fix(web): translate the skipped-active toast and show one toast

selectedSessionsSkippedActive is required in Translations, but only en.ts
had it. Every locale typed `: Translations` failed tsc -b with TS2741, which
breaks scripts/build/web.mjs. Add a translation next to
selectedSessionsDeleted in each of them (ar.ts goes through defineLocale and
falls back to English).

useToast holds one toast and only supports success|error, so the skipped
toast replaced the success toast in the same tick and the deleted count was
lost. Show a single toast instead: success with the count when nothing was
skipped, otherwise one error toast that carries both counts. Also drop the
duplicated comment.
This commit is contained in:
kshitijk4poor
2026-09-27 16:23:49 +05:30
committed by kshitij
parent d1849547e9
commit e78e7ccdeb
17 changed files with 29 additions and 14 deletions

View File

@@ -162,6 +162,7 @@ export const af: Translations = {
deleteSelectedConfirmMessage:
"Dit verwyder {count} gekose sessies en al hul boodskappe permanent. Dit kan nie ongedaan gemaak word nie.",
selectedSessionsDeleted: "{count} sessies geskrap",
selectedSessionsSkippedActive: "{deleted} geskrap; {count} behou omdat 'n beurt nog loop",
failedToDeleteSelected: "Kon nie gekose sessies skrap nie",
resumeInChat: "Hervat in Klets",
newChat: "Nuwe klets",

View File

@@ -162,6 +162,7 @@ export const de: Translations = {
deleteSelectedConfirmMessage:
"Dies entfernt {count} ausgewählte Sitzungen und alle zugehörigen Nachrichten dauerhaft. Dies kann nicht rückgängig gemacht werden.",
selectedSessionsDeleted: "{count} Sitzungen gelöscht",
selectedSessionsSkippedActive: "{deleted} gelöscht; {count} behalten, weil noch ein Turn läuft",
failedToDeleteSelected: "Ausgewählte Sitzungen konnten nicht gelöscht werden",
resumeInChat: "Im Chat fortsetzen",
newChat: "Neuer Chat",

View File

@@ -194,7 +194,7 @@ export const en: Translations = {
"This permanently removes {count} selected sessions and all their messages. This cannot be undone.",
selectedSessionsDeleted: "{count} sessions deleted",
selectedSessionsSkippedActive:
"{count} sessions kept: a live turn is still running in them",
"{deleted} deleted; {count} kept because a turn is running",
failedToDeleteSelected: "Failed to delete selected sessions",
resumeInChat: "Resume in Chat",
newChat: "New chat",

View File

@@ -162,6 +162,7 @@ export const es: Translations = {
deleteSelectedConfirmMessage:
"Esto elimina permanentemente {count} sesiones seleccionadas y todos sus mensajes. No se puede deshacer.",
selectedSessionsDeleted: "{count} sesiones eliminadas",
selectedSessionsSkippedActive: "{deleted} eliminadas; {count} conservadas porque hay un turno en curso",
failedToDeleteSelected: "No se pudieron eliminar las sesiones seleccionadas",
resumeInChat: "Reanudar en el chat",
newChat: "Nuevo chat",

View File

@@ -162,6 +162,7 @@ export const fr: Translations = {
deleteSelectedConfirmMessage:
"Cela supprime définitivement {count} sessions sélectionnées et tous leurs messages. Cette action est irréversible.",
selectedSessionsDeleted: "{count} sessions supprimées",
selectedSessionsSkippedActive: "{deleted} supprimées ; {count} conservées car un tour est en cours",
failedToDeleteSelected: "Échec de la suppression des sessions sélectionnées",
resumeInChat: "Reprendre dans le chat",
newChat: "Nouveau chat",

View File

@@ -162,6 +162,7 @@ export const ga: Translations = {
deleteSelectedConfirmMessage:
"Bainfear {count} seisiún roghnaithe agus a dteachtaireachtaí go léir go buan. Ní féidir é seo a chur ar ais.",
selectedSessionsDeleted: "Scriosadh {count} seisiún",
selectedSessionsSkippedActive: "Scriosadh {deleted}; coinníodh {count} mar go bhfuil seal ar siúl",
failedToDeleteSelected: "Theip ar scriosadh na seisiún roghnaithe",
resumeInChat: "Lean ar aghaidh sa chomhrá",
newChat: "Comhrá nua",

View File

@@ -162,6 +162,7 @@ export const hu: Translations = {
deleteSelectedConfirmMessage:
"Ez véglegesen eltávolítja a kijelölt {count} munkamenetet és minden üzenetüket. A művelet nem vonható vissza.",
selectedSessionsDeleted: "{count} munkamenet törölve",
selectedSessionsSkippedActive: "{deleted} törölve; {count} megtartva, mert egy kör még fut",
failedToDeleteSelected: "Nem sikerült törölni a kijelölt munkameneteket",
resumeInChat: "Folytatás a csevegésben",
newChat: "Új csevegés",

View File

@@ -162,6 +162,7 @@ export const it: Translations = {
deleteSelectedConfirmMessage:
"Verranno eliminate definitivamente {count} sessioni selezionate e tutti i loro messaggi. L'operazione non può essere annullata.",
selectedSessionsDeleted: "{count} sessioni eliminate",
selectedSessionsSkippedActive: "{deleted} eliminate; {count} mantenute perché un turno è in corso",
failedToDeleteSelected: "Impossibile eliminare le sessioni selezionate",
resumeInChat: "Riprendi nella chat",
newChat: "Nuova chat",

View File

@@ -162,6 +162,7 @@ export const ja: Translations = {
deleteSelectedConfirmMessage:
"選択した{count}件のセッションとそのすべてのメッセージが完全に削除されます。この操作は取り消せません。",
selectedSessionsDeleted: "{count}件のセッションを削除しました",
selectedSessionsSkippedActive: "{deleted}件を削除、実行中のターンがあるため{count}件を保持しました",
failedToDeleteSelected: "選択したセッションの削除に失敗しました",
resumeInChat: "チャットで再開",
newChat: "新しいチャット",

View File

@@ -162,6 +162,7 @@ export const ko: Translations = {
deleteSelectedConfirmMessage:
"선택한 {count}개 세션과 모든 메시지가 영구적으로 제거됩니다. 이 작업은 취소할 수 없습니다.",
selectedSessionsDeleted: "{count}개 세션이 삭제되었습니다",
selectedSessionsSkippedActive: "{deleted}개 삭제됨, 진행 중인 턴이 있어 {count}개 유지됨",
failedToDeleteSelected: "선택한 세션 삭제에 실패했습니다",
resumeInChat: "채팅에서 다시 시작",
newChat: "새 채팅",

View File

@@ -162,6 +162,7 @@ export const pt: Translations = {
deleteSelectedConfirmMessage:
"Isto remove permanentemente {count} sessões selecionadas e todas as suas mensagens. Não pode ser desfeito.",
selectedSessionsDeleted: "{count} sessões eliminadas",
selectedSessionsSkippedActive: "{deleted} eliminadas; {count} mantidas porque há um turno em curso",
failedToDeleteSelected: "Falha ao eliminar as sessões selecionadas",
resumeInChat: "Retomar no Chat",
newChat: "Novo chat",

View File

@@ -162,6 +162,7 @@ export const ru: Translations = {
deleteSelectedConfirmMessage:
"Это безвозвратно удалит {count} выбранных сессий и все их сообщения. Это действие нельзя отменить.",
selectedSessionsDeleted: "Удалено сессий: {count}",
selectedSessionsSkippedActive: "Удалено: {deleted}; сохранено: {count}, так как ход ещё выполняется",
failedToDeleteSelected: "Не удалось удалить выбранные сессии",
resumeInChat: "Продолжить в чате",
newChat: "Новый чат",

View File

@@ -162,6 +162,7 @@ export const tr: Translations = {
deleteSelectedConfirmMessage:
"Bu, seçilen {count} oturumu ve tüm mesajlarını kalıcı olarak siler. Bu işlem geri alınamaz.",
selectedSessionsDeleted: "{count} oturum silindi",
selectedSessionsSkippedActive: "{deleted} silindi; bir tur çalıştığı için {count} tutuldu",
failedToDeleteSelected: "Seçilen oturumlar silinemedi",
resumeInChat: "Sohbette Devam Et",
newChat: "Yeni sohbet",

View File

@@ -162,6 +162,7 @@ export const uk: Translations = {
deleteSelectedConfirmMessage:
"Це назавжди видалить {count} вибраних сесій і всі їхні повідомлення. Цю дію неможливо скасувати.",
selectedSessionsDeleted: "Видалено сесій: {count}",
selectedSessionsSkippedActive: "Видалено: {deleted}; залишено: {count}, бо хід ще виконується",
failedToDeleteSelected: "Не вдалося видалити вибрані сесії",
resumeInChat: "Продовжити в чаті",
newChat: "Новий чат",

View File

@@ -162,6 +162,7 @@ export const zhHant: Translations = {
deleteSelectedConfirmMessage:
"此操作將永久刪除所選的 {count} 個工作階段及其所有訊息。無法復原。",
selectedSessionsDeleted: "已刪除 {count} 個工作階段",
selectedSessionsSkippedActive: "已刪除 {deleted} 個;{count} 個因仍有回合執行中而保留",
failedToDeleteSelected: "刪除所選工作階段失敗",
resumeInChat: "在對話中繼續",
newChat: "新對話",

View File

@@ -160,6 +160,7 @@ export const zh: Translations = {
deleteSelectedConfirmMessage:
"此操作将永久删除所选的 {count} 个会话及其所有消息。无法撤销。",
selectedSessionsDeleted: "已删除 {count} 个会话",
selectedSessionsSkippedActive: "已删除 {deleted} 个;{count} 个因仍有回合运行中而保留",
failedToDeleteSelected: "删除所选会话失败",
resumeInChat: "在对话中继续",
newChat: "新对话",

View File

@@ -1396,22 +1396,22 @@ export default function SessionsPage() {
ids,
owners.size === 1 ? [...owners][0] : undefined,
);
showToast(
t.sessions.selectedSessionsDeleted.replace(
"{count}",
String(resp.deleted),
),
"success",
);
if (resp.skipped_active?.length) {
// Rows a live turn owns were refused server-side; say so instead of implying all went.
const skippedCount = resp.skipped_active?.length ?? 0;
if (skippedCount) {
showToast(
t.sessions.selectedSessionsSkippedActive.replace(
"{count}",
String(resp.skipped_active.length),
),
t.sessions.selectedSessionsSkippedActive
.replace("{deleted}", String(resp.deleted))
.replace("{count}", String(skippedCount)),
"error",
);
} else {
showToast(
t.sessions.selectedSessionsDeleted.replace(
"{count}",
String(resp.deleted),
),
"success",
);
}
setDeleteSelectedOpen(false);
// Drop deleted rows out of the visible list immediately rather