iTwin / iTwinUI

A design system for building beautiful and well-working web interfaces.
https://itwin.github.io/iTwinUI/
MIT License
104 stars 37 forks source link

Overlay loading state container #42

Closed veekeys closed 3 years ago

veekeys commented 3 years ago
maxime4000 commented 3 years ago

It will need some refactoring, but here some free working code :

@import "~@bentley/itwinui/scss/style/index";
@include themed();
@mixin SpinnerClass($backgroundColor, $pointerEvent: auto) {
    width: calc(100%);
    height: calc(100%);
    position: absolute;
    background-color: $backgroundColor;
    top: 0;
    left: 0;
    z-index: 500;
    border-radius: 4px;
    pointer-events: $pointerEvent;

    .SpinnerMiddleContainer {
        position: relative;
        top: 50%;
        -ms-transform: translate(0%, -50%);
        transform: translate(0%, -50%);

        .iui-progress-indicator-radial {
            display: block;
            height: 50px;
            width: unset;
        }

        .SpinnerTextContainer {
            top: 48%;
            padding: 19px;
            text-align: center;
            font-size: 18px;
        }
    }
}
.SpinnerOverlay {
    $backgroundColor: rgba(t(iui-color-background-1-rgb), t(iui-opacity-2));
    $pointerEvent: auto;
    @include SpinnerClass($backgroundColor, $pointerEvent);
}

.SpinnerNoOverlay {
    $backgroundColor: #00000000; //rgba(t($iui-color-background-1-rgb), t(iui-opacity-2))
    $pointerEvent: none;
    @include SpinnerClass($backgroundColor, $pointerEvent);
}

And the React Component :

import React from "react";
import cx from "classnames";
import { ProgressRadial } from "@bentley/itwinui-react/esm/core";

import "./OverlaySpinner.scss";

interface Props {
    isShown: boolean;
    isNoOverlay?: boolean;
    text?: string;
}

export const OverlaySpinner = (props: Props) => {
    const { isShown, isNoOverlay = false, text } = props;
    return (
        <>
            {isShown && (
                <div className={cx(!isNoOverlay ? "SpinnerOverlay" : "SpinnerNoOverlay")}>
                    <div className="SpinnerMiddleContainer">
                        <ProgressRadial indeterminate />
                        {text && <div className="SpinnerTextContainer">{text}</div>}
                    </div>
                </div>
            )}
        </>
    );
};