From c8640a801000094116ec3f0bf71e70e24ef7468c Mon Sep 17 00:00:00 2001 From: Tommaso Casaburi Date: Wed, 13 May 2026 23:55:38 +0700 Subject: [PATCH] fix(settings): show latest update feedback --- public/translations/ar/default.json | 3 +- public/translations/bn/default.json | 3 +- public/translations/cs/default.json | 3 +- public/translations/da/default.json | 3 +- public/translations/de/default.json | 3 +- public/translations/el/default.json | 3 +- public/translations/en/default.json | 3 +- public/translations/es/default.json | 3 +- public/translations/fa/default.json | 3 +- public/translations/fi/default.json | 3 +- public/translations/fil/default.json | 3 +- public/translations/fr/default.json | 3 +- public/translations/he/default.json | 3 +- public/translations/hi/default.json | 3 +- public/translations/hu/default.json | 3 +- public/translations/id/default.json | 3 +- public/translations/it/default.json | 3 +- public/translations/ja/default.json | 3 +- public/translations/ko/default.json | 3 +- public/translations/mr/default.json | 3 +- public/translations/nl/default.json | 3 +- public/translations/no/default.json | 3 +- public/translations/pl/default.json | 3 +- public/translations/pt/default.json | 3 +- public/translations/ro/default.json | 3 +- public/translations/ru/default.json | 3 +- public/translations/sq/default.json | 3 +- public/translations/sv/default.json | 3 +- public/translations/te/default.json | 3 +- public/translations/th/default.json | 3 +- public/translations/tr/default.json | 3 +- public/translations/uk/default.json | 3 +- public/translations/ur/default.json | 3 +- public/translations/vi/default.json | 3 +- public/translations/zh/default.json | 3 +- .../__tests__/interface-settings.test.tsx | 31 +++++++++++++++++++ .../interface-settings/app-update-setting.tsx | 13 +++++++- src/stores/use-app-update-store.ts | 31 +++++++++++++++++++ 38 files changed, 144 insertions(+), 36 deletions(-) diff --git a/public/translations/ar/default.json b/public/translations/ar/default.json index 30025521..6f7c301f 100644 --- a/public/translations/ar/default.json +++ b/public/translations/ar/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "هل سيتحكم 5chan Pass في إدارة الدليل؟", - "pass_answer_governance": "لا. التوجه الحالي هو أن حاملي 5chan Pass يمكنهم المشاركة في التصويت على الدليل، لكن آليات الحوكمة النهائية يجب أن تتضمن مواءمة BSO-holder وضمانات بدلاً من منح حاملي pass وحدهم السيطرة النهائية." + "pass_answer_governance": "لا. التوجه الحالي هو أن حاملي 5chan Pass يمكنهم المشاركة في التصويت على الدليل، لكن آليات الحوكمة النهائية يجب أن تتضمن مواءمة BSO-holder وضمانات بدلاً من منح حاملي pass وحدهم السيطرة النهائية.", + "app_is_up_to_date": "أنت على أحدث إصدار" } diff --git a/public/translations/bn/default.json b/public/translations/bn/default.json index 5daf074f..a11629f9 100644 --- a/public/translations/bn/default.json +++ b/public/translations/bn/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass কি ডিরেক্টরি শাসন নিয়ন্ত্রণ করবে?", - "pass_answer_governance": "না। বর্তমান দিকনির্দেশনা হলো 5chan Pass ধারকেরা ডিরেক্টরি ভোটিংয়ে অংশ নিতে পারবেন, তবে চূড়ান্ত শাসনব্যবস্থায় শুধু pass-ধারীদের চূড়ান্ত নিয়ন্ত্রণের বদলে BSO-holder alignment এবং সুরক্ষা ব্যবস্থা থাকতে হবে।" + "pass_answer_governance": "না। বর্তমান দিকনির্দেশনা হলো 5chan Pass ধারকেরা ডিরেক্টরি ভোটিংয়ে অংশ নিতে পারবেন, তবে চূড়ান্ত শাসনব্যবস্থায় শুধু pass-ধারীদের চূড়ান্ত নিয়ন্ত্রণের বদলে BSO-holder alignment এবং সুরক্ষা ব্যবস্থা থাকতে হবে।", + "app_is_up_to_date": "আপনি সর্বশেষ সংস্করণে আছেন" } diff --git a/public/translations/cs/default.json b/public/translations/cs/default.json index 15943cfa..0e5d010d 100644 --- a/public/translations/cs/default.json +++ b/public/translations/cs/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Bude 5chan Pass řídit správu adresáře?", - "pass_answer_governance": "Ne. Současný směr je takový, že držitelé 5chan Pass se mohou účastnit hlasování o adresáři, ale konečné mechanismy správy by měly zahrnovat sladění s BSO-holder a ochranné prvky namísto toho, aby konečnou kontrolu měli pouze držitelé passu." + "pass_answer_governance": "Ne. Současný směr je takový, že držitelé 5chan Pass se mohou účastnit hlasování o adresáři, ale konečné mechanismy správy by měly zahrnovat sladění s BSO-holder a ochranné prvky namísto toho, aby konečnou kontrolu měli pouze držitelé passu.", + "app_is_up_to_date": "máte nejnovější verzi" } diff --git a/public/translations/da/default.json b/public/translations/da/default.json index 541d389f..fc434d86 100644 --- a/public/translations/da/default.json +++ b/public/translations/da/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Vil 5chan Pass kontrollere katalogets styring?", - "pass_answer_governance": "Nej. Den nuværende retning er, at indehavere af 5chan Pass kan deltage i afstemning om kataloget, men de endelige styringsmekanismer bør omfatte BSO-holder-tilpasning og sikkerhedsforanstaltninger i stedet for, at pass-indehavere alene har den endelige kontrol." + "pass_answer_governance": "Nej. Den nuværende retning er, at indehavere af 5chan Pass kan deltage i afstemning om kataloget, men de endelige styringsmekanismer bør omfatte BSO-holder-tilpasning og sikkerhedsforanstaltninger i stedet for, at pass-indehavere alene har den endelige kontrol.", + "app_is_up_to_date": "du har den nyeste version" } diff --git a/public/translations/de/default.json b/public/translations/de/default.json index 31013ef9..38e60972 100644 --- a/public/translations/de/default.json +++ b/public/translations/de/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Wird 5chan Pass die Verzeichnis-Governance steuern?", - "pass_answer_governance": "Nein. Die aktuelle Richtung ist, dass Inhaber von 5chan Pass an Verzeichnisabstimmungen teilnehmen können, aber die endgültigen Governance-Mechanismen sollten eine Ausrichtung auf BSO-holder und Schutzmechanismen enthalten, statt den Inhabern des Passes allein die endgültige Kontrolle zu geben." + "pass_answer_governance": "Nein. Die aktuelle Richtung ist, dass Inhaber von 5chan Pass an Verzeichnisabstimmungen teilnehmen können, aber die endgültigen Governance-Mechanismen sollten eine Ausrichtung auf BSO-holder und Schutzmechanismen enthalten, statt den Inhabern des Passes allein die endgültige Kontrolle zu geben.", + "app_is_up_to_date": "du hast die neueste Version" } diff --git a/public/translations/el/default.json b/public/translations/el/default.json index bf3f446d..1a903d50 100644 --- a/public/translations/el/default.json +++ b/public/translations/el/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Θα ελέγχει το 5chan Pass τη διακυβέρνηση του καταλόγου;", - "pass_answer_governance": "Όχι. Η τρέχουσα κατεύθυνση είναι ότι οι κάτοχοι του 5chan Pass μπορούν να συμμετέχουν στην ψηφοφορία καταλόγου, αλλά οι τελικοί μηχανισμοί διακυβέρνησης θα πρέπει να περιλαμβάνουν ευθυγράμμιση με τους BSO-holder και δικλίδες ασφαλείας αντί για τελικό έλεγχο μόνο από κατόχους pass." + "pass_answer_governance": "Όχι. Η τρέχουσα κατεύθυνση είναι ότι οι κάτοχοι του 5chan Pass μπορούν να συμμετέχουν στην ψηφοφορία καταλόγου, αλλά οι τελικοί μηχανισμοί διακυβέρνησης θα πρέπει να περιλαμβάνουν ευθυγράμμιση με τους BSO-holder και δικλίδες ασφαλείας αντί για τελικό έλεγχο μόνο από κατόχους pass.", + "app_is_up_to_date": "έχετε την πιο πρόσφατη έκδοση" } diff --git a/public/translations/en/default.json b/public/translations/en/default.json index 93e1c55e..e9d3b50d 100644 --- a/public/translations/en/default.json +++ b/public/translations/en/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Will 5chan Pass control directory governance?", - "pass_answer_governance": "No. The current direction is that 5chan Pass holders can participate in directory voting, but final governance mechanics should include BSO-holder alignment and safeguards instead of pass-only final control." + "pass_answer_governance": "No. The current direction is that 5chan Pass holders can participate in directory voting, but final governance mechanics should include BSO-holder alignment and safeguards instead of pass-only final control.", + "app_is_up_to_date": "you're on latest" } diff --git a/public/translations/es/default.json b/public/translations/es/default.json index e4c7ad75..fa238682 100644 --- a/public/translations/es/default.json +++ b/public/translations/es/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "¿Controlará 5chan Pass la gobernanza del directorio?", - "pass_answer_governance": "No. La dirección actual es que los titulares de 5chan Pass puedan participar en la votación del directorio, pero los mecanismos finales de gobernanza deben incluir alineación con BSO-holder y salvaguardas en lugar de un control final exclusivo de los titulares del pass." + "pass_answer_governance": "No. La dirección actual es que los titulares de 5chan Pass puedan participar en la votación del directorio, pero los mecanismos finales de gobernanza deben incluir alineación con BSO-holder y salvaguardas en lugar de un control final exclusivo de los titulares del pass.", + "app_is_up_to_date": "ya tienes la última versión" } diff --git a/public/translations/fa/default.json b/public/translations/fa/default.json index 5d4f3c69..859f9349 100644 --- a/public/translations/fa/default.json +++ b/public/translations/fa/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "آیا 5chan Pass کنترل حاکمیت دایرکتوری را در دست خواهد گرفت؟", - "pass_answer_governance": "خیر. جهت‌گیری فعلی این است که دارندگان 5chan Pass بتوانند در رأی‌گیری دایرکتوری شرکت کنند، اما سازوکارهای نهایی حاکمیتی باید به‌جای کنترل نهایی فقط توسط دارندگان pass، شامل هم‌راستایی با BSO-holder و سازوکارهای حفاظتی باشند." + "pass_answer_governance": "خیر. جهت‌گیری فعلی این است که دارندگان 5chan Pass بتوانند در رأی‌گیری دایرکتوری شرکت کنند، اما سازوکارهای نهایی حاکمیتی باید به‌جای کنترل نهایی فقط توسط دارندگان pass، شامل هم‌راستایی با BSO-holder و سازوکارهای حفاظتی باشند.", + "app_is_up_to_date": "شما از آخرین نسخه استفاده می‌کنید" } diff --git a/public/translations/fi/default.json b/public/translations/fi/default.json index d817c834..3243cb66 100644 --- a/public/translations/fi/default.json +++ b/public/translations/fi/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Hallitseeko 5chan Pass hakemiston hallintoa?", - "pass_answer_governance": "Ei. Nykyinen suunta on, että 5chan Passin haltijat voivat osallistua hakemistoäänestykseen, mutta lopullisten hallintamekanismien tulisi sisältää BSO-holder-linjaus ja suojatoimet sen sijaan, että lopullinen valta olisi vain passin haltijoilla." + "pass_answer_governance": "Ei. Nykyinen suunta on, että 5chan Passin haltijat voivat osallistua hakemistoäänestykseen, mutta lopullisten hallintamekanismien tulisi sisältää BSO-holder-linjaus ja suojatoimet sen sijaan, että lopullinen valta olisi vain passin haltijoilla.", + "app_is_up_to_date": "käytössä on uusin versio" } diff --git a/public/translations/fil/default.json b/public/translations/fil/default.json index 6ec6f643..9414997a 100644 --- a/public/translations/fil/default.json +++ b/public/translations/fil/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Kokontrolin ba ng 5chan Pass ang pamamahala ng directory?", - "pass_answer_governance": "Hindi. Ang kasalukuyang direksyon ay ang mga may hawak ng 5chan Pass ay maaaring lumahok sa pagboto sa directory, pero ang pinal na mekanika ng governance ay dapat may kasamang BSO-holder alignment at mga safeguard sa halip na pass-only na pinal na kontrol." + "pass_answer_governance": "Hindi. Ang kasalukuyang direksyon ay ang mga may hawak ng 5chan Pass ay maaaring lumahok sa pagboto sa directory, pero ang pinal na mekanika ng governance ay dapat may kasamang BSO-holder alignment at mga safeguard sa halip na pass-only na pinal na kontrol.", + "app_is_up_to_date": "pinakabagong bersyon ang gamit mo" } diff --git a/public/translations/fr/default.json b/public/translations/fr/default.json index 9ad44fd7..6dc2a8d9 100644 --- a/public/translations/fr/default.json +++ b/public/translations/fr/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass contrôlera-t-il la gouvernance de l'annuaire ?", - "pass_answer_governance": "Non. L’orientation actuelle est que les détenteurs de 5chan Pass peuvent participer au vote du répertoire, mais les mécanismes finaux de gouvernance devraient inclure un alignement avec les BSO-holder et des garde-fous au lieu d’un contrôle final réservé aux seuls détenteurs du pass." + "pass_answer_governance": "Non. L’orientation actuelle est que les détenteurs de 5chan Pass peuvent participer au vote du répertoire, mais les mécanismes finaux de gouvernance devraient inclure un alignement avec les BSO-holder et des garde-fous au lieu d’un contrôle final réservé aux seuls détenteurs du pass.", + "app_is_up_to_date": "vous avez la dernière version" } diff --git a/public/translations/he/default.json b/public/translations/he/default.json index 01292f16..9931e3bd 100644 --- a/public/translations/he/default.json +++ b/public/translations/he/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "האם 5chan Pass ישלוט בניהול הספרייה?", - "pass_answer_governance": "לא. הכיוון הנוכחי הוא שמחזיקי 5chan Pass יוכלו להשתתף בהצבעה על הספרייה, אבל מנגנוני הממשל הסופיים צריכים לכלול יישור עם BSO-holder ואמצעי הגנה במקום שליטה סופית של מחזיקי pass בלבד." + "pass_answer_governance": "לא. הכיוון הנוכחי הוא שמחזיקי 5chan Pass יוכלו להשתתף בהצבעה על הספרייה, אבל מנגנוני הממשל הסופיים צריכים לכלול יישור עם BSO-holder ואמצעי הגנה במקום שליטה סופית של מחזיקי pass בלבד.", + "app_is_up_to_date": "זו הגרסה העדכנית ביותר" } diff --git a/public/translations/hi/default.json b/public/translations/hi/default.json index ca5cf21f..1cea3cff 100644 --- a/public/translations/hi/default.json +++ b/public/translations/hi/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "क्या 5chan Pass डायरेक्टरी गवर्नेंस को नियंत्रित करेगा?", - "pass_answer_governance": "नहीं। वर्तमान दिशा यह है कि 5chan Pass धारक directory voting में भाग ले सकें, लेकिन अंतिम governance mechanisms में केवल pass धारकों के अंतिम नियंत्रण के बजाय BSO-holder alignment और safeguards शामिल होने चाहिए।" + "pass_answer_governance": "नहीं। वर्तमान दिशा यह है कि 5chan Pass धारक directory voting में भाग ले सकें, लेकिन अंतिम governance mechanisms में केवल pass धारकों के अंतिम नियंत्रण के बजाय BSO-holder alignment और safeguards शामिल होने चाहिए।", + "app_is_up_to_date": "आप नवीनतम संस्करण पर हैं" } diff --git a/public/translations/hu/default.json b/public/translations/hu/default.json index 12b8c582..5e87f229 100644 --- a/public/translations/hu/default.json +++ b/public/translations/hu/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "A 5chan Pass fogja irányítani a címtár felügyeletét?", - "pass_answer_governance": "Nem. A jelenlegi irány az, hogy az 5chan Pass tulajdonosai részt vehetnek a könyvtárszavazásban, de a végleges irányítási mechanizmusoknak BSO-holder igazodást és védőkorlátokat kell tartalmazniuk a kizárólag pass-tulajdonosi végső kontroll helyett." + "pass_answer_governance": "Nem. A jelenlegi irány az, hogy az 5chan Pass tulajdonosai részt vehetnek a könyvtárszavazásban, de a végleges irányítási mechanizmusoknak BSO-holder igazodást és védőkorlátokat kell tartalmazniuk a kizárólag pass-tulajdonosi végső kontroll helyett.", + "app_is_up_to_date": "a legújabb verziót használod" } diff --git a/public/translations/id/default.json b/public/translations/id/default.json index 11e31cbc..1203adb9 100644 --- a/public/translations/id/default.json +++ b/public/translations/id/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Apakah 5chan Pass akan mengendalikan tata kelola direktori?", - "pass_answer_governance": "Tidak. Arah saat ini adalah bahwa pemegang 5chan Pass dapat berpartisipasi dalam pemungutan suara direktori, tetapi mekanisme tata kelola final harus mencakup penyelarasan BSO-holder dan perlindungan, bukan kontrol final yang hanya dipegang pemilik pass." + "pass_answer_governance": "Tidak. Arah saat ini adalah bahwa pemegang 5chan Pass dapat berpartisipasi dalam pemungutan suara direktori, tetapi mekanisme tata kelola final harus mencakup penyelarasan BSO-holder dan perlindungan, bukan kontrol final yang hanya dipegang pemilik pass.", + "app_is_up_to_date": "Anda sudah di versi terbaru" } diff --git a/public/translations/it/default.json b/public/translations/it/default.json index 1b603af4..bc84e6a2 100644 --- a/public/translations/it/default.json +++ b/public/translations/it/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass controllerà la governance della directory?", - "pass_answer_governance": "No. L'attuale direzione è che i titolari di 5chan Pass possano partecipare al voto della directory, ma i meccanismi finali di governance dovrebbero includere allineamento con i BSO-holder e salvaguardie invece di un controllo finale riservato solo ai titolari del pass." + "pass_answer_governance": "No. L'attuale direzione è che i titolari di 5chan Pass possano partecipare al voto della directory, ma i meccanismi finali di governance dovrebbero includere allineamento con i BSO-holder e salvaguardie invece di un controllo finale riservato solo ai titolari del pass.", + "app_is_up_to_date": "hai l'ultima versione" } diff --git a/public/translations/ja/default.json b/public/translations/ja/default.json index f8148fec..da142827 100644 --- a/public/translations/ja/default.json +++ b/public/translations/ja/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass はディレクトリのガバナンスを管理しますか?", - "pass_answer_governance": "いいえ。現在の方針では、5chan Pass保有者はディレクトリ投票に参加できますが、最終的なガバナンスの仕組みには、pass保有者だけの最終支配ではなく、BSO-holderとの整合性とセーフガードを含めるべきです。" + "pass_answer_governance": "いいえ。現在の方針では、5chan Pass保有者はディレクトリ投票に参加できますが、最終的なガバナンスの仕組みには、pass保有者だけの最終支配ではなく、BSO-holderとの整合性とセーフガードを含めるべきです。", + "app_is_up_to_date": "最新バージョンです" } diff --git a/public/translations/ko/default.json b/public/translations/ko/default.json index a8cc277d..59171a47 100644 --- a/public/translations/ko/default.json +++ b/public/translations/ko/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass가 디렉터리 거버넌스를 통제하나요?", - "pass_answer_governance": "아니요. 현재 방향은 5chan Pass 보유자가 디렉터리 투표에 참여할 수 있도록 하는 것이지만, 최종 거버넌스 메커니즘에는 pass 보유자만의 최종 통제 대신 BSO-holder 정렬과 안전장치가 포함되어야 합니다." + "pass_answer_governance": "아니요. 현재 방향은 5chan Pass 보유자가 디렉터리 투표에 참여할 수 있도록 하는 것이지만, 최종 거버넌스 메커니즘에는 pass 보유자만의 최종 통제 대신 BSO-holder 정렬과 안전장치가 포함되어야 합니다.", + "app_is_up_to_date": "최신 버전입니다" } diff --git a/public/translations/mr/default.json b/public/translations/mr/default.json index 948d60e7..9fecc253 100644 --- a/public/translations/mr/default.json +++ b/public/translations/mr/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass निर्देशिका प्रशासन नियंत्रित करेल का?", - "pass_answer_governance": "नाही. सध्याची दिशा अशी आहे की 5chan Pass धारक directory voting मध्ये सहभागी होऊ शकतात, पण अंतिम governance mechanics मध्ये pass-only final control ऐवजी BSO-holder alignment आणि safeguards समाविष्ट असले पाहिजेत." + "pass_answer_governance": "नाही. सध्याची दिशा अशी आहे की 5chan Pass धारक directory voting मध्ये सहभागी होऊ शकतात, पण अंतिम governance mechanics मध्ये pass-only final control ऐवजी BSO-holder alignment आणि safeguards समाविष्ट असले पाहिजेत.", + "app_is_up_to_date": "तुम्ही नवीनतम आवृत्तीवर आहात" } diff --git a/public/translations/nl/default.json b/public/translations/nl/default.json index 1d610dd2..99b0ff9e 100644 --- a/public/translations/nl/default.json +++ b/public/translations/nl/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Zal 5chan Pass het beheer van de directory bepalen?", - "pass_answer_governance": "Nee. De huidige richting is dat houders van 5chan Pass kunnen deelnemen aan directory voting, maar de uiteindelijke governance-mechanismen moeten BSO-holder-afstemming en waarborgen bevatten in plaats van pass-only definitieve controle." + "pass_answer_governance": "Nee. De huidige richting is dat houders van 5chan Pass kunnen deelnemen aan directory voting, maar de uiteindelijke governance-mechanismen moeten BSO-holder-afstemming en waarborgen bevatten in plaats van pass-only definitieve controle.", + "app_is_up_to_date": "je hebt de nieuwste versie" } diff --git a/public/translations/no/default.json b/public/translations/no/default.json index 42ff6082..039ce360 100644 --- a/public/translations/no/default.json +++ b/public/translations/no/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Vil 5chan Pass styre katalogstyringen?", - "pass_answer_governance": "Nei. Den nåværende retningen er at innehavere av 5chan Pass kan delta i katalogavstemning, men de endelige styringsmekanismene bør inkludere BSO-holder-tilpasning og sikkerhetstiltak i stedet for at passinnehavere alene har endelig kontroll." + "pass_answer_governance": "Nei. Den nåværende retningen er at innehavere av 5chan Pass kan delta i katalogavstemning, men de endelige styringsmekanismene bør inkludere BSO-holder-tilpasning og sikkerhetstiltak i stedet for at passinnehavere alene har endelig kontroll.", + "app_is_up_to_date": "du har den nyeste versjonen" } diff --git a/public/translations/pl/default.json b/public/translations/pl/default.json index 45a9d302..ad2c82c6 100644 --- a/public/translations/pl/default.json +++ b/public/translations/pl/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Czy 5chan Pass będzie kontrolować zarządzanie katalogiem?", - "pass_answer_governance": "Nie. Obecny kierunek jest taki, że posiadacze 5chan Pass mogą uczestniczyć w głosowaniu katalogowym, ale ostateczne mechanizmy zarządzania powinny obejmować zgodność z BSO-holder i zabezpieczenia zamiast wyłącznej ostatecznej kontroli posiadaczy passa." + "pass_answer_governance": "Nie. Obecny kierunek jest taki, że posiadacze 5chan Pass mogą uczestniczyć w głosowaniu katalogowym, ale ostateczne mechanizmy zarządzania powinny obejmować zgodność z BSO-holder i zabezpieczenia zamiast wyłącznej ostatecznej kontroli posiadaczy passa.", + "app_is_up_to_date": "masz najnowszą wersję" } diff --git a/public/translations/pt/default.json b/public/translations/pt/default.json index f0fc1297..60968d84 100644 --- a/public/translations/pt/default.json +++ b/public/translations/pt/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "O 5chan Pass controlará a governança do diretório?", - "pass_answer_governance": "Não. A direção atual é que os detentores de 5chan Pass possam participar da votação de diretório, mas os mecanismos finais de governança devem incluir alinhamento com BSO-holder e salvaguardas em vez de controle final apenas dos detentores do pass." + "pass_answer_governance": "Não. A direção atual é que os detentores de 5chan Pass possam participar da votação de diretório, mas os mecanismos finais de governança devem incluir alinhamento com BSO-holder e salvaguardas em vez de controle final apenas dos detentores do pass.", + "app_is_up_to_date": "você está na versão mais recente" } diff --git a/public/translations/ro/default.json b/public/translations/ro/default.json index 6a39ef5f..294d962c 100644 --- a/public/translations/ro/default.json +++ b/public/translations/ro/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Va controla 5chan Pass guvernanța directorului?", - "pass_answer_governance": "Nu. Direcția actuală este ca deținătorii de 5chan Pass să poată participa la votul pentru director, dar mecanismele finale de guvernanță ar trebui să includă aliniere cu BSO-holder și măsuri de protecție în locul controlului final exclusiv al deținătorilor de pass." + "pass_answer_governance": "Nu. Direcția actuală este ca deținătorii de 5chan Pass să poată participa la votul pentru director, dar mecanismele finale de guvernanță ar trebui să includă aliniere cu BSO-holder și măsuri de protecție în locul controlului final exclusiv al deținătorilor de pass.", + "app_is_up_to_date": "ai cea mai recentă versiune" } diff --git a/public/translations/ru/default.json b/public/translations/ru/default.json index 45534f17..f81a0667 100644 --- a/public/translations/ru/default.json +++ b/public/translations/ru/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Будет ли 5chan Pass контролировать управление каталогом?", - "pass_answer_governance": "Нет. Текущее направление таково: владельцы 5chan Pass могут участвовать в голосовании по каталогам, но итоговые механизмы управления должны включать согласование с BSO-holder и защитные меры вместо окончательного контроля только со стороны владельцев pass." + "pass_answer_governance": "Нет. Текущее направление таково: владельцы 5chan Pass могут участвовать в голосовании по каталогам, но итоговые механизмы управления должны включать согласование с BSO-holder и защитные меры вместо окончательного контроля только со стороны владельцев pass.", + "app_is_up_to_date": "у вас последняя версия" } diff --git a/public/translations/sq/default.json b/public/translations/sq/default.json index 47e8bb96..b52191a4 100644 --- a/public/translations/sq/default.json +++ b/public/translations/sq/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "A do ta kontrollojë 5chan Pass qeverisjen e drejtorisë?", - "pass_answer_governance": "Jo. Drejtimi aktual është që mbajtësit e 5chan Pass mund të marrin pjesë në votimin e drejtorisë, por mekanizmat përfundimtarë të qeverisjes duhet të përfshijnë përputhje me BSO-holder dhe masa mbrojtëse në vend të kontrollit përfundimtar vetëm nga mbajtësit e pass-it." + "pass_answer_governance": "Jo. Drejtimi aktual është që mbajtësit e 5chan Pass mund të marrin pjesë në votimin e drejtorisë, por mekanizmat përfundimtarë të qeverisjes duhet të përfshijnë përputhje me BSO-holder dhe masa mbrojtëse në vend të kontrollit përfundimtar vetëm nga mbajtësit e pass-it.", + "app_is_up_to_date": "jeni në versionin më të fundit" } diff --git a/public/translations/sv/default.json b/public/translations/sv/default.json index 4f1c3211..e8b5fb51 100644 --- a/public/translations/sv/default.json +++ b/public/translations/sv/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Kommer 5chan Pass att kontrollera katalogets styrning?", - "pass_answer_governance": "Nej. Den nuvarande inriktningen är att innehavare av 5chan Pass kan delta i katalogomröstning, men de slutliga styrningsmekanismerna bör inkludera BSO-holder-anpassning och skyddsåtgärder i stället för att passinnehavare ensamma har slutlig kontroll." + "pass_answer_governance": "Nej. Den nuvarande inriktningen är att innehavare av 5chan Pass kan delta i katalogomröstning, men de slutliga styrningsmekanismerna bör inkludera BSO-holder-anpassning och skyddsåtgärder i stället för att passinnehavare ensamma har slutlig kontroll.", + "app_is_up_to_date": "du har den senaste versionen" } diff --git a/public/translations/te/default.json b/public/translations/te/default.json index 828a2d65..b32a9785 100644 --- a/public/translations/te/default.json +++ b/public/translations/te/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass డైరెక్టరీ పాలనను నియంత్రిస్తుందా?", - "pass_answer_governance": "కాదు. ప్రస్తుత దిశ ఏమిటంటే 5chan Pass హోల్డర్లు directory voting లో పాల్గొనగలరు, కానీ తుది governance mechanics లో pass-only final control కి బదులుగా BSO-holder alignment మరియు safeguards ఉండాలి." + "pass_answer_governance": "కాదు. ప్రస్తుత దిశ ఏమిటంటే 5chan Pass హోల్డర్లు directory voting లో పాల్గొనగలరు, కానీ తుది governance mechanics లో pass-only final control కి బదులుగా BSO-holder alignment మరియు safeguards ఉండాలి.", + "app_is_up_to_date": "మీరు తాజా సంస్కరణలో ఉన్నారు" } diff --git a/public/translations/th/default.json b/public/translations/th/default.json index 558831c7..728dafb7 100644 --- a/public/translations/th/default.json +++ b/public/translations/th/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass จะควบคุมการกำกับดูแลไดเรกทอรีหรือไม่?", - "pass_answer_governance": "ไม่ใช่ ทิศทางปัจจุบันคือผู้ถือ 5chan Pass สามารถมีส่วนร่วมในการโหวตไดเรกทอรีได้ แต่กลไกการกำกับดูแลขั้นสุดท้ายควรมีทั้งความสอดคล้องกับ BSO-holder และมาตรการป้องกัน แทนที่จะให้ผู้ถือ pass เป็นผู้ควบคุมขั้นสุดท้ายเพียงฝ่ายเดียว" + "pass_answer_governance": "ไม่ใช่ ทิศทางปัจจุบันคือผู้ถือ 5chan Pass สามารถมีส่วนร่วมในการโหวตไดเรกทอรีได้ แต่กลไกการกำกับดูแลขั้นสุดท้ายควรมีทั้งความสอดคล้องกับ BSO-holder และมาตรการป้องกัน แทนที่จะให้ผู้ถือ pass เป็นผู้ควบคุมขั้นสุดท้ายเพียงฝ่ายเดียว", + "app_is_up_to_date": "คุณใช้เวอร์ชันล่าสุดแล้ว" } diff --git a/public/translations/tr/default.json b/public/translations/tr/default.json index ceb43319..f7ea934c 100644 --- a/public/translations/tr/default.json +++ b/public/translations/tr/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass dizin yönetişimini kontrol edecek mi?", - "pass_answer_governance": "Hayır. Mevcut yön, 5chan Pass sahiplerinin dizin oylamasına katılabilmesi yönünde, ancak nihai yönetişim mekanizmaları, yalnızca pass sahiplerine nihai kontrol vermek yerine BSO-holder uyumu ve güvenceler içermelidir." + "pass_answer_governance": "Hayır. Mevcut yön, 5chan Pass sahiplerinin dizin oylamasına katılabilmesi yönünde, ancak nihai yönetişim mekanizmaları, yalnızca pass sahiplerine nihai kontrol vermek yerine BSO-holder uyumu ve güvenceler içermelidir.", + "app_is_up_to_date": "en son sürümdesiniz" } diff --git a/public/translations/uk/default.json b/public/translations/uk/default.json index efca16cd..21ba5bf8 100644 --- a/public/translations/uk/default.json +++ b/public/translations/uk/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "Чи контролюватиме 5chan Pass управління каталогом?", - "pass_answer_governance": "Ні. Поточний напрям полягає в тому, що власники 5chan Pass можуть брати участь у голосуванні за каталоги, але фінальні механіки врядування мають включати узгодження з BSO-holder і запобіжники замість остаточного контролю лише з боку власників pass." + "pass_answer_governance": "Ні. Поточний напрям полягає в тому, що власники 5chan Pass можуть брати участь у голосуванні за каталоги, але фінальні механіки врядування мають включати узгодження з BSO-holder і запобіжники замість остаточного контролю лише з боку власників pass.", + "app_is_up_to_date": "у вас найновіша версія" } diff --git a/public/translations/ur/default.json b/public/translations/ur/default.json index 4f3d1bcb..6efe91f4 100644 --- a/public/translations/ur/default.json +++ b/public/translations/ur/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "کیا 5chan Pass ڈائریکٹری گورننس کو کنٹرول کرے گا؟", - "pass_answer_governance": "نہیں۔ موجودہ سمت یہ ہے کہ 5chan Pass رکھنے والے directory voting میں حصہ لے سکیں، لیکن حتمی governance mechanics میں صرف pass holders کے final control کے بجائے BSO-holder alignment اور safeguards شامل ہونے چاہئیں۔" + "pass_answer_governance": "نہیں۔ موجودہ سمت یہ ہے کہ 5chan Pass رکھنے والے directory voting میں حصہ لے سکیں، لیکن حتمی governance mechanics میں صرف pass holders کے final control کے بجائے BSO-holder alignment اور safeguards شامل ہونے چاہئیں۔", + "app_is_up_to_date": "آپ تازہ ترین ورژن پر ہیں" } diff --git a/public/translations/vi/default.json b/public/translations/vi/default.json index 29ccc0fe..c3d3a773 100644 --- a/public/translations/vi/default.json +++ b/public/translations/vi/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass có kiểm soát việc quản trị thư mục không?", - "pass_answer_governance": "Không. Định hướng hiện tại là người nắm giữ 5chan Pass có thể tham gia bỏ phiếu thư mục, nhưng cơ chế quản trị cuối cùng nên bao gồm sự đồng bộ với BSO-holder và các biện pháp bảo vệ thay vì quyền kiểm soát cuối cùng chỉ dành cho người giữ pass." + "pass_answer_governance": "Không. Định hướng hiện tại là người nắm giữ 5chan Pass có thể tham gia bỏ phiếu thư mục, nhưng cơ chế quản trị cuối cùng nên bao gồm sự đồng bộ với BSO-holder và các biện pháp bảo vệ thay vì quyền kiểm soát cuối cùng chỉ dành cho người giữ pass.", + "app_is_up_to_date": "bạn đang dùng phiên bản mới nhất" } diff --git a/public/translations/zh/default.json b/public/translations/zh/default.json index f4698ea1..873674ae 100644 --- a/public/translations/zh/default.json +++ b/public/translations/zh/default.json @@ -379,5 +379,6 @@ "p2p_stats_updated": "Updated", "p2p_stats_starting": "P2P stats appear after the P2P client starts.", "pass_question_governance": "5chan Pass 会控制目录治理吗?", - "pass_answer_governance": "不是。当前方向是 5chan Pass 持有者可以参与目录投票,但最终治理机制应包含与 BSO-holder 的一致性和保障措施,而不是仅由 pass 持有者拥有最终控制权。" + "pass_answer_governance": "不是。当前方向是 5chan Pass 持有者可以参与目录投票,但最终治理机制应包含与 BSO-holder 的一致性和保障措施,而不是仅由 pass 持有者拥有最终控制权。", + "app_is_up_to_date": "你已是最新版本" } diff --git a/src/components/settings-modal/interface-settings/__tests__/interface-settings.test.tsx b/src/components/settings-modal/interface-settings/__tests__/interface-settings.test.tsx index f1238004..3a3593a5 100644 --- a/src/components/settings-modal/interface-settings/__tests__/interface-settings.test.tsx +++ b/src/components/settings-modal/interface-settings/__tests__/interface-settings.test.tsx @@ -92,6 +92,7 @@ describe('InterfaceSettings', () => { useFeedViewSettingsStore.getState().setEnableInfiniteScroll(false); useAppUpdateStore.setState({ availableUpdate: null, + appUpdateCheckStatus: 'idle', isApplyingUpdate: false, isCheckingForUpdate: false, applyAppUpdate: testState.applyAppUpdateMock, @@ -106,6 +107,8 @@ describe('InterfaceSettings', () => { afterEach(() => { act(() => root.unmount()); + useAppUpdateStore.getState().clearAppUpdateCheckStatus(); + vi.useRealTimers(); container.remove(); setItemSpy.mockRestore(); vi.unstubAllGlobals(); @@ -230,6 +233,7 @@ describe('InterfaceSettings', () => { }); it('checks for app updates when the check button is pressed', async () => { + testState.refreshAvailableUpdateMock.mockResolvedValueOnce(null); render(createElement(InterfaceSettings)); await settleLazyImports(); @@ -245,6 +249,33 @@ describe('InterfaceSettings', () => { expect(testState.applyAppUpdateMock).not.toHaveBeenCalled(); }); + it('shows then clears the latest-version status when no app update is available', async () => { + vi.useFakeTimers(); + testState.refreshAvailableUpdateMock.mockResolvedValueOnce(null); + render(createElement(InterfaceSettings)); + await settleLazyImports(); + + const button = findButtonByText('Check'); + expect(button).toBeTruthy(); + + await act(async () => { + button?.dispatchEvent(new MouseEvent('click', { bubbles: true })); + await Promise.resolve(); + }); + + expect(container.textContent).toContain('app_is_up_to_date'); + + act(() => { + vi.advanceTimersByTime(3999); + }); + expect(container.textContent).toContain('app_is_up_to_date'); + + act(() => { + vi.advanceTimersByTime(1); + }); + expect(container.textContent).not.toContain('app_is_up_to_date'); + }); + it('applies the available app update when the button is pressed', async () => { useAppUpdateStore.setState({ availableUpdate: { diff --git a/src/components/settings-modal/interface-settings/app-update-setting.tsx b/src/components/settings-modal/interface-settings/app-update-setting.tsx index 3bef0c95..68948b75 100644 --- a/src/components/settings-modal/interface-settings/app-update-setting.tsx +++ b/src/components/settings-modal/interface-settings/app-update-setting.tsx @@ -8,8 +8,10 @@ const UpdateButton = () => { const availableUpdate = useAppUpdateStore((state) => state.availableUpdate); const isApplyingUpdate = useAppUpdateStore((state) => state.isApplyingUpdate); const isCheckingForUpdate = useAppUpdateStore((state) => state.isCheckingForUpdate); + const appUpdateCheckStatus = useAppUpdateStore((state) => state.appUpdateCheckStatus); const applyAppUpdate = useAppUpdateStore((state) => state.applyAppUpdate); const refreshAvailableUpdate = useAppUpdateStore((state) => state.refreshAvailableUpdate); + const showAppUpdateUpToDateStatus = useAppUpdateStore((state) => state.showAppUpdateUpToDateStatus); const handleUpdateAction = async () => { try { @@ -18,13 +20,17 @@ const UpdateButton = () => { return; } - await refreshAvailableUpdate(); + const update = await refreshAvailableUpdate(); + if (!update) { + showAppUpdateUpToDateStatus(); + } } catch (error) { alert(String(error)); } }; const buttonLabel = availableUpdate ? t('download') : t('check'); const isBusy = isApplyingUpdate || isCheckingForUpdate; + const shouldShowUpToDateStatus = !isCheckingForUpdate && !availableUpdate && appUpdateCheckStatus === 'upToDate'; return ( <> @@ -36,6 +42,11 @@ const UpdateButton = () => { {t('checking_for_updates')} )} + {shouldShowUpToDateStatus && ( + + {t('app_is_up_to_date')} + + )} {!isCheckingForUpdate && availableUpdate && ( {t('new_version_found')}:  diff --git a/src/stores/use-app-update-store.ts b/src/stores/use-app-update-store.ts index 758fbc1a..84d5b0ef 100644 --- a/src/stores/use-app-update-store.ts +++ b/src/stores/use-app-update-store.ts @@ -1,19 +1,50 @@ import { create } from 'zustand'; import { applyAvailableAppUpdate, resolveAvailableAppUpdate, type AvailableAppUpdate } from '../lib/app-update'; +type AppUpdateCheckStatus = 'idle' | 'upToDate'; + interface AppUpdateState { availableUpdate: AvailableAppUpdate | null; + appUpdateCheckStatus: AppUpdateCheckStatus; isApplyingUpdate: boolean; isCheckingForUpdate: boolean; + clearAppUpdateCheckStatus: () => void; + showAppUpdateUpToDateStatus: () => void; refreshAvailableUpdate: () => Promise; applyAppUpdate: () => Promise; } +const UP_TO_DATE_STATUS_TIMEOUT_MS = 4000; + +let appUpdateCheckStatusTimeout: ReturnType | null = null; + +const clearAppUpdateCheckStatusTimeout = () => { + if (appUpdateCheckStatusTimeout !== null) { + clearTimeout(appUpdateCheckStatusTimeout); + appUpdateCheckStatusTimeout = null; + } +}; + +const scheduleAppUpdateCheckStatusClear = (clearStatus: () => void) => { + clearAppUpdateCheckStatusTimeout(); + appUpdateCheckStatusTimeout = setTimeout(clearStatus, UP_TO_DATE_STATUS_TIMEOUT_MS); +}; + const useAppUpdateStore = create((set, get) => ({ availableUpdate: null, + appUpdateCheckStatus: 'idle', isApplyingUpdate: false, isCheckingForUpdate: false, + clearAppUpdateCheckStatus: () => { + clearAppUpdateCheckStatusTimeout(); + set({ appUpdateCheckStatus: 'idle' }); + }, + showAppUpdateUpToDateStatus: () => { + set({ appUpdateCheckStatus: 'upToDate' }); + scheduleAppUpdateCheckStatusClear(get().clearAppUpdateCheckStatus); + }, refreshAvailableUpdate: async () => { + get().clearAppUpdateCheckStatus(); set({ isCheckingForUpdate: true }); try { const availableUpdate = await resolveAvailableAppUpdate();