53 lines
1.4 KiB
TypeScript
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;
|
|
}
|