rain confetti on activity finish (#4715)

* rain confetti on activity finish

also add continue button, and change copy for completed single practice activities

* fix: show confetti popup when finish all activities with grammar activity

* translations

---------

Co-authored-by: ggurdin <ggurdin@gmail.com>
This commit is contained in:
avashilling 2025-11-20 14:55:27 -05:00 committed by GitHub
parent 54c74cbb33
commit 6e8a6f8332
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
60 changed files with 403 additions and 72 deletions

View file

@ -1,6 +1,6 @@
{
"@@locale": "ar",
"@@last_modified": "2025-11-20 12:39:04.749371",
"@@last_modified": "2025-11-20 14:54:02.760300",
"about": "حول",
"@about": {
"type": "String",
@ -10795,5 +10795,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "تم الانتهاء من نشاط الممارسة",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1915,7 +1915,7 @@
"playWithAI": "Пакуль гуляйце з ШІ",
"courseStartDesc": "Pangea Bot гатовы да працы ў любы час!\n\n...але навучанне лепш з сябрамі!",
"@@locale": "be",
"@@last_modified": "2025-11-20 12:38:48.985011",
"@@last_modified": "2025-11-20 14:53:56.300239",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11677,5 +11677,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Практычная дзейнасць завершана",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:17.140740",
"@@last_modified": "2025-11-20 14:54:10.871486",
"about": "সম্পর্কে",
"@about": {
"type": "String",
@ -11682,5 +11682,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "অভ্যাস কার্যক্রম সম্পন্ন",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4282,7 +4282,7 @@
"joinPublicTrip": "མི་ཚེས་ལ་ལོག་འབད།",
"startOwnTrip": "ངེད་རང་གི་ལོག་ལ་སྦྱོར་བཅོས།",
"@@locale": "bo",
"@@last_modified": "2025-11-20 12:39:14.389283",
"@@last_modified": "2025-11-20 14:54:09.235231",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -10328,5 +10328,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktik aktiviti telah diselesaikan",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:55.798385",
"@@last_modified": "2025-11-20 14:53:57.101713",
"about": "Quant a",
"@about": {
"type": "String",
@ -10602,5 +10602,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Activitat de pràctica completada",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "cs",
"@@last_modified": "2025-11-20 12:38:46.113217",
"@@last_modified": "2025-11-20 14:53:54.804617",
"about": "O aplikaci",
"@about": {
"type": "String",
@ -11185,5 +11185,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivita cvičení byla dokončena",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1934,7 +1934,7 @@
"playWithAI": "Leg med AI for nu",
"courseStartDesc": "Pangea Bot er klar til at starte når som helst!\n\n...men læring er bedre med venner!",
"@@locale": "da",
"@@last_modified": "2025-11-20 12:38:22.209817",
"@@last_modified": "2025-11-20 14:53:35.097620",
"@aboutHomeserver": {
"type": "String",
"placeholders": {
@ -11640,5 +11640,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Øvelsesaktivitet fuldført",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "de",
"@@last_modified": "2025-11-20 12:38:39.354858",
"@@last_modified": "2025-11-20 14:53:50.178435",
"alwaysUse24HourFormat": "true",
"@alwaysUse24HourFormat": {
"description": "Set to true to always display time of day in 24 hour format."
@ -10585,5 +10585,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Übungsaktivität abgeschlossen",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4460,7 +4460,7 @@
"playWithAI": "Παίξτε με την Τεχνητή Νοημοσύνη προς το παρόν",
"courseStartDesc": "Ο Pangea Bot είναι έτοιμος να ξεκινήσει οποιαδήποτε στιγμή!\n\n...αλλά η μάθηση είναι καλύτερη με φίλους!",
"@@locale": "el",
"@@last_modified": "2025-11-20 12:39:22.667055",
"@@last_modified": "2025-11-20 14:54:14.475585",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11636,5 +11636,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Η δραστηριότητα πρακτικής ολοκληρώθηκε",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4955,6 +4955,7 @@
"teacherModeTitle": "Teacher Mode",
"teacherModeDesc": "Toggle to unlock all topics and activities. Course admin only.",
"noSavedActivitiesYet": "Activities will appear here once they are completed and saved.",
"practiceActivityCompleted": "Practice activity completed",
"changeCourse": "Change course",
"changeCourseDesc": "Here you can change this course's course plan."
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:27.591280",
"@@last_modified": "2025-11-20 14:54:18.264427",
"about": "Prio",
"@about": {
"type": "String",
@ -11667,5 +11667,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktika aktiveco finita",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "es",
"@@last_modified": "2025-11-20 12:38:17.219618",
"@@last_modified": "2025-11-20 14:53:31.098192",
"about": "Acerca de",
"@about": {
"type": "String",
@ -7813,5 +7813,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Actividad de práctica completada",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "et",
"@@last_modified": "2025-11-20 12:38:38.325390",
"@@last_modified": "2025-11-20 14:53:49.442060",
"about": "Rakenduse teave",
"@about": {
"type": "String",
@ -10849,5 +10849,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Harjutustegevus lõpetatud",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "eu",
"@@last_modified": "2025-11-20 12:38:36.071015",
"@@last_modified": "2025-11-20 14:53:47.461492",
"about": "Honi buruz",
"@about": {
"type": "String",
@ -10578,5 +10578,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktika jarduera amaituta",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:18.369784",
"@@last_modified": "2025-11-20 14:54:11.691213",
"repeatPassword": "تکرار رمزعبور",
"@repeatPassword": {},
"about": "درباره",
@ -11310,5 +11310,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "فعالیت تمرینی کامل شد",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4013,7 +4013,7 @@
"playWithAI": "Leiki tekoälyn kanssa nyt",
"courseStartDesc": "Pangea Bot on valmis milloin tahansa!\n\n...mutta oppiminen on parempaa ystävien kanssa!",
"@@locale": "fi",
"@@last_modified": "2025-11-20 12:38:20.199337",
"@@last_modified": "2025-11-20 14:53:34.208462",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11201,5 +11201,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Harjoitustoiminta suoritettu",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2791,7 +2791,7 @@
"selectAll": "Piliin lahat",
"deselectAll": "Huwag piliin lahat",
"@@locale": "fil",
"@@last_modified": "2025-11-20 12:39:01.960523",
"@@last_modified": "2025-11-20 14:54:01.155789",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11554,5 +11554,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Natapos ang aktibidad sa pagsasanay",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "fr",
"@@last_modified": "2025-11-20 12:39:33.718195",
"@@last_modified": "2025-11-20 14:54:22.927028",
"about": "À propos",
"@about": {
"type": "String",
@ -10902,5 +10902,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Activité de pratique terminée",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4521,7 +4521,7 @@
"playWithAI": "Imir le AI faoi láthair",
"courseStartDesc": "Tá Bot Pangea réidh chun dul am ar bith!\n\n...ach is fearr foghlaim le cairde!",
"@@locale": "ga",
"@@last_modified": "2025-11-20 12:39:32.391774",
"@@last_modified": "2025-11-20 14:54:22.114918",
"@customReaction": {
"type": "String",
"placeholders": {}
@ -10576,5 +10576,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Críochnaíodh an gníomhaíocht chleachtais",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "gl",
"@@last_modified": "2025-11-20 12:38:18.326177",
"@@last_modified": "2025-11-20 14:53:32.298371",
"about": "Acerca de",
"@about": {
"type": "String",
@ -10575,5 +10575,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Actividade de práctica completada",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:31.739043",
"@@last_modified": "2025-11-20 14:53:44.448591",
"about": "אודות",
"@about": {
"type": "String",
@ -11627,5 +11627,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "פעילות תרגול הושלמה",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4487,7 +4487,7 @@
"playWithAI": "अभी के लिए एआई के साथ खेलें",
"courseStartDesc": "पैंजिया बॉट कभी भी जाने के लिए तैयार है!\n\n...लेकिन दोस्तों के साथ सीखना बेहतर है!",
"@@locale": "hi",
"@@last_modified": "2025-11-20 12:39:26.351630",
"@@last_modified": "2025-11-20 14:54:17.425082",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11663,5 +11663,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "अभ्यास गतिविधि पूरी हुई",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hr",
"@@last_modified": "2025-11-20 12:38:30.674058",
"@@last_modified": "2025-11-20 14:53:43.599159",
"about": "Informacije",
"@about": {
"type": "String",
@ -10950,5 +10950,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivnost vježbanja završena",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "hu",
"@@last_modified": "2025-11-20 12:38:23.399921",
"@@last_modified": "2025-11-20 14:53:36.261794",
"about": "Névjegy",
"@about": {
"type": "String",
@ -10579,5 +10579,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Gyakorló tevékenység befejezve",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1962,7 +1962,7 @@
"playWithAI": "Joca con le IA pro ora",
"courseStartDesc": "Pangea Bot es preste a comenzar a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ia",
"@@last_modified": "2025-11-20 12:38:33.310279",
"@@last_modified": "2025-11-20 14:53:45.693586",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11656,5 +11656,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktiko aktivita finita",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:25.008007",
"@@last_modified": "2025-11-20 14:53:37.035253",
"setAsCanonicalAlias": "Atur sebagai alias utama",
"@setAsCanonicalAlias": {
"type": "String",
@ -10569,5 +10569,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivitas latihan selesai",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4376,7 +4376,7 @@
"playWithAI": "Joca con AI pro ora",
"courseStartDesc": "Pangea Bot es preste a partir a qualunque momento!\n\n...ma apprender es melior con amicos!",
"@@locale": "ie",
"@@last_modified": "2025-11-20 12:38:29.133545",
"@@last_modified": "2025-11-20 14:53:42.684180",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11552,5 +11552,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktiko aktivita kompletita",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:43.010339",
"@@last_modified": "2025-11-20 14:53:53.093014",
"about": "Informazioni",
"@about": {
"type": "String",
@ -10581,5 +10581,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Attività di pratica completata",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ja",
"@@last_modified": "2025-11-20 12:39:23.909449",
"@@last_modified": "2025-11-20 14:54:15.873729",
"about": "このアプリについて",
"@about": {
"type": "String",
@ -11368,5 +11368,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "練習活動が完了しました",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2598,7 +2598,7 @@
"playWithAI": "ამ დროისთვის ითამაშეთ AI-თან",
"courseStartDesc": "Pangea Bot მზადაა ნებისმიერ დროს გასასვლელად!\n\n...მაგრამ სწავლა უკეთესია მეგობრებთან ერთად!",
"@@locale": "ka",
"@@last_modified": "2025-11-20 12:39:30.042222",
"@@last_modified": "2025-11-20 14:54:20.259278",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11608,5 +11608,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "პრაქტიკის აქტივობა დასრულდა",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:15.496170",
"@@last_modified": "2025-11-20 14:53:30.116789",
"about": "소개",
"@about": {
"type": "String",
@ -10686,5 +10686,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "연습 활동이 완료되었습니다",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3865,7 +3865,7 @@
"playWithAI": "Žaiskite su dirbtiniu intelektu dabar",
"courseStartDesc": "Pangea botas pasiruošęs bet kada pradėti!\n\n...bet mokymasis yra geresnis su draugais!",
"@@locale": "lt",
"@@last_modified": "2025-11-20 12:39:09.565316",
"@@last_modified": "2025-11-20 14:54:05.562745",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11383,5 +11383,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Praktikos veikla baigta",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4486,7 +4486,7 @@
"playWithAI": "Tagad spēlējiet ar AI",
"courseStartDesc": "Pangea bots ir gatavs jebkurā laikā!\n\n...bet mācīties ir labāk ar draugiem!",
"@@locale": "lv",
"@@last_modified": "2025-11-20 12:39:03.415375",
"@@last_modified": "2025-11-20 14:54:02.050011",
"analyticsInactiveTitle": "Pieprasījumi neaktīviem lietotājiem nevar tikt nosūtīti",
"analyticsInactiveDesc": "Neaktīvi lietotāji, kuri nav pieteikušies kopš šīs funkcijas ieviešanas, neredzēs jūsu pieprasījumu.\n\nPieprasījuma poga parādīsies, kad viņi atgriezīsies. Jūs varat atkārtoti nosūtīt pieprasījumu vēlāk, noklikšķinot uz pieprasījuma pogas viņu vārdā, kad tā būs pieejama.",
"accessRequestedTitle": "Pieprasījums piekļūt analītikai",
@ -10564,5 +10564,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Prakses aktivitāte pabeigta",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:47.529512",
"@@last_modified": "2025-11-20 14:53:55.552111",
"about": "Om",
"@about": {
"type": "String",
@ -11671,5 +11671,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Øvingsaktivitet fullført",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:13.229885",
"@@last_modified": "2025-11-20 14:54:08.318051",
"about": "Over ons",
"@about": {
"type": "String",
@ -10578,5 +10578,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Oefenactiviteit voltooid",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "pl",
"@@last_modified": "2025-11-20 12:39:20.003666",
"@@last_modified": "2025-11-20 14:54:12.599201",
"about": "O aplikacji",
"@about": {
"type": "String",
@ -10578,5 +10578,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktywność praktyczna zakończona",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:37.248064",
"@@last_modified": "2025-11-20 14:53:48.565172",
"copiedToClipboard": "Copiada para a área de transferência",
"@copiedToClipboard": {
"type": "String",
@ -11678,5 +11678,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Atividade de prática concluída",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:34.435839",
"@@last_modified": "2025-11-20 14:53:46.544212",
"about": "Sobre",
"@about": {
"type": "String",
@ -10936,5 +10936,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Atividade de prática concluída",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -3335,7 +3335,7 @@
"selectAll": "Selecionar tudo",
"deselectAll": "Desmarcar tudo",
"@@locale": "pt_PT",
"@@last_modified": "2025-11-20 12:38:58.794363",
"@@last_modified": "2025-11-20 14:53:59.030209",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11607,5 +11607,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Atividade de prática concluída",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:38:26.175424",
"@@last_modified": "2025-11-20 14:53:39.359488",
"about": "Despre",
"@about": {
"type": "String",
@ -11313,5 +11313,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Activitate de practică finalizată",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "ru",
"@@last_modified": "2025-11-20 12:39:28.706564",
"@@last_modified": "2025-11-20 14:54:19.249444",
"about": "О проекте",
"@about": {
"type": "String",
@ -10683,5 +10683,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Практическое задание завершено",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "sk",
"@@last_modified": "2025-11-20 12:38:27.288377",
"@@last_modified": "2025-11-20 14:53:40.669714",
"about": "O aplikácii",
"@about": {
"type": "String",
@ -11662,5 +11662,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivita cvičenia dokončená",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -2468,7 +2468,7 @@
"playWithAI": "Za zdaj igrajte z AI-jem",
"courseStartDesc": "Pangea Bot je pripravljen kadarkoli!\n\n...ampak je bolje učiti se s prijatelji!",
"@@locale": "sl",
"@@last_modified": "2025-11-20 12:38:40.685640",
"@@last_modified": "2025-11-20 14:53:51.206505",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11659,5 +11659,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivnost vadbe zaključena",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:31.189262",
"@@last_modified": "2025-11-20 14:54:21.092644",
"about": "О програму",
"@about": {
"type": "String",
@ -11680,5 +11680,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Aktivnost vežbanja je završena",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:21.247328",
"@@last_modified": "2025-11-20 14:54:13.498644",
"about": "Om",
"@about": {
"type": "String",
@ -11056,5 +11056,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Övningsaktivitet slutförd",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:12.125435",
"@@last_modified": "2025-11-20 14:54:07.409352",
"acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது",
"@acceptedTheInvitation": {
"type": "String",
@ -10802,5 +10802,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "பயிற்சி செயல்பாடு முடிந்தது",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1924,7 +1924,7 @@
"playWithAI": "ఇప్పుడే AI తో ఆడండి",
"courseStartDesc": "పాంజియా బాట్ ఎప్పుడైనా సిద్ధంగా ఉంటుంది!\n\n...కానీ స్నేహితులతో నేర్చుకోవడం మెరుగైనది!",
"@@locale": "te",
"@@last_modified": "2025-11-20 12:39:07.913220",
"@@last_modified": "2025-11-20 14:54:04.730180",
"@setCustomPermissionLevel": {
"type": "String",
"placeholders": {}
@ -11667,5 +11667,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "అభ్యాస కార్యకలాపం పూర్తయింది",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -4460,7 +4460,7 @@
"playWithAI": "เล่นกับ AI ชั่วคราว",
"courseStartDesc": "Pangea Bot พร้อมที่จะเริ่มต้นได้ทุกเมื่อ!\n\n...แต่การเรียนรู้ดีกว่ากับเพื่อน!",
"@@locale": "th",
"@@last_modified": "2025-11-20 12:38:57.356247",
"@@last_modified": "2025-11-20 14:53:58.064329",
"@alwaysUse24HourFormat": {
"type": "String",
"placeholders": {}
@ -11636,5 +11636,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "กิจกรรมการฝึกซ้อมเสร็จสิ้น",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "tr",
"@@last_modified": "2025-11-20 12:39:06.593277",
"@@last_modified": "2025-11-20 14:54:03.661128",
"about": "Hakkında",
"@about": {
"type": "String",
@ -10800,5 +10800,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Pratik etkinliği tamamlandı",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "uk",
"@@last_modified": "2025-11-20 12:38:44.579835",
"@@last_modified": "2025-11-20 14:53:53.830897",
"about": "Про застосунок",
"@about": {
"type": "String",
@ -10572,5 +10572,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Практична діяльність завершена",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:10.677258",
"@@last_modified": "2025-11-20 14:54:06.548321",
"about": "Giới thiệu",
"@about": {
"type": "String",
@ -6148,5 +6148,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "Hoạt động thực hành đã hoàn thành",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1860,7 +1860,7 @@
"selectAll": "全選",
"deselectAll": "取消全選",
"@@locale": "yue",
"@@last_modified": "2025-11-20 12:38:42.034948",
"@@last_modified": "2025-11-20 14:53:52.037690",
"@ignoreUser": {
"type": "String",
"placeholders": {}
@ -11669,5 +11669,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "練習活動已完成",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,6 +1,6 @@
{
"@@locale": "zh",
"@@last_modified": "2025-11-20 12:39:15.698399",
"@@last_modified": "2025-11-20 14:54:09.943983",
"about": "关于",
"@about": {
"type": "String",
@ -10569,5 +10569,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "练习活动已完成",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -1,5 +1,5 @@
{
"@@last_modified": "2025-11-20 12:39:00.347163",
"@@last_modified": "2025-11-20 14:53:59.953711",
"about": "關於",
"@about": {
"type": "String",
@ -10576,5 +10576,10 @@
"@changeCourseDesc": {
"type": "String",
"placeholders": {}
},
"practiceActivityCompleted": "練習活動已完成",
"@practiceActivityCompleted": {
"type": "String",
"placeholders": {}
}
}

View file

@ -5,15 +5,18 @@ import 'package:flutter/material.dart';
import 'package:confetti/confetti.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/widgets/matrix.dart';
class StarRainWidget extends StatefulWidget {
final bool showBlast;
final Duration rainDuration;
final Duration blastDuration;
final VoidCallback? onFinished;
final String? overlayKey;
const StarRainWidget({
super.key,
this.overlayKey,
this.showBlast = true,
this.rainDuration = const Duration(seconds: 8),
this.blastDuration = const Duration(seconds: 1),
@ -57,6 +60,10 @@ class _StarRainWidgetState extends State<StarRainWidget> {
});
}
await Future.delayed(const Duration(milliseconds: 800));
if (widget.overlayKey != null) {
MatrixState.pAnyState.closeOverlay(widget.overlayKey);
}
widget.onFinished?.call();
if (mounted) {
_blastController.stop();

View file

@ -3,6 +3,7 @@ import 'dart:developer';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:fluffychat/pangea/analytics_misc/level_up/star_rain_widget.dart';
import 'package:fluffychat/pangea/choreographer/choreo_constants.dart';
import 'package:fluffychat/pangea/choreographer/choreographer.dart';
import 'package:fluffychat/pangea/choreographer/igc/pangea_match_state_model.dart';
@ -273,4 +274,17 @@ class OverlayUtil {
blockOverlay: true,
);
}
static void showStarRainOverlay(BuildContext context) {
showOverlay(
context: context,
position: OverlayPositionEnum.centered,
closePrevOverlay: false,
canPop: false,
overlayKey: "star_rain_level_up",
child: const StarRainWidget(
overlayKey: "star_rain_level_up",
),
);
}
}

View file

@ -179,13 +179,9 @@ class TokenPracticeButtonState extends State<TokenPracticeButton>
);
return;
}
widget.overlayController!.onChoiceSelect(null);
widget.overlayController!.activity!.onMatch(
widget.token,
form,
widget.overlayController!.pangeaMessageEvent,
() => widget.overlayController!.setState(() {}),
);
widget.overlayController!.onMatch(widget.token, form);
}
bool get _isEmpty {

View file

@ -132,8 +132,7 @@ class MessageMorphInputBarContentState
),
onTap: () {
setState(() => selectedTag = choice);
widget.activity.onMultipleChoiceSelect(
widget.overlayController.onMatch(
token,
PracticeChoice(
choiceContent: choice,
@ -145,8 +144,6 @@ class MessageMorphInputBarContentState
form: token.text.content,
),
),
widget.overlayController.pangeaMessageEvent,
() => overlay.setState(() {}),
);
},
isSelected: selectedTag == choice,

View file

@ -6,6 +6,7 @@ import 'package:fluffychat/pangea/toolbar/enums/message_mode_enum.dart';
import 'package:fluffychat/pangea/toolbar/widgets/message_selection_overlay.dart';
import 'package:fluffychat/pangea/toolbar/widgets/practice_activity/practice_activity_card.dart';
import 'package:fluffychat/pangea/toolbar/widgets/practice_mode_buttons.dart';
import 'package:fluffychat/widgets/matrix.dart';
const double minContentHeight = 120;
@ -57,11 +58,7 @@ class ReadingAssistanceInputBarState extends State<ReadingAssistanceInputBar> {
case MessageMode.noneSelected:
case MessageMode.messageMeaning:
content = overlayController.isTotallyDone
? Text(
L10n.of(context).allDone,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
)
? const AllDoneWidget()
: Text(
L10n.of(context).choosePracticeMode,
style: Theme.of(context)
@ -74,9 +71,11 @@ class ReadingAssistanceInputBarState extends State<ReadingAssistanceInputBar> {
case MessageMode.wordEmoji:
case MessageMode.wordMeaning:
case MessageMode.listening:
if (target == null || activityCompleted) {
if (overlayController.isTotallyDone) {
content = const AllDoneWidget();
} else if (target == null || activityCompleted) {
content = Text(
L10n.of(context).allDone,
L10n.of(context).practiceActivityCompleted,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
);
@ -87,9 +86,11 @@ class ReadingAssistanceInputBarState extends State<ReadingAssistanceInputBar> {
);
}
case MessageMode.wordMorph:
if (activityCompleted) {
if (overlayController.isTotallyDone) {
content = const AllDoneWidget();
} else if (activityCompleted) {
content = Text(
L10n.of(context).allDone,
L10n.of(context).practiceActivityCompleted,
style: Theme.of(context).textTheme.bodyLarge,
textAlign: TextAlign.center,
);
@ -149,3 +150,32 @@ class ReadingAssistanceInputBarState extends State<ReadingAssistanceInputBar> {
);
}
}
class AllDoneWidget extends StatelessWidget {
const AllDoneWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
spacing: 8,
children: [
Text(
L10n.of(context).allDone,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.bold,
letterSpacing: 0.5,
),
textAlign: TextAlign.center,
),
ElevatedButton(
child: Text(L10n.of(context).continueText),
onPressed: () {
MatrixState.pAnyState.closeOverlay();
},
),
],
);
}
}

View file

@ -322,6 +322,27 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
setState(() {});
}
void onMatch(PangeaToken token, PracticeChoice choice) {
if (activity == null) return;
activity!.activityType == ActivityTypeEnum.morphId
? activity!.onMultipleChoiceSelect(
token,
choice,
pangeaMessageEvent,
() => setState(() {}),
)
: activity!.onMatch(
token,
choice,
pangeaMessageEvent,
() => setState(() {}),
);
if (isTotallyDone) {
OverlayUtil.showStarRainOverlay(context);
}
}
/////////////////////////////////////
/// Getters
////////////////////////////////////