Skip to content

Commit 0134d4a

Browse files
committed
Fix problem with popover opening
1 parent 7ac6001 commit 0134d4a

File tree

4 files changed

+44
-18
lines changed

4 files changed

+44
-18
lines changed

src/components/Settings/SettingsPopover.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,26 @@
1-
import { useState, useEffect, useRef } from "react";
1+
import { useState } from "react";
22
import { useLingui } from "@lingui/react/macro";
33
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/react";
44
import { HiCog6Tooth } from "react-icons/hi2";
55

6+
import { SettingsPopoverStateProvider } from "./SettingsPopoverStateProvider";
67
import { SettingsSpeedTab } from "./SettingsSpeedTab";
78
import { SettingsRootTab } from "./SettingsRootTab";
89
import { useVideoActions, useVideoState } from "../../hooks";
9-
import { useSetAtom } from "jotai";
10-
import { settingsPopoverOpenAtom } from "../../store/video";
1110

1211
export function SettingsPopover() {
1312
const { t } = useLingui();
1413
const [settingsTab, setSettingsTab] = useState<"root" | "speed">("root");
15-
const popoverOpenRef = useRef(false);
16-
const setSettingsPopoverOpen = useSetAtom(settingsPopoverOpenAtom);
1714

1815
const videoActions = useVideoActions();
1916
const videoState = useVideoState();
2017

21-
// Update the global popover state when ref changes
22-
useEffect(() => {
23-
setSettingsPopoverOpen(popoverOpenRef.current);
24-
});
25-
2618
return (
2719
<Popover>
2820
{({ open }) => {
29-
// Update ref when popover state changes
30-
popoverOpenRef.current = open;
31-
3221
return (
3322
<>
23+
<SettingsPopoverStateProvider open={open} />
3424
<PopoverButton
3525
onClick={() => {
3626
setSettingsTab("root");
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useSetAtom } from "jotai";
2+
import { settingsPopoverOpenAtom } from "../../store/video";
3+
import { useEffect } from "react";
4+
5+
interface SettingsPopoverStateProviderProps {
6+
readonly open: boolean;
7+
}
8+
9+
export function SettingsPopoverStateProvider(
10+
props: SettingsPopoverStateProviderProps,
11+
) {
12+
const setSettingsPopoverOpen = useSetAtom(settingsPopoverOpenAtom);
13+
14+
useEffect(() => {
15+
setSettingsPopoverOpen(props.open);
16+
}, [props.open, setSettingsPopoverOpen]);
17+
18+
return null;
19+
}

src/components/VideoPlayer.tsx

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ export default function VideoPlayerApp() {
3232
height: 0,
3333
});
3434
const settingsPopoverOpen = useAtomValue(settingsPopoverOpenAtom);
35+
const justClosedPopoverRef = useRef(false);
36+
37+
// Detect when popover closes and set flag to prevent immediate actions
38+
useEffect(() => {
39+
if (!settingsPopoverOpen) {
40+
justClosedPopoverRef.current = true;
41+
const timer = setTimeout(() => {
42+
justClosedPopoverRef.current = false;
43+
}, 100);
44+
return () => {
45+
clearTimeout(timer);
46+
};
47+
}
48+
}, [settingsPopoverOpen]);
3549

3650
// Get video context data
3751
const videoActions = useVideoActions();
@@ -115,7 +129,7 @@ export default function VideoPlayerApp() {
115129
};
116130

117131
const openFileDialog = () => {
118-
if (!settingsPopoverOpen) {
132+
if (!settingsPopoverOpen && !justClosedPopoverRef.current) {
119133
fileInputRef.current?.click();
120134
}
121135
};
@@ -357,7 +371,11 @@ export default function VideoPlayerApp() {
357371
ref={videoRef}
358372
src={videoUrl}
359373
className="h-full w-full object-contain"
360-
onClick={videoActions.togglePlayPause}
374+
onClick={() => {
375+
if (!settingsPopoverOpen && !justClosedPopoverRef.current) {
376+
videoActions.togglePlayPause();
377+
}
378+
}}
361379
/>
362380
) : (
363381
<div className="flex h-full w-full flex-col items-center justify-center text-white">
@@ -375,6 +393,7 @@ export default function VideoPlayerApp() {
375393
<p className="text-xl text-gray-300">
376394
{t`Drop a video file anywhere or click here to open one`}
377395
</p>
396+
<p>{settingsPopoverOpen ? "Settings Open" : "Settings Closed"}</p>
378397
</div>
379398
</div>
380399
</div>

src/store/video.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,8 @@ export const videoFileSetAtom = atom(null, (_get, set, file: File) => {
140140

141141
export const togglePlayPauseAtom = atom(null, (get) => {
142142
const element = get(videoElementAtom);
143-
const isSettingsPopoverOpen = get(settingsPopoverOpenAtom);
144143

145-
if (!element || isSettingsPopoverOpen) {
146-
// No element registered or settings popover is open; nothing to toggle
144+
if (!element) {
147145
return;
148146
}
149147

0 commit comments

Comments
 (0)