Files
Task_Reporter/frontend/src/hooks/useRooms.ts
egg c8966477b9 feat: Initial commit - Task Reporter incident response system
Complete implementation of the production line incident response system (生產線異常即時反應系統) including:

Backend (FastAPI):
- User authentication with AD integration and session management
- Chat room management (create, list, update, members, roles)
- Real-time messaging via WebSocket (typing indicators, reactions)
- File storage with MinIO (upload, download, image preview)

Frontend (React + Vite):
- Authentication flow with token management
- Room list with filtering, search, and pagination
- Real-time chat interface with WebSocket
- File upload with drag-and-drop and image preview
- Member management and room settings
- Breadcrumb navigation
- 53 unit tests (Vitest)

Specifications:
- authentication: AD auth, sessions, JWT tokens
- chat-room: rooms, members, templates
- realtime-messaging: WebSocket, messages, reactions
- file-storage: MinIO integration, file management
- frontend-core: React SPA structure

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 17:42:52 +08:00

126 lines
3.6 KiB
TypeScript

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) })
},
})
}