Story 6-2 — Markdown roundtrip export/import: - lib/editor/markdown-export.ts: tiptapHTMLToMarkdown, markdownToHTML, looksLikeMarkdown - lib/editor/markdown-paste-extension.ts: TipTap extension paste Markdown → blocs - note-editor-toolbar.tsx: export .md + import .md (file picker) - rich-text-editor.tsx: intégration MarkdownPasteExtension - 40 tests unitaires markdown-export.test.ts Story 6-3 — Brainstorm PPTX + Canvas: - lib/brainstorm/export-pptx.ts: génération PPTX 5 slides (pptxgenjs) - app/api/brainstorm/[sessionId]/export-pptx/route.ts: route POST protégée - brainstorm-page.tsx: bouton PPTX, auto-select session, fix emoji, fix router.replace - wave-canvas.tsx: fitTrigger recentrage, légende bas-droite Onboarding activation wizard (Story 6-1): - components/onboarding/: wizard multi-étapes, hints éditeur - app/api/onboarding/: route PATCH onboarding - prisma/migrations: champs onboarding user Locales: 15 langues mises à jour (brainstorm, markdown, onboarding keys) Sprint: 6-1 done, 6-2 review, 6-3 review Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
59 lines
2.2 KiB
TypeScript
59 lines
2.2 KiB
TypeScript
'use client'
|
|
|
|
import { LanguageProvider, useLanguage } from '@/lib/i18n/LanguageProvider'
|
|
import { NotebooksProvider } from '@/context/notebooks-context'
|
|
import { EditorUIProvider } from '@/context/editor-ui-context'
|
|
import { NoteRefreshProvider } from '@/context/NoteRefreshContext'
|
|
import { QueryProvider } from '@/components/query-provider'
|
|
import type { ReactNode } from 'react'
|
|
import type { Translations } from '@/lib/i18n/load-translations'
|
|
import { AiConsentProvider } from '@/components/legal/ai-consent-provider'
|
|
import { SearchModalProvider } from '@/context/search-modal-context'
|
|
import { OnboardingWizard } from '@/components/onboarding/onboarding-wizard'
|
|
import { OnboardingEditorHints } from '@/components/onboarding/onboarding-editor-hints'
|
|
|
|
const RTL_LANGUAGES = ['ar', 'fa']
|
|
|
|
/** Sets `dir` on its own DOM node from React state — immune to third-party JS overwriting documentElement.dir. */
|
|
function DirWrapper({ children }: { children: ReactNode }) {
|
|
const { language } = useLanguage()
|
|
const dir = RTL_LANGUAGES.includes(language) ? 'rtl' : 'ltr'
|
|
return <div dir={dir} className="contents">{children}</div>
|
|
}
|
|
|
|
interface ProvidersWrapperProps {
|
|
children: ReactNode
|
|
initialLanguage?: string
|
|
initialTranslations?: Translations
|
|
initialAiProcessingConsent?: boolean
|
|
}
|
|
|
|
export function ProvidersWrapper({
|
|
children,
|
|
initialLanguage = 'en',
|
|
initialTranslations,
|
|
initialAiProcessingConsent = false,
|
|
}: ProvidersWrapperProps) {
|
|
return (
|
|
<QueryProvider>
|
|
<NoteRefreshProvider>
|
|
<NotebooksProvider>
|
|
<EditorUIProvider>
|
|
<LanguageProvider initialLanguage={initialLanguage as any} initialTranslations={initialTranslations}>
|
|
<AiConsentProvider initialPersistentConsent={initialAiProcessingConsent}>
|
|
<DirWrapper>
|
|
<SearchModalProvider>
|
|
{children}
|
|
<OnboardingWizard />
|
|
<OnboardingEditorHints />
|
|
</SearchModalProvider>
|
|
</DirWrapper>
|
|
</AiConsentProvider>
|
|
</LanguageProvider>
|
|
</EditorUIProvider>
|
|
</NotebooksProvider>
|
|
</NoteRefreshProvider>
|
|
</QueryProvider>
|
|
)
|
|
}
|