fix(pages): scope order views to the active role

This commit is contained in:
zetaloop
2026-04-24 08:58:35 +08:00
parent 3b82602c38
commit ffb420f7e7
3 changed files with 120 additions and 81 deletions
+19 -6
View File
@@ -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)
+29 -4
View File
@@ -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>
)
}
+3 -2
View File
@@ -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" />