diff --git a/mobile/lib/l10n/app_am.arb b/mobile/lib/l10n/app_am.arb index 6298acb23f..0e2bf877e0 100644 --- a/mobile/lib/l10n/app_am.arb +++ b/mobile/lib/l10n/app_am.arb @@ -3818,6 +3818,16 @@ "videoEditorOriginalAudioLabel": "ዋናው ኦዲዮ", "videoEditorClipVolumeLabel": "ቅንጥብ {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "ፍለጋ", + "emojiCategoryRecent": "የቅርብ ጊዜ", + "emojiCategorySmileys": "ፈገግታዎች እና ሰዎች", + "emojiCategoryAnimals": "እንስሳት እና ተፈጥሮ", + "emojiCategoryFood": "ምግብ እና መጠጥ", + "emojiCategoryActivities": "እንቅስቃሴዎች", + "emojiCategoryTravel": "ጉዞ እና ቦታዎች", + "emojiCategoryObjects": "ቁሶች", + "emojiCategorySymbols": "ምልክቶች", + "emojiCategoryFlags": "ባንዲራዎች", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_ar.arb b/mobile/lib/l10n/app_ar.arb index c7413431ea..410891f3d4 100644 --- a/mobile/lib/l10n/app_ar.arb +++ b/mobile/lib/l10n/app_ar.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "الصوت الأصلي", "videoEditorClipVolumeLabel": "مقطع {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "بحث", + "emojiCategoryRecent": "الأخيرة", + "emojiCategorySmileys": "الوجوه والأشخاص", + "emojiCategoryAnimals": "الحيوانات والطبيعة", + "emojiCategoryFood": "الطعام والشراب", + "emojiCategoryActivities": "الأنشطة", + "emojiCategoryTravel": "السفر والأماكن", + "emojiCategoryObjects": "الأشياء", + "emojiCategorySymbols": "الرموز", + "emojiCategoryFlags": "الأعلام", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_bg.arb b/mobile/lib/l10n/app_bg.arb index 81ecd8f1d3..3b161a53ba 100644 --- a/mobile/lib/l10n/app_bg.arb +++ b/mobile/lib/l10n/app_bg.arb @@ -3824,6 +3824,16 @@ "videoEditorOriginalAudioLabel": "Оригинален звук", "videoEditorClipVolumeLabel": "Клип {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Търсене", + "emojiCategoryRecent": "Скорошни", + "emojiCategorySmileys": "Емотикони и хора", + "emojiCategoryAnimals": "Животни и природа", + "emojiCategoryFood": "Храна и напитки", + "emojiCategoryActivities": "Дейности", + "emojiCategoryTravel": "Пътувания и места", + "emojiCategoryObjects": "Обекти", + "emojiCategorySymbols": "Символи", + "emojiCategoryFlags": "Знамена", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_de.arb b/mobile/lib/l10n/app_de.arb index 1d4cb1ac32..561a68e956 100644 --- a/mobile/lib/l10n/app_de.arb +++ b/mobile/lib/l10n/app_de.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Originalton", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Suchen", + "emojiCategoryRecent": "Zuletzt verwendet", + "emojiCategorySmileys": "Smileys und Menschen", + "emojiCategoryAnimals": "Tiere und Natur", + "emojiCategoryFood": "Essen und Trinken", + "emojiCategoryActivities": "Aktivitäten", + "emojiCategoryTravel": "Reisen und Orte", + "emojiCategoryObjects": "Objekte", + "emojiCategorySymbols": "Symbole", + "emojiCategoryFlags": "Flaggen", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_en.arb b/mobile/lib/l10n/app_en.arb index dc33b29436..14a22af2e1 100644 --- a/mobile/lib/l10n/app_en.arb +++ b/mobile/lib/l10n/app_en.arb @@ -3077,6 +3077,46 @@ "@dmReactionChipRetryAnnouncement": { "description": "Live-region announcement on chip retry." }, + "emojiPickerSearchHint": "Search", + "@emojiPickerSearchHint": { + "description": "Hint text in the search field of the full emoji picker opened from the DM reaction '+' button." + }, + "emojiCategoryRecent": "Recent", + "@emojiCategoryRecent": { + "description": "Title for the 'Recent' category in the full emoji picker." + }, + "emojiCategorySmileys": "Smileys & People", + "@emojiCategorySmileys": { + "description": "Title for the 'Smileys & People' category in the full emoji picker." + }, + "emojiCategoryAnimals": "Animals & Nature", + "@emojiCategoryAnimals": { + "description": "Title for the 'Animals & Nature' category in the full emoji picker." + }, + "emojiCategoryFood": "Food & Drink", + "@emojiCategoryFood": { + "description": "Title for the 'Food & Drink' category in the full emoji picker." + }, + "emojiCategoryActivities": "Activities", + "@emojiCategoryActivities": { + "description": "Title for the 'Activities' category in the full emoji picker." + }, + "emojiCategoryTravel": "Travel & Places", + "@emojiCategoryTravel": { + "description": "Title for the 'Travel & Places' category in the full emoji picker." + }, + "emojiCategoryObjects": "Objects", + "@emojiCategoryObjects": { + "description": "Title for the 'Objects' category in the full emoji picker." + }, + "emojiCategorySymbols": "Symbols", + "@emojiCategorySymbols": { + "description": "Title for the 'Symbols' category in the full emoji picker." + }, + "emojiCategoryFlags": "Flags", + "@emojiCategoryFlags": { + "description": "Title for the 'Flags' category in the full emoji picker." + }, "dmFormatBold": "Bold", "@dmFormatBold": { "description": "Label for the Bold formatting action in the DM composer's text-selection context menu. Wraps the selected text with markdown bold markers (e.g. **text**)." diff --git a/mobile/lib/l10n/app_es.arb b/mobile/lib/l10n/app_es.arb index 8fccd2ff17..41afd48080 100644 --- a/mobile/lib/l10n/app_es.arb +++ b/mobile/lib/l10n/app_es.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Audio original", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Buscar", + "emojiCategoryRecent": "Recientes", + "emojiCategorySmileys": "Emoticonos y personas", + "emojiCategoryAnimals": "Animales y naturaleza", + "emojiCategoryFood": "Comida y bebida", + "emojiCategoryActivities": "Actividades", + "emojiCategoryTravel": "Viajes y lugares", + "emojiCategoryObjects": "Objetos", + "emojiCategorySymbols": "Símbolos", + "emojiCategoryFlags": "Banderas", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_fil.arb b/mobile/lib/l10n/app_fil.arb index 3e388c0cc0..6736556f69 100644 --- a/mobile/lib/l10n/app_fil.arb +++ b/mobile/lib/l10n/app_fil.arb @@ -2231,6 +2231,16 @@ "videoEditorOriginalAudioLabel": "Orihinal na audio", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Maghanap", + "emojiCategoryRecent": "Kamakailan", + "emojiCategorySmileys": "Mga Smiley at Tao", + "emojiCategoryAnimals": "Mga Hayop at Kalikasan", + "emojiCategoryFood": "Pagkain at Inumin", + "emojiCategoryActivities": "Mga Aktibidad", + "emojiCategoryTravel": "Paglalakbay at Mga Lugar", + "emojiCategoryObjects": "Mga Bagay", + "emojiCategorySymbols": "Mga Simbolo", + "emojiCategoryFlags": "Mga Bandila", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_fr.arb b/mobile/lib/l10n/app_fr.arb index 5ae724f2cd..b754d3aac3 100644 --- a/mobile/lib/l10n/app_fr.arb +++ b/mobile/lib/l10n/app_fr.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Audio original", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Rechercher", + "emojiCategoryRecent": "Récents", + "emojiCategorySmileys": "Smileys et personnes", + "emojiCategoryAnimals": "Animaux et nature", + "emojiCategoryFood": "Nourriture et boissons", + "emojiCategoryActivities": "Activités", + "emojiCategoryTravel": "Voyages et lieux", + "emojiCategoryObjects": "Objets", + "emojiCategorySymbols": "Symboles", + "emojiCategoryFlags": "Drapeaux", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_id.arb b/mobile/lib/l10n/app_id.arb index ee5e5e7af7..3950b48248 100644 --- a/mobile/lib/l10n/app_id.arb +++ b/mobile/lib/l10n/app_id.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Audio asli", "videoEditorClipVolumeLabel": "Klip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Cari", + "emojiCategoryRecent": "Terbaru", + "emojiCategorySmileys": "Smiley & Orang", + "emojiCategoryAnimals": "Hewan & Alam", + "emojiCategoryFood": "Makanan & Minuman", + "emojiCategoryActivities": "Aktivitas", + "emojiCategoryTravel": "Perjalanan & Tempat", + "emojiCategoryObjects": "Objek", + "emojiCategorySymbols": "Simbol", + "emojiCategoryFlags": "Bendera", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_it.arb b/mobile/lib/l10n/app_it.arb index faae94a659..f422ca7d57 100644 --- a/mobile/lib/l10n/app_it.arb +++ b/mobile/lib/l10n/app_it.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Audio originale", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Cerca", + "emojiCategoryRecent": "Recenti", + "emojiCategorySmileys": "Faccine e persone", + "emojiCategoryAnimals": "Animali e natura", + "emojiCategoryFood": "Cibo e bevande", + "emojiCategoryActivities": "Attività", + "emojiCategoryTravel": "Viaggi e luoghi", + "emojiCategoryObjects": "Oggetti", + "emojiCategorySymbols": "Simboli", + "emojiCategoryFlags": "Bandiere", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_ja.arb b/mobile/lib/l10n/app_ja.arb index 936c6e495d..6cb84d618e 100644 --- a/mobile/lib/l10n/app_ja.arb +++ b/mobile/lib/l10n/app_ja.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "元の音声", "videoEditorClipVolumeLabel": "クリップ {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "検索", + "emojiCategoryRecent": "最近使った絵文字", + "emojiCategorySmileys": "スマイリーと人々", + "emojiCategoryAnimals": "動物と自然", + "emojiCategoryFood": "食べ物と飲み物", + "emojiCategoryActivities": "アクティビティ", + "emojiCategoryTravel": "旅行と場所", + "emojiCategoryObjects": "物", + "emojiCategorySymbols": "記号", + "emojiCategoryFlags": "旗", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_ko.arb b/mobile/lib/l10n/app_ko.arb index 179c54beed..22cda167ec 100644 --- a/mobile/lib/l10n/app_ko.arb +++ b/mobile/lib/l10n/app_ko.arb @@ -2979,6 +2979,16 @@ "videoEditorOriginalAudioLabel": "원본 오디오", "videoEditorClipVolumeLabel": "클립 {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "검색", + "emojiCategoryRecent": "최근 사용", + "emojiCategorySmileys": "스마일리 및 사람", + "emojiCategoryAnimals": "동물 및 자연", + "emojiCategoryFood": "음식 및 음료", + "emojiCategoryActivities": "활동", + "emojiCategoryTravel": "여행 및 장소", + "emojiCategoryObjects": "사물", + "emojiCategorySymbols": "기호", + "emojiCategoryFlags": "깃발", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_nl.arb b/mobile/lib/l10n/app_nl.arb index 1ae4eec1a6..e875b9e946 100644 --- a/mobile/lib/l10n/app_nl.arb +++ b/mobile/lib/l10n/app_nl.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Origineel geluid", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Zoeken", + "emojiCategoryRecent": "Recent", + "emojiCategorySmileys": "Smileys en mensen", + "emojiCategoryAnimals": "Dieren en natuur", + "emojiCategoryFood": "Eten en drinken", + "emojiCategoryActivities": "Activiteiten", + "emojiCategoryTravel": "Reizen en plaatsen", + "emojiCategoryObjects": "Objecten", + "emojiCategorySymbols": "Symbolen", + "emojiCategoryFlags": "Vlaggen", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_pl.arb b/mobile/lib/l10n/app_pl.arb index cdc75c1f49..feb75bff6c 100644 --- a/mobile/lib/l10n/app_pl.arb +++ b/mobile/lib/l10n/app_pl.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Oryginalne audio", "videoEditorClipVolumeLabel": "Klip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Szukaj", + "emojiCategoryRecent": "Ostatnie", + "emojiCategorySmileys": "Uśmiechy i ludzie", + "emojiCategoryAnimals": "Zwierzęta i natura", + "emojiCategoryFood": "Jedzenie i napoje", + "emojiCategoryActivities": "Aktywności", + "emojiCategoryTravel": "Podróże i miejsca", + "emojiCategoryObjects": "Przedmioty", + "emojiCategorySymbols": "Symbole", + "emojiCategoryFlags": "Flagi", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_pt.arb b/mobile/lib/l10n/app_pt.arb index 4a13ab4893..5634514705 100644 --- a/mobile/lib/l10n/app_pt.arb +++ b/mobile/lib/l10n/app_pt.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Áudio original", "videoEditorClipVolumeLabel": "Clipe {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Pesquisar", + "emojiCategoryRecent": "Recentes", + "emojiCategorySmileys": "Smileys e pessoas", + "emojiCategoryAnimals": "Animais e natureza", + "emojiCategoryFood": "Comida e bebida", + "emojiCategoryActivities": "Atividades", + "emojiCategoryTravel": "Viagens e lugares", + "emojiCategoryObjects": "Objetos", + "emojiCategorySymbols": "Símbolos", + "emojiCategoryFlags": "Bandeiras", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_ro.arb b/mobile/lib/l10n/app_ro.arb index f4c505451a..1b58304536 100644 --- a/mobile/lib/l10n/app_ro.arb +++ b/mobile/lib/l10n/app_ro.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Audio original", "videoEditorClipVolumeLabel": "Clip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Căutare", + "emojiCategoryRecent": "Recente", + "emojiCategorySmileys": "Emoticoane și persoane", + "emojiCategoryAnimals": "Animale și natură", + "emojiCategoryFood": "Mâncare și băutură", + "emojiCategoryActivities": "Activități", + "emojiCategoryTravel": "Călătorii și locuri", + "emojiCategoryObjects": "Obiecte", + "emojiCategorySymbols": "Simboluri", + "emojiCategoryFlags": "Steaguri", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_sv.arb b/mobile/lib/l10n/app_sv.arb index 14595f149c..31d37ed0e7 100644 --- a/mobile/lib/l10n/app_sv.arb +++ b/mobile/lib/l10n/app_sv.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Originalljud", "videoEditorClipVolumeLabel": "Klipp {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Sök", + "emojiCategoryRecent": "Senaste", + "emojiCategorySmileys": "Smileys och personer", + "emojiCategoryAnimals": "Djur och natur", + "emojiCategoryFood": "Mat och dryck", + "emojiCategoryActivities": "Aktiviteter", + "emojiCategoryTravel": "Resor och platser", + "emojiCategoryObjects": "Objekt", + "emojiCategorySymbols": "Symboler", + "emojiCategoryFlags": "Flaggor", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/app_tr.arb b/mobile/lib/l10n/app_tr.arb index 33d74dda93..39a0802a4c 100644 --- a/mobile/lib/l10n/app_tr.arb +++ b/mobile/lib/l10n/app_tr.arb @@ -3690,6 +3690,16 @@ "videoEditorOriginalAudioLabel": "Orijinal ses", "videoEditorClipVolumeLabel": "Klip {index}", "dmReactionAddCustomA11yLabel": "Add custom emoji reaction", + "emojiPickerSearchHint": "Ara", + "emojiCategoryRecent": "Son Kullanılanlar", + "emojiCategorySmileys": "İfadeler ve İnsanlar", + "emojiCategoryAnimals": "Hayvanlar ve Doğa", + "emojiCategoryFood": "Yiyecek ve İçecek", + "emojiCategoryActivities": "Etkinlikler", + "emojiCategoryTravel": "Seyahat ve Yerler", + "emojiCategoryObjects": "Nesneler", + "emojiCategorySymbols": "Semboller", + "emojiCategoryFlags": "Bayraklar", "dmReactionChipOwnA11yLabel": "Your reaction: {emoji}", "dmReactionChipOtherA11yLabel": "{name} reacted with {emoji}", "dmReactionChipPendingA11yLabel": "Sending reaction: {emoji}", diff --git a/mobile/lib/l10n/generated/app_localizations.dart b/mobile/lib/l10n/generated/app_localizations.dart index 455d97bb02..f0e704f45f 100644 --- a/mobile/lib/l10n/generated/app_localizations.dart +++ b/mobile/lib/l10n/generated/app_localizations.dart @@ -9734,6 +9734,66 @@ abstract class AppLocalizations { /// **'Retrying reaction'** String get dmReactionChipRetryAnnouncement; + /// Hint text in the search field of the full emoji picker opened from the DM reaction '+' button. + /// + /// In en, this message translates to: + /// **'Search'** + String get emojiPickerSearchHint; + + /// Title for the 'Recent' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Recent'** + String get emojiCategoryRecent; + + /// Title for the 'Smileys & People' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Smileys & People'** + String get emojiCategorySmileys; + + /// Title for the 'Animals & Nature' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Animals & Nature'** + String get emojiCategoryAnimals; + + /// Title for the 'Food & Drink' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Food & Drink'** + String get emojiCategoryFood; + + /// Title for the 'Activities' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Activities'** + String get emojiCategoryActivities; + + /// Title for the 'Travel & Places' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Travel & Places'** + String get emojiCategoryTravel; + + /// Title for the 'Objects' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Objects'** + String get emojiCategoryObjects; + + /// Title for the 'Symbols' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Symbols'** + String get emojiCategorySymbols; + + /// Title for the 'Flags' category in the full emoji picker. + /// + /// In en, this message translates to: + /// **'Flags'** + String get emojiCategoryFlags; + /// Label for the Bold formatting action in the DM composer's text-selection context menu. Wraps the selected text with markdown bold markers (e.g. **text**). /// /// In en, this message translates to: diff --git a/mobile/lib/l10n/generated/app_localizations_am.dart b/mobile/lib/l10n/generated/app_localizations_am.dart index cb5236ba17..6af12ad43d 100644 --- a/mobile/lib/l10n/generated/app_localizations_am.dart +++ b/mobile/lib/l10n/generated/app_localizations_am.dart @@ -5426,6 +5426,36 @@ class AppLocalizationsAm extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'ፍለጋ'; + + @override + String get emojiCategoryRecent => 'የቅርብ ጊዜ'; + + @override + String get emojiCategorySmileys => 'ፈገግታዎች እና ሰዎች'; + + @override + String get emojiCategoryAnimals => 'እንስሳት እና ተፈጥሮ'; + + @override + String get emojiCategoryFood => 'ምግብ እና መጠጥ'; + + @override + String get emojiCategoryActivities => 'እንቅስቃሴዎች'; + + @override + String get emojiCategoryTravel => 'ጉዞ እና ቦታዎች'; + + @override + String get emojiCategoryObjects => 'ቁሶች'; + + @override + String get emojiCategorySymbols => 'ምልክቶች'; + + @override + String get emojiCategoryFlags => 'ባንዲራዎች'; + @override String get dmFormatBold => 'ደማቅ'; diff --git a/mobile/lib/l10n/generated/app_localizations_ar.dart b/mobile/lib/l10n/generated/app_localizations_ar.dart index 36b9e49c9c..2de3ceb087 100644 --- a/mobile/lib/l10n/generated/app_localizations_ar.dart +++ b/mobile/lib/l10n/generated/app_localizations_ar.dart @@ -5487,6 +5487,36 @@ class AppLocalizationsAr extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'بحث'; + + @override + String get emojiCategoryRecent => 'الأخيرة'; + + @override + String get emojiCategorySmileys => 'الوجوه والأشخاص'; + + @override + String get emojiCategoryAnimals => 'الحيوانات والطبيعة'; + + @override + String get emojiCategoryFood => 'الطعام والشراب'; + + @override + String get emojiCategoryActivities => 'الأنشطة'; + + @override + String get emojiCategoryTravel => 'السفر والأماكن'; + + @override + String get emojiCategoryObjects => 'الأشياء'; + + @override + String get emojiCategorySymbols => 'الرموز'; + + @override + String get emojiCategoryFlags => 'الأعلام'; + @override String get dmFormatBold => 'عريض'; diff --git a/mobile/lib/l10n/generated/app_localizations_bg.dart b/mobile/lib/l10n/generated/app_localizations_bg.dart index b630d2785d..fd474a94e0 100644 --- a/mobile/lib/l10n/generated/app_localizations_bg.dart +++ b/mobile/lib/l10n/generated/app_localizations_bg.dart @@ -5591,6 +5591,36 @@ class AppLocalizationsBg extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Търсене'; + + @override + String get emojiCategoryRecent => 'Скорошни'; + + @override + String get emojiCategorySmileys => 'Емотикони и хора'; + + @override + String get emojiCategoryAnimals => 'Животни и природа'; + + @override + String get emojiCategoryFood => 'Храна и напитки'; + + @override + String get emojiCategoryActivities => 'Дейности'; + + @override + String get emojiCategoryTravel => 'Пътувания и места'; + + @override + String get emojiCategoryObjects => 'Обекти'; + + @override + String get emojiCategorySymbols => 'Символи'; + + @override + String get emojiCategoryFlags => 'Знамена'; + @override String get dmFormatBold => 'Получер'; diff --git a/mobile/lib/l10n/generated/app_localizations_de.dart b/mobile/lib/l10n/generated/app_localizations_de.dart index 055fac54e0..e0b3b47d16 100644 --- a/mobile/lib/l10n/generated/app_localizations_de.dart +++ b/mobile/lib/l10n/generated/app_localizations_de.dart @@ -5605,6 +5605,36 @@ class AppLocalizationsDe extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Suchen'; + + @override + String get emojiCategoryRecent => 'Zuletzt verwendet'; + + @override + String get emojiCategorySmileys => 'Smileys und Menschen'; + + @override + String get emojiCategoryAnimals => 'Tiere und Natur'; + + @override + String get emojiCategoryFood => 'Essen und Trinken'; + + @override + String get emojiCategoryActivities => 'Aktivitäten'; + + @override + String get emojiCategoryTravel => 'Reisen und Orte'; + + @override + String get emojiCategoryObjects => 'Objekte'; + + @override + String get emojiCategorySymbols => 'Symbole'; + + @override + String get emojiCategoryFlags => 'Flaggen'; + @override String get dmFormatBold => 'Fett'; diff --git a/mobile/lib/l10n/generated/app_localizations_en.dart b/mobile/lib/l10n/generated/app_localizations_en.dart index 047bef76ac..26776a5e25 100644 --- a/mobile/lib/l10n/generated/app_localizations_en.dart +++ b/mobile/lib/l10n/generated/app_localizations_en.dart @@ -5539,6 +5539,36 @@ class AppLocalizationsEn extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Search'; + + @override + String get emojiCategoryRecent => 'Recent'; + + @override + String get emojiCategorySmileys => 'Smileys & People'; + + @override + String get emojiCategoryAnimals => 'Animals & Nature'; + + @override + String get emojiCategoryFood => 'Food & Drink'; + + @override + String get emojiCategoryActivities => 'Activities'; + + @override + String get emojiCategoryTravel => 'Travel & Places'; + + @override + String get emojiCategoryObjects => 'Objects'; + + @override + String get emojiCategorySymbols => 'Symbols'; + + @override + String get emojiCategoryFlags => 'Flags'; + @override String get dmFormatBold => 'Bold'; diff --git a/mobile/lib/l10n/generated/app_localizations_es.dart b/mobile/lib/l10n/generated/app_localizations_es.dart index 46532b4608..0151dc367c 100644 --- a/mobile/lib/l10n/generated/app_localizations_es.dart +++ b/mobile/lib/l10n/generated/app_localizations_es.dart @@ -5587,6 +5587,36 @@ class AppLocalizationsEs extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Buscar'; + + @override + String get emojiCategoryRecent => 'Recientes'; + + @override + String get emojiCategorySmileys => 'Emoticonos y personas'; + + @override + String get emojiCategoryAnimals => 'Animales y naturaleza'; + + @override + String get emojiCategoryFood => 'Comida y bebida'; + + @override + String get emojiCategoryActivities => 'Actividades'; + + @override + String get emojiCategoryTravel => 'Viajes y lugares'; + + @override + String get emojiCategoryObjects => 'Objetos'; + + @override + String get emojiCategorySymbols => 'Símbolos'; + + @override + String get emojiCategoryFlags => 'Banderas'; + @override String get dmFormatBold => 'Negrita'; diff --git a/mobile/lib/l10n/generated/app_localizations_fil.dart b/mobile/lib/l10n/generated/app_localizations_fil.dart index 250947c174..dd8e86dd4f 100644 --- a/mobile/lib/l10n/generated/app_localizations_fil.dart +++ b/mobile/lib/l10n/generated/app_localizations_fil.dart @@ -5607,6 +5607,36 @@ class AppLocalizationsFil extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Maghanap'; + + @override + String get emojiCategoryRecent => 'Kamakailan'; + + @override + String get emojiCategorySmileys => 'Mga Smiley at Tao'; + + @override + String get emojiCategoryAnimals => 'Mga Hayop at Kalikasan'; + + @override + String get emojiCategoryFood => 'Pagkain at Inumin'; + + @override + String get emojiCategoryActivities => 'Mga Aktibidad'; + + @override + String get emojiCategoryTravel => 'Paglalakbay at Mga Lugar'; + + @override + String get emojiCategoryObjects => 'Mga Bagay'; + + @override + String get emojiCategorySymbols => 'Mga Simbolo'; + + @override + String get emojiCategoryFlags => 'Mga Bandila'; + @override String get dmFormatBold => 'Makapal'; diff --git a/mobile/lib/l10n/generated/app_localizations_fr.dart b/mobile/lib/l10n/generated/app_localizations_fr.dart index 183ba15a77..7eb7a3de97 100644 --- a/mobile/lib/l10n/generated/app_localizations_fr.dart +++ b/mobile/lib/l10n/generated/app_localizations_fr.dart @@ -5610,6 +5610,36 @@ class AppLocalizationsFr extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Rechercher'; + + @override + String get emojiCategoryRecent => 'Récents'; + + @override + String get emojiCategorySmileys => 'Smileys et personnes'; + + @override + String get emojiCategoryAnimals => 'Animaux et nature'; + + @override + String get emojiCategoryFood => 'Nourriture et boissons'; + + @override + String get emojiCategoryActivities => 'Activités'; + + @override + String get emojiCategoryTravel => 'Voyages et lieux'; + + @override + String get emojiCategoryObjects => 'Objets'; + + @override + String get emojiCategorySymbols => 'Symboles'; + + @override + String get emojiCategoryFlags => 'Drapeaux'; + @override String get dmFormatBold => 'Gras'; diff --git a/mobile/lib/l10n/generated/app_localizations_id.dart b/mobile/lib/l10n/generated/app_localizations_id.dart index e3a427fb5f..d7fb099d3a 100644 --- a/mobile/lib/l10n/generated/app_localizations_id.dart +++ b/mobile/lib/l10n/generated/app_localizations_id.dart @@ -5513,6 +5513,36 @@ class AppLocalizationsId extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Cari'; + + @override + String get emojiCategoryRecent => 'Terbaru'; + + @override + String get emojiCategorySmileys => 'Smiley & Orang'; + + @override + String get emojiCategoryAnimals => 'Hewan & Alam'; + + @override + String get emojiCategoryFood => 'Makanan & Minuman'; + + @override + String get emojiCategoryActivities => 'Aktivitas'; + + @override + String get emojiCategoryTravel => 'Perjalanan & Tempat'; + + @override + String get emojiCategoryObjects => 'Objek'; + + @override + String get emojiCategorySymbols => 'Simbol'; + + @override + String get emojiCategoryFlags => 'Bendera'; + @override String get dmFormatBold => 'Tebal'; diff --git a/mobile/lib/l10n/generated/app_localizations_it.dart b/mobile/lib/l10n/generated/app_localizations_it.dart index fdaf49489b..a738ca7d9f 100644 --- a/mobile/lib/l10n/generated/app_localizations_it.dart +++ b/mobile/lib/l10n/generated/app_localizations_it.dart @@ -5586,6 +5586,36 @@ class AppLocalizationsIt extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Cerca'; + + @override + String get emojiCategoryRecent => 'Recenti'; + + @override + String get emojiCategorySmileys => 'Faccine e persone'; + + @override + String get emojiCategoryAnimals => 'Animali e natura'; + + @override + String get emojiCategoryFood => 'Cibo e bevande'; + + @override + String get emojiCategoryActivities => 'Attività'; + + @override + String get emojiCategoryTravel => 'Viaggi e luoghi'; + + @override + String get emojiCategoryObjects => 'Oggetti'; + + @override + String get emojiCategorySymbols => 'Simboli'; + + @override + String get emojiCategoryFlags => 'Bandiere'; + @override String get dmFormatBold => 'Grassetto'; diff --git a/mobile/lib/l10n/generated/app_localizations_ja.dart b/mobile/lib/l10n/generated/app_localizations_ja.dart index 4ddf9b5b8d..b3a34c47d2 100644 --- a/mobile/lib/l10n/generated/app_localizations_ja.dart +++ b/mobile/lib/l10n/generated/app_localizations_ja.dart @@ -5311,6 +5311,36 @@ class AppLocalizationsJa extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => '検索'; + + @override + String get emojiCategoryRecent => '最近使った絵文字'; + + @override + String get emojiCategorySmileys => 'スマイリーと人々'; + + @override + String get emojiCategoryAnimals => '動物と自然'; + + @override + String get emojiCategoryFood => '食べ物と飲み物'; + + @override + String get emojiCategoryActivities => 'アクティビティ'; + + @override + String get emojiCategoryTravel => '旅行と場所'; + + @override + String get emojiCategoryObjects => '物'; + + @override + String get emojiCategorySymbols => '記号'; + + @override + String get emojiCategoryFlags => '旗'; + @override String get dmFormatBold => '太字'; diff --git a/mobile/lib/l10n/generated/app_localizations_ko.dart b/mobile/lib/l10n/generated/app_localizations_ko.dart index 323473214d..59ee62afa1 100644 --- a/mobile/lib/l10n/generated/app_localizations_ko.dart +++ b/mobile/lib/l10n/generated/app_localizations_ko.dart @@ -5328,6 +5328,36 @@ class AppLocalizationsKo extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => '검색'; + + @override + String get emojiCategoryRecent => '최근 사용'; + + @override + String get emojiCategorySmileys => '스마일리 및 사람'; + + @override + String get emojiCategoryAnimals => '동물 및 자연'; + + @override + String get emojiCategoryFood => '음식 및 음료'; + + @override + String get emojiCategoryActivities => '활동'; + + @override + String get emojiCategoryTravel => '여행 및 장소'; + + @override + String get emojiCategoryObjects => '사물'; + + @override + String get emojiCategorySymbols => '기호'; + + @override + String get emojiCategoryFlags => '깃발'; + @override String get dmFormatBold => '굵게'; diff --git a/mobile/lib/l10n/generated/app_localizations_nl.dart b/mobile/lib/l10n/generated/app_localizations_nl.dart index d9b27986ad..92de04a4e7 100644 --- a/mobile/lib/l10n/generated/app_localizations_nl.dart +++ b/mobile/lib/l10n/generated/app_localizations_nl.dart @@ -5561,6 +5561,36 @@ class AppLocalizationsNl extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Zoeken'; + + @override + String get emojiCategoryRecent => 'Recent'; + + @override + String get emojiCategorySmileys => 'Smileys en mensen'; + + @override + String get emojiCategoryAnimals => 'Dieren en natuur'; + + @override + String get emojiCategoryFood => 'Eten en drinken'; + + @override + String get emojiCategoryActivities => 'Activiteiten'; + + @override + String get emojiCategoryTravel => 'Reizen en plaatsen'; + + @override + String get emojiCategoryObjects => 'Objecten'; + + @override + String get emojiCategorySymbols => 'Symbolen'; + + @override + String get emojiCategoryFlags => 'Vlaggen'; + @override String get dmFormatBold => 'Vet'; diff --git a/mobile/lib/l10n/generated/app_localizations_pl.dart b/mobile/lib/l10n/generated/app_localizations_pl.dart index 80af210642..dc9c75e584 100644 --- a/mobile/lib/l10n/generated/app_localizations_pl.dart +++ b/mobile/lib/l10n/generated/app_localizations_pl.dart @@ -5673,6 +5673,36 @@ class AppLocalizationsPl extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Szukaj'; + + @override + String get emojiCategoryRecent => 'Ostatnie'; + + @override + String get emojiCategorySmileys => 'Uśmiechy i ludzie'; + + @override + String get emojiCategoryAnimals => 'Zwierzęta i natura'; + + @override + String get emojiCategoryFood => 'Jedzenie i napoje'; + + @override + String get emojiCategoryActivities => 'Aktywności'; + + @override + String get emojiCategoryTravel => 'Podróże i miejsca'; + + @override + String get emojiCategoryObjects => 'Przedmioty'; + + @override + String get emojiCategorySymbols => 'Symbole'; + + @override + String get emojiCategoryFlags => 'Flagi'; + @override String get dmFormatBold => 'Pogrubienie'; diff --git a/mobile/lib/l10n/generated/app_localizations_pt.dart b/mobile/lib/l10n/generated/app_localizations_pt.dart index a1cfbccb1f..425b43afec 100644 --- a/mobile/lib/l10n/generated/app_localizations_pt.dart +++ b/mobile/lib/l10n/generated/app_localizations_pt.dart @@ -5571,6 +5571,36 @@ class AppLocalizationsPt extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Pesquisar'; + + @override + String get emojiCategoryRecent => 'Recentes'; + + @override + String get emojiCategorySmileys => 'Smileys e pessoas'; + + @override + String get emojiCategoryAnimals => 'Animais e natureza'; + + @override + String get emojiCategoryFood => 'Comida e bebida'; + + @override + String get emojiCategoryActivities => 'Atividades'; + + @override + String get emojiCategoryTravel => 'Viagens e lugares'; + + @override + String get emojiCategoryObjects => 'Objetos'; + + @override + String get emojiCategorySymbols => 'Símbolos'; + + @override + String get emojiCategoryFlags => 'Bandeiras'; + @override String get dmFormatBold => 'Negrito'; diff --git a/mobile/lib/l10n/generated/app_localizations_ro.dart b/mobile/lib/l10n/generated/app_localizations_ro.dart index ff11091252..4f89b2f0e9 100644 --- a/mobile/lib/l10n/generated/app_localizations_ro.dart +++ b/mobile/lib/l10n/generated/app_localizations_ro.dart @@ -5686,6 +5686,36 @@ class AppLocalizationsRo extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Căutare'; + + @override + String get emojiCategoryRecent => 'Recente'; + + @override + String get emojiCategorySmileys => 'Emoticoane și persoane'; + + @override + String get emojiCategoryAnimals => 'Animale și natură'; + + @override + String get emojiCategoryFood => 'Mâncare și băutură'; + + @override + String get emojiCategoryActivities => 'Activități'; + + @override + String get emojiCategoryTravel => 'Călătorii și locuri'; + + @override + String get emojiCategoryObjects => 'Obiecte'; + + @override + String get emojiCategorySymbols => 'Simboluri'; + + @override + String get emojiCategoryFlags => 'Steaguri'; + @override String get dmFormatBold => 'Aldin'; diff --git a/mobile/lib/l10n/generated/app_localizations_sv.dart b/mobile/lib/l10n/generated/app_localizations_sv.dart index d2d63980fb..f02c2766c9 100644 --- a/mobile/lib/l10n/generated/app_localizations_sv.dart +++ b/mobile/lib/l10n/generated/app_localizations_sv.dart @@ -5538,6 +5538,36 @@ class AppLocalizationsSv extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Sök'; + + @override + String get emojiCategoryRecent => 'Senaste'; + + @override + String get emojiCategorySmileys => 'Smileys och personer'; + + @override + String get emojiCategoryAnimals => 'Djur och natur'; + + @override + String get emojiCategoryFood => 'Mat och dryck'; + + @override + String get emojiCategoryActivities => 'Aktiviteter'; + + @override + String get emojiCategoryTravel => 'Resor och platser'; + + @override + String get emojiCategoryObjects => 'Objekt'; + + @override + String get emojiCategorySymbols => 'Symboler'; + + @override + String get emojiCategoryFlags => 'Flaggor'; + @override String get dmFormatBold => 'Fet'; diff --git a/mobile/lib/l10n/generated/app_localizations_tr.dart b/mobile/lib/l10n/generated/app_localizations_tr.dart index 3996fc7c7c..f1c095aac0 100644 --- a/mobile/lib/l10n/generated/app_localizations_tr.dart +++ b/mobile/lib/l10n/generated/app_localizations_tr.dart @@ -5519,6 +5519,36 @@ class AppLocalizationsTr extends AppLocalizations { @override String get dmReactionChipRetryAnnouncement => 'Retrying reaction'; + @override + String get emojiPickerSearchHint => 'Ara'; + + @override + String get emojiCategoryRecent => 'Son Kullanılanlar'; + + @override + String get emojiCategorySmileys => 'İfadeler ve İnsanlar'; + + @override + String get emojiCategoryAnimals => 'Hayvanlar ve Doğa'; + + @override + String get emojiCategoryFood => 'Yiyecek ve İçecek'; + + @override + String get emojiCategoryActivities => 'Etkinlikler'; + + @override + String get emojiCategoryTravel => 'Seyahat ve Yerler'; + + @override + String get emojiCategoryObjects => 'Nesneler'; + + @override + String get emojiCategorySymbols => 'Semboller'; + + @override + String get emojiCategoryFlags => 'Bayraklar'; + @override String get dmFormatBold => 'Kalın'; diff --git a/mobile/lib/screens/inbox/conversation/conversation_view.dart b/mobile/lib/screens/inbox/conversation/conversation_view.dart index 51ad8b8c40..b950267cf6 100644 --- a/mobile/lib/screens/inbox/conversation/conversation_view.dart +++ b/mobile/lib/screens/inbox/conversation/conversation_view.dart @@ -378,21 +378,13 @@ class _MessageList extends StatelessWidget { if (!context.mounted) return; if (result.emoji != null) { - context.read().add( - ConversationReactionToggled( - conversationId: message.conversationId, - messageId: message.id, - messageAuthorPubkey: message.senderPubkey, - emoji: result.emoji!, - ), - ); + _toggleReaction(context, message, result.emoji!); return; } if (result.openFullPicker) { - // Full picker integration is staged for v1 by triggering the - // emoji_picker_flutter sheet. Caller-side gating keeps this - // off the critical path while the dependency is wired in. - // TODO(#4633): wire full emoji_picker_flutter sheet. + final emoji = await FullReactionEmojiPickerSheet.show(context: context); + if (emoji == null || !context.mounted) return; + _toggleReaction(context, message, emoji); return; } final action = result.action; @@ -417,6 +409,17 @@ class _MessageList extends StatelessWidget { } } + void _toggleReaction(BuildContext context, DmMessage message, String emoji) { + context.read().add( + ConversationReactionToggled( + conversationId: message.conversationId, + messageId: message.id, + messageAuthorPubkey: message.senderPubkey, + emoji: emoji, + ), + ); + } + @override Widget build(BuildContext context) { return ListView.builder( diff --git a/mobile/lib/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet.dart b/mobile/lib/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet.dart new file mode 100644 index 0000000000..2cb3bae63f --- /dev/null +++ b/mobile/lib/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet.dart @@ -0,0 +1,87 @@ +// ABOUTME: Full emoji picker bottom sheet for DM custom reactions. Wraps +// ABOUTME: pro_image_editor's EmojiEditor in a Divine dark-styled sheet. + +import 'package:divine_ui/divine_ui.dart'; +import 'package:flutter/material.dart'; +import 'package:openvine/l10n/l10n.dart'; +import 'package:pro_image_editor/pro_image_editor.dart'; + +/// Bottom sheet that lets the user pick any emoji as a DM reaction. +/// +/// Wraps [EmojiEditor] from `pro_image_editor` — already a direct +/// dependency for the video editor — so the full emoji set is available +/// beyond the six quick reactions, without adding a new picker package. +/// The picked emoji flows through the same [ConversationReactionToggled] +/// path as a quick reaction. +class FullReactionEmojiPickerSheet { + /// Visible height of the picker body, excluding the keyboard inset. + static const double _bodyHeight = 320; + + /// Dark-mode picker styling. + /// + /// Paints every sub-surface — grid, search bar, category bar, and bottom + /// action bar — with [VineTheme.surfaceBackground] so the picker reads as a + /// single dark panel. The package defaults the search/category/emoji views + /// to light grey, which would otherwise stand out against the dark sheet. + /// [VineBottomSheet] supplies the drag handle, so the editor's own is off. + static const _emojiEditorStyle = EmojiEditorStyle( + backgroundColor: VineTheme.surfaceBackground, + showDragHandle: false, + searchViewConfig: SearchViewConfig( + backgroundColor: VineTheme.surfaceBackground, + buttonIconColor: VineTheme.onSurface, + ), + bottomActionBarConfig: BottomActionBarConfig( + backgroundColor: VineTheme.surfaceBackground, + buttonColor: VineTheme.surfaceBackground, + buttonIconColor: VineTheme.onSurface, + showBackspaceButton: false, + ), + categoryViewConfig: CategoryViewConfig( + backgroundColor: VineTheme.surfaceBackground, + ), + emojiViewConfig: EmojiViewConfig( + backgroundColor: VineTheme.surfaceBackground, + ), + ); + + /// Maps the picker's category / search labels to localized strings. + /// + /// [I18nEmojiEditor] defaults to hardcoded English; this wires each label + /// to its [AppLocalizations] value so the picker follows the app locale. + @visibleForTesting + static I18nEmojiEditor buildI18n(AppLocalizations l10n) => I18nEmojiEditor( + search: l10n.emojiPickerSearchHint, + categoryRecent: l10n.emojiCategoryRecent, + categorySmileys: l10n.emojiCategorySmileys, + categoryAnimals: l10n.emojiCategoryAnimals, + categoryFood: l10n.emojiCategoryFood, + categoryActivities: l10n.emojiCategoryActivities, + categoryTravel: l10n.emojiCategoryTravel, + categoryObjects: l10n.emojiCategoryObjects, + categorySymbols: l10n.emojiCategorySymbols, + categoryFlags: l10n.emojiCategoryFlags, + ); + + /// Shows the picker and resolves to the selected emoji, or `null` if the + /// sheet was dismissed without a choice. + static Future show({required BuildContext context}) async { + final configs = ProImageEditorConfigs( + i18n: I18n(emojiEditor: buildI18n(context.l10n)), + emojiEditor: const EmojiEditorConfigs(style: _emojiEditorStyle), + ); + + final layer = await VineBottomSheet.show( + context: context, + scrollable: false, + showHeader: false, + body: ConstrainedBox( + constraints: BoxConstraints( + maxHeight: _bodyHeight + MediaQuery.viewInsetsOf(context).bottom, + ), + child: EmojiEditor(configs: configs), + ), + ); + return layer?.emoji; + } +} diff --git a/mobile/lib/screens/inbox/conversation/widgets/widgets.dart b/mobile/lib/screens/inbox/conversation/widgets/widgets.dart index d1d64d12f0..29d1d5c6e4 100644 --- a/mobile/lib/screens/inbox/conversation/widgets/widgets.dart +++ b/mobile/lib/screens/inbox/conversation/widgets/widgets.dart @@ -1,6 +1,7 @@ export 'collaborator_invite_card.dart'; export 'conversation_app_bar.dart'; export 'empty_conversation.dart'; +export 'full_reaction_emoji_picker_sheet.dart'; export 'message_actions_sheet.dart'; export 'message_bubble.dart'; export 'message_input_bar.dart'; diff --git a/mobile/test/screens/inbox/conversation/conversation_view_test.dart b/mobile/test/screens/inbox/conversation/conversation_view_test.dart index 5addaff092..15b3860f6d 100644 --- a/mobile/test/screens/inbox/conversation/conversation_view_test.dart +++ b/mobile/test/screens/inbox/conversation/conversation_view_test.dart @@ -21,6 +21,7 @@ import 'package:openvine/providers/user_profile_providers.dart'; import 'package:openvine/screens/inbox/conversation/conversation_view.dart'; import 'package:openvine/screens/inbox/conversation/widgets/widgets.dart'; import 'package:openvine/services/video_event_service.dart'; +import 'package:pro_image_editor/pro_image_editor.dart'; import 'package:visibility_detector/visibility_detector.dart'; import '../../../builders/video_event_builder.dart'; @@ -1208,6 +1209,26 @@ void main() { ); }, ); + + // Closes #4710: the "+" affordance was a no-op stub. Proves the + // long-press → "+" path now dismisses the reaction overlay and + // opens the full emoji picker. + testWidgets( + 'tapping "+" in the reaction row opens the full emoji picker', + (tester) async { + await pumpWithMessage(tester); + + await tester.longPress(find.text('Hello there!')); + await tester.pumpAndSettle(); + + await tester.tap( + find.bySemanticsLabel(l10n.dmReactionAddCustomA11yLabel), + ); + await tester.pumpAndSettle(); + + expect(find.byType(EmojiEditor), findsOneWidget); + }, + ); }); }); } diff --git a/mobile/test/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet_test.dart b/mobile/test/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet_test.dart new file mode 100644 index 0000000000..88f306a09c --- /dev/null +++ b/mobile/test/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet_test.dart @@ -0,0 +1,109 @@ +// ABOUTME: Widget tests for FullReactionEmojiPickerSheet. +// ABOUTME: Verifies the sheet mounts the emoji picker and resolves its result. + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:openvine/l10n/l10n.dart'; +import 'package:openvine/screens/inbox/conversation/widgets/full_reaction_emoji_picker_sheet.dart'; +import 'package:pro_image_editor/pro_image_editor.dart'; + +import '../../../../helpers/test_provider_overrides.dart'; + +void main() { + group('FullReactionEmojiPickerSheet', () { + testWidgets('mounts the emoji picker when shown', (tester) async { + await tester.pumpWidget( + testMaterialApp( + home: Builder( + builder: (context) { + return Scaffold( + body: TextButton( + onPressed: () { + unawaited( + FullReactionEmojiPickerSheet.show(context: context), + ); + }, + child: const Text('open'), + ), + ); + }, + ), + ), + ); + + await tester.tap(find.text('open')); + await tester.pumpAndSettle(); + + expect(find.byType(EmojiEditor), findsOneWidget); + }); + + testWidgets('resolves to null when dismissed without a choice', ( + tester, + ) async { + String? selected; + var completed = false; + await tester.pumpWidget( + testMaterialApp( + home: Builder( + builder: (context) { + return Scaffold( + body: TextButton( + onPressed: () async { + selected = await FullReactionEmojiPickerSheet.show( + context: context, + ); + completed = true; + }, + child: const Text('open'), + ), + ); + }, + ), + ), + ); + + await tester.tap(find.text('open')); + await tester.pumpAndSettle(); + + // Dismiss the sheet without selecting an emoji. + Navigator.of(tester.element(find.byType(EmojiEditor))).pop(); + await tester.pumpAndSettle(); + + expect(completed, isTrue); + expect(selected, isNull); + }); + + group('buildI18n', () { + test('maps every category label to its localized value', () { + final en = lookupAppLocalizations(const Locale('en')); + final i18n = FullReactionEmojiPickerSheet.buildI18n(en); + + expect(i18n.search, en.emojiPickerSearchHint); + expect(i18n.categoryRecent, en.emojiCategoryRecent); + expect(i18n.categorySmileys, en.emojiCategorySmileys); + expect(i18n.categoryAnimals, en.emojiCategoryAnimals); + expect(i18n.categoryFood, en.emojiCategoryFood); + expect(i18n.categoryActivities, en.emojiCategoryActivities); + expect(i18n.categoryTravel, en.emojiCategoryTravel); + expect(i18n.categoryObjects, en.emojiCategoryObjects); + expect(i18n.categorySymbols, en.emojiCategorySymbols); + expect(i18n.categoryFlags, en.emojiCategoryFlags); + }); + + test('follows the active locale instead of hardcoded English', () { + final en = lookupAppLocalizations(const Locale('en')); + final de = lookupAppLocalizations(const Locale('de')); + + // German labels differ from English, proving the picker reads from + // l10n rather than the package's hardcoded English defaults. + expect(de.emojiCategorySmileys, isNot(en.emojiCategorySmileys)); + expect( + FullReactionEmojiPickerSheet.buildI18n(de).categorySmileys, + de.emojiCategorySmileys, + ); + }); + }); + }); +} diff --git a/mobile/test/screens/inbox/conversation/widgets/reaction_picker_overlay_test.dart b/mobile/test/screens/inbox/conversation/widgets/reaction_picker_overlay_test.dart index bb24e6b44a..544f1e814b 100644 --- a/mobile/test/screens/inbox/conversation/widgets/reaction_picker_overlay_test.dart +++ b/mobile/test/screens/inbox/conversation/widgets/reaction_picker_overlay_test.dart @@ -69,15 +69,37 @@ void main() { expect(find.text('Copy text'), findsNothing); }); - testWidgets('dismisses after selecting the full-picker affordance', ( + testWidgets('"+" affordance dismisses and pops openFullPicker', ( tester, ) async { - await openOverlay(tester); + ReactionPickerResult? result; + await tester.pumpWidget( + testMaterialApp( + home: Builder( + builder: (context) { + return Scaffold( + body: TextButton( + onPressed: () async { + result = await ReactionPickerOverlay.show( + context: context, + isSent: false, + ); + }, + child: const Text('open'), + ), + ); + }, + ), + ), + ); + await tester.tap(find.text('open')); + await tester.pumpAndSettle(); await tester.tap(find.bySemanticsLabel('Add custom emoji reaction')); await tester.pumpAndSettle(); expect(find.bySemanticsLabel('Add custom emoji reaction'), findsNothing); + expect(result?.openFullPicker, isTrue); }); testWidgets('omits picker row when showPicker is false', (tester) async {