1- "use client" ;
2-
3- import { useEffect , useState } from "react" ;
4- import ConceptList from "@/components/ConceptList" ;
5- import NotesList from "@/components/NotesList" ;
6- import { Note , Concept } from "@/types/OmopTables" ;
1+ import { Suspense } from "react" ;
2+ import { use } from "react" ;
3+ import ConceptsSection from "@/components/ConceptsSection" ;
4+ import NotesSection from "@/components/NotesSection" ;
75import { Card , CardContent , CardHeader , CardTitle } from "@/components/ui/card" ;
8- import {
9- Select ,
10- SelectContent ,
11- SelectItem ,
12- SelectTrigger ,
13- SelectValue ,
14- } from "@/components/ui/select" ;
15-
16- export default function Home ( ) {
17- const [ concepts , setConcepts ] = useState < Concept [ ] > ( [ ] ) ;
18- const [ notes , setNotes ] = useState < Note [ ] > ( [ ] ) ;
19- const [ selectedConcept , setSelectedConcept ] = useState < string | null > ( null ) ;
20- const [ domain , setDomain ] = useState ( "All" ) ;
21- const [ conceptName , setConceptName ] = useState < string | null > ( null ) ;
6+ import DomainSelect from "@/components/DomainSelect" ;
227
23- // Filter concepts by domain
24- useEffect ( ( ) => {
25- fetch ( `/api/concepts?domain=${ domain } ` )
26- . then ( ( res ) => res . json ( ) )
27- . then ( ( data ) => {
28- if ( Array . isArray ( data ) ) {
29- setConcepts ( data ) ;
30- } else {
31- console . error ( "Concepts is not an array:" , data ) ;
32- setConcepts ( [ ] ) ;
33- }
34- } )
35- . catch ( ( err ) => {
36- console . error ( "Fetch error:" , err ) ;
37- setConcepts ( [ ] ) ;
38- } ) ;
39- } , [ domain ] ) ;
40-
41- const loadNotes = async ( conceptId : string ) => {
42- setSelectedConcept ( conceptId ) ;
8+ export default function Page ( props : {
9+ searchParams : Promise < {
10+ conceptId ?: string ;
11+ domain ?: string ;
12+ } > ;
13+ } ) {
14+ return (
15+ < Suspense fallback = { < div > Loading page...</ div > } >
16+ < PageContent { ...props } />
17+ </ Suspense >
18+ ) ;
19+ }
4320
44- const res = await fetch ( `/api/notes?conceptId=${ conceptId } ` ) ;
45- const data = await res . json ( ) ;
21+ function PageContent ( {
22+ searchParams,
23+ } : {
24+ searchParams : Promise < {
25+ conceptId ?: string ;
26+ domain ?: string ;
27+ } > ;
28+ } ) {
29+ const params = use ( searchParams ) ;
4630
47- setNotes ( data . notes ) ;
48- setConceptName ( data . conceptName ) ;
49- } ;
31+ const conceptId = params . conceptId ?? null ;
32+ const domain = params . domain ?? "All" ;
5033
5134 return (
5235 < div className = "min-h-screen bg-muted/40 p-6" >
@@ -64,34 +47,24 @@ export default function Home() {
6447
6548 < CardContent >
6649 < div className = "flex items-center gap-4" >
67- < span className = "text-lg font-medium" > Domain</ span >
68-
69- < Select value = { domain } onValueChange = { setDomain } >
70- < SelectTrigger className = "w-[200px]" >
71- < SelectValue placeholder = "Select domain" />
72- </ SelectTrigger >
50+ < span className = "text-lg font-medium " > Domain</ span >
7351
74- < SelectContent >
75- < SelectItem value = "All" > All</ SelectItem >
76- < SelectItem value = "Condition" > Condition</ SelectItem >
77- < SelectItem value = "Drug" > Drug</ SelectItem >
78- </ SelectContent >
79- </ Select >
52+ < DomainSelect domain = { domain } />
8053 </ div >
8154 </ CardContent >
8255 </ Card >
8356
8457 < div className = "grid grid-cols-1 md:grid-cols-3 gap-6" >
8558 < Card className = "p-0 md:col-span-1" >
86- < ConceptList concepts = { concepts } onSelect = { loadNotes } />
59+ < Suspense fallback = { < div > Loading concepts...</ div > } >
60+ < ConceptsSection domain = { domain } />
61+ </ Suspense >
8762 </ Card >
8863
8964 < Card className = "p-0 md:col-span-2" >
90- < NotesList
91- notes = { notes }
92- conceptId = { selectedConcept }
93- conceptName = { conceptName }
94- />
65+ < Suspense fallback = { < div > Loading notes...</ div > } >
66+ < NotesSection conceptId = { conceptId } />
67+ </ Suspense >
9568 </ Card >
9669 </ div >
9770 </ div >
0 commit comments