File size: 2,780 Bytes
56b6519
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { ArrowPathIcon } from '@heroicons/react/20/solid';
import clsx from 'clsx';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { toast } from 'sonner';

import Modal from '@/components/modal/Modal';
import {
  HoverCard,
  HoverCardContent,
  HoverCardTrigger,
} from '@/components/ui/hover-card';
import { checkUpdateCWE, updateCWEModel } from '@/services/settings';

export const ModelUpdateContainer = () => {
  const [isOpenModal, setIsOpenModal] = useState<boolean>(false);
  const [isUpdateAvailable, setIsUpdateAvailable] = useState<boolean>(false);
  const [isUpdating, setIsUpdating] = useState<boolean>(false);

  const { t } = useTranslation();

  useEffect(() => {
    const checkForUpdate = async () => {
      const result = await checkUpdateCWE();
      setIsOpenModal(!result);
    };
    void checkForUpdate();
  }, []);

  const onClickUpdate = () => {
    setIsOpenModal(false);
    setIsUpdateAvailable(true);
    const updateCWEHandler = async () => {
      try {
        setIsUpdating(true);
        const result = await updateCWEModel();
        if (result.status === 'success') {
          toast.success(t('msg.updateCWEModelOk'));
        } else {
          toast.error(t('err.updateCWEModelFailed'));
        }
      } catch (err) {
        console.error(err);
        toast.error(t('err.updateCWEModelFailed'));
      } finally {
        setIsUpdateAvailable(false);
        setIsUpdating(false);
      }
    };
    void updateCWEHandler();
  };

  return (
    <>
      <Modal
        cancelText={t('btn.dismiss')}
        disablehr
        isOpen={isOpenModal}
        onCancel={() => {
          setIsOpenModal(false);
          setIsUpdateAvailable(true);
        }}
        onSubmit={onClickUpdate}
        submitText={t('btn.update')}
        title={t('updateAvailable')}
      >
        {t('CWEModelUpdateText')}
      </Modal>
      {isUpdateAvailable ? (
        <button
          className={clsx(
            'fixed bottom-4 right-4 p-2 rounded-full inline-flex',
            {
              'bg-green-500': isUpdateAvailable,
              'bg-stone-500': isUpdating,
            },
          )}
          onClick={() => {
            !isUpdating && setIsOpenModal(true);
          }}
          type="button"
        >
          <HoverCard>
            <HoverCardTrigger>
              <ArrowPathIcon
                className={clsx('h-8 w-8 text-gray-100', {
                  'animate-spin': isUpdating,
                })}
              />
            </HoverCardTrigger>
            <HoverCardContent>
              {isUpdating ? t('updatingCWEModel') : t('updateAvailable')}
            </HoverCardContent>
          </HoverCard>
        </button>
      ) : null}
    </>
  );
};