1- import { useState } from 'react' ;
1+ import { useEffect , useState } from 'react' ;
22
33import { snakeToCamelCase } from '@douglasneuroinformatics/libjs' ;
44import { Button , ClientTable , Heading , SearchBar , Sheet } from '@douglasneuroinformatics/libui/components' ;
@@ -7,31 +7,44 @@ import type { User } from '@opendatacapture/schemas/user';
77import { Link } from 'react-router-dom' ;
88
99import { PageHeader } from '@/components/PageHeader' ;
10+ import { WithFallback } from '@/components/WithFallback' ;
1011import { useSearch } from '@/hooks/useSearch' ;
1112import { useAppStore } from '@/store' ;
1213
1314import { useDeleteUserMutation } from '../hooks/useDeleteUserMutation' ;
15+ import { useGroupsQuery } from '../hooks/useGroupsQuery' ;
1416import { useUpdateUserMutation } from '../hooks/useUpdateUserMutation' ;
1517import { useUsersQuery } from '../hooks/useUsersQuery' ;
1618import { UpdateUserForm , type UpdateUserFormInputData } from './UpdateUserForm' ;
1719
1820export const ManageUsersPage = ( ) => {
1921 const currentUser = useAppStore ( ( store ) => store . currentUser ) ;
2022 const { t } = useTranslation ( ) ;
23+ const groupsQuery = useGroupsQuery ( ) ;
2124 const usersQuery = useUsersQuery ( ) ;
2225 const deleteUserMutation = useDeleteUserMutation ( ) ;
2326 const updateUserMutation = useUpdateUserMutation ( ) ;
2427 const [ selectedUser , setSelectedUser ] = useState < null | User > ( null ) ;
2528 const { filteredData, searchTerm, setSearchTerm } = useSearch ( usersQuery . data ?? [ ] , 'username' ) ;
2629
27- const data : UpdateUserFormInputData = {
28- disableDelete : selectedUser ?. username === currentUser ?. username ,
29- initialValues : selectedUser ?. additionalPermissions . length
30- ? {
31- additionalPermissions : selectedUser . additionalPermissions
32- }
33- : undefined
34- } ;
30+ const [ data , setData ] = useState < null | UpdateUserFormInputData > ( null ) ;
31+
32+ useEffect ( ( ) => {
33+ const groups = groupsQuery . data ;
34+ if ( ! selectedUser || ! groups ) {
35+ setData ( null ) ;
36+ } else {
37+ setData ( {
38+ disableDelete : selectedUser ?. username === currentUser ?. username ,
39+ groupOptions : Object . fromEntries ( groups . map ( ( group ) => [ group . id , group . name ] ) ) ,
40+ initialValues : selectedUser ?. additionalPermissions . length
41+ ? {
42+ additionalPermissions : selectedUser . additionalPermissions
43+ }
44+ : undefined
45+ } ) ;
46+ }
47+ } , [ groupsQuery . data , selectedUser ] ) ;
3548
3649 return (
3750 < Sheet open = { Boolean ( selectedUser ) } onOpenChange = { ( ) => setSelectedUser ( null ) } >
@@ -96,17 +109,23 @@ export const ManageUsersPage = () => {
96109 } ) }
97110 </ Sheet . Description >
98111 </ Sheet . Header >
99- < Sheet . Body className = "grid gap-4" >
100- < UpdateUserForm
101- data = { data }
102- onDelete = { ( ) => {
103- deleteUserMutation . mutate ( { id : selectedUser ! . id } ) ;
104- setSelectedUser ( null ) ;
105- } }
106- onSubmit = { ( data ) => {
107- void updateUserMutation . mutateAsync ( { data, id : selectedUser ! . id } ) . then ( ( ) => {
112+ < Sheet . Body className = "grid h-full gap-4" >
113+ < WithFallback
114+ Component = { UpdateUserForm }
115+ minDelay = { 1000 }
116+ props = { {
117+ data,
118+ onDelete : ( ) => {
119+ deleteUserMutation . mutate ( { id : selectedUser ! . id } ) ;
108120 setSelectedUser ( null ) ;
109- } ) ;
121+ } ,
122+ onSubmit : ( { groupIds, ...data } ) => {
123+ void updateUserMutation
124+ . mutateAsync ( { data : { groupIds : Array . from ( groupIds ) , ...data } , id : selectedUser ! . id } )
125+ . then ( ( ) => {
126+ setSelectedUser ( null ) ;
127+ } ) ;
128+ }
110129 } }
111130 />
112131 </ Sheet . Body >
0 commit comments