All files / src/components utils.tsx

43.75% Statements 21/48
0% Branches 0/19
28.57% Functions 2/7
34.14% Lines 14/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113        4x 4x 4x 4x 4x               4x                                     4x 22x                     4x           4x                 4x             4x 1x             4x                                                                      
/*---------------------------------------------------------------------------------------------
 * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
 * See LICENSE.md in the project root for license terms and full copyright notice.
 *--------------------------------------------------------------------------------------------*/
import { SvgChevronLeft } from "@itwin/itwinui-icons-react";
import { ProgressRadial, toaster } from "@itwin/itwinui-react";
import { Text } from "@itwin/itwinui-react";
import "./utils.scss";
import React from "react";
 
export interface WidgetHeaderProps {
  title: string;
  disabled?: boolean;
  returnFn?: () => Promise<void>;
}
 
export const WidgetHeader = ({ title, disabled = false, returnFn }: WidgetHeaderProps) => {
  return (
    <div className="ec3w-widget-header-container">
      {returnFn && (
        <div
          className={disabled ? "ec3w-chevron-disabled" : "ec3w-chevron"}
          onClick={disabled ? undefined : returnFn}
          onKeyUp={disabled ? undefined : returnFn}
        >
          <SvgChevronLeft />
        </div>
      )}
      <Text className="ec3w-title" variant="title">
        {title}
      </Text>
    </div>
  );
};
 
export const LoadingOverlay = () => (
  <div className="ec3w-center-overlay">
    <Text>Loading</Text>
    <ProgressRadial indeterminate />
    <Text>Please wait...</Text>
  </div>
);
 
interface EmptyMessageProps {
  message: string;
}
 
export const EmptyMessage = ({ message }: EmptyMessageProps) => (
  <div className="ec3w-center-overlay">
    <Text>{message}</Text>
  </div>
);
 
export const handleInputChange = <T,>(e: React.ChangeEvent<HTMLInputElement>, values: T, setValues: React.Dispatch<React.SetStateAction<T>>) => {
  const { name, value } = e.target;
 
  setValues({
    ...values,
    [name]: value,
  });
};
 
export const handleSelectChange = <T,>(value: string, name: string, values: T, setValues: React.Dispatch<React.SetStateAction<T>>) => {
  setValues({
    ...values,
    [name]: value,
  });
};
 
export const LoadingSpinner = () => {
  return (
    <div className="ec3w-loading-spinner">
      <ProgressRadial size="small" indeterminate />
    </div>
  );
};
 
export const handleError = (errorStatus: number) => {
  let errorMessage = "Error! ";
  switch (errorStatus) {
    case 401:
      errorMessage += `You are unauthorized to do this operation.`;
      break;
    case 403:
      errorMessage += `You don't have permission to access the requested resource.`;
      break;
    case 404:
      errorMessage += `The requested resource was not found.`;
      break;
    case 409:
      errorMessage += `This property name is already being used.`;
      break;
    case 422:
      errorMessage += `Unable to process the request.`;
      break;
    case 429:
      errorMessage += `Too many requests.`;
      break;
    case 500:
      errorMessage += `Internal server error.`;
      break;
    case 502:
      errorMessage += `Bad gateway.`;
      break;
    case 503:
      errorMessage += `Service unavailable.`;
      break;
    default:
      errorMessage += `Something went wrong!`;
  }
  toaster.negative(errorMessage);
};