@@ -26,6 +26,7 @@ import {
2626 useModifyUser ,
2727 useModifyUserWithTemplate ,
2828 type UserResponse ,
29+ type UsersResponse ,
2930} from '@/service/api'
3031import { dateUtils , useRelativeExpiryDate } from '@/utils/dateFormatter'
3132import { formatBytes } from '@/utils/formatByte'
@@ -605,16 +606,44 @@ export default function UserModal({ isDialogOpen, onOpenChange, form, editingUse
605606 } )
606607
607608 // Function to refresh all user-related data
608- const refreshUserData = ( user : UserResponse ) => {
609- // Invalidate relevant queries to trigger fresh fetches
610- queryClient . invalidateQueries ( { queryKey : [ '/api/users' ] } )
611- queryClient . invalidateQueries ( { queryKey : [ 'getUsersUsage' ] } )
612- queryClient . invalidateQueries ( { queryKey : [ 'getUserStats' ] } )
613- queryClient . invalidateQueries ( { queryKey : [ 'getInboundStats' ] } )
614- queryClient . invalidateQueries ( { queryKey : [ 'getUserOnlineStats' ] } )
615-
616- // Force immediate refetch
617- refetchUsers ( )
609+ const refreshUserData = ( user : UserResponse , isEdit : boolean = false ) => {
610+ if ( isEdit ) {
611+ // When editing, update the specific user in the cache without refreshing all users
612+ // Get all cached queries for users
613+ queryClient . setQueriesData < UsersResponse > (
614+ {
615+ queryKey : [ '/api/users' ] ,
616+ exact : false ,
617+ } ,
618+ ( oldData ) => {
619+ if ( ! oldData ) return oldData
620+
621+ // Find and update the user in the users array
622+ const updatedUsers = oldData . users . map ( ( u ) => ( u . username === user . username ? user : u ) )
623+
624+ return {
625+ ...oldData ,
626+ users : updatedUsers ,
627+ }
628+ } ,
629+ )
630+
631+ // Still invalidate usage/stats queries as they may have changed
632+ queryClient . invalidateQueries ( { queryKey : [ 'getUsersUsage' ] } )
633+ queryClient . invalidateQueries ( { queryKey : [ 'getUserStats' ] } )
634+ queryClient . invalidateQueries ( { queryKey : [ 'getInboundStats' ] } )
635+ queryClient . invalidateQueries ( { queryKey : [ 'getUserOnlineStats' ] } )
636+ } else {
637+ // When creating, invalidate and refetch all users
638+ queryClient . invalidateQueries ( { queryKey : [ '/api/users' ] } )
639+ queryClient . invalidateQueries ( { queryKey : [ 'getUsersUsage' ] } )
640+ queryClient . invalidateQueries ( { queryKey : [ 'getUserStats' ] } )
641+ queryClient . invalidateQueries ( { queryKey : [ 'getInboundStats' ] } )
642+ queryClient . invalidateQueries ( { queryKey : [ 'getUserOnlineStats' ] } )
643+
644+ // Force immediate refetch
645+ refetchUsers ( )
646+ }
618647
619648 // Call the success callback if provided
620649 if ( onSuccessCallback ) {
@@ -629,7 +658,7 @@ export default function UserModal({ isDialogOpen, onOpenChange, form, editingUse
629658 } )
630659 const modifyUserMutation = useModifyUser ( {
631660 mutation : {
632- onSuccess : data => refreshUserData ( data ) ,
661+ onSuccess : data => refreshUserData ( data , true ) ,
633662 } ,
634663 } )
635664 const createUserFromTemplateMutation = useCreateUserFromTemplate ( {
@@ -641,7 +670,7 @@ export default function UserModal({ isDialogOpen, onOpenChange, form, editingUse
641670 // Add the mutation hook at the top with other mutations
642671 const modifyUserWithTemplateMutation = useModifyUserWithTemplate ( {
643672 mutation : {
644- onSuccess : data => refreshUserData ( data ) ,
673+ onSuccess : data => refreshUserData ( data , true ) ,
645674 } ,
646675 } )
647676
0 commit comments