64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import useFileDrop from "components/system/Files/FileManager/useFileDrop";
|
|
import { useProcesses } from "contexts/process";
|
|
import dynamic from "next/dynamic";
|
|
import { useMemo, useRef, useState } from "react";
|
|
import type {
|
|
DefaultTheme,
|
|
StyledComponent as StyledComponentType,
|
|
} from "styled-components";
|
|
|
|
const StyledLoading = dynamic(
|
|
() => import("components/system/Files/FileManager/StyledLoading")
|
|
);
|
|
|
|
type ContainerHook = (
|
|
id: string,
|
|
url: string,
|
|
container: React.MutableRefObject<HTMLDivElement | null>,
|
|
setLoading: React.Dispatch<React.SetStateAction<boolean>>,
|
|
loading: boolean
|
|
) => void;
|
|
|
|
type AppContainerProps = {
|
|
StyledComponent: StyledComponentType<"div", DefaultTheme>;
|
|
id: string;
|
|
useHook: ContainerHook;
|
|
};
|
|
|
|
const AppContainer: FC<AppContainerProps> = ({
|
|
id,
|
|
useHook,
|
|
StyledComponent,
|
|
children,
|
|
}): JSX.Element => {
|
|
const {
|
|
processes: { [id]: { url: currentUrl = "" } = {} },
|
|
} = useProcesses();
|
|
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const style = useMemo<React.CSSProperties>(
|
|
() => ({
|
|
contain: "strict",
|
|
visibility: loading ? "hidden" : "visible",
|
|
}),
|
|
[loading]
|
|
);
|
|
|
|
useHook(id, currentUrl, containerRef, setLoading, loading);
|
|
|
|
return (
|
|
<>
|
|
{loading && <StyledLoading />}
|
|
<StyledComponent
|
|
ref={containerRef}
|
|
style={style}
|
|
{...useFileDrop({ id })}
|
|
>
|
|
{children}
|
|
</StyledComponent>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default AppContainer;
|