Skip to content

Commit 9ab9c9d

Browse files
committed
Refactor: remove react-fullscreenable dependency and replace with custom fullscreen hook
implemented custom useFullscreen hook wrapping standard Fullscreen API uninstalled react-fullscreenable package and removed all of its imports Signed-off-by: Andrii Podriez <[email protected]>
1 parent 9a19cd1 commit 9ab9c9d

File tree

5 files changed

+105
-7
lines changed

5 files changed

+105
-7
lines changed

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"react-dnd": "^14.0.5",
4545
"react-dnd-html5-backend": "^14.1.0",
4646
"react-dom": "^17.0.2",
47-
"react-fullscreenable": "^2.5.1-0",
4847
"react-json-view": "^1.21.3",
4948
"react-notification-system": "^0.4.0",
5049
"react-redux": "^7.2.8",

src/pages/dashboards/dashboard-layout.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
useUpdateWidgetMutation,
2828
} from "../../store/apiSlice";
2929
import { sessionToken } from "../../localStorage";
30-
import Fullscreenable from "react-fullscreenable";
3130
import DashboardButtonGroup from "./grid/dashboard-button-group";
3231
import Widget from "./widget/widget";
3332
import WidgetContainer from "./widget/widget-container";
@@ -38,6 +37,7 @@ import EditWidgetDialog from "./widget/edit-widget/edit-widget";
3837
import EditSignalMappingDialog from "../scenarios/dialogs/edit-signal-mapping";
3938
import classNames from "classnames";
4039
import { Spinner } from "react-bootstrap";
40+
import useFullscreen from "../../utils/fullscreen.js";
4141

4242
//this component handles the UI of the dashboard
4343
const DashboardLayout = ({ isFullscreen, toggleFullscreen }) => {
@@ -451,4 +451,19 @@ const DashboardLayout = ({ isFullscreen, toggleFullscreen }) => {
451451
);
452452
};
453453

454-
export default Fullscreenable()(DashboardLayout);
454+
//wrap into fullscreen
455+
const DashboardFullscreenable = () => {
456+
const { fullscreenTargetRef, isFullscreen, toggleFullscreen } =
457+
useFullscreen();
458+
459+
return (
460+
<div ref={fullscreenTargetRef}>
461+
<Dashboard
462+
isFullscreen={isFullscreen}
463+
toggleFullscreen={toggleFullscreen}
464+
/>
465+
</div>
466+
);
467+
};
468+
469+
export default DashboardFullscreenable;

src/pages/dashboards/dashboard-old.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import React, { useState, useEffect, useCallback, useRef, act } from "react";
1919
import { useDispatch, useSelector } from "react-redux";
2020
import { useParams } from "react-router-dom";
21-
import Fullscreenable from "react-fullscreenable";
2221
import classNames from "classnames";
2322
import "react-contexify/dist/ReactContexify.min.css";
2423
import EditWidget from "./widget/edit-widget/edit-widget";
@@ -29,6 +28,7 @@ import DashboardButtonGroup from "./grid/dashboard-button-group";
2928
import IconToggleButton from "../../common/buttons/icon-toggle-button";
3029
import WidgetContainer from "./widget/widget-container";
3130
import Widget from "./widget/widget-old";
31+
import useFullscreen from "../../utils/fullscreen.js";
3232

3333
import { connectWebSocket, disconnect } from "../../store/websocketSlice";
3434

@@ -615,4 +615,19 @@ const Dashboard = ({ isFullscreen, toggleFullscreen }) => {
615615
);
616616
};
617617

618-
export default Fullscreenable()(Dashboard);
618+
//wrap into fullscreen
619+
const DashboardFullscreenable = () => {
620+
const { fullscreenTargetRef, isFullscreen, toggleFullscreen } =
621+
useFullscreen();
622+
623+
return (
624+
<div ref={fullscreenTargetRef}>
625+
<Dashboard
626+
isFullscreen={isFullscreen}
627+
toggleFullscreen={toggleFullscreen}
628+
/>
629+
</div>
630+
);
631+
};
632+
633+
export default DashboardFullscreenable;

src/pages/dashboards/dashboard.jsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import React, { useState, useEffect, useCallback, useRef } from "react";
1919
import { useDispatch, useSelector } from "react-redux";
2020
import { useParams } from "react-router-dom";
21-
import Fullscreenable from "react-fullscreenable";
2221
import "react-contexify/dist/ReactContexify.min.css";
2322
import EditWidget from "./widget/edit-widget/edit-widget";
2423
import EditSignalMappingDialog from "./dialogs/edit-signal-mapping.jsx";
@@ -29,6 +28,7 @@ import IconToggleButton from "../../common/buttons/icon-toggle-button";
2928
import WidgetContainer from "./widget/widget-container";
3029
import Widget from "./widget/widget.jsx";
3130
import EditFilesDialog from "./dialogs/edit-files-dialog.jsx";
31+
import useFullscreen from "../../utils/fullscreen.js";
3232

3333
import { disconnect } from "../../store/websocketSlice";
3434
import { useDashboardData } from "./hooks/use-dashboard-data.js";
@@ -609,4 +609,19 @@ const Dashboard = ({ isFullscreen, toggleFullscreen }) => {
609609
);
610610
};
611611

612-
export default Fullscreenable()(Dashboard);
612+
//wrap into fullscreen
613+
const DashboardFullscreenable = () => {
614+
const { fullscreenTargetRef, isFullscreen, toggleFullscreen } =
615+
useFullscreen();
616+
617+
return (
618+
<div ref={fullscreenTargetRef}>
619+
<Dashboard
620+
isFullscreen={isFullscreen}
621+
toggleFullscreen={toggleFullscreen}
622+
/>
623+
</div>
624+
);
625+
};
626+
627+
export default DashboardFullscreenable;

src/utils/fullscreen.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* This file is part of VILLASweb.
3+
*
4+
* VILLASweb is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* VILLASweb is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with VILLASweb. If not, see <http://www.gnu.org/licenses/>.
16+
******************************************************************************/
17+
18+
import { useState, useEffect, useRef } from "react";
19+
20+
// this is essentially a wrapper around standart Fullscreen API
21+
22+
const useFullscreen = () => {
23+
const fullscreenTargetRef = useRef(null);
24+
const [isFullscreen, setIsFullscreen] = useState(false);
25+
26+
useEffect(() => {
27+
const updateFullscreenState = () =>
28+
setIsFullscreen(!!document.fullscreenElement);
29+
30+
document.addEventListener("fullscreenchange", updateFullscreenState);
31+
document.addEventListener("webkitfullscreenchange", updateFullscreenState);
32+
33+
return () => {
34+
document.removeEventListener("fullscreenchange", updateFullscreenState);
35+
document.removeEventListener(
36+
"webkitfullscreenchange",
37+
updateFullscreenState
38+
);
39+
};
40+
}, []);
41+
42+
const toggleFullscreen = () => {
43+
if (isFullscreen) {
44+
if (document.exitFullscreen) document.exitFullscreen();
45+
} else {
46+
if (fullscreenTargetRef.current.requestFullscreen)
47+
fullscreenTargetRef.current.requestFullscreen();
48+
}
49+
};
50+
51+
return { fullscreenTargetRef, isFullscreen, toggleFullscreen };
52+
};
53+
54+
export default useFullscreen;

0 commit comments

Comments
 (0)