import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query' import type { Ref } from 'vue' import { apiClient } from '@/lib/axios' import type { CreatePersonPayload, Person, UpdatePersonPayload } from '@/types/person' interface ApiResponse { success: boolean data: T message?: string } interface PaginatedResponse { data: T[] links: Record meta: { current_page: number per_page: number total: number last_page: number total_approved: number total_pending: number total_rejected: number } } export function usePersonList( orgId: Ref, eventId: Ref, filters?: Ref<{ crowd_type_id?: string; status?: string }>, ) { return useQuery({ queryKey: ['persons', eventId, filters], queryFn: async () => { const params: Record = {} if (filters?.value?.crowd_type_id) params.crowd_type_id = filters.value.crowd_type_id if (filters?.value?.status) params.status = filters.value.status const { data } = await apiClient.get>( `/organisations/${orgId.value}/events/${eventId.value}/persons`, { params }, ) return data }, enabled: () => !!orgId.value && !!eventId.value, }) } export function usePersonDetail(orgId: Ref, eventId: Ref, id: Ref) { return useQuery({ queryKey: ['persons', eventId, 'detail', id], queryFn: async () => { const { data } = await apiClient.get>( `/organisations/${orgId.value}/events/${eventId.value}/persons/${id.value}`, ) return data.data }, enabled: () => !!orgId.value && !!eventId.value && !!id.value, }) } export function useCreatePerson(orgId: Ref, eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (payload: CreatePersonPayload) => { const { data } = await apiClient.post>( `/organisations/${orgId.value}/events/${eventId.value}/persons`, payload, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['persons', eventId.value] }) }, }) } export function useUpdatePerson(orgId: Ref, eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async ({ id, ...payload }: UpdatePersonPayload & { id: string }) => { const { data } = await apiClient.put>( `/organisations/${orgId.value}/events/${eventId.value}/persons/${id}`, payload, ) return data.data }, onSuccess: (_data, variables) => { queryClient.invalidateQueries({ queryKey: ['persons', eventId.value] }) queryClient.invalidateQueries({ queryKey: ['persons', eventId.value, 'detail', variables.id] }) }, }) } export function useApprovePerson(orgId: Ref, eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (id: string) => { const { data } = await apiClient.post>( `/organisations/${orgId.value}/events/${eventId.value}/persons/${id}/approve`, ) return data.data }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['persons', eventId.value] }) }, }) } export function useDeletePerson(orgId: Ref, eventId: Ref) { const queryClient = useQueryClient() return useMutation({ mutationFn: async (id: string) => { await apiClient.delete(`/organisations/${orgId.value}/events/${eventId.value}/persons/${id}`) }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['persons', eventId.value] }) }, }) }