import orLogo from "~/assets/orSpot.svg"; import micOff from "~/assets/mic-off-red.svg"; import micOn from "~/assets/mic-on-dark.svg"; import Login from "~/entrypoints/popup/Login"; import Settings from "~/entrypoints/popup/Settings"; import { createSignal, createEffect, onMount } from "solid-js"; import Dropdown from "~/entrypoints/popup/Dropdown"; import Button from "~/entrypoints/popup/Button"; import { ChevronSvg, RecordDesktopSvg, RecordTabSvg, HomePageSvg, SlackSvg, SettingsSvg, } from "./Icons"; async function getAudioDevices() { try { await navigator.mediaDevices.getUserMedia({ audio: true }); const devices = await navigator.mediaDevices.enumerateDevices(); const audioDevices = devices .filter((device) => device.kind === "audioinput") .map((device) => ({ label: device.label, id: device.deviceId })); return { granted: true, audioDevices }; } catch (error) { console.error("Error accessing audio devices:", error); const msg = error.message ?? ""; return { granted: false, denied: msg.includes("denied"), audioDevices: [], }; } } const orSite = () => { window.open("https://openreplay.com", "_blank"); }; function Header({ openSettings }: { openSettings: () => void }) { const openHomePage = async () => { const { settings } = await chrome.storage.local.get("settings"); return window.open(`${settings.ingestPoint}/spots`, "_blank"); }; return (
); } const STATE = { empty: "empty", login: "login", ready: "ready", starting: "starting", recording: "recording", }; function App() { const [state, setState] = createSignal(STATE.empty); const [isSettingsOpen, setIsSettingsOpen] = createSignal(false); const [mic, setMic] = createSignal(false); const [selectedAudioDevice, setSelectedAudioDevice] = createSignal(""); const [hasPermissions, setHasPermissions] = createSignal(false); onMount(() => { browser.runtime.onMessage.addListener((message) => { if (message.type === "popup:no-login") { setState(STATE.login); } if (message.type === "popup:login") { setState(STATE.ready); } if (message.type === "popup:stopped") { setState(STATE.ready); } if (message.type === "popup:started") { setState(STATE.recording); } if (message.type === "popup:mic-status") { setMic(message.status); } }); void browser.runtime.sendMessage({ type: "popup:check-status" }); }); const startRecording = async (reqTab: "tab" | "desktop") => { setState(STATE.starting); await browser.runtime.sendMessage({ type: "popup:start", area: reqTab, mic: mic(), audioId: selectedAudioDevice(), permissions: hasPermissions(), }); window.close(); }; const stopRecording = () => { void browser.runtime.sendMessage({ type: "popup:stop", mic: mic(), audioId: selectedAudioDevice(), }); }; const toggleMic = async () => { setMic(!mic()); }; const openSettings = () => { setIsSettingsOpen(true); }; const closeSettings = () => { setIsSettingsOpen(false); }; return (