11"use client" ;
22
3- import { useState } from "react" ;
3+ import { useState , useEffect , useCallback } from "react" ;
44import { useTranslations } from "next-intl" ;
55import { useRouter } from "next/navigation" ;
66import { Loader2 , Check } from "lucide-react" ;
@@ -45,58 +45,59 @@ export function MoveIdeaDialog({ open, onOpenChange, ideaUuid, projectUuid, onMo
4545 const [ selectedProject , setSelectedProject ] = useState < { uuid : string ; name : string } | null > ( null ) ;
4646 const [ isMoving , setIsMoving ] = useState ( false ) ;
4747 const [ moveError , setMoveError ] = useState < string | null > ( null ) ;
48- const [ hasLoaded , setHasLoaded ] = useState ( false ) ;
4948
50- // Load projects when dialog opens
51- const handleOpenChange = async ( isOpen : boolean ) => {
52- onOpenChange ( isOpen ) ;
53- if ( isOpen && ! hasLoaded ) {
54- setSelectedProject ( null ) ;
55- setMoveError ( null ) ;
56- setIsLoadingProjects ( true ) ;
57- try {
58- const result = await getProjectsAndGroupsAction ( ) ;
59- if ( result . success ) {
60- const { projects : allProjects , groups : allGroups } = result . data ;
61- const projects = allProjects
62- . filter ( ( p : { uuid : string } ) => p . uuid !== projectUuid )
63- . map ( ( p : { uuid : string ; name : string ; groupUuid : string | null } ) => ( {
64- uuid : p . uuid , name : p . name , groupUuid : p . groupUuid ,
65- } ) ) ;
49+ const loadProjects = useCallback ( async ( ) => {
50+ setSelectedProject ( null ) ;
51+ setMoveError ( null ) ;
52+ setIsLoadingProjects ( true ) ;
53+ try {
54+ const result = await getProjectsAndGroupsAction ( ) ;
55+ if ( result . success ) {
56+ const { projects : allProjects , groups : allGroups } = result . data ;
57+ const projects = allProjects
58+ . filter ( ( p : { uuid : string } ) => p . uuid !== projectUuid )
59+ . map ( ( p : { uuid : string ; name : string ; groupUuid : string | null } ) => ( {
60+ uuid : p . uuid , name : p . name , groupUuid : p . groupUuid ,
61+ } ) ) ;
6662
67- const groupMap = new Map < string , string > ( ) ;
68- for ( const g of allGroups ) {
69- groupMap . set ( g . uuid , g . name ) ;
70- }
63+ const groupMap = new Map < string , string > ( ) ;
64+ for ( const g of allGroups ) {
65+ groupMap . set ( g . uuid , g . name ) ;
66+ }
7167
72- const grouped = new Map < string , MoveGroup > ( ) ;
73- const ungrouped : { uuid : string ; name : string } [ ] = [ ] ;
68+ const grouped = new Map < string , MoveGroup > ( ) ;
69+ const ungrouped : { uuid : string ; name : string } [ ] = [ ] ;
7470
75- for ( const p of projects ) {
76- if ( p . groupUuid && groupMap . has ( p . groupUuid ) ) {
77- if ( ! grouped . has ( p . groupUuid ) ) {
78- grouped . set ( p . groupUuid , { uuid : p . groupUuid , name : groupMap . get ( p . groupUuid ) ! , projects : [ ] } ) ;
79- }
80- grouped . get ( p . groupUuid ) ! . projects . push ( { uuid : p . uuid , name : p . name } ) ;
81- } else {
82- ungrouped . push ( { uuid : p . uuid , name : p . name } ) ;
71+ for ( const p of projects ) {
72+ if ( p . groupUuid && groupMap . has ( p . groupUuid ) ) {
73+ if ( ! grouped . has ( p . groupUuid ) ) {
74+ grouped . set ( p . groupUuid , { uuid : p . groupUuid , name : groupMap . get ( p . groupUuid ) ! , projects : [ ] } ) ;
8375 }
76+ grouped . get ( p . groupUuid ) ! . projects . push ( { uuid : p . uuid , name : p . name } ) ;
77+ } else {
78+ ungrouped . push ( { uuid : p . uuid , name : p . name } ) ;
8479 }
80+ }
8581
86- const groups = [ ...grouped . values ( ) ] ;
87- if ( ungrouped . length > 0 ) {
88- groups . push ( { uuid : "ungrouped" , name : t ( "ideas.ungrouped" ) , projects : ungrouped } ) ;
89- }
90- setMoveGroups ( groups ) ;
91- setHasLoaded ( true ) ;
82+ const groups = [ ...grouped . values ( ) ] ;
83+ if ( ungrouped . length > 0 ) {
84+ groups . push ( { uuid : "ungrouped" , name : t ( "ideas.ungrouped" ) , projects : ungrouped } ) ;
9285 }
93- } catch ( e ) {
94- console . error ( "Failed to load projects for move dialog:" , e ) ;
95- setMoveGroups ( [ ] ) ;
86+ setMoveGroups ( groups ) ;
9687 }
97- setIsLoadingProjects ( false ) ;
88+ } catch ( e ) {
89+ console . error ( "Failed to load projects for move dialog:" , e ) ;
90+ setMoveGroups ( [ ] ) ;
9891 }
99- } ;
92+ setIsLoadingProjects ( false ) ;
93+ } , [ projectUuid , t ] ) ;
94+
95+ // Load projects when dialog opens
96+ useEffect ( ( ) => {
97+ if ( open ) {
98+ loadProjects ( ) ;
99+ }
100+ } , [ open , loadProjects ] ) ;
100101
101102 const handleMove = async ( ) => {
102103 if ( ! selectedProject || isMoving ) return ;
@@ -119,7 +120,7 @@ export function MoveIdeaDialog({ open, onOpenChange, ideaUuid, projectUuid, onMo
119120 } ;
120121
121122 return (
122- < Dialog open = { open } onOpenChange = { handleOpenChange } >
123+ < Dialog open = { open } onOpenChange = { onOpenChange } >
123124 < DialogContent >
124125 < DialogHeader >
125126 < DialogTitle > { t ( "ideas.moveIdeaTitle" ) } </ DialogTitle >
0 commit comments