{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 { toErrorMessage } from "@/lib/api"; 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 recentSteps = useSessionStore((s) => s.recentSteps); 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); const [redirected, setRedirected] = useState(false); useEffect(() => { if (!id) return; void fetchState(id).catch((err) => pushToast("error", toErrorMessage(err, t("play.load_failed")))); return () => { reset(); }; }, [id, fetchState, reset, pushToast, t]); // Redirect non-ready worlds to the edit page (once we have the world loaded). useEffect(() => { if (!id) return; if (world && world.status !== "ready" && !redirected) { pushToast("warning", t("play.not_ready")); setRedirected(true); navigate(`/worlds/${id}/edit`, { replace: true }); } }, [id, world, redirected, navigate, 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")}