- Turbopack activé (dev: next dev --turbopack) - NOTE_LIST_SELECT: exclut embedding (~6KB/note) des requêtes de liste - getAllNotes/getNotes/getArchivedNotes/getNotesWithReminders optimisés - searchNotes: filtrage DB-side au lieu de full-scan JS en mémoire - getAllNotes: requêtes ownNotes + sharedNotes parallélisées avec Promise.all - syncLabels: upsert en transaction () vs N boucles séquentielles - app/(main)/page.tsx converti en Server Component (RSC) - HomeClient: composant client hydraté avec données pré-chargées - NoteEditor/BatchOrganizationDialog/AutoLabelSuggestionDialog: lazy-loaded avec dynamic() - MasonryGrid: remplace Muuri par CSS grid auto-fill + @dnd-kit/sortable - 13 packages supprimés: muuri, web-animations-js, react-masonry-css, react-grid-layout - next.config.ts nettoyé: suppression webpack override, activation image optimization
34 lines
968 B
TypeScript
34 lines
968 B
TypeScript
import { getAllNotes } from '@/app/actions/notes'
|
|
import { getAISettings } from '@/app/actions/ai-settings'
|
|
import { HomeClient } from '@/components/home-client'
|
|
|
|
/**
|
|
* Page principale — Server Component.
|
|
* Les notes et settings sont chargés côté serveur en parallèle,
|
|
* éliminant le spinner de chargement initial et améliorant le TTI.
|
|
*/
|
|
export default async function HomePage() {
|
|
// Charge notes + settings en parallèle côté serveur
|
|
const [allNotes, settings] = await Promise.all([
|
|
getAllNotes(),
|
|
getAISettings(),
|
|
])
|
|
|
|
const notesViewMode =
|
|
settings?.notesViewMode === 'masonry'
|
|
? 'masonry' as const
|
|
: settings?.notesViewMode === 'tabs' || settings?.notesViewMode === 'list'
|
|
? 'tabs' as const
|
|
: 'masonry' as const
|
|
|
|
return (
|
|
<HomeClient
|
|
initialNotes={allNotes}
|
|
initialSettings={{
|
|
showRecentNotes: settings?.showRecentNotes !== false,
|
|
notesViewMode,
|
|
}}
|
|
/>
|
|
)
|
|
}
|