- 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.
60 lines
1.7 KiB
TypeScript
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>
|
|
);
|
|
}
|