Refactor ImageGalleryLayout
Split out main component Move useEffect to corresponding component
This commit is contained in:
parent
5d0a9fdefe
commit
fc32dd79cc
|
|
@ -132,16 +132,25 @@ const GenerateTreeView = ({ root }: { root: Folders }) => {
|
||||||
export const ImageGalleryDrawer = ({
|
export const ImageGalleryDrawer = ({
|
||||||
open,
|
open,
|
||||||
drawerWidth,
|
drawerWidth,
|
||||||
folders,
|
|
||||||
handleDrawerToggle,
|
handleDrawerToggle,
|
||||||
}: {
|
}: {
|
||||||
open: boolean;
|
open: boolean;
|
||||||
drawerWidth: number;
|
drawerWidth: number;
|
||||||
folders: Folders | undefined;
|
|
||||||
handleDrawerToggle: () => void;
|
handleDrawerToggle: () => void;
|
||||||
}) => {
|
}) => {
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const smallScreen = !useMediaQuery(smallScreenMediaQuery);
|
const smallScreen = !useMediaQuery(smallScreenMediaQuery);
|
||||||
|
const [folders, setFolders] = useState<Folders | undefined>(undefined);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetch("/directories", {
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((data) => setFolders(data));
|
||||||
|
}, []);
|
||||||
|
|
||||||
const drawerContent =
|
const drawerContent =
|
||||||
folders != undefined ? (
|
folders != undefined ? (
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
import React, { useEffect, useState } from "react";
|
||||||
|
import Box from "@mui/material/Box";
|
||||||
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
|
import Toolbar from "@mui/material/Toolbar";
|
||||||
|
import { Chip, Divider } from "@mui/material";
|
||||||
|
import { FolderPreview, ImageWithThumbnail } from "./models";
|
||||||
|
import { Spinner } from "./Spinner";
|
||||||
|
import { FolderGallery } from "./FolderGallery";
|
||||||
|
import { ImageGallery } from "./ImageGallery";
|
||||||
|
|
||||||
|
export const ImageGalleryMain = ({
|
||||||
|
setError,
|
||||||
|
}: {
|
||||||
|
setError: (_: boolean) => void;
|
||||||
|
}) => {
|
||||||
|
const [imagesLoaded, setImagesLoaded] = useState(false);
|
||||||
|
const [images, setImages] = useState<ImageWithThumbnail[]>([]);
|
||||||
|
|
||||||
|
const [foldersPreview, setFoldersPreview] = useState<
|
||||||
|
FolderPreview[] | undefined
|
||||||
|
>([]);
|
||||||
|
const location = useLocation();
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setFoldersPreview(undefined);
|
||||||
|
setImages([]);
|
||||||
|
setError(false);
|
||||||
|
setImagesLoaded(false);
|
||||||
|
fetch(`/folderspreview${location.pathname}`, {
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((data) => {
|
||||||
|
setFoldersPreview(data);
|
||||||
|
});
|
||||||
|
fetch(`/images${location.pathname}`, {
|
||||||
|
headers: {
|
||||||
|
Accept: "application/json",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((data) => {
|
||||||
|
if (data.images === undefined) {
|
||||||
|
if (location.pathname !== "/") {
|
||||||
|
navigate("/");
|
||||||
|
} else {
|
||||||
|
setError(true);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setImages(data.images);
|
||||||
|
setImagesLoaded(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, [location.pathname]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box component="main" sx={{ flexGrow: 1, p: 3 }}>
|
||||||
|
<Toolbar />
|
||||||
|
{!imagesLoaded || !foldersPreview ? (
|
||||||
|
<Spinner />
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{foldersPreview.length > 0 && (
|
||||||
|
<>
|
||||||
|
<Divider style={{ marginBottom: "10px" }}>
|
||||||
|
<Chip label="Folders" size="small" />
|
||||||
|
</Divider>
|
||||||
|
<FolderGallery folders={foldersPreview} />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{images.length > 0 && foldersPreview.length > 0 && (
|
||||||
|
<Divider style={{ marginBottom: "10px" }}>
|
||||||
|
<Chip label="Images" size="small" />
|
||||||
|
</Divider>
|
||||||
|
)}
|
||||||
|
{images.length > 0 && <ImageGallery images={images} />}
|
||||||
|
{images.length == 0 && foldersPreview.length == 0 && (
|
||||||
|
<p>
|
||||||
|
No images available. You may want to add images to this directory.
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
@ -1,84 +1,21 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useState } from "react";
|
||||||
import CssBaseline from "@mui/material/CssBaseline";
|
import CssBaseline from "@mui/material/CssBaseline";
|
||||||
import Box from "@mui/material/Box";
|
import Box from "@mui/material/Box";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
|
||||||
import {
|
|
||||||
FolderPreview,
|
|
||||||
Folders,
|
|
||||||
ImageWithThumbnail,
|
|
||||||
} from "./ImageGallery/models";
|
|
||||||
import { ImageGalleryAppBar } from "./ImageGallery/ImageGalleryAppBar";
|
import { ImageGalleryAppBar } from "./ImageGallery/ImageGalleryAppBar";
|
||||||
import { ImageGalleryDrawer } from "./ImageGallery/ImageGalleryDrawer";
|
import { ImageGalleryDrawer } from "./ImageGallery/ImageGalleryDrawer";
|
||||||
import { ImageGallery } from "./ImageGallery/ImageGallery";
|
import { ImageGalleryMain } from "./ImageGallery/ImageGalleryMain";
|
||||||
import { Spinner } from "./ImageGallery/Spinner";
|
|
||||||
import Toolbar from "@mui/material/Toolbar";
|
|
||||||
import { Chip, Divider } from "@mui/material";
|
|
||||||
import { FolderGallery } from "./ImageGallery/FolderGallery";
|
|
||||||
|
|
||||||
const drawerWidth = 240;
|
const drawerWidth = 240;
|
||||||
export const smallScreenMediaQuery = `(min-width:${drawerWidth * 3}px)`;
|
export const smallScreenMediaQuery = `(min-width:${drawerWidth * 3}px)`;
|
||||||
|
|
||||||
function ImageGalleryLayout() {
|
export const ImageGalleryLayout = (): React.JSX.Element => {
|
||||||
const [drawerOpen, setDrawerOpen] = useState(false);
|
const [drawerOpen, setDrawerOpen] = useState(false);
|
||||||
const [error, setError] = useState(false);
|
const [error, setError] = useState(false);
|
||||||
const [imagesLoaded, setImagesLoaded] = useState(false);
|
|
||||||
const [images, setImages] = useState<ImageWithThumbnail[]>([]);
|
|
||||||
|
|
||||||
const [folders, setFolders] = useState<Folders | undefined>(undefined);
|
|
||||||
const [foldersPreview, setFoldersPreview] = useState<
|
|
||||||
FolderPreview[] | undefined
|
|
||||||
>([]);
|
|
||||||
const location = useLocation();
|
|
||||||
const navigate = useNavigate();
|
|
||||||
|
|
||||||
function handleDrawerToggle() {
|
function handleDrawerToggle() {
|
||||||
setDrawerOpen(!drawerOpen);
|
setDrawerOpen(!drawerOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetch("/directories", {
|
|
||||||
headers: {
|
|
||||||
Accept: "application/json",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((res) => res.json())
|
|
||||||
.then((data) => setFolders(data));
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setFoldersPreview(undefined);
|
|
||||||
setImages([]);
|
|
||||||
setError(false);
|
|
||||||
setImagesLoaded(false);
|
|
||||||
fetch(`/folderspreview${location.pathname}`, {
|
|
||||||
headers: {
|
|
||||||
Accept: "application/json",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((res) => res.json())
|
|
||||||
.then((data) => {
|
|
||||||
setFoldersPreview(data);
|
|
||||||
});
|
|
||||||
fetch(`/images${location.pathname}`, {
|
|
||||||
headers: {
|
|
||||||
Accept: "application/json",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then((res) => res.json())
|
|
||||||
.then((data) => {
|
|
||||||
if (data.images === undefined) {
|
|
||||||
if (location.pathname !== "/") {
|
|
||||||
navigate("/");
|
|
||||||
} else {
|
|
||||||
setError(true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
setImages(data.images);
|
|
||||||
setImagesLoaded(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, [location.pathname]);
|
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return (
|
return (
|
||||||
<p>
|
<p>
|
||||||
|
|
@ -98,40 +35,9 @@ function ImageGalleryLayout() {
|
||||||
<ImageGalleryDrawer
|
<ImageGalleryDrawer
|
||||||
open={drawerOpen}
|
open={drawerOpen}
|
||||||
drawerWidth={drawerWidth}
|
drawerWidth={drawerWidth}
|
||||||
folders={folders}
|
|
||||||
handleDrawerToggle={handleDrawerToggle}
|
handleDrawerToggle={handleDrawerToggle}
|
||||||
/>
|
/>
|
||||||
<Box component="main" sx={{ flexGrow: 1, p: 3 }}>
|
<ImageGalleryMain setError={setError} />
|
||||||
<Toolbar />
|
|
||||||
{!imagesLoaded || !foldersPreview ? (
|
|
||||||
<Spinner />
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
{foldersPreview.length > 0 && (
|
|
||||||
<>
|
|
||||||
<Divider style={{ marginBottom: "10px" }}>
|
|
||||||
<Chip label="Folders" size="small" />
|
|
||||||
</Divider>
|
|
||||||
<FolderGallery folders={foldersPreview} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
{images.length > 0 && foldersPreview.length > 0 && (
|
|
||||||
<Divider style={{ marginBottom: "10px" }}>
|
|
||||||
<Chip label="Images" size="small" />
|
|
||||||
</Divider>
|
|
||||||
)}
|
|
||||||
{images.length > 0 && <ImageGallery images={images} />}
|
|
||||||
{images.length == 0 && foldersPreview.length == 0 && (
|
|
||||||
<p>
|
|
||||||
No images available. You may want to add images to this
|
|
||||||
directory.
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Box>
|
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
export default ImageGalleryLayout;
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import ReactDOM from "react-dom/client";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
import { BrowserRouter } from "react-router-dom";
|
import { BrowserRouter } from "react-router-dom";
|
||||||
import reportWebVitals from "./reportWebVitals";
|
import reportWebVitals from "./reportWebVitals";
|
||||||
import ImageGalleryLayout from "./ImageGalleryLayout";
|
import { ImageGalleryLayout } from "./ImageGalleryLayout";
|
||||||
import { setGalleryTitleAndFavicon } from "./env";
|
import { setGalleryTitleAndFavicon } from "./env";
|
||||||
|
|
||||||
setGalleryTitleAndFavicon();
|
setGalleryTitleAndFavicon();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue