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>
This commit is contained in:
125
frontend/src/hooks/useRooms.ts
Normal file
125
frontend/src/hooks/useRooms.ts
Normal file
@@ -0,0 +1,125 @@
|
||||
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) })
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user