diff --git a/plane-src/apps/web/core/components/core/app-header.tsx b/plane-src/apps/web/core/components/core/app-header.tsx index 988e9a6..fab9005 100644 --- a/plane-src/apps/web/core/components/core/app-header.tsx +++ b/plane-src/apps/web/core/components/core/app-header.tsx @@ -69,6 +69,7 @@ export const AppHeader = observer(function AppHeader(props: AppHeaderProps) { )} > +
{mobileHeader && mobileHeader}
diff --git a/plane-src/apps/web/core/components/voice-tasker/global-control.tsx b/plane-src/apps/web/core/components/voice-tasker/global-control.tsx index 7ad127c..f340fe8 100644 --- a/plane-src/apps/web/core/components/voice-tasker/global-control.tsx +++ b/plane-src/apps/web/core/components/voice-tasker/global-control.tsx @@ -6,6 +6,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import type { ElementType, MouseEvent, ReactNode } from "react"; +import { createPortal } from "react-dom"; import { useParams } from "next/navigation"; import useSWR from "swr"; import { @@ -760,6 +761,7 @@ export function VoiceTaskerGlobalControl({ workspaceSlug }: Props) { const [commitResult, setCommitResult] = useState(null); const [hasDraftChanges, setHasDraftChanges] = useState(false); const [selectedTargetIssue, setSelectedTargetIssue] = useState(null); + const [dockSlot, setDockSlot] = useState(null); const mediaRecorderRef = useRef(null); const discardedRecorderRef = useRef(null); @@ -787,6 +789,22 @@ export function VoiceTaskerGlobalControl({ workspaceSlug }: Props) { return UNAVAILABLE_LABELS[preflight.reason ?? "not_configured"]; }, [preflight]); + useEffect(() => { + if (typeof document === "undefined") return; + + const updateDockSlot = () => { + setDockSlot(document.querySelector("[data-nodedc-voice-task-dock-slot]")); + }; + + updateDockSlot(); + const observer = new MutationObserver(updateDockSlot); + observer.observe(document.body, { childList: true, subtree: true }); + + return () => { + observer.disconnect(); + }; + }, []); + const clearTimer = useCallback(() => { if (timerRef.current) { window.clearInterval(timerRef.current); @@ -1171,23 +1189,21 @@ export function VoiceTaskerGlobalControl({ workspaceSlug }: Props) { return ( <> -
- - - -
+ {isAvailable && dockSlot + ? createPortal( + + + , + dockSlot + ) + : null}