summaryrefslogtreecommitdiff
path: root/frontend/src/components/modals/PluginInstallModal.tsx
blob: 012d0982f89c700dcd38d24553e1c68371835bb8 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { ConfirmModal, Navigation, QuickAccessTab } from '@decky/ui';
import { FC, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';

import { InstallType, InstallTypeTranslationMapping } from '../../plugin';
import PluginInstallProgress from './PluginInstallProgress';

interface PluginInstallModalProps {
  artifact: string;
  version: string;
  hash: string;
  installType: InstallType;
  disabled?: boolean;
  onOK(): void;
  onCancel(): void;
  closeModal?(): void;
}

const PluginInstallModal: FC<PluginInstallModalProps> = ({
  artifact,
  version,
  hash,
  installType,
  disabled,
  onOK,
  onCancel,
  closeModal,
}) => {
  const [loading, setLoading] = useState<boolean>(false);
  const [percentage, setPercentage] = useState<number>(0);
  const [downloadInfo, setDownloadInfo] = useState<string | null>(null);
  const { t } = useTranslation();

  function updateDownloadState(percent: number, trans_text: string | undefined, trans_info: Record<string, string>) {
    setPercentage(percent);
    if (trans_text === undefined) {
      setDownloadInfo(null);
    } else {
      setDownloadInfo(t(trans_text, trans_info));
    }
  }

  useEffect(() => {
    DeckyBackend.addEventListener('loader/plugin_download_info', updateDownloadState);
    return () => {
      DeckyBackend.removeEventListener('loader/plugin_download_info', updateDownloadState);
    };
  }, []);

  const installTypeTranslationKey = InstallTypeTranslationMapping[installType];
  const description = t(`PluginInstallModal.${installTypeTranslationKey}.desc`, {
    artifact: artifact,
    version: version,
  });

  return (
    <ConfirmModal
      bOKDisabled={loading}
      closeModal={closeModal}
      onOK={async () => {
        setLoading(true);
        await onOK();
        setTimeout(() => Navigation.OpenQuickAccessMenu(QuickAccessTab.Decky), 250);
        setTimeout(() => DeckyPluginLoader.checkPluginUpdates(), 1000);
      }}
      onCancel={async () => {
        await onCancel();
      }}
      strTitle={
        <div>
          {
            // IMPORTANT! These comments are not cosmetic and are needed for `extracttext` task to work
            // t('PluginInstallModal.install.title')
            // t('PluginInstallModal.reinstall.title')
            // t('PluginInstallModal.update.title')
            // t('PluginInstallModal.downgrade.title')
            // t('PluginInstallModal.overwrite.title')
            t(`PluginInstallModal.${installTypeTranslationKey}.title`, { artifact: artifact })
          }
        </div>
      }
      strOKButtonText={
        loading ? (
          <div>
            {
              // IMPORTANT! These comments are not cosmetic and are needed for `extracttext` task to work
              // t('PluginInstallModal.install.button_processing')
              // t('PluginInstallModal.reinstall.button_processing')
              // t('PluginInstallModal.update.button_processing')
              // t('PluginInstallModal.downgrade.button_processing')
              // t('PluginInstallModal.overwrite.button_processing')
              t(`PluginInstallModal.${installTypeTranslationKey}.button_processing`)
            }
          </div>
        ) : (
          <div>
            {
              // IMPORTANT! These comments are not cosmetic and are needed for `extracttext` task to work
              // t('PluginInstallModal.install.button_idle')
              // t('PluginInstallModal.reinstall.button_idle')
              // t('PluginInstallModal.update.button_idle')
              // t('PluginInstallModal.downgrade.button_idle')
              // t('PluginInstallModal.overwrite.button_idle')
              t(`PluginInstallModal.${installTypeTranslationKey}.button_idle`)
            }
          </div>
        )
      }
    >
      <div>
        {
          // IMPORTANT! These comments are not cosmetic and are needed for `extracttext` task to work
          // t('PluginInstallModal.install.desc')
          // t('PluginInstallModal.reinstall.desc')
          // t('PluginInstallModal.update.desc')
          // t('PluginInstallModal.downgrade.desc')
          // t('PluginInstallModal.overwrite.desc')
          disabled ? `${description} ${t('PluginInstallModal.disabled')}` : description
        }
      </div>
      {hash == 'False' && <span style={{ color: 'red' }}>{t('PluginInstallModal.no_hash')}</span>}
      {loading && <PluginInstallProgress percentage={percentage} operationText={downloadInfo} />}
    </ConfirmModal>
  );
};

export default PluginInstallModal;