feat(notifications): add notification system and wire order/dispute events

This commit is contained in:
zetaloop
2026-02-23 11:05:04 +08:00
parent 2222dccbb7
commit c986539954
7 changed files with 214 additions and 17 deletions
+62 -2
View File
@@ -7,7 +7,9 @@ import type { Actor } from "@/lib/policy/actor"
import type { PolicyDecision } from "@/lib/policy/decision"
import { mockOrders } from "@/lib/mock"
import type { Order, OrderStatus, PlayerService } from "@/lib/types"
import { useAuthStore } from "@/store/auth"
import { useChatStore } from "@/store/chat"
import { useNotificationStore } from "@/store/notifications"
import { useWalletStore } from "@/store/wallet"
interface CreateOrderInput {
@@ -191,6 +193,55 @@ function scheduleOrderTimeout(orderId: string, status: OrderStatus) {
orderTimeouts.set(orderId, timer)
}
function notifyOrderStatus(order: Order) {
if (!useAuthStore.getState().notificationPrefs.order) {
return
}
const mapping: Partial<Record<OrderStatus, { title: string; content: string }>> = {
pending_accept: {
title: "订单待接单",
content: `${order.service.title} 已支付,等待接单`,
},
in_progress: {
title: "订单已接单",
content: `${order.playerName} 已开始服务`,
},
pending_close: {
title: "订单发起结单",
content: `订单 ${order.id} 等待确认结单`,
},
pending_review: {
title: "订单待评价",
content: "服务已结束,可提交双向评价",
},
completed: {
title: "订单已完成",
content: `订单 ${order.id} 已完成`,
},
cancelled: {
title: "订单已取消",
content: `订单 ${order.id} 已取消`,
},
disputed: {
title: "订单进入争议",
content: "已发起争议,等待平台处理",
},
}
const payload = mapping[order.status]
if (!payload) {
return
}
useNotificationStore.getState().addNotification({
type: "order",
title: payload.title,
content: payload.content,
link: `/order/${order.id}`,
})
}
export const useOrderStore = create<OrderState>((set, get) => {
const applyTransition = (
orderId: string,
@@ -226,7 +277,13 @@ export const useOrderStore = create<OrderState>((set, get) => {
}
if (previousOrder.status !== "completed" && updatedOrder.status === "completed") {
useWalletStore.getState().addIncome(updatedOrder.id, updatedOrder.totalPrice)
useWalletStore
.getState()
.addIncome(updatedOrder.id, updatedOrder.totalPrice, updatedOrder.shopId)
}
if (previousOrder.status !== updatedOrder.status) {
notifyOrderStatus(updatedOrder)
}
const shouldRefund =
@@ -299,6 +356,7 @@ export const useOrderStore = create<OrderState>((set, get) => {
}))
useChatStore.getState().ensureOrderSession(order)
notifyOrderStatus(order)
return { decision: allow(), order }
},
payOrder: (orderId, actor) => applyTransition(orderId, "PAY", actor),
@@ -323,7 +381,9 @@ export const useOrderStore = create<OrderState>((set, get) => {
if (previousOrder && updatedOrder) {
if (previousOrder.status !== "completed" && updatedOrder.status === "completed") {
useWalletStore.getState().addIncome(updatedOrder.id, updatedOrder.totalPrice)
useWalletStore
.getState()
.addIncome(updatedOrder.id, updatedOrder.totalPrice, updatedOrder.shopId)
}
if (previousOrder.status === "pending_accept" && updatedOrder.status === "cancelled") {