ULinkResolvedData.fromJson constructor

ULinkResolvedData.fromJson(
  1. Map<String, dynamic> json
)

Creates a resolved link data object from JSON

Implementation

factory ULinkResolvedData.fromJson(Map<String, dynamic> json) {
  // Extract social media tags from metadata if it exists
  SocialMediaTags? socialMediaTags;
  Map<String, dynamic>? metadata;
  Map<String, dynamic>? parameters;

  // Safely extract metadata
  final metadataRaw = json['metadata'];
  if (metadataRaw is Map) {
    metadata = Map<String, dynamic>.from(metadataRaw);
  }

  // Safely extract parameters
  final parametersRaw = json['parameters'];
  if (parametersRaw is Map) {
    parameters = Map<String, dynamic>.from(parametersRaw);
  }

  // Try to extract social media tags from metadata first
  if (metadata != null) {
    final ogTitle = metadata['ogTitle'];
    final ogDescription = metadata['ogDescription'];
    final ogImage = metadata['ogImage'];

    if (ogTitle != null || ogDescription != null || ogImage != null) {
      socialMediaTags = SocialMediaTags(
        ogTitle: ogTitle,
        ogDescription: ogDescription,
        ogImage: ogImage,
      );
    }
  }

  // Fallback: check parameters for backward compatibility
  if (socialMediaTags == null && parameters != null) {
    final ogTitle = parameters['ogTitle'];
    final ogDescription = parameters['ogDescription'];
    final ogImage = parameters['ogImage'];

    if (ogTitle != null || ogDescription != null || ogImage != null) {
      socialMediaTags = SocialMediaTags(
        ogTitle: ogTitle,
        ogDescription: ogDescription,
        ogImage: ogImage,
      );
    }
  }

  // Determine link type based on type field from rawData
  final typeFromData = json['type'] as String?;
  final linkType =
      typeFromData == 'dynamic' ? ULinkType.dynamic : ULinkType.unified;

  return ULinkResolvedData(
    slug: json['slug'],
    iosFallbackUrl: json['iosUrl'] ?? json['iosFallbackUrl'],
    androidFallbackUrl: json['androidUrl'] ?? json['androidFallbackUrl'],
    fallbackUrl: json['fallbackUrl'],
    parameters: parameters,
    socialMediaTags: socialMediaTags,
    metadata: metadata,
    linkType: linkType,
    isDeferred: json['isDeferred'] == true,
    matchType: json['matchType'],
    rawData: json,
  );
}