Files
cozsweet-frontend-nextjs/src/app/chat/hooks/use-chat-promotion-bootstrap.ts
T

53 lines
1.4 KiB
TypeScript

"use client";
import { useEffect, useRef, useState } from "react";
import {
consumePendingChatPromotion,
peekPendingChatUnlock,
} from "@/lib/navigation/chat_unlock_session";
import { useChatDispatch } from "@/stores/chat/chat-context";
import { Logger } from "@/utils/logger";
const log = new Logger("UseChatPromotionBootstrap");
export function useChatPromotionBootstrap(): boolean {
const chatDispatch = useChatDispatch();
const startedRef = useRef(false);
const [isReady, setIsReady] = useState(false);
useEffect(() => {
if (startedRef.current) return;
startedRef.current = true;
void (async () => {
try {
const [entryPromotion, pendingUnlock] = await Promise.all([
consumePendingChatPromotion(),
peekPendingChatUnlock(),
]);
const promotion = entryPromotion ?? pendingUnlock?.promotion ?? null;
if (promotion) {
chatDispatch({
type: "ChatPromotionInjected",
promotion,
messageId: pendingUnlock?.promotion
? pendingUnlock.messageId
: undefined,
});
} else {
chatDispatch({ type: "ChatPromotionCleared" });
}
} catch (error) {
log.warn("Failed to restore chat promotion", error);
chatDispatch({ type: "ChatPromotionCleared" });
} finally {
setIsReady(true);
}
})();
}, [chatDispatch]);
return isReady;
}