feat: mobile gate

This commit is contained in:
Maze Winther 2026-03-02 10:36:19 +01:00
parent 2074dde3e3
commit 82f8f76a84
2 changed files with 86 additions and 9 deletions

View File

@ -16,22 +16,25 @@ import { Onboarding } from "@/components/editor/onboarding";
import { MigrationDialog } from "@/components/editor/dialogs/migration-dialog";
import { usePanelStore } from "@/stores/panel-store";
import { usePasteMedia } from "@/hooks/use-paste-media";
import { MobileGate } from "@/components/editor/mobile-gate";
export default function Editor() {
const params = useParams();
const projectId = params.project_id as string;
return (
<EditorProvider projectId={projectId}>
<div className="bg-background flex h-screen w-screen flex-col overflow-hidden">
<EditorHeader />
<div className="min-h-0 min-w-0 flex-1">
<EditorLayout />
<MobileGate>
<EditorProvider projectId={projectId}>
<div className="bg-background flex h-screen w-screen flex-col overflow-hidden">
<EditorHeader />
<div className="min-h-0 min-w-0 flex-1">
<EditorLayout />
</div>
<Onboarding />
<MigrationDialog />
</div>
<Onboarding />
<MigrationDialog />
</div>
</EditorProvider>
</EditorProvider>
</MobileGate>
);
}

View File

@ -0,0 +1,74 @@
"use client";
import { useEffect, useState } from "react";
import Link from "next/link";
import { Button } from "../ui/button";
import { HugeiconsIcon } from "@hugeicons/react";
import { ArrowLeft01Icon, ArrowRight01Icon } from "@hugeicons/core-free-icons";
import { useRouter } from "next/navigation";
const STORAGE_KEY = "mobile-acknowledged";
interface MobileGateProps {
children: React.ReactNode;
}
export function MobileGate({ children }: MobileGateProps) {
const router = useRouter();
const [show, setShow] = useState<boolean | null>(null);
useEffect(() => {
const isMobile = window.innerWidth < 1024;
const acknowledged = localStorage.getItem(STORAGE_KEY) === "true";
setShow(isMobile && !acknowledged);
}, []);
if (show === null) return null;
if (!show) return <>{children}</>;
const handleContinue = () => {
localStorage.setItem(STORAGE_KEY, "true");
setShow(false);
};
const handleGoBack = () => {
router.back();
};
return (
<div className="dark bg-background relative flex h-screen w-screen flex-col overflow-hidden">
<Button
variant="text"
className="absolute top-6 left-6 flex items-center gap-1 text-muted-foreground"
onClick={handleGoBack}
>
<HugeiconsIcon icon={ArrowLeft01Icon} className="size-4" />
<span className=" text-sm">Go back</span>
</Button>
<div className="flex flex-1 flex-col justify-center gap-5 px-7">
<div className="flex flex-col gap-3">
<h1 className="text-foreground text-3xl font-bold tracking-tight">
Desktop only (for now)
</h1>
<p className="text-muted-foreground text-sm leading-relaxed">
OpenCut isn't optimized for mobile or iPad yet. Things will break
and the layout will be a mess. Come back on a desktop for the real
experience.
</p>
</div>
<div className="flex items-center gap-3">
<Button variant="foreground" onClick={handleContinue}>
Take a look anyway
</Button>
<Button variant="ghost" asChild>
<Link href="/roadmap" className="flex items-center gap-1">
Roadmap
<HugeiconsIcon icon={ArrowRight01Icon} size={14} />
</Link>
</Button>
</div>
</div>
</div>
);
}