refactor(order): rewrite store around state machine transitions

This commit is contained in:
zetaloop
2026-02-23 11:04:00 +08:00
parent f8c4c87c61
commit 385dac2d49
4 changed files with 411 additions and 104 deletions
+26 -24
View File
@@ -12,10 +12,10 @@ import { Label } from "@/components/ui/label"
import { Separator } from "@/components/ui/separator"
import { Textarea } from "@/components/ui/textarea"
import { getPlayerById, getServiceById } from "@/lib/api"
import type { Actor } from "@/lib/policy/actor"
import { notifySuccess } from "@/lib/toast"
import { useRequireAuth } from "@/lib/use-require-auth"
import { useAuthStore } from "@/store/auth"
import { useChatStore } from "@/store/chat"
import { useOrderStore } from "@/store/orders"
import { useWalletStore } from "@/store/wallet"
@@ -23,10 +23,8 @@ export default function NewOrderPage() {
const router = useRouter()
const searchParams = useSearchParams()
const { requireAuth } = useRequireAuth()
const createOrder = useOrderStore((state) => state.createOrder)
const ensureOrderSession = useChatStore((state) => state.ensureOrderSession)
const createPaidOrder = useOrderStore((state) => state.createPaidOrder)
const balance = useWalletStore((state) => state.balance)
const deductBalance = useWalletStore((state) => state.deductBalance)
const serviceId = searchParams.get("serviceId")
const service = serviceId ? getServiceById(serviceId) : undefined
@@ -186,34 +184,38 @@ export default function NewOrderPage() {
size="lg"
disabled={balance < totalPrice}
onClick={() =>
requireAuth(async () => {
await new Promise((resolve) => setTimeout(resolve, 500))
requireAuth(() => {
const authUser = useAuthStore.getState().user
if (!authUser) return
const order = createOrder({
consumerId: authUser.id,
consumerName: authUser.nickname,
playerId: player.id,
playerName: player.user.nickname,
shopId: player.shopId,
shopName: player.shopName,
service,
totalPrice,
note,
status: "pending_accept",
})
const paid = deductBalance(order.id, totalPrice)
if (!paid) {
return
const actor: Actor = {
userId: authUser.id,
role: "consumer",
}
ensureOrderSession(order)
const result = createPaidOrder(
{
consumerId: authUser.id,
consumerName: authUser.nickname,
playerId: player.id,
playerName: player.user.nickname,
shopId: player.shopId,
shopName: player.shopName,
service,
totalPrice,
note,
},
actor,
)
if (!result.decision.ok || !result.order) {
return
}
const nextOrder = result.order
setSubmitted(true)
notifySuccess("下单成功")
setTimeout(() => {
router.push(`/order/${order.id}`)
router.push(`/order/${nextOrder.id}`)
}, 800)
})
}