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}