{world.name}
{world.current_time ? `${t("worlds.current_time")}: ${world.current_time}` : ""}
import { useEffect, useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { useSessionStore } from "@/stores/sessionStore"; import { useToastStore } from "@/stores/toastStore"; import { Button } from "@/components/ui/Button"; import { Card } from "@/components/ui/Card"; import { Spinner } from "@/components/ui/Spinner"; import { ChatView } from "@/components/sessions/ChatView"; import { ActionInput } from "@/components/sessions/ActionInput"; import { SseStatus } from "@/components/sessions/SseStatus"; import type { Environment, PlotRail } from "@/types"; export function PlayPage() { const { id } = useParams<{ id: string }>(); const { t } = useTranslation(); const navigate = useNavigate(); const pushToast = useToastStore((s) => s.push); const world = useSessionStore((s) => s.world); const environment = useSessionStore((s) => s.environment); const nextActions = useSessionStore((s) => s.nextActions); const loading = useSessionStore((s) => s.loading); const error = useSessionStore((s) => s.error); const submitting = useSessionStore((s) => s.submitting); const sseStatus = useSessionStore((s) => s.sseStatus); const fetchState = useSessionStore((s) => s.fetchState); const sendAction = useSessionStore((s) => s.sendAction); const retry = useSessionStore((s) => s.retry); const rollback = useSessionStore((s) => s.rollback); const reset = useSessionStore((s) => s.reset); const [rollbackOpen, setRollbackOpen] = useState(false); useEffect(() => { if (!id) return; void fetchState(id).catch(() => pushToast("error", t("play.load_failed"))); return () => { reset(); }; }, [id, fetchState, reset, pushToast, t]); if (!id) return null; if (loading && !world) { return (
{t("play.load_failed")}: {error}
{world.current_time ? `${t("worlds.current_time")}: ${world.current_time}` : ""}
{t("play.rollback_confirm")}