feat(brainstorm): UX fixes — modal confirmation + destination carnet + race fix
UX Pro Max appliqué selon les best practices 2026 (Heptabase, Obsidian, Tana):
- confirmation-dialogs (HIGH): modal de confirmation avant brainstorm
- success-feedback (MEDIUM): toast avec destination du carnet
- nav-state-active (MEDIUM): indication claire de la session active
3 fixes:
1. Modal de confirmation (brainstorm-confirm-dialog.tsx, 181 lignes):
- Design system respecté: brand-accent, memento-paper, font-memento-serif
- Aperçu seed en card paper
- Sélecteur de carnet avec animation d'expansion
- Bouton 'Annuler' + 'Lancer le brainstorm' avec loader
- role=dialog, aria-modal, aria-label
- focus-visible, keyboard nav
- backdrop-blur-sm + click-to-close
- Lazy loaded via next/dynamic
2. Race condition fix (brainstorm-page.tsx L111):
- Auto-select session désactivé si urlSeed présent
- urlSeed + urlInviteToken court-circuitent le useEffect
3. Toast avec destination (handleConvert + noteCreatedIn key):
- message: 'Note créée dans [Nom du carnet]'
- useConvertIdea accepte notebookId optionnel
- API convert accepte notebookId via zod schema
- useConvertIdea(mutationFn) accepte string | {ideaId, notebookId}
i18n: 9 nouvelles clés brainstorm.* en EN/FR
This commit is contained in:
@@ -154,12 +154,14 @@ export function useConvertIdea(sessionId: string) {
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
return useMutation({
|
||||
mutationFn: async (ideaId: string) => {
|
||||
mutationFn: async (args: string | { ideaId: string; notebookId?: string | null }) => {
|
||||
const ideaId = typeof args === 'string' ? args : args.ideaId
|
||||
const notebookId = typeof args === 'string' ? null : args.notebookId
|
||||
const res = await fetch(`/api/brainstorm/${sessionId}/convert`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'include',
|
||||
body: JSON.stringify({ ideaId }),
|
||||
body: JSON.stringify({ ideaId, notebookId }),
|
||||
})
|
||||
const data = await res.json()
|
||||
if (!data.success) throw new Error(data.error || 'Failed to convert idea')
|
||||
|
||||
Reference in New Issue
Block a user