22
33import { useEffect , useState } from "react"
44import { useRouter } from "next/navigation"
5- import { getCurrentUser } from "@/lib/features/auth"
5+ import { getCurrentUserAsync } from "@/lib/features/auth"
66import { Input } from "@/components/ui/input"
77import { Plus , Edit , Trash2 , Search , Filter } from "lucide-react"
88import { useLanguage } from "@/lib/config"
99import Link from "next/link"
10+ import { createDiagram , deleteDiagram , getDiagrams , updateDiagram , type Diagram as DBDiagram } from "@/lib/database"
1011
1112interface Diagram {
1213 id : string
@@ -21,6 +22,22 @@ interface Diagram {
2122 category ?: string // e.g., "c4", "flowchart", "sequence", "class", "er"
2223}
2324
25+ function toViewDiagram ( row : DBDiagram ) : Diagram {
26+ const payload = row . data && typeof row . data === "object" ? row . data : { }
27+ return {
28+ id : row . id ,
29+ name : row . title ,
30+ description : row . description || "" ,
31+ userId : row . user_id ,
32+ createdAt : row . created_at ,
33+ updatedAt : row . updated_at ,
34+ data : payload ,
35+ diagramType : row . type === "visual" ? "visual" : "text" ,
36+ textContent : typeof payload . textContent === "string" ? payload . textContent : "" ,
37+ category : typeof payload . category === "string" ? payload . category : undefined ,
38+ }
39+ }
40+
2441export default function DiagramsPage ( ) {
2542 const router = useRouter ( )
2643 const { t } = useLanguage ( )
@@ -35,45 +52,42 @@ export default function DiagramsPage() {
3552 const [ user , setUser ] = useState < any > ( null )
3653 const [ searchQuery , setSearchQuery ] = useState ( "" )
3754
38- const loadDiagrams = ( userId : string ) => {
39- const allDiagrams = JSON . parse ( localStorage . getItem ( "lab68_diagrams" ) || "[]" )
40- const userDiagrams = allDiagrams . filter ( ( d : Diagram ) => d . userId === userId )
41- setDiagrams ( userDiagrams )
55+ const loadDiagrams = async ( userId : string ) => {
56+ const rows = await getDiagrams ( userId )
57+ setDiagrams ( rows . map ( toViewDiagram ) )
4258 }
4359
4460 useEffect ( ( ) => {
45- queueMicrotask ( ( ) => {
46- const currentUser = getCurrentUser ( )
61+ void ( async ( ) => {
62+ const currentUser = await getCurrentUserAsync ( )
4763 if ( ! currentUser ) {
4864 router . push ( "/login" )
4965 return
5066 }
5167 setUser ( currentUser )
52- loadDiagrams ( currentUser . id )
53- } )
68+ await loadDiagrams ( currentUser . id )
69+ } ) ( )
5470 } , [ router ] )
5571
56- const handleCreateDiagram = ( ) => {
72+ const handleCreateDiagram = async ( ) => {
5773 if ( ! newDiagram . name . trim ( ) || ! user ) return
5874
59- const diagram : Diagram = {
60- id : crypto . randomUUID ( ) ,
61- name : newDiagram . name ,
62- description : newDiagram . description ,
63- userId : user . id ,
64- createdAt : new Date ( ) . toISOString ( ) ,
65- updatedAt : new Date ( ) . toISOString ( ) ,
66- data : newDiagram . diagramType === "visual" ? { nodes : [ ] , connections : [ ] } : { } ,
67- diagramType : newDiagram . diagramType ,
68- category : newDiagram . diagramType === "text" ? newDiagram . category : undefined ,
69- textContent : newDiagram . diagramType === "text" ? getDefaultTemplate ( newDiagram . category ) : "" ,
70- }
71-
72- const allDiagrams = JSON . parse ( localStorage . getItem ( "lab68_diagrams" ) || "[]" )
73- allDiagrams . push ( diagram )
74- localStorage . setItem ( "lab68_diagrams" , JSON . stringify ( allDiagrams ) )
75+ await createDiagram ( {
76+ user_id : user . id ,
77+ title : newDiagram . name . trim ( ) ,
78+ description : newDiagram . description . trim ( ) ,
79+ type : newDiagram . diagramType ,
80+ data :
81+ newDiagram . diagramType === "visual"
82+ ? { nodes : [ ] , connections : [ ] , diagramType : "visual" }
83+ : {
84+ diagramType : "text" ,
85+ category : newDiagram . category ,
86+ textContent : getDefaultTemplate ( newDiagram . category ) ,
87+ } ,
88+ } )
7589
76- setDiagrams ( [ ... diagrams , diagram ] )
90+ await loadDiagrams ( user . id )
7791 setNewDiagram ( { name : "" , description : "" , diagramType : "text" , category : "c4" } )
7892 setShowCreateModal ( false )
7993 }
@@ -177,12 +191,10 @@ Rel(banking_system, mainframe, "Uses")`,
177191 return templates [ category ] || templates . c4
178192 }
179193
180- const handleDeleteDiagram = ( id : string ) => {
194+ const handleDeleteDiagram = async ( id : string ) => {
181195 if ( ! confirm ( t . diagrams . confirmDelete ) ) return
182196
183- const allDiagrams = JSON . parse ( localStorage . getItem ( "lab68_diagrams" ) || "[]" )
184- const filtered = allDiagrams . filter ( ( d : Diagram ) => d . id !== id )
185- localStorage . setItem ( "lab68_diagrams" , JSON . stringify ( filtered ) )
197+ await deleteDiagram ( id )
186198 setDiagrams ( diagrams . filter ( ( d ) => d . id !== id ) )
187199 }
188200
0 commit comments