| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import React, { useState, useCallback, useEffect } from 'react';
- import { useQuery } from '@tanstack/react-query';
- import { useNavigate, useSearchParams } from "react-router";
- import dayjs from 'dayjs';
- import { message } from 'antd';
- import { ClassroomDataAPI } from '../../api/classroom_data.ts';
- import { ClassroomStatus } from '../../../share/types_stock.ts';
- // 昵称输入页面
- function ExamIndex() {
- const [nickname, setNickname] = useState('');
- const navigate = useNavigate();
- const [searchParams] = useSearchParams();
- const classroom = searchParams.get('classroom');
- const { data: classroomData, isLoading } = useQuery({
- queryKey: ['classroom', classroom],
- queryFn: async () => {
- if (!classroom) return null;
- const response = await ClassroomDataAPI.getClassroomDatas({ classroom_no: classroom });
- if (!response.data?.length) {
- message.error('获取教室数据失败');
- return null;
- }
- return response.data[0] || null;
- },
- enabled: !!classroom
- });
- useEffect(() => {
- if (classroomData && classroomData.status !== ClassroomStatus.OPEN) {
- message.error('该教室已关闭');
- }
- }, [classroomData]);
- const handleJoinTraining = useCallback(() => {
- if (!nickname.trim()) {
- message.error('请输入昵称');
- return;
- }
- if (!classroom) {
- message.error('教室号不能为空');
- return;
- }
- if (!classroomData) {
- message.error('教室不存在');
- return;
- }
- if (classroomData.status !== ClassroomStatus.OPEN) {
- message.error('该教室已关闭');
- return;
- }
- // 将昵称和教室号作为参数传递到答题页
- navigate(`/mobile/exam/card?nickname=${encodeURIComponent(nickname)}&classroom=${classroom}`);
- }, [nickname, navigate, classroom, classroomData]);
- if (isLoading) {
- return <div className="flex items-center justify-center min-h-screen">加载中...</div>;
- }
- return (
- <div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
- <div className="w-full max-w-md space-y-8">
- <div className="text-center">
- <h2 className="text-3xl font-bold text-gray-900">股票训练答题卡系统</h2>
- <p className="mt-2 text-gray-600">
- {classroom ? `教室号: ${classroom}` : '请输入昵称开始答题'}
- </p>
- {classroomData && (
- <div className="mt-2 text-sm text-gray-500">
- <p>训练日期: {dayjs(classroomData.training_date).format('YYYY-MM-DD')}</p>
- <p>代码: {classroomData.code}</p>
- </div>
- )}
- </div>
-
- <div className="mt-8">
- <input
- type="text"
- value={nickname}
- onChange={(e) => setNickname(e.target.value)}
- placeholder="请输入昵称"
- className="w-full px-4 py-3 text-lg border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
- />
- </div>
- <button
- onClick={handleJoinTraining}
- disabled={!classroomData || classroomData.status !== ClassroomStatus.OPEN}
- className={`w-full px-8 py-3 text-lg font-medium text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors ${
- !classroomData || classroomData.status !== ClassroomStatus.OPEN
- ? 'bg-gray-400 cursor-not-allowed'
- : 'bg-blue-500 hover:bg-blue-600 focus:ring-blue-500'
- }`}
- >
- 开始答题
- </button>
- </div>
- </div>
- );
- }
- export default ExamIndex;
|