1import { useRef, useState } from "react";
2
3import type { ComposerTrigger } from "../../composer-logic";
4
5export function useComposerTriggerState(initialTrigger: () => ComposerTrigger | null) {
6 const [trigger, setActiveTrigger] = useState(initialTrigger);
7 const dismissedTriggerRef = useRef<ComposerTrigger | null>(null);
8
9 const resolveTrigger = (candidate: ComposerTrigger | null) => {
10 const dismissed = dismissedTriggerRef.current;
11 return candidate &&
12 dismissed &&
13 candidate.kind === dismissed.kind &&
14 candidate.rangeStart === dismissed.rangeStart
15 ? null
16 : candidate;
17 };
18
19 const setTrigger = (candidate: ComposerTrigger | null) => {
20 const activeTrigger = resolveTrigger(candidate);
21 if (candidate === null || activeTrigger !== null) {
22 dismissedTriggerRef.current = null;
23 }
24 setActiveTrigger(activeTrigger);
25 };
26
27 const dismissTrigger = (candidate: ComposerTrigger | null) => {
28 dismissedTriggerRef.current = candidate;
29 setActiveTrigger(null);
30 };
31
32 const resetTrigger = (candidate: ComposerTrigger | null) => {
33 dismissedTriggerRef.current = null;
34 setActiveTrigger(candidate);
35 };
36
37 return { trigger, setTrigger, resolveTrigger, dismissTrigger, resetTrigger };
38}