diff --git a/apps/extension/entrypoints/popup/App.tsx b/apps/extension/entrypoints/popup/App.tsx index a9f7988..f6c3b66 100644 --- a/apps/extension/entrypoints/popup/App.tsx +++ b/apps/extension/entrypoints/popup/App.tsx @@ -1,27 +1,36 @@ -import { ArrowUpRight, Circle, MousePointerClick, Square } from "lucide-react"; -import { useEffect, useState } from "react"; +import { + ArrowUpRight, + MousePointerClick, + Square, + TriangleAlert, +} from "lucide-react"; import { browser } from "wxt/browser"; import { MadeByRustrak } from "@/components/brand/made-by-rustrak"; import { OpenShowcaseWordmark } from "@/components/brand/openshowcase-wordmark"; import { Button } from "@/components/ui/button"; import { useColorScheme } from "@/hooks/use-color-scheme"; +import { sendMessage } from "@/lib/messaging"; +import { RecDot } from "./components/RecDot"; +import { RecentRecordings } from "./components/RecentRecordings"; +import { RecordGlyph } from "./components/RecordGlyph"; +import { TabCard } from "./components/TabCard"; +import { formatElapsed, isRecordableUrl } from "./core/format"; import { - defaultRecordingSessionState, - type RecordingSessionState, - sendMessage, -} from "@/lib/messaging"; -import { recordingSession } from "@/lib/recording-storage"; + useActiveTab, + useNow, + useRecentRecordings, + useRecordingSession, + useRecordingStart, + useTab, +} from "./hooks/use-popup-data"; + +const RECENT_LIMIT = 3; function App() { useColorScheme(); - const [state, setState] = useState( - defaultRecordingSessionState, - ); - - useEffect(() => { - recordingSession.getValue().then(setState); - return recordingSession.watch((newState) => setState(newState)); - }, []); + const session = useRecordingSession(); + const activeTab = useActiveTab(); + const recent = useRecentRecordings(RECENT_LIMIT); async function send(type: "startRecording" | "stopRecording") { await sendMessage(type, undefined).catch((error) => { @@ -35,79 +44,40 @@ function App() { window.close(); } - async function openEditor() { - if (!state.recordingId) return; + async function openEditor(recordingId: string) { await browser.tabs.create({ - url: browser.runtime.getURL( - `/editor.html?recordingId=${state.recordingId}`, - ), + url: browser.runtime.getURL(`/editor.html?recordingId=${recordingId}`), }); + window.close(); } - const hasFinishedRecording = !state.active && Boolean(state.recordingId); - return ( -
-
+
+
- {state.active && ( - - - - - - REC - - )} + {session.active && }
- {state.active ? ( -
-
- - - -
- - {state.clickCount ?? 0}{" "} - {state.clickCount === 1 ? "step" : "steps"} - - - Every click becomes a step - -
-
- -
- ) : ( -
-

- Use this tab normally. Clicks become steps, scrolling and typing - become short clips — the editor opens when you stop. -

- - {hasFinishedRecording && ( - - )} -
- )} +
+ {session.active ? ( + send("stopRecording")} + /> + ) : ( + + } + /> + )} +
-