feat(notifications): add notification system and wire order/dispute events
This commit is contained in:
+62
-2
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user