File size: 3,033 Bytes
92189dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import GradientBorder from '@/common/components/button/GradientBorder';
import useScreenSize from '@/common/screen/useScreenSize';
import {BLUE_PINK_FILL_BR} from '@/theme/gradientStyle';
import type {CarbonIconType} from '@carbon/icons-react';
import {Loading} from 'react-daisyui';

type Props = {
  isDisabled?: boolean;
  isActive?: boolean;
  icon: CarbonIconType;
  title: string;
  badge?: React.ReactNode;
  variant: 'toggle' | 'button' | 'gradient' | 'flat';
  span?: 1 | 2;
  loadingProps?: {
    loading: boolean;
    label?: string;
  };
  onClick: () => void;
};

export default function ToolbarActionIcon({
  variant,
  isDisabled = false,
  isActive = false,
  title,
  badge,
  loadingProps,
  icon: Icon,
  span = 1,
  onClick,
}: Props) {
  const {isMobile} = useScreenSize();
  const isLoading = loadingProps?.loading === true;

  function handleClick() {
    if (isDisabled) {
      return;
    }
    onClick();
  }

  const ButtonBase = (
    <div
      onClick={handleClick}
      className={`relative rounded-lg h-full flex items-center justify-center select-none
      ${!isDisabled && 'cursor-pointer hover:bg-black'}
      ${span === 1 && 'col-span-1'} 
      ${span === 2 && 'col-span-2'}
      ${variant === 'button' && (isDisabled ? 'bg-graydark-500 text-gray-300' : 'bg-graydark-700 hover:bg-graydark-800 text-white')} 
      ${variant === 'toggle' && (isActive ? BLUE_PINK_FILL_BR : 'bg-inherit')}
      ${variant === 'flat' && (isDisabled ? ' text-gray-600' : 'text-white')} 
      `}>
      <div className="py-4 px-2">
        <div className="flex items-center justify-center">
          {isLoading ? (
            <Loading size="md" className="mx-auto" />
          ) : (
            <Icon
              size={isMobile ? 24 : 28}
              color={isActive ? 'white' : 'black'}
              className={`mx-auto ${isDisabled ? 'text-gray-300' : 'text-white'}`}
            />
          )}
        </div>
        <div
          className={`mt-1 md:mt-2 text-center text-xs font-bold ${isActive && 'text-white'}`}>
          {isLoading && loadingProps?.label != null
            ? loadingProps.label
            : title}
        </div>
        {isActive && badge}
      </div>
    </div>
  );

  return variant == 'gradient' ? (
    <GradientBorder rounded={false} className="rounded-lg h-full text-white">
      {ButtonBase}
    </GradientBorder>
  ) : (
    ButtonBase
  );
}