parseUrl static method

FWUrlInfo? parseUrl({
  1. required String url,
  2. required String iOSQueryName,
  3. required String androidQueryName,
})

Parse url info

Example:

const url = "https://firework.com/?ios=com.firework%3A%2F%2Fpdp%3Fproduct_id%3D1234&android=com.firework%3A%2F%2Fpdp%3Fproduct_id%3D12345";
const iOSQueryName = "ios";
const androidQueryName = "android";
final info = FWUrlUtil.parseUrl(
  url: url,
  iOSQueryName: iOSQueryName,
  androidQueryName: androidQueryName,
);
print("${info?.url}"); // https://firework.com/
print("${info?.iOSUrl}"); // com.firework://pdp?product_id=1234
print("${info?.androidUrl}"); // com.firework://pdp?product_id=12345

Implementation

static FWUrlInfo? parseUrl({
  required String url,
  required String iOSQueryName,
  required String androidQueryName,
}) {
  if (url.isEmpty) {
    return null;
  }

  final uri = Uri.tryParse(url);
  if (uri == null) {
    return null;
  }

  final queryParameters = uri.queryParameters;

  final urlInfo = FWUrlInfo();

  // Get iOS url and Android Url from query
  queryParameters.forEach((key, value) {
    if (key == iOSQueryName) {
      urlInfo.iOSUrl = value;
    }

    if (key == androidQueryName) {
      urlInfo.androidUrl = value;
    }
  });

  // Remove iOS url and Android url from query
  final newQueryParameters = Map.fromEntries(
    queryParameters.entries.where(
      (entry) => entry.key != iOSQueryName && entry.key != androidQueryName,
    ),
  );
  final resultUri = uri.replace(
    queryParameters: newQueryParameters,
  );
  var resultUrl = resultUri.toString();
  if (resultUrl.isNotEmpty && resultUrl.endsWith("?")) {
    resultUrl = resultUrl.substring(0, resultUrl.length - 1);
  }

  urlInfo.url = resultUrl;

  return urlInfo;
}