|
| 1 | +import type { ComputedRef } from 'vue'; |
| 2 | +import { computed } from 'vue'; |
| 3 | + |
| 4 | +import { |
| 5 | + useMutation, useQueryClient, |
| 6 | +} from '@tanstack/vue-query'; |
| 7 | + |
| 8 | +import type { DashboardDeleteParams, DashboardListParams } from '@/api-clients/dashboard/_types/dashboard-type'; |
| 9 | +import type { FolderDeleteParams } from '@/api-clients/dashboard/_types/folder-type'; |
| 10 | +import { usePrivateDashboardApi } from '@/api-clients/dashboard/private-dashboard/composables/use-private-dashboard-api'; |
| 11 | +import { usePrivateFolderApi } from '@/api-clients/dashboard/private-folder/composables/use-private-folder-api'; |
| 12 | +import { usePublicDashboardApi } from '@/api-clients/dashboard/public-dashboard/composables/use-public-dashboard-api'; |
| 13 | +import { usePublicFolderApi } from '@/api-clients/dashboard/public-folder/composables/use-public-folder-api'; |
| 14 | +import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; |
| 15 | + |
| 16 | +interface UseDashboardFolderDeleteActionOptions { |
| 17 | + folderId: ComputedRef<string|undefined>; |
| 18 | + onSuccess?: (data: unknown, variables: FolderDeleteParams) => void|Promise<void>; |
| 19 | + onError?: (error: Error, variables: FolderDeleteParams) => void|Promise<void>; |
| 20 | + onSettled?: (data: unknown|undefined, error: Error|null, variables: FolderDeleteParams) => void|Promise<void>; |
| 21 | +} |
| 22 | + |
| 23 | +export const useDashboardFolderDeleteAction = (options: UseDashboardFolderDeleteActionOptions) => { |
| 24 | + const { publicFolderAPI } = usePublicFolderApi(); |
| 25 | + const { privateFolderAPI } = usePrivateFolderApi(); |
| 26 | + const { publicDashboardAPI } = usePublicDashboardApi(); |
| 27 | + const { privateDashboardAPI } = usePrivateDashboardApi(); |
| 28 | + const queryClient = useQueryClient(); |
| 29 | + const { withSuffix: publicFolderGetQueryKey } = useServiceQueryKey('dashboard', 'public-folder', 'get'); |
| 30 | + const { withSuffix: privateFolderGetQueryKey } = useServiceQueryKey('dashboard', 'private-folder', 'get'); |
| 31 | + const { withSuffix: publicDashboardGetQueryKey } = useServiceQueryKey('dashboard', 'public-dashboard', 'get'); |
| 32 | + const { withSuffix: privateDashboardGetQueryKey } = useServiceQueryKey('dashboard', 'private-dashboard', 'get'); |
| 33 | + |
| 34 | + const { |
| 35 | + folderId, onSuccess, onError, onSettled, |
| 36 | + } = options; |
| 37 | + |
| 38 | + const isPrivate = computed(() => folderId.value?.startsWith('private')); |
| 39 | + |
| 40 | + const listDashboardFn = (params: DashboardListParams) => { |
| 41 | + if (!folderId.value) throw new Error('Folder ID is not provided'); |
| 42 | + const fetcher = isPrivate.value ? privateDashboardAPI.list : publicDashboardAPI.list; |
| 43 | + return fetcher(params); |
| 44 | + }; |
| 45 | + const deleteDashboardFn = (params: DashboardDeleteParams) => { |
| 46 | + if (!params.dashboard_id) throw new Error('Dashboard ID is not provided'); |
| 47 | + const fetcher = isPrivate.value ? privateDashboardAPI.delete : publicDashboardAPI.delete; |
| 48 | + return fetcher(params); |
| 49 | + }; |
| 50 | + |
| 51 | + const deleteDashboardListByFolderId = async (_folderId: string) => { |
| 52 | + const _dashboardList = await listDashboardFn({ |
| 53 | + folder_id: _folderId, |
| 54 | + }); |
| 55 | + const _dashboardIds = _dashboardList.results?.map((d) => d.dashboard_id); |
| 56 | + if (!_dashboardIds) return; |
| 57 | + const _dashboardDeletePromises = _dashboardIds.map(async (id) => { |
| 58 | + const _isPrivate = id.startsWith('private'); |
| 59 | + await deleteDashboardFn({ dashboard_id: id }); |
| 60 | + queryClient.invalidateQueries({ queryKey: _isPrivate ? privateDashboardGetQueryKey(id) : publicDashboardGetQueryKey(id) }); |
| 61 | + }); |
| 62 | + await Promise.all(_dashboardDeletePromises); |
| 63 | + }; |
| 64 | + |
| 65 | + const deleteFolderFn = (params: FolderDeleteParams) => { |
| 66 | + if (!folderId.value) throw new Error('Folder ID is not provided'); |
| 67 | + const fetcher = isPrivate.value ? privateFolderAPI.delete : publicFolderAPI.delete; |
| 68 | + return fetcher(params); |
| 69 | + }; |
| 70 | + |
| 71 | + return useMutation({ |
| 72 | + mutationFn: deleteFolderFn, |
| 73 | + onSuccess: async (data, variables) => { |
| 74 | + const _folderId = variables.folder_id; |
| 75 | + const _isPrivate = _folderId.startsWith('private'); |
| 76 | + const folderListQueryKey = _isPrivate ? privateFolderGetQueryKey(_folderId) : publicFolderGetQueryKey(_folderId); |
| 77 | + queryClient.invalidateQueries({ queryKey: folderListQueryKey }); |
| 78 | + |
| 79 | + await deleteDashboardListByFolderId(_folderId); |
| 80 | + |
| 81 | + if (onSuccess) await onSuccess(data, variables); |
| 82 | + }, |
| 83 | + onError: (error, variables) => { |
| 84 | + if (onError) onError(error, variables); |
| 85 | + }, |
| 86 | + onSettled: (data, error, variables) => { |
| 87 | + if (onSettled) onSettled(data, error, variables); |
| 88 | + }, |
| 89 | + }); |
| 90 | +}; |
0 commit comments