feat(modules): enhance ModuleKpiCards and add update functionality for modules
CI / changes (push) Successful in 7s
CI / commitlint (push) Skipped
CI / go (push) Skipped
CI / bird2 (push) Skipped
CI / openapi (push) Successful in 51s
CI / web (push) Successful in 1m26s
CI / release (push) Successful in 4m26s

Updated the ModuleKpiCards component to improve the display of KPI metrics by introducing a new entries count prop and simplifying the logic for displaying community and DoH information. Added a new mutation hook for updating modules, which includes success and error handling with toast notifications. Enhanced the ModuleDetailComponent to support editing modules with a new dialog and integrated the entries count into the KPI display.

Additionally, introduced a new helper function for generating short labels for DoH profiles, improving the overall user experience in module management.
This commit is contained in:
Denozordec
2026-08-12 11:32:44 +07:00
parent 4634aac2d1
commit 821f342476
6 changed files with 383 additions and 39 deletions
+27 -2
View File
@@ -1,6 +1,10 @@
import { queryOptions } from '@tanstack/react-query'
import { apiJSON } from '@/lib/api-client'
import { queryOptions, useMutation, useQueryClient } from '@tanstack/react-query'
import { toast } from 'sonner'
import { apiJSON, apiMutate } from '@/lib/api-client'
import { overviewKeys } from '@/queries/overview'
import type {
ModulePatch,
ModuleRow,
ModulesResponse,
Page,
@@ -16,6 +20,14 @@ export const modulesKeys = {
ipRangeEntries: (id: string) => [...modulesKeys.all, 'ip-range-entries', id] as const,
}
function invalidateModules(qc: ReturnType<typeof useQueryClient>, id?: string) {
void qc.invalidateQueries({ queryKey: modulesKeys.all })
void qc.invalidateQueries({ queryKey: overviewKeys.modules() })
if (id) {
void qc.invalidateQueries({ queryKey: modulesKeys.detail(id) })
}
}
export function modulesListQueryOptions() {
return queryOptions<ModulesResponse>({
queryKey: modulesKeys.list(),
@@ -51,3 +63,16 @@ export function moduleEntriesQueryOptions(id: string, type: ModuleRow['type']) {
queryFn: () => apiJSON<ModuleEntriesPage>(path),
})
}
export function useUpdateModuleMutation() {
const qc = useQueryClient()
return useMutation({
mutationFn: ({ id, body }: { id: string; body: ModulePatch }) =>
apiMutate<ModuleRow>(`/v1/modules/${id}`, 'PATCH', body, { idempotent: false }),
onSuccess: (_data, vars) => {
toast.success('Модуль обновлён')
invalidateModules(qc, vars.id)
},
onError: (e) => toast.error(e instanceof Error ? e.message : 'Не удалось обновить модуль'),
})
}