fix(pages): scope order views to the active role
This commit is contained in:
@@ -12,9 +12,17 @@ import { CheckCircle, Clock, DollarSign, ListOrdered, Star, TrendingUp, Users }
|
||||
import Link from "next/link"
|
||||
import { useEffect, useState } from "react"
|
||||
|
||||
function getOrderRole(role: "consumer" | "player" | "owner" | "admin") {
|
||||
if (role === "consumer" || role === "player" || role === "owner") {
|
||||
return role
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
export default function DashboardPage() {
|
||||
const { currentRole } = useAuthStore()
|
||||
const { currentRole, user } = useAuthStore()
|
||||
const isOwner = currentRole === "owner"
|
||||
const orderRole = getOrderRole(currentRole)
|
||||
|
||||
const [player, setPlayer] = useState<Player | null>(null)
|
||||
const [shop, setShop] = useState<Shop | null>(null)
|
||||
@@ -28,8 +36,8 @@ export default function DashboardPage() {
|
||||
Promise.all([listPlayers(), listShops(), listServices()])
|
||||
.then(([players, shops, services]) => {
|
||||
if (cancelled) return
|
||||
setPlayer(players[0] ?? null)
|
||||
setShop(shops[0] ?? null)
|
||||
setPlayer(players.find((item) => item.user.id === user?.id) ?? null)
|
||||
setShop(shops.find((item) => item.owner.id === user?.id) ?? null)
|
||||
setServices(services)
|
||||
})
|
||||
.catch(() => {
|
||||
@@ -42,14 +50,19 @@ export default function DashboardPage() {
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [])
|
||||
}, [user?.id])
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false
|
||||
|
||||
void (async () => {
|
||||
try {
|
||||
const orders = await Promise.resolve(listOrders())
|
||||
if (!orderRole) {
|
||||
setOrders([])
|
||||
return
|
||||
}
|
||||
|
||||
const orders = await Promise.resolve(listOrders({ role: orderRole }))
|
||||
if (cancelled) return
|
||||
setOrders(orders)
|
||||
} catch {
|
||||
@@ -61,7 +74,7 @@ export default function DashboardPage() {
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [])
|
||||
}, [orderRole])
|
||||
|
||||
const totalOrders = isOwner ? (shop?.totalOrders ?? 0) : (player?.totalOrders ?? 0)
|
||||
const rating = isOwner ? (shop?.rating ?? 0) : (player?.rating ?? 0)
|
||||
|
||||
@@ -56,6 +56,13 @@ const ownerTabs = [
|
||||
{ value: "disputed", label: "争议" },
|
||||
]
|
||||
|
||||
function getOrderRole(role: UserRole): "consumer" | "player" | "owner" | undefined {
|
||||
if (role === "consumer" || role === "player" || role === "owner") {
|
||||
return role
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
export default function OrderListPage() {
|
||||
const { currentRole, user } = useAuthStore()
|
||||
const shops = useShopStore((state) => state.shops)
|
||||
@@ -80,6 +87,7 @@ function OrderListContent({
|
||||
userId?: string
|
||||
ownerShopId?: string
|
||||
}) {
|
||||
const orderRole = getOrderRole(currentRole)
|
||||
const [tab, setTab] = useState<TabFilter | "pending">("all")
|
||||
const [orders, setOrders] = useState<Awaited<ReturnType<typeof listOrders>>>([])
|
||||
const [sessions, setSessions] = useState<Awaited<ReturnType<typeof listChatSessions>>>([])
|
||||
@@ -87,9 +95,15 @@ function OrderListContent({
|
||||
useEffect(() => {
|
||||
let cancelled = false
|
||||
|
||||
if (!orderRole) {
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}
|
||||
|
||||
void (async () => {
|
||||
try {
|
||||
const items = await Promise.resolve(listOrders())
|
||||
const items = await Promise.resolve(listOrders({ role: orderRole }))
|
||||
if (cancelled) return
|
||||
setOrders(items)
|
||||
} catch {
|
||||
@@ -101,7 +115,7 @@ function OrderListContent({
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [])
|
||||
}, [orderRole])
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false
|
||||
@@ -148,10 +162,19 @@ function OrderListContent({
|
||||
? "客户视角"
|
||||
: currentRole === "player"
|
||||
? "打手视角"
|
||||
: "店主视角"}
|
||||
: currentRole === "owner"
|
||||
? "店主视角"
|
||||
: "管理员视角"}
|
||||
</Badge>
|
||||
</div>
|
||||
|
||||
{!orderRole ? (
|
||||
<Card className="hover:shadow-card-hover">
|
||||
<CardContent className="py-8 text-center text-sm text-muted-foreground">
|
||||
当前身份暂不支持订单视角
|
||||
</CardContent>
|
||||
</Card>
|
||||
) : (
|
||||
<Tabs value={tab} onValueChange={(v) => setTab(v as TabFilter | "pending")}>
|
||||
<TabsList>
|
||||
{tabs.map((item) => (
|
||||
@@ -191,8 +214,9 @@ function OrderListContent({
|
||||
</div>
|
||||
<div className="flex gap-2">
|
||||
{(() => {
|
||||
if (order.status !== "in_progress" && order.status !== "pending_close")
|
||||
if (order.status !== "in_progress" && order.status !== "pending_close") {
|
||||
return null
|
||||
}
|
||||
const session = sessions.find(
|
||||
(item) => item.type === "order" && item.orderId === order.id,
|
||||
)
|
||||
@@ -225,6 +249,7 @@ function OrderListContent({
|
||||
)}
|
||||
</TabsContent>
|
||||
</Tabs>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ export function Header() {
|
||||
const ownerShop = useShopStore((state) =>
|
||||
user ? state.shops.find((shop) => shop.owner.id === user.id) : undefined,
|
||||
)
|
||||
const canOpenDashboard = currentRole === "player" || currentRole === "owner"
|
||||
|
||||
const navLinks =
|
||||
currentRole === "consumer"
|
||||
@@ -64,7 +65,7 @@ export function Header() {
|
||||
{ href: "/community", label: "社区" },
|
||||
{ href: "/orders", label: "订单" },
|
||||
{ href: "/chat", label: "消息" },
|
||||
{ href: "/dashboard", label: "管理后台" },
|
||||
...(canOpenDashboard ? [{ href: "/dashboard", label: "管理后台" }] : []),
|
||||
]
|
||||
|
||||
const availableRoles = (Object.entries(roleLabels) as [UserRole, string][]).filter(([role]) =>
|
||||
@@ -209,7 +210,7 @@ export function Header() {
|
||||
钱包
|
||||
</Link>
|
||||
</DropdownMenuItem>
|
||||
{(currentRole === "player" || currentRole === "owner") && (
|
||||
{canOpenDashboard && (
|
||||
<DropdownMenuItem asChild>
|
||||
<Link href="/dashboard">
|
||||
<Gamepad2 className="mr-2 h-4 w-4" />
|
||||
|
||||
Reference in New Issue
Block a user