Path: blob/master/src/packages/next/components/share/loading.tsx
1449 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/4import { Icon } from "@cocalc/frontend/components/icon";5import { CSSProperties, ReactNode, useEffect, useState } from "react";6import useIsMounted from "lib/hooks/mounted";78interface Props {9delay?: number;10style?: CSSProperties;11children?: ReactNode;12before?: ReactNode;13center?: boolean;14large?: boolean;15}1617export default function Loading({18delay,19style,20children,21before,22center,23large,24}: Props) {25const [show, setShow] = useState<boolean>(false);26const isMounted = useIsMounted();27useEffect(() => {28setTimeout(() => {29if (!isMounted.current) return;30setShow(true);31}, delay ?? 500);32}, []);3334if (!show) {35return <>{before}</>;36}37return (38<div39style={{40textAlign: center ? "center" : undefined,41fontSize: large ? "32pt" : undefined,42color: "#666",43...style,44}}45>46<Icon name="spinner" spin /> {children ?? <>Loading...</>}47</div>48);49}505152