diff --git a/src/pages/repair/RepairAdmin.tsx b/src/pages/repair/RepairAdmin.tsx index 56ea569..0054e79 100644 --- a/src/pages/repair/RepairAdmin.tsx +++ b/src/pages/repair/RepairAdmin.tsx @@ -188,16 +188,32 @@ export const validateRepairRole = (roles: string[]) => { export default function App() { const [isLoading, setIsLoading] = useState(true) - const [page, setPage] = useState(1) + + // Initialize state from URL query params + const getInitialPage = () => { + const params = new URLSearchParams(window.location.search) + const pageParam = params.get('page') + return pageParam ? parseInt(pageParam, 10) : 1 + } + + const getInitialStatusFilter = () => { + const params = new URLSearchParams(window.location.search) + const statusParam = params.get('status') + if (statusParam) { + return statusParam.split(',').filter(Boolean) + } + return UserEventStatus.filter(v => v.status !== EventStatus.cancelled).map(v => v.status) + } + + const [page, setPage] = useState(getInitialPage()) const rowsPerPage = 10 const [totalCount, setTotalCount] = useState(0) - const [statusFilter, setStatusFilter] = useState( - UserEventStatus.filter(v => v.status !== EventStatus.cancelled).map(v => v.status), - ) + const [statusFilter, setStatusFilter] = useState(getInitialStatusFilter()) const { isOpen, onOpen, onOpenChange } = useDisclosure() const [userInfo, setUserInfo] = useState() const [currentMember, setCurrentMember] = useState() const [token, setToken] = useState() + const [errorMessage, setErrorMessage] = useState("") useEffect(() => { const check = async () => { @@ -229,6 +245,39 @@ export default function App() { check() }, []) + // Handle eventid query parameter to auto-open event detail + useEffect(() => { + const loadEventFromUrl = async () => { + if (!token) return // Wait for authentication + + const params = new URLSearchParams(window.location.search) + const eventId = params.get('eventid') + + if (eventId) { + try { + const { data, error } = await saturdayClient.GET("/events/{eventId}", { + params: { + path: { + eventId: eventId, + }, + }, + }) + + if (error || !data) { + setErrorMessage(`无法找到工单 #${eventId},该工单可能不存在或已被删除`) + } else { + setActiveEvent(data as PublicEvent) + onOpen() + } + } catch (err) { + setErrorMessage(`加载工单 #${eventId} 时出错`) + } + } + } + + loadEventFromUrl() + }, [token]) + const list = useAsyncList({ async load() { setIsLoading(true) @@ -282,6 +331,19 @@ export default function App() { return Math.ceil(totalCount / rowsPerPage) }, [totalCount, rowsPerPage]) + // Update URL query params when page or statusFilter changes + useEffect(() => { + const params = new URLSearchParams(window.location.search) + params.set('page', page.toString()) + if (statusFilter.length > 0) { + params.set('status', statusFilter.join(',')) + } else { + params.delete('status') + } + const newUrl = `${window.location.pathname}?${params.toString()}` + window.history.replaceState({}, '', newUrl) + }, [page, statusFilter]) + useEffect(() => { setPage(1) list.reload() @@ -341,6 +403,24 @@ export default function App() { const onOpenEventDetail = (event: PublicEvent) => { setActiveEvent(event) onOpen() + + // Update URL with eventid + const params = new URLSearchParams(window.location.search) + params.set('eventid', event.eventId) + const newUrl = `${window.location.pathname}?${params.toString()}` + window.history.replaceState({}, '', newUrl) + } + + const handleDrawerOpenChange = (isOpen: boolean) => { + onOpenChange() + + // Remove eventid from URL when drawer is closed + if (!isOpen) { + const params = new URLSearchParams(window.location.search) + params.delete('eventid') + const newUrl = `${window.location.pathname}?${params.toString()}` + window.history.replaceState({}, '', newUrl) + } } const MobileEventCard = ({ event }: { event: PublicEvent }) => ( @@ -539,14 +619,36 @@ export default function App() { } } isOpen={isOpen} - onOpenChange={onOpenChange} - onClose={() => { - onOpenChange() - }} + onOpenChange={handleDrawerOpenChange} + onClose={() => handleDrawerOpenChange(false)} onDelete={() => {}} onEdit={() => {}} > + + {/* Error Message Display */} + {errorMessage && ( +
+
+
+ + + +
+

{errorMessage}

+
+ +
+
+
+ )} ) }