diff --git a/src/app/[slug]/[configId]/layout.tsx b/src/app/[slug]/[configId]/layout.tsx index bfec46e..8ac4d51 100644 --- a/src/app/[slug]/[configId]/layout.tsx +++ b/src/app/[slug]/[configId]/layout.tsx @@ -2,6 +2,7 @@ import { notFound } from 'next/navigation' import { getInstanceBySlug, getConfiguration } from '@/lib/api/client' import { resolveColors } from '@/lib/theme' import SplashScreen from '@/components/SplashScreen' +import AssistantBubble from '@/components/assistant/AssistantBubble' export default async function ConfigLayout({ children, @@ -27,6 +28,16 @@ export default async function ConfigLayout({
{label('welcome', language)}
+ {suggestions.length > 0 && ( +Le calice
' }], + }) + + expect(buildSuggestions([current], 'FR', current)[0]).toBe('Parlez-moi de « Le calice »') + }) + + it('traduit les gabarits', () => { + const suggestions = buildSuggestions([section({ id: 'a', type: 'Agenda' })], 'EN') + expect(suggestions).toContain("What's on this week?") + }) + + it('retombe sur le français pour une langue non traduite', () => { + expect(buildSuggestions([], 'PL')).toContain("Que voir si je n'ai qu'une heure ?") + }) + + it('ignore les sections désactivées et les sous-sections', () => { + const suggestions = buildSuggestions( + [ + section({ id: 'a', type: 'Agenda', isActive: false }), + section({ id: 'p', type: 'Parcours', isSubSection: true }), + ], + 'FR' + ) + + expect(suggestions).not.toContain("Qu'est-ce qu'il y a cette semaine ?") + expect(suggestions).not.toContain('Que faire avec des enfants ?') + }) + + it('ne dépasse jamais trois suggestions ni ne se répète', () => { + const current = section({ id: 'a', type: 'Agenda', title: [{ language: 'FR', value: 'Agenda' }] }) + const suggestions = buildSuggestions( + [current, section({ id: 'p', type: 'Parcours' }), section({ id: 'm', type: 'Map' })], + 'FR', + current + ) + + expect(suggestions.length).toBeLessThanOrEqual(3) + expect(new Set(suggestions).size).toBe(suggestions.length) + }) +}) diff --git a/src/lib/assistantSuggestions.ts b/src/lib/assistantSuggestions.ts new file mode 100644 index 0000000..db49509 --- /dev/null +++ b/src/lib/assistantSuggestions.ts @@ -0,0 +1,119 @@ +import type { SectionDTO } from './api/types' +import { t, stripHtml } from './i18n' + +/// Questions proposées au visiteur quand il ouvre l'assistant. +/// +/// Elles sont dérivées du contenu réel de la configuration — pas configurées par +/// le client, pas générées par le modèle : les sections sont déjà chargées, leurs +/// titres déjà traduits par le CMS. Un lieu sans agenda ne propose donc pas de +/// question sur l'agenda, et le nom qui apparaît est celui que le client a saisi. + +type Lang = string + +const PHRASES: Record