"use client"; import { useState, useEffect, useRef } from "react"; import { observer } from "mobx-react"; import { LockKeyhole, LockKeyholeOpen } from "lucide-react"; // plane imports import { PROJECT_PAGE_TRACKER_ELEMENTS } from "@plane/constants"; import { Tooltip } from "@plane/propel/tooltip"; // helpers import { captureClick } from "@/helpers/event-tracker.helper"; // hooks import { usePageOperations } from "@/hooks/use-page-operations"; // store import type { TPageInstance } from "@/store/pages/base-page"; // Define our lock display states, renaming "icon-only" to "neutral" type LockDisplayState = "neutral" | "locked" | "unlocked"; type Props = { page: TPageInstance; }; export const PageLockControl = observer(({ page }: Props) => { // Initial state: if locked, then "locked", otherwise default to "neutral" const [displayState, setDisplayState] = useState(page.is_locked ? "locked" : "neutral"); // derived values const { canCurrentUserLockPage, is_locked } = page; // Ref for the transition timer const timerRef = useRef | null>(null); // Ref to store the previous value of isLocked for detecting transitions const prevLockedRef = useRef(is_locked); // page operations const { pageOperations: { toggleLock }, } = usePageOperations({ page, }); // Cleanup any running timer on unmount useEffect( () => () => { if (timerRef.current) clearTimeout(timerRef.current); }, [] ); // Update display state when isLocked changes useEffect(() => { // Clear any previous timer to avoid overlapping transitions if (timerRef.current) { clearTimeout(timerRef.current); timerRef.current = null; } // Transition logic: // If locked, ensure the display state is "locked" // If unlocked after being locked, show "unlocked" briefly then revert to "neutral" if (is_locked) { setDisplayState("locked"); } else if (prevLockedRef.current === true) { setDisplayState("unlocked"); timerRef.current = setTimeout(() => { setDisplayState("neutral"); timerRef.current = null; }, 600); } else { setDisplayState("neutral"); } // Update the previous locked state prevLockedRef.current = is_locked; }, [is_locked]); if (!canCurrentUserLockPage) return null; // Render different UI based on the current display state return ( <> {displayState === "neutral" && ( )} {displayState === "locked" && ( )} {displayState === "unlocked" && (
Unlocked
)} ); });