ULinkResolvedData.fromJson constructor
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,
);
}