/// `type` of the visible Connect push for a parent letter. Its data carries /// the letter under [parentLetterIdKey]. const String parentLetterPushType = 'parent-letter'; const String parentLetterIdKey = 'parentLetterId'; /// Where a tapped notification leads. sealed class PushTarget { const PushTarget(); } class ParentLetterTarget extends PushTarget { final String letterId; const ParentLetterTarget(this.letterId); } class NewsletterTarget extends PushTarget { final String newsletterId; const NewsletterTarget(this.newsletterId); } class ChatTarget extends PushTarget { final String chatToken; const ChatTarget(this.chatToken); } /// Resolves the data of a tapped notification — the payload of a locally /// rendered one as well as the data of an FCM message. Null when it names no /// known target. PushTarget? resolvePushTarget(Map data) { String? value(String key) { final value = data[key]; return value is String && value.isNotEmpty ? value : null; } if (value(parentLetterIdKey) case final letterId?) { return ParentLetterTarget(letterId); } if (value('newsletterId') case final newsletterId?) { return NewsletterTarget(newsletterId); } for (final key in const ['chatToken', 'token', 'roomToken']) { if (value(key) case final chatToken?) return ChatTarget(chatToken); } return null; }