From 8702d6bff3441d89ffc238604d3d8b2b592d2532 Mon Sep 17 00:00:00 2001 From: v0 Date: Thu, 20 Nov 2025 03:13:10 +0000 Subject: [PATCH] Initialized repository for chat Esports platform development Co-authored-by: null <4804959+fnvtk@users.noreply.github.com> --- README.md | 30 + app/booking/page.tsx | 277 ++ app/course/[id]/page.tsx | 122 + app/globals.css | 67 + app/layout.tsx | 34 + app/loading.tsx | 3 + app/mall/page.tsx | 235 ++ app/moments/[id]/page.tsx | 130 + app/moments/page.tsx | 171 + app/my-courses/page.tsx | 70 + app/orders/page.tsx | 146 + app/page.tsx | 260 ++ app/pitch-deck/page.tsx | 253 ++ app/planet/page.tsx | 233 ++ app/profile/page.tsx | 223 ++ app/star/[id]/page.tsx | 337 ++ components.json | 21 + components/layout/mobile-nav.tsx | 48 + components/providers/app-provider.tsx | 164 + components/theme-provider.tsx | 11 + components/ui/button.tsx | 60 + components/ui/card.tsx | 92 + components/ui/tabs.tsx | 66 + components/ui/toast.tsx | 129 + components/ui/toaster.tsx | 35 + hooks/use-toast.ts | 191 + lib/utils.ts | 6 + next.config.mjs | 12 + package.json | 75 + pnpm-lock.yaml | 3279 +++++++++++++++++ postcss.config.mjs | 8 + public/abstract-geometric-shapes.png | Bin 0 -> 664948 bytes public/apple-icon.png | Bin 0 -> 2626 bytes public/avatar-3d-style.jpg | Bin 0 -> 70362 bytes public/diverse-avatars.png | Bin 0 -> 681174 bytes public/diverse-group-avatars.png | Bin 0 -> 595190 bytes .../esports-gamer-girl-streaming-vertical.jpg | Bin 0 -> 108443 bytes public/esports-logo.png | Bin 0 -> 1037652 bytes ...s-tournament-stadium-neon-lights-crowd.jpg | Bin 0 -> 222283 bytes public/icon-dark-32x32.png | Bin 0 -> 585 bytes public/icon-light-32x32.png | Bin 0 -> 566 bytes public/icon.svg | 26 + public/lol.jpg | Bin 0 -> 29973 bytes public/placeholder-logo.png | Bin 0 -> 568 bytes public/placeholder-logo.svg | 1 + public/placeholder-user.jpg | Bin 0 -> 1635 bytes public/placeholder.jpg | Bin 0 -> 1064 bytes public/placeholder.svg | 1 + public/wow-bg.jpg | Bin 0 -> 113285 bytes styles/globals.css | 125 + tsconfig.json | 27 + 51 files changed, 6968 insertions(+) create mode 100644 README.md create mode 100644 app/booking/page.tsx create mode 100644 app/course/[id]/page.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/loading.tsx create mode 100644 app/mall/page.tsx create mode 100644 app/moments/[id]/page.tsx create mode 100644 app/moments/page.tsx create mode 100644 app/my-courses/page.tsx create mode 100644 app/orders/page.tsx create mode 100644 app/page.tsx create mode 100644 app/pitch-deck/page.tsx create mode 100644 app/planet/page.tsx create mode 100644 app/profile/page.tsx create mode 100644 app/star/[id]/page.tsx create mode 100644 components.json create mode 100644 components/layout/mobile-nav.tsx create mode 100644 components/providers/app-provider.tsx create mode 100644 components/theme-provider.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/toast.tsx create mode 100644 components/ui/toaster.tsx create mode 100644 hooks/use-toast.ts create mode 100644 lib/utils.ts create mode 100644 next.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.mjs create mode 100644 public/abstract-geometric-shapes.png create mode 100644 public/apple-icon.png create mode 100644 public/avatar-3d-style.jpg create mode 100644 public/diverse-avatars.png create mode 100644 public/diverse-group-avatars.png create mode 100644 public/esports-gamer-girl-streaming-vertical.jpg create mode 100644 public/esports-logo.png create mode 100644 public/esports-tournament-stadium-neon-lights-crowd.jpg create mode 100644 public/icon-dark-32x32.png create mode 100644 public/icon-light-32x32.png create mode 100644 public/icon.svg create mode 100644 public/lol.jpg create mode 100644 public/placeholder-logo.png create mode 100644 public/placeholder-logo.svg create mode 100644 public/placeholder-user.jpg create mode 100644 public/placeholder.jpg create mode 100644 public/placeholder.svg create mode 100644 public/wow-bg.jpg create mode 100644 styles/globals.css create mode 100644 tsconfig.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d6a9b1 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# Esports platform development + +*Automatically synced with your [v0.app](https://v0.app) deployments* + +[![Deployed on Vercel](https://img.shields.io/badge/Deployed%20on-Vercel-black?style=for-the-badge&logo=vercel)](https://vercel.com/fnvtks-projects/v0--aa) +[![Built with v0](https://img.shields.io/badge/Built%20with-v0.app-black?style=for-the-badge)](https://v0.app/chat/pDE9S8I1cvU) + +## Overview + +This repository will stay in sync with your deployed chats on [v0.app](https://v0.app). +Any changes you make to your deployed app will be automatically pushed to this repository from [v0.app](https://v0.app). + +## Deployment + +Your project is live at: + +**[https://vercel.com/fnvtks-projects/v0--aa](https://vercel.com/fnvtks-projects/v0--aa)** + +## Build your app + +Continue building your app on: + +**[https://v0.app/chat/pDE9S8I1cvU](https://v0.app/chat/pDE9S8I1cvU)** + +## How It Works + +1. Create and modify your project using [v0.app](https://v0.app) +2. Deploy your chats from the v0 interface +3. Changes are automatically pushed to this repository +4. Vercel deploys the latest version from this repository \ No newline at end of file diff --git a/app/booking/page.tsx b/app/booking/page.tsx new file mode 100644 index 0000000..c144878 --- /dev/null +++ b/app/booking/page.tsx @@ -0,0 +1,277 @@ +"use client"; + +import { useState, Suspense } from "react"; +import { useSearchParams, useRouter } from 'next/navigation'; +import { ArrowLeft, Calendar, Clock, CreditCard, Shield, CheckCircle2 } from 'lucide-react'; +import Link from "next/link"; +import Image from "next/image"; + +// Mock data - matches star detail page +const bookingData: Record = { + "1-1": { + starName: "GM-远洋", + starAvatar: "/gamer-girl-headphones.jpg", + serviceName: "单局陪玩", + price: 50, + duration: "1局", + type: "陪玩" + }, + "1-2": { + starName: "GM-远洋", + starAvatar: "/gamer-girl-headphones.jpg", + serviceName: "5局套餐", + price: 220, + duration: "5局", + type: "陪玩" + }, + "1-3": { + starName: "GM-远洋", + starAvatar: "/gamer-girl-headphones.jpg", + serviceName: "打野进阶课", + price: 299, + duration: "8节课", + type: "课程" + }, + "1-4": { + starName: "GM-远洋", + starAvatar: "/gamer-girl-headphones.jpg", + serviceName: "拜师学艺", + price: 1980, + duration: "30天", + type: "拜师" + }, + "2-1": { + starName: "卡若", + starAvatar: "/gamer-boy-esports-jersey.jpg", + serviceName: "单局陪玩", + price: 80, + duration: "1局", + type: "陪玩" + } +}; + +function BookingContent() { + const searchParams = useSearchParams(); + const router = useRouter(); + const starId = searchParams.get("starId") || "1"; + const serviceId = searchParams.get("serviceId") || "1"; + const bookingKey = `${starId}-${serviceId}`; + const booking = bookingData[bookingKey] || bookingData["1-1"]; + + const [selectedDate, setSelectedDate] = useState(""); + const [selectedTime, setSelectedTime] = useState(""); + const [note, setNote] = useState(""); + const [isSubmitting, setIsSubmitting] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); + + // Generate available dates (next 7 days) + const availableDates = Array.from({ length: 7 }, (_, i) => { + const date = new Date(); + date.setDate(date.getDate() + i); + return { + value: date.toISOString().split('T')[0], + label: i === 0 ? "今天" : i === 1 ? "明天" : `${date.getMonth() + 1}/${date.getDate()}` + }; + }); + + // Available time slots + const timeSlots = [ + "09:00", "10:00", "11:00", "14:00", "15:00", "16:00", + "17:00", "18:00", "19:00", "20:00", "21:00", "22:00" + ]; + + const handleSubmit = async () => { + if (!selectedDate || !selectedTime) { + alert("请选择预约时间"); + return; + } + + setIsSubmitting(true); + + // Simulate API call + await new Promise(resolve => setTimeout(resolve, 1500)); + + setIsSubmitting(false); + setIsSuccess(true); + + // Redirect after success + setTimeout(() => { + router.push("/profile"); + }, 2000); + }; + + if (isSuccess) { + return ( +
+
+
+ +
+
+

预约成功!

+

+ 已向 {booking.starName} 发送预约请求 +
+ 请等待确认 +

+
+ + 查看我的订单 + +
+
+ ); + } + + return ( +
+ {/* Header */} +
+ + + +

确认预约

+
+ + {/* Service Info */} +
+
+
+ {booking.starName} +
+
+

{booking.starName}

+

{booking.serviceName}

+
+ {booking.duration} + + {booking.price} 玩值币 +
+
+
+
+ + {/* Date Selection */} +
+

+ + 选择日期 +

+
+ {availableDates.map((date) => ( + + ))} +
+
+ + {/* Time Selection */} +
+

+ + 选择时间 +

+
+ {timeSlots.map((time) => ( + + ))} +
+
+ + {/* Note */} +
+

备注说明

+