feat(wallet): add runtime balance flow and role-gated order posting

This commit is contained in:
zetaloop
2026-02-22 08:17:31 +08:00
parent ea822aaa8d
commit dc629c9472
4 changed files with 207 additions and 26 deletions
+23 -10
View File
@@ -4,7 +4,7 @@ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema"
import { ArrowLeft, ImagePlus, X } from "lucide-react"
import Link from "next/link"
import { useRouter } from "next/navigation"
import { useState } from "react"
import { useEffect, useState } from "react"
import { useForm } from "react-hook-form"
import { z } from "zod"
import { Badge } from "@/components/ui/badge"
@@ -20,8 +20,10 @@ import {
SelectValue,
} from "@/components/ui/select"
import { Textarea } from "@/components/ui/textarea"
import { mockOrders, mockPosts } from "@/lib/mock"
import { mockPosts } from "@/lib/mock"
import { useRequireAuth } from "@/lib/use-require-auth"
import { useAuthStore } from "@/store/auth"
import { useOrderStore } from "@/store/orders"
const postSchema = z.object({
title: z.string().min(2, "标题至少2个字符").max(50, "标题最多50个字符"),
@@ -33,6 +35,9 @@ const tagOptions = ["英雄联盟", "王者荣耀", "CS2", "原神", "上分", "
export default function NewPostPage() {
const router = useRouter()
const { isAuthenticated, requireAuth } = useRequireAuth()
const currentRole = useAuthStore((state) => state.currentRole)
const userId = useAuthStore((state) => state.user?.id)
const orders = useOrderStore((state) => state.orders)
const [postType, setPostType] = useState("normal")
const [selectedTags, setSelectedTags] = useState<string[]>([])
const [imageCount, setImageCount] = useState(0)
@@ -53,6 +58,16 @@ export default function NewPostPage() {
)
}
useEffect(() => {
if (currentRole !== "consumer" && postType === "show_order") {
setPostType("normal")
}
}, [currentRole, postType])
const availableOrders = orders.filter(
(order) => order.status === "completed" && order.consumerId === userId,
)
const onSubmit = async () => {
if (!isAuthenticated) {
requireAuth(() => undefined)
@@ -87,7 +102,7 @@ export default function NewPostPage() {
</SelectTrigger>
<SelectContent>
<SelectItem value="normal"></SelectItem>
<SelectItem value="show_order"></SelectItem>
{currentRole === "consumer" && <SelectItem value="show_order"></SelectItem>}
<SelectItem value="quote"></SelectItem>
</SelectContent>
</Select>
@@ -101,13 +116,11 @@ export default function NewPostPage() {
<SelectValue placeholder="选择要展示的订单" />
</SelectTrigger>
<SelectContent>
{mockOrders
.filter((order) => order.status === "completed")
.map((order) => (
<SelectItem key={order.id} value={order.id}>
{order.service.title} · {order.playerName}
</SelectItem>
))}
{availableOrders.map((order) => (
<SelectItem key={order.id} value={order.id}>
{order.service.title} · {order.playerName}
</SelectItem>
))}
</SelectContent>
</Select>
</div>