Skip to content

Commit ee1f8f6

Browse files
fix(chat): address second round review blockers for bulk resolve (EVO-1011)
- fix(i18n): replace noPermissionSend with dedicated bulkResolveNoPermission key in all 6 locales - fix(i18n): replace broken plural concatenation with i18next native selectedCount_one/other keys - fix(dead-code): remove unused conversationAPI.bulkResolve from conversationService - fix(a11y): disable bulk resolve button when user lacks conversations:update permission Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fca539c commit ee1f8f6

9 files changed

Lines changed: 30 additions & 28 deletions

File tree

src/components/chat/chat-sidebar/ChatSidebar.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ interface ChatSidebarProps {
9999
onClearSelection: () => void;
100100
onBulkResolve: () => Promise<void>;
101101
isBulkResolving?: boolean;
102+
canBulkResolve?: boolean;
102103
}
103104

104105
const ChatSidebar = ({
@@ -128,6 +129,7 @@ const ChatSidebar = ({
128129
onClearSelection,
129130
onBulkResolve,
130131
isBulkResolving = false,
132+
canBulkResolve = true,
131133
}: ChatSidebarProps) => {
132134
const { t } = useLanguage('chat');
133135
const chatContext = useChatContext();
@@ -993,11 +995,7 @@ const ChatSidebar = ({
993995
<div className="px-3 py-2 border-b bg-primary/5 flex flex-col gap-1.5 flex-shrink-0">
994996
<div className="flex items-center justify-between">
995997
<span className="text-sm font-medium text-muted-foreground">
996-
{selectedConversationIds.size}{' '}
997-
{selectedConversationIds.size === 1
998-
? t('chatSidebar.conversation')
999-
: t('chatSidebar.conversations')}{' '}
1000-
{t('chatSidebar.selected')}
998+
{t('chatSidebar.selectedCount', { count: selectedConversationIds.size })}
1001999
</span>
10021000
<Button
10031001
variant="ghost"
@@ -1012,7 +1010,7 @@ const ChatSidebar = ({
10121010
size="sm"
10131011
className="h-7 w-full cursor-pointer"
10141012
onClick={onBulkResolve}
1015-
disabled={isBulkResolving}
1013+
disabled={isBulkResolving || !canBulkResolve}
10161014
>
10171015
<CheckCircle className="h-3.5 w-3.5 mr-1.5" />
10181016
{t('chatHeader.actions.markAsResolved')}

src/i18n/locales/en/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@
293293
"deleteConversation": "Delete conversation",
294294
"bulkResolveSuccess": "{{count}} conversation(s) resolved",
295295
"bulkResolvePartialSuccess": "{{success}} resolved, {{failed}} failed",
296-
"bulkResolveError": "Error resolving conversations"
296+
"bulkResolveError": "Error resolving conversations",
297+
"bulkResolveNoPermission": "You do not have permission to resolve conversations"
297298
},
298299
"contactNoName": "Contact without name",
299300
"status": "Status:",
@@ -305,7 +306,8 @@
305306
"searchPlaceholder": "Search conversations...",
306307
"conversation": "conversation",
307308
"conversations": "conversations",
308-
"selected": "selected",
309+
"selectedCount_one": "{{count}} conversation selected",
310+
"selectedCount_other": "{{count}} conversations selected",
309311
"selectConversation": "Select conversation",
310312
"filter": "filter",
311313
"filters": "filters",

src/i18n/locales/es/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@
288288
"deleteConversation": "Eliminar conversación",
289289
"bulkResolveSuccess": "{{count}} conversación(es) resuelta(s)",
290290
"bulkResolvePartialSuccess": "{{success}} resuelta(s), {{failed}} fallida(s)",
291-
"bulkResolveError": "Error al resolver conversaciones"
291+
"bulkResolveError": "Error al resolver conversaciones",
292+
"bulkResolveNoPermission": "No tienes permiso para resolver conversaciones"
292293
},
293294
"contactNoName": "Contacto sin nombre",
294295
"status": "Estado:",
@@ -300,7 +301,8 @@
300301
"searchPlaceholder": "Buscar conversaciones...",
301302
"conversation": "conversación",
302303
"conversations": "conversaciones",
303-
"selected": "seleccionada(s)",
304+
"selectedCount_one": "{{count}} conversación seleccionada",
305+
"selectedCount_other": "{{count}} conversaciones seleccionadas",
304306
"selectConversation": "Seleccionar conversación",
305307
"filter": "filtro",
306308
"filters": "filtros",

src/i18n/locales/fr/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@
288288
"deleteConversation": "Supprimer la conversation",
289289
"bulkResolveSuccess": "{{count}} conversation(s) résolue(s)",
290290
"bulkResolvePartialSuccess": "{{success}} résolue(s), {{failed}} échouée(s)",
291-
"bulkResolveError": "Erreur lors de la résolution des conversations"
291+
"bulkResolveError": "Erreur lors de la résolution des conversations",
292+
"bulkResolveNoPermission": "Vous n'avez pas la permission de résoudre des conversations"
292293
},
293294
"contactNoName": "Contact sans nom",
294295
"status": "Statut :",
@@ -300,7 +301,8 @@
300301
"searchPlaceholder": "Rechercher des conversations...",
301302
"conversation": "conversation",
302303
"conversations": "conversations",
303-
"selected": "sélectionnée(s)",
304+
"selectedCount_one": "{{count}} conversation sélectionnée",
305+
"selectedCount_other": "{{count}} conversations sélectionnées",
304306
"selectConversation": "Sélectionner la conversation",
305307
"filter": "filtre",
306308
"filters": "filtres",

src/i18n/locales/it/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@
288288
"deleteConversation": "Elimina conversazione",
289289
"bulkResolveSuccess": "{{count}} conversazione/i risolta/e",
290290
"bulkResolvePartialSuccess": "{{success}} risolta/e, {{failed}} fallita/e",
291-
"bulkResolveError": "Errore nella risoluzione delle conversazioni"
291+
"bulkResolveError": "Errore nella risoluzione delle conversazioni",
292+
"bulkResolveNoPermission": "Non hai il permesso di risolvere le conversazioni"
292293
},
293294
"contactNoName": "Contatto senza nome",
294295
"status": "Stato:",
@@ -300,7 +301,8 @@
300301
"searchPlaceholder": "Cerca conversazioni...",
301302
"conversation": "conversazione",
302303
"conversations": "conversazioni",
303-
"selected": "selezionata/e",
304+
"selectedCount_one": "{{count}} conversazione selezionata",
305+
"selectedCount_other": "{{count}} conversazioni selezionate",
304306
"selectConversation": "Seleziona conversazione",
305307
"filter": "filtro",
306308
"filters": "filtri",

src/i18n/locales/pt-BR/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@
293293
"deleteConversation": "Deletar conversa",
294294
"bulkResolveSuccess": "{{count}} conversa(s) resolvida(s)",
295295
"bulkResolvePartialSuccess": "{{success}} resolvida(s), {{failed}} falhada(s)",
296-
"bulkResolveError": "Erro ao resolver conversas em lote"
296+
"bulkResolveError": "Erro ao resolver conversas em lote",
297+
"bulkResolveNoPermission": "Você não tem permissão para resolver conversas"
297298
},
298299
"contactNoName": "Contato sem nome",
299300
"status": "Status:",
@@ -305,7 +306,8 @@
305306
"searchPlaceholder": "Buscar conversas...",
306307
"conversation": "conversa",
307308
"conversations": "conversas",
308-
"selected": "selecionada(s)",
309+
"selectedCount_one": "{{count}} conversa selecionada",
310+
"selectedCount_other": "{{count}} conversas selecionadas",
309311
"selectConversation": "Selecionar conversa",
310312
"filter": "filtro",
311313
"filters": "filtros",

src/i18n/locales/pt/chat.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@
288288
"deleteConversation": "Deletar conversa",
289289
"bulkResolveSuccess": "{{count}} conversa(s) resolvida(s)",
290290
"bulkResolvePartialSuccess": "{{success}} resolvida(s), {{failed}} falhada(s)",
291-
"bulkResolveError": "Erro ao resolver conversas em lote"
291+
"bulkResolveError": "Erro ao resolver conversas em lote",
292+
"bulkResolveNoPermission": "Não tem permissão para resolver conversas"
292293
},
293294
"contactNoName": "Contato sem nome",
294295
"status": "Status:",
@@ -300,7 +301,8 @@
300301
"searchPlaceholder": "Buscar conversas...",
301302
"conversation": "conversa",
302303
"conversations": "conversas",
303-
"selected": "selecionada(s)",
304+
"selectedCount_one": "{{count}} conversa selecionada",
305+
"selectedCount_other": "{{count}} conversas selecionadas",
304306
"selectConversation": "Selecionar conversa",
305307
"filter": "filtro",
306308
"filters": "filtros",

src/pages/Customer/Chat/Chat.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ const Chat = () => {
215215
const handleBulkResolve = useCallback(async () => {
216216
if (selectedConversationIds.size === 0) return;
217217
if (!can('conversations', 'update')) {
218-
toast.error(t('messages.noPermissionSend'));
218+
toast.error(t('chatHeader.actions.bulkResolveNoPermission'));
219219
return;
220220
}
221221
const displayIds = Array.from(selectedConversationIds);
@@ -776,6 +776,7 @@ const Chat = () => {
776776
onClearSelection={handleClearSelection}
777777
onBulkResolve={handleBulkResolve}
778778
isBulkResolving={isBulkResolving}
779+
canBulkResolve={can('conversations', 'update')}
779780
/>
780781

781782
{/* Chat Area */}

src/services/conversations/conversationService.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,6 @@ export const conversationAPI = {
181181
return extractData<any>(response);
182182
},
183183

184-
// Bulk resolve conversations by display_id
185-
async bulkResolve(displayIds: string[]): Promise<void> {
186-
await api.post('/bulk_actions', {
187-
type: 'Conversation',
188-
ids: displayIds,
189-
fields: { status: 'resolved' },
190-
});
191-
},
192-
193184
// Get conversation counts
194185
async getConversationCounts(): Promise<{
195186
open_count: number;

0 commit comments

Comments
 (0)