vkashti / app / quiz / TeamSetup.tsx
TeamSetup.tsx
Raw
import React, { Dispatch, SetStateAction, useEffect, useState } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { createClient } from '@/utils/supabase/client';

type TeamSetupProps = {
  teamName: string;
  setTeamName: Dispatch<SetStateAction<string>>;
  handleStartQuiz: (continueFromQuestion?: number) => void;
  quizId: number | null;
};

export default function TeamSetup({
  teamName,
  setTeamName,
  handleStartQuiz,
  quizId
}: TeamSetupProps) {
  const supabase = createClient();

  useEffect(() => {
    // Check if there's existing team data in localStorage
    const savedTeamData = localStorage.getItem('quizTeamData');
    
    if (savedTeamData) {
      const { name, quizId: savedQuizId } = JSON.parse(savedTeamData);
      
      // If we have saved data for this quiz, use the team name
      if (savedQuizId && quizId && savedQuizId === quizId) {
        setTeamName(name);
      } else {
        // If quiz IDs don't match, clear saved data
        localStorage.removeItem('quizTeamData');
        localStorage.removeItem('quizAnswers');
      }
    }
  }, [setTeamName, quizId]);

  const handleStartQuizWithSync = async () => {
    if (teamName.trim()) {
      // Join the presence channel when starting the quiz
      const channel = supabase.channel('online_teams');
      
      await channel.subscribe(async (status) => {
        if (status === 'SUBSCRIBED') {
          await channel.track({
            team: teamName.trim(),
            online_at: new Date().toISOString(),
            status: 'active'
          });
        }
      });

      // Just start the quiz - we'll sync with the current slide automatically
      handleStartQuiz();
    }
  };

  return (
    <motion.div
      initial={{ opacity: 0, y: 20 }}
      animate={{ opacity: 1, y: 0 }}
      transition={{ duration: 0.5 }}
      className="max-w-2xl mx-auto p-4 rounded-md"
    >
      <motion.div
        initial={{ scale: 0.9 }}
        animate={{ scale: 1 }}
        transition={{ delay: 0.2 }}
        className="space-y-8"
      >
        <motion.div
          initial={{ y: -20, opacity: 0 }}
          animate={{ y: 0, opacity: 1 }}
          transition={{ delay: 0.3 }}
        >
          <h1 className="text-3xl font-bold text-center text-amber-900 mb-2">
            Добре дошли на<br />
            Вкъщи Куиз!
          </h1>
          <p className="text-center text-amber-800/80 text-sm">
            Подгответе се за невероятно приключение
          </p>
        </motion.div>

        <motion.div
          initial={{ y: 20, opacity: 0 }}
          animate={{ y: 0, opacity: 1 }}
          transition={{ delay: 0.4 }}
          className="bg-white/60 backdrop-blur-sm rounded-xl p-6 shadow-sm border border-amber-100/50"
        >
          <h2 className="text-2xl font-semibold text-amber-900 mb-4">
            Правила на играта:
          </h2>
          <ul className="space-y-3">
            <motion.li
              initial={{ x: -20, opacity: 0 }}
              animate={{ x: 0, opacity: 1 }}
              transition={{ delay: 0.5 }}
              className="flex items-center text-lg text-amber-800"
            >
              <span className="mr-3 text-amber-600">👥</span>
              Максимум 6 човека в отбор
            </motion.li>
            <motion.li
              initial={{ x: -20, opacity: 0 }}
              animate={{ x: 0, opacity: 1 }}
              transition={{ delay: 0.6 }}
              className="flex items-center text-lg text-amber-800"
            >
              <span className="mr-3 text-amber-600">💰</span>
              7лв на играч
            </motion.li>
            <motion.li
              initial={{ x: -20, opacity: 0 }}
              animate={{ x: 0, opacity: 1 }}
              transition={{ delay: 0.7 }}
              className="flex items-center text-lg text-amber-800"
            >
              <span className="mr-3 text-amber-600">🎯</span>
              Моля, не мамете
            </motion.li>
            <motion.li
              initial={{ x: -20, opacity: 0 }}
              animate={{ x: 0, opacity: 1 }}
              transition={{ delay: 0.8 }}
              className="flex items-center text-lg text-amber-800"
            >
              <span className="mr-3 text-amber-600">🎉</span>
              Забавлявайте се!
            </motion.li>
          </ul>
        </motion.div>

        <motion.div
          initial={{ y: 20, opacity: 0 }}
          animate={{ y: 0, opacity: 1 }}
          transition={{ delay: 0.9 }}
          className="space-y-6"
        >
          <div className="relative">
            <input
              type="text"
              value={teamName}
              onChange={(e) => setTeamName(e.target.value)}
              placeholder="Име на отбора"
              className="w-full px-6 py-4 text-xl bg-white/60 backdrop-blur-sm border-2 border-amber-200/50 rounded-xl focus:border-amber-400 focus:outline-none transition-all duration-300 placeholder:text-amber-800/40 text-amber-900"
            />
            <div className="absolute inset-0 bg-gradient-to-br from-amber-100/20 to-orange-100/20 rounded-xl -z-10" />
          </div>

          <motion.button
            whileHover={{ scale: 1.02 }}
            whileTap={{ scale: 0.98 }}
            onClick={handleStartQuizWithSync}
            className="w-full py-4 text-xl font-semibold text-white bg-gradient-to-r from-amber-500 to-orange-500 rounded-xl shadow-lg hover:shadow-xl transition-all duration-300 hover:from-amber-400 hover:to-orange-400"
          >
            Започни играта
          </motion.button>
        </motion.div>
      </motion.div>
    </motion.div>
  );
}