feat(catalog): fetch players, services, shops

This commit is contained in:
zetaloop
2026-02-28 16:37:15 +08:00
parent f4365668ab
commit f1ae3e04bb
11 changed files with 234 additions and 57 deletions
+51 -3
View File
@@ -10,6 +10,7 @@ import { Textarea } from "@/components/ui/textarea"
import type { Actor } from "@/lib/actor"
import { getPlayerById, getServiceById } from "@/lib/api"
import { notifySuccess } from "@/lib/toast"
import type { Player, PlayerService } from "@/lib/types"
import { useRequireAuth } from "@/lib/use-require-auth"
import { useAuthStore } from "@/store/auth"
import { useOrderStore } from "@/store/orders"
@@ -17,7 +18,7 @@ import { useWalletStore } from "@/store/wallet"
import { ArrowLeft, CheckCircle, CreditCard, ShieldCheck } from "lucide-react"
import Link from "next/link"
import { useRouter, useSearchParams } from "next/navigation"
import { useState } from "react"
import { useEffect, useState } from "react"
export default function NewOrderPage() {
const router = useRouter()
@@ -27,13 +28,60 @@ export default function NewOrderPage() {
const balance = useWalletStore((state) => state.balance)
const serviceId = searchParams.get("serviceId")
const service = serviceId ? getServiceById(serviceId) : undefined
const player = service ? getPlayerById(service.playerId) : undefined
const [service, setService] = useState<PlayerService | null>(null)
const [player, setPlayer] = useState<Player | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
let cancelled = false
setLoading(true)
if (!serviceId) {
setService(null)
setPlayer(null)
setLoading(false)
return
}
;(async () => {
try {
const s = await getServiceById(serviceId)
if (cancelled) return
if (!s) {
setService(null)
setPlayer(null)
setLoading(false)
return
}
setService(s)
const p = await getPlayerById(s.playerId)
if (cancelled) return
setPlayer(p ?? null)
setLoading(false)
} catch {
if (cancelled) return
setService(null)
setPlayer(null)
setLoading(false)
}
})()
return () => {
cancelled = true
}
}, [serviceId])
const [quantity, setQuantity] = useState(1)
const [note, setNote] = useState("")
const [submitted, setSubmitted] = useState(false)
if (loading) {
return (
<div className="container mx-auto py-8 px-4 text-center text-muted-foreground">...</div>
)
}
if (!service || !player) {
return (
<div className="container mx-auto py-8 px-4 text-center text-muted-foreground">