storytellurx-v1/app/game-engine/turn-provider.tsx
Elias Rhouzlane a82706a764 feat: Add Lottie to SVG conversion utility and integrate zipper animation
- Created a new utility script `lottie-to-svg.ts` to convert Lottie animations to SVG format using `bodymovin-to-smil`.
- Added a new Lottie animation file `zipper.json` for the zipper animation.
- Generated the corresponding SVG file `zipper.svg` from the Lottie animation.
- Updated `deno.json` to include new dependencies and references for the zipper animation.
- Modified `main.css` to introduce new color variables and styles for the zipper animation.
2025-07-01 04:23:37 +02:00

60 lines
1.7 KiB
TypeScript

"use client";
import type { NarrativeMessage } from "./narrative-provider.tsx";
import { useGetAssistantTurn } from "./game-state.ts";
import { createContext, useContext } from "react";
interface TurnContextValue {
message: NarrativeMessage;
previousAssistantMessage?: NarrativeMessage;
nextAssistantMessage?: NarrativeMessage | null;
previousMessages?: NarrativeMessage[];
turnData: ReturnType<typeof useGetAssistantTurn>;
previousTurnData: ReturnType<typeof useGetAssistantTurn>;
nextTurnData: ReturnType<typeof useGetAssistantTurn> | null;
}
const TurnContext = createContext<TurnContextValue | null>(null);
export const useTurn = () => {
const context = useContext(TurnContext);
if (!context) {
throw new Error("useTurn must be used within a TurnProvider");
}
return context;
};
export default function TurnProvider({
children,
messages,
nextAssistantMessage,
}: {
messages: NarrativeMessage[];
children: React.ReactNode;
nextAssistantMessage: NarrativeMessage | null;
}) {
const previousAssistantMessages = messages
.filter((t) => t.role === "assistant");
const message = messages.at(-1);
if (!message) return null;
const contextValue: TurnContextValue = {
message,
previousAssistantMessage: previousAssistantMessages?.at(-1),
nextAssistantMessage,
previousMessages: messages,
turnData: useGetAssistantTurn(message),
previousTurnData: useGetAssistantTurn(previousAssistantMessages?.at(-1)),
nextTurnData: nextAssistantMessage
? useGetAssistantTurn(nextAssistantMessage)
: null,
};
return (
<TurnContext.Provider value={contextValue}>
{children}
</TurnContext.Provider>
);
}