From beec3035e5521ea6c06f73f313242c1b078f9dbd Mon Sep 17 00:00:00 2001 From: Alireza Hassani Date: Mon, 10 Aug 2026 21:33:22 +0330 Subject: [PATCH] Fix typed i18n keys for customer access labels. Unblocks the business dashboard production build after Customer/Manager role UI. Co-authored-by: Cursor --- .../src/components/ChangeUserAccessModal.tsx | 9 ++++++++- apps/business/src/pages/CustomersPage.tsx | 12 ++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/business/src/components/ChangeUserAccessModal.tsx b/apps/business/src/components/ChangeUserAccessModal.tsx index bfeffea..8d7208d 100644 --- a/apps/business/src/components/ChangeUserAccessModal.tsx +++ b/apps/business/src/components/ChangeUserAccessModal.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState } from 'react' import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { useT } from '../i18n/useT' +import type { BusinessMessageKey } from '../i18n/messages' import { ApiError } from '../lib/api' import { assignBusinessAccess, @@ -16,6 +17,12 @@ const ANIMATION_MS = 220 const ALL_TEAM_ROLES = ['admin', 'editor', 'viewer'] as const const BUSINESS_TEAM_ROLES = ['editor', 'viewer'] as const +const TEAM_ROLE_LABEL_KEYS: Record<(typeof ALL_TEAM_ROLES)[number], BusinessMessageKey> = { + admin: 'customers.access.role.admin', + editor: 'customers.access.role.editor', + viewer: 'customers.access.role.viewer', +} + export interface ChangeUserAccessModalProps { open: boolean user: BusinessCustomerListItem | null @@ -195,7 +202,7 @@ export function ChangeUserAccessModal({ disabled={submitting} /> - {t(`customers.access.role.${slug}`)} + {t(TEAM_ROLE_LABEL_KEYS[slug as (typeof ALL_TEAM_ROLES)[number]])} ))} diff --git a/apps/business/src/pages/CustomersPage.tsx b/apps/business/src/pages/CustomersPage.tsx index b71cd8e..41b5ba8 100644 --- a/apps/business/src/pages/CustomersPage.tsx +++ b/apps/business/src/pages/CustomersPage.tsx @@ -12,6 +12,7 @@ import { Tooltip } from '../components/Tooltip' import { useAuth } from '../context/AuthContext' import { useToast } from '../context/ToastContext' import { useT } from '../i18n/useT' +import type { BusinessMessageKey } from '../i18n/messages' import { ApiError, isAbortError } from '../lib/api' import { getActiveBusinessId } from '../lib/businessContext' import { formatCellForDisplay } from '../lib/cellNumber' @@ -52,7 +53,7 @@ function formatTransactionTotal(total: number | null | undefined) { return formatIrtPrice(total) } -function accessBadgeKey(user: BusinessCustomerListItem): string | null { +function accessBadgeKey(user: BusinessCustomerListItem): BusinessMessageKey | null { if (user.isBusinessOwner) return 'customers.access.badge.owner' if (user.teamRole === 'admin') return 'customers.access.badge.admin' if (user.teamRole === 'editor') return 'customers.access.badge.editor' @@ -61,6 +62,13 @@ function accessBadgeKey(user: BusinessCustomerListItem): string | null { return null } +function teamRoleMessageKey(teamRole: string): BusinessMessageKey { + if (teamRole === 'admin') return 'customers.access.role.admin' + if (teamRole === 'editor') return 'customers.access.role.editor' + if (teamRole === 'viewer') return 'customers.access.role.viewer' + return 'customers.access.badge.manager' +} + export function CustomersPage() { const t = useT() const { locale } = useLocale() @@ -269,7 +277,7 @@ export function CustomersPage() { const roleLabel = updated.isBusinessOwner ? t('customers.access.badge.owner') : updated.teamRole - ? t(`customers.access.role.${updated.teamRole}`) + ? t(teamRoleMessageKey(updated.teamRole)) : t('customers.access.customer') showToast(t('customers.toast.accessUpdated', { role: roleLabel }), 'success') }