import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { roomsService, type RoomFilters } from '../services/rooms' import type { CreateRoomRequest, UpdateRoomRequest, MemberRole } from '../types' // Query keys export const roomKeys = { all: ['rooms'] as const, lists: () => [...roomKeys.all, 'list'] as const, list: (filters: RoomFilters) => [...roomKeys.lists(), filters] as const, details: () => [...roomKeys.all, 'detail'] as const, detail: (id: string) => [...roomKeys.details(), id] as const, templates: () => [...roomKeys.all, 'templates'] as const, permissions: (id: string) => [...roomKeys.all, 'permissions', id] as const, } export function useRooms(filters?: RoomFilters) { return useQuery({ queryKey: roomKeys.list(filters || {}), queryFn: () => roomsService.listRooms(filters), }) } export function useRoom(roomId: string) { return useQuery({ queryKey: roomKeys.detail(roomId), queryFn: () => roomsService.getRoom(roomId), enabled: !!roomId, }) } export function useRoomTemplates() { return useQuery({ queryKey: roomKeys.templates(), queryFn: () => roomsService.getTemplates(), staleTime: 1000 * 60 * 5, // 5 minutes }) } export function useRoomPermissions(roomId: string) { return useQuery({ queryKey: roomKeys.permissions(roomId), queryFn: () => roomsService.getPermissions(roomId), enabled: !!roomId, }) } export function useCreateRoom() { const queryClient = useQueryClient() return useMutation({ mutationFn: (data: CreateRoomRequest) => roomsService.createRoom(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.lists() }) }, }) } export function useUpdateRoom(roomId: string) { const queryClient = useQueryClient() return useMutation({ mutationFn: (data: UpdateRoomRequest) => roomsService.updateRoom(roomId, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.detail(roomId) }) queryClient.invalidateQueries({ queryKey: roomKeys.lists() }) }, }) } export function useDeleteRoom() { const queryClient = useQueryClient() return useMutation({ mutationFn: (roomId: string) => roomsService.deleteRoom(roomId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.lists() }) }, }) } export function useAddMember(roomId: string) { const queryClient = useQueryClient() return useMutation({ mutationFn: ({ userId, role }: { userId: string; role: MemberRole }) => roomsService.addMember(roomId, userId, role), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.detail(roomId) }) }, }) } export function useUpdateMemberRole(roomId: string) { const queryClient = useQueryClient() return useMutation({ mutationFn: ({ userId, role }: { userId: string; role: MemberRole }) => roomsService.updateMemberRole(roomId, userId, role), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.detail(roomId) }) }, }) } export function useRemoveMember(roomId: string) { const queryClient = useQueryClient() return useMutation({ mutationFn: (userId: string) => roomsService.removeMember(roomId, userId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.detail(roomId) }) }, }) } export function useTransferOwnership(roomId: string) { const queryClient = useQueryClient() return useMutation({ mutationFn: (newOwnerId: string) => roomsService.transferOwnership(roomId, newOwnerId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: roomKeys.detail(roomId) }) }, }) }