diff --git a/backend/src/routes/admin.routes.ts b/backend/src/routes/admin.routes.ts index 68c8338..1549a09 100644 --- a/backend/src/routes/admin.routes.ts +++ b/backend/src/routes/admin.routes.ts @@ -2794,7 +2794,7 @@ export async function adminRoutes(fastify: FastifyInstance) { userIds: { type: 'array', items: { type: 'string', format: 'uuid' } }, emails: { type: 'array', items: { type: 'string', format: 'email' } }, segment: { type: 'string', enum: SEGMENTS }, - locale: { type: 'string', enum: ['en', 'fr'] }, + locale: { type: 'string', enum: ['en', 'fr', 'ar'] }, limit: { type: 'integer', minimum: 1 }, payload: { type: 'object', additionalProperties: true }, }, diff --git a/frontend/app/[locale]/tools/[category]/page.tsx b/frontend/app/[locale]/tools/[category]/page.tsx index b44e089..ef5f860 100644 --- a/frontend/app/[locale]/tools/[category]/page.tsx +++ b/frontend/app/[locale]/tools/[category]/page.tsx @@ -71,11 +71,11 @@ export default function CategoryPage() { if (reducedMotion) return; const interval = setInterval(() => { - setPlaceholderIndex((prev) => (prev + 1) % placeholderExamples.length); + setPlaceholderIndex((prev) => (prev + 1) % placeholderKeys.length); }, 3000); return () => clearInterval(interval); - }, [reducedMotion, placeholderExamples.length]); + }, [reducedMotion, placeholderKeys.length]); const fetchTools = React.useCallback(async () => { setIsLoading(true); diff --git a/frontend/app/[locale]/tools/page.tsx b/frontend/app/[locale]/tools/page.tsx index e093f3a..740eeb9 100644 --- a/frontend/app/[locale]/tools/page.tsx +++ b/frontend/app/[locale]/tools/page.tsx @@ -227,7 +227,7 @@ export default function ToolsPage() { const count = tierCounts[tier.id] || 0; const isActive = activeTier === tier.id; const Icon = tier.icon; - const label = "labelKey" in tier && tier.labelKey ? t(tier.labelKey) : tier.label; + const label = t(tier.labelKey); return ( ) { const t = useTranslations("toasts"); const tButtons = useTranslations("toolButtons"); + const tTools = useTranslations("tools"); const [pdfFiles, setPdfFiles] = useState<(File | null)[]>([]); const setSelectedFilesRef = useRef<((files: File[]) => void) | null>(null); const setSelectedFileRef = useRef<((file: File | null) => void) | null>(null); diff --git a/frontend/services/admin.service.ts b/frontend/services/admin.service.ts index 3d26dbe..41ab7e0 100644 --- a/frontend/services/admin.service.ts +++ b/frontend/services/admin.service.ts @@ -569,8 +569,8 @@ export interface AdminEmailSendBatchBody { emailType: string; userIds?: string[]; emails?: string[]; - segment?: "all" | "all_pro" | "all_free" | "locale_en" | "locale_fr" | "active_last_7d" | "active_last_30d" | "active_last_90d" | "signup_last_7d" | "signup_last_30d"; - locale?: "en" | "fr"; + segment?: "all" | "all_pro" | "all_free" | "locale_en" | "locale_fr" | "locale_ar" | "active_last_7d" | "active_last_30d" | "active_last_90d" | "signup_last_7d" | "signup_last_30d"; + locale?: "en" | "fr" | "ar"; limit?: number; payload?: Record; }