mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-05 04:57:42 +03:00
add ability to use browser back button to close MobilePage
This commit is contained in:
parent
10c730501a
commit
ce54175430
@ -1,4 +1,10 @@
|
|||||||
import { createContext, useContext, useEffect, useState } from "react";
|
import {
|
||||||
|
createContext,
|
||||||
|
useContext,
|
||||||
|
useEffect,
|
||||||
|
useState,
|
||||||
|
useCallback,
|
||||||
|
} from "react";
|
||||||
import { createPortal } from "react-dom";
|
import { createPortal } from "react-dom";
|
||||||
import { motion, AnimatePresence } from "framer-motion";
|
import { motion, AnimatePresence } from "framer-motion";
|
||||||
import { IoMdArrowRoundBack } from "react-icons/io";
|
import { IoMdArrowRoundBack } from "react-icons/io";
|
||||||
@ -6,6 +12,7 @@ import { cn } from "@/lib/utils";
|
|||||||
import { isPWA } from "@/utils/isPWA";
|
import { isPWA } from "@/utils/isPWA";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
|
||||||
const MobilePageContext = createContext<{
|
const MobilePageContext = createContext<{
|
||||||
open: boolean;
|
open: boolean;
|
||||||
@ -24,15 +31,47 @@ export function MobilePage({
|
|||||||
onOpenChange,
|
onOpenChange,
|
||||||
}: MobilePageProps) {
|
}: MobilePageProps) {
|
||||||
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
||||||
|
const location = useLocation();
|
||||||
|
|
||||||
const open = controlledOpen ?? uncontrolledOpen;
|
const open = controlledOpen ?? uncontrolledOpen;
|
||||||
const setOpen = (value: boolean) => {
|
const setOpen = useCallback(
|
||||||
if (onOpenChange) {
|
(value: boolean) => {
|
||||||
onOpenChange(value);
|
if (onOpenChange) {
|
||||||
} else {
|
onOpenChange(value);
|
||||||
setUncontrolledOpen(value);
|
} else {
|
||||||
|
setUncontrolledOpen(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[onOpenChange, setUncontrolledOpen],
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
let isActive = true;
|
||||||
|
|
||||||
|
if (open && isActive) {
|
||||||
|
window.history.pushState({ isMobilePage: true }, "", location.pathname);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
const handlePopState = (event: PopStateEvent) => {
|
||||||
|
if (open && isActive) {
|
||||||
|
event.preventDefault();
|
||||||
|
setOpen(false);
|
||||||
|
// Delay replaceState to ensure state updates are processed
|
||||||
|
setTimeout(() => {
|
||||||
|
if (isActive) {
|
||||||
|
window.history.replaceState(null, "", location.pathname);
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("popstate", handlePopState);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
isActive = false;
|
||||||
|
window.removeEventListener("popstate", handlePopState);
|
||||||
|
};
|
||||||
|
}, [open, setOpen, location.pathname]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<MobilePageContext.Provider value={{ open, onOpenChange: setOpen }}>
|
<MobilePageContext.Provider value={{ open, onOpenChange: setOpen }}>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user