import { allow, deny } from "@/lib/decision" import type { ApiDecision } from "@/lib/errors" import { generateId } from "@/lib/id" import type { Review } from "@/lib/types" import { create } from "zustand" interface SubmitReviewInput { orderId: string fromUserId: string rating: number content?: string } interface ReviewState { reviews: Review[] submitReview: (input: SubmitReviewInput) => ApiDecision getReviewsByOrder: (orderId: string) => Review[] hasUserReviewed: (orderId: string, userId: string) => boolean } export const useReviewStore = create((set, get) => ({ reviews: [], getReviewsByOrder: (orderId) => get().reviews.filter((review) => review.orderId === orderId), hasUserReviewed: (orderId, userId) => get().reviews.some((review) => review.orderId === orderId && review.fromUserId === userId), submitReview: (input) => { if (!input.fromUserId) { return deny(401, "请先登录") } if (!Number.isFinite(input.rating) || input.rating < 1 || input.rating > 5) { return deny(400, "评分范围应为 1-5") } const exists = get().hasUserReviewed(input.orderId, input.fromUserId) if (exists) { return deny(400, "该订单已提交过评价") } const createdAt = new Date().toISOString() const review: Review = { id: generateId("rev"), orderId: input.orderId, fromUserId: input.fromUserId, fromUserName: "", rating: input.rating, content: input.content?.trim() ?? "", sealed: true, createdAt, } set((state) => ({ reviews: [...state.reviews, review] })) const orderReviews = get().getReviewsByOrder(input.orderId) if (orderReviews.length >= 2) { set((state) => ({ reviews: state.reviews.map((item) => item.orderId === input.orderId ? { ...item, sealed: false } : item, ), })) } return allow() }, }))