From 7d5960ae8751e3c304eec4367095c2209f73f6c3 Mon Sep 17 00:00:00 2001 From: Clas Wen Date: Mon, 29 Sep 2025 23:56:33 +0800 Subject: [PATCH] Add comprehensive repair system functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add repair ticket form and detail components - Implement repair history tracking and display - Create repair event detail view - Add repair landing section and modal components - Update repair header and main page 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/components/header/HeaderNavigation.tsx | 12 ++ src/components/header/RepairHeader.astro | 4 +- src/pages/repair/EditRepairModal.tsx | 131 ++++++++++++ src/pages/repair/EventDetail.tsx | 2 +- src/pages/repair/RepairHistoryCard.tsx | 54 +++++ src/pages/repair/RepairHistoryPage.tsx | 84 ++++++++ src/pages/repair/RepairLandingSection.tsx | 229 +++++++++++++++++++++ src/pages/repair/TicketDetail.tsx | 208 +++++++++++++++++++ src/pages/repair/TicketForm.tsx | 91 +------- src/pages/repair/UserRepairHistory.tsx | 109 ++++++++++ src/pages/repair/history.astro | 15 ++ src/pages/repair/index.astro | 58 +----- src/pages/repair/ticket-detail.astro | 8 +- 13 files changed, 856 insertions(+), 149 deletions(-) create mode 100644 src/pages/repair/EditRepairModal.tsx create mode 100644 src/pages/repair/RepairHistoryCard.tsx create mode 100644 src/pages/repair/RepairHistoryPage.tsx create mode 100644 src/pages/repair/RepairLandingSection.tsx create mode 100644 src/pages/repair/TicketDetail.tsx create mode 100644 src/pages/repair/UserRepairHistory.tsx create mode 100644 src/pages/repair/history.astro diff --git a/src/components/header/HeaderNavigation.tsx b/src/components/header/HeaderNavigation.tsx index 2c592df..31d87ca 100644 --- a/src/components/header/HeaderNavigation.tsx +++ b/src/components/header/HeaderNavigation.tsx @@ -82,6 +82,18 @@ export default function App() { ))} + + + Github + GitHub + + ) diff --git a/src/components/header/RepairHeader.astro b/src/components/header/RepairHeader.astro index a86df09..0073152 100644 --- a/src/components/header/RepairHeader.astro +++ b/src/components/header/RepairHeader.astro @@ -27,7 +27,9 @@ makeLogtoClient().getIdTokenClaims().then((claims) => {
维修
-
+ diff --git a/src/pages/repair/EditRepairModal.tsx b/src/pages/repair/EditRepairModal.tsx new file mode 100644 index 0000000..1657233 --- /dev/null +++ b/src/pages/repair/EditRepairModal.tsx @@ -0,0 +1,131 @@ +import { useState, useEffect } from "react" +import { Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, Button, Input, Textarea } from "@heroui/react" +import { saturdayClient } from "../../utils/client" +import { makeLogtoClient } from "../../utils/auth" +import type { components } from "../../types/saturday" + +type PublicEvent = components["schemas"]["PublicEvent"] +type UpdateClientEventInputBody = components["schemas"]["UpdateClientEventInputBody"] + +interface EditRepairModalProps { + isOpen: boolean + onClose: () => void + event: PublicEvent + onSaved: () => void +} + +export default function EditRepairModal({ isOpen, onClose, event, onSaved }: EditRepairModalProps) { + const [loading, setLoading] = useState(false) + const [formData, setFormData] = useState({ + problem: "", + model: "", + phone: "", + qq: "", + }) + + useEffect(() => { + if (event) { + setFormData({ + problem: event.problem || "", + model: event.model || "", + phone: event.phone || "", + qq: event.qq || "", + }) + } + }, [event]) + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + + try { + const logtoToken = await makeLogtoClient().getAccessToken() + + const { error } = await saturdayClient.PATCH("/client/events/{EventId}", { + params: { + path: { + EventId: event.eventId, + }, + }, + headers: { + Authorization: `Bearer ${logtoToken}`, + }, + body: formData, + }) + + if (error) { + throw new Error("Failed to update event") + } + + onSaved() + } + catch (err) { + console.error("Error updating event:", err) + // Could add error handling/toast here + } + finally { + setLoading(false) + } + } + + const handleClose = () => { + if (!loading) { + onClose() + } + } + + return ( + + +
+ + 编辑维修预约 #{event?.eventId} + + +
+