Skip to content

Commit 34df980

Browse files
committed
feat(user): use response from PUT for table and avoid refetching
1 parent f96a934 commit 34df980

File tree

3 files changed

+54
-14
lines changed

3 files changed

+54
-14
lines changed

dashboard/src/components/dialogs/user-modal.tsx

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
useModifyUser,
2727
useModifyUserWithTemplate,
2828
type UserResponse,
29+
type UsersResponse,
2930
} from '@/service/api'
3031
import { dateUtils, useRelativeExpiryDate } from '@/utils/dateFormatter'
3132
import { 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

dashboard/src/components/users/action-buttons.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,18 @@ const ActionButtons: FC<ActionButtonsProps> = ({ user }) => {
505505
</AlertDialog>
506506

507507
{/* Edit User Modal */}
508-
<UserModal isDialogOpen={isEditModalOpen} onOpenChange={setEditModalOpen} form={userForm} editingUser={true} editingUserId={user.id} editingUserData={user} onSuccessCallback={refreshUserData} />
508+
<UserModal
509+
isDialogOpen={isEditModalOpen}
510+
onOpenChange={setEditModalOpen}
511+
form={userForm}
512+
editingUser={true}
513+
editingUserId={user.id}
514+
editingUserData={user}
515+
onSuccessCallback={() => {
516+
// No need to invalidate - cache is already updated by the modal
517+
setEditModalOpen(false)
518+
}}
519+
/>
509520

510521
<UsageModal open={isUsageModalOpen} onClose={() => setUsageModalOpen(false)} username={user.username} />
511522

dashboard/src/components/users/users-table.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ const UsersTable = memo(() => {
285285
const handleEditSuccess = () => {
286286
setEditModalOpen(false)
287287
setSelectedUser(null)
288-
handleManualRefresh()
288+
// No need to manually refresh - cache is already updated by the modal
289289
}
290290

291291
const columns = setupColumns({

0 commit comments

Comments
 (0)