File size: 3,895 Bytes
a5784e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
/**
 * Auth Manager Component
 * Manage authentication profile files
 */

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { Key, Check, Trash2, RefreshCw, Loader2, AlertCircle } from 'lucide-react';
import { useI18n } from '@/contexts';
import { fetchAuthFiles, activateAuthFile, deactivateAuth } from '@/api';
import styles from './SettingsPanel.module.css';

export function AuthManager() {
  const { t } = useI18n();
  const queryClient = useQueryClient();

  // Fetch auth files
  const { data, isLoading, refetch } = useQuery({
    queryKey: ['authFiles'],
    queryFn: fetchAuthFiles,
  });

  // Activate mutation
  const activateMutation = useMutation({
    mutationFn: activateAuthFile,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['authFiles'] });
    },
  });

  // Deactivate mutation
  const deactivateMutation = useMutation({
    mutationFn: deactivateAuth,
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: ['authFiles'] });
    },
  });

  const savedFiles = data?.saved_files || [];
  const activeFile = data?.active_file;

  if (isLoading) {
    return (
      <div className={styles.loading}>
        <Loader2 size={16} className={styles.spinning} />
        <span>{t.common.loading}</span>
      </div>
    );
  }

  return (
    <div className={styles.authManager}>
      {/* Current Active Auth */}
      <div className={styles.formGroup}>
        <label className={styles.label}>{t.settingsPage.currentAuth}</label>
        <div className={styles.activeAuthDisplay}>
          <Key size={14} />
          <span>{activeFile || t.common.none}</span>
        </div>
      </div>

      {/* Auth File List */}
      <div className={styles.formGroup}>
        <label className={styles.label}>{t.settingsPage.availableAuthFiles}</label>
        {savedFiles.length === 0 ? (
          <div className={styles.infoBox}>
            <AlertCircle size={16} />
            <span>{t.settingsPage.noAuthFiles}</span>
          </div>
        ) : (
          <div className={styles.authFileList}>
            {savedFiles.map((file) => (
              <div
                key={file.name}
                className={`${styles.authFileItem} ${file.is_active ? styles.active : ''}`}
              >
                <span className={styles.fileName}>{file.name}</span>
                <span className={styles.fileSize}>
                  {(file.size_bytes / 1024).toFixed(1)} KB
                </span>
                {!file.is_active && (
                  <button
                    className={styles.iconButton}
                    onClick={() => activateMutation.mutate(file.name)}
                    disabled={activateMutation.isPending}
                    title={t.settingsPage.activateAuth}
                  >
                    <Check size={14} />
                  </button>
                )}
                {file.is_active && (
                  <span className={styles.activeLabel}>{t.common.activated}</span>
                )}
              </div>
            ))}
          </div>
        )}
      </div>

      {/* Action Buttons */}
      <div className={styles.buttonGroup}>
        <button
          className={styles.secondaryButton}
          onClick={() => refetch()}
          disabled={isLoading}
        >
          <RefreshCw size={14} />
          {t.common.refresh}
        </button>
        {activeFile && (
          <button
            className={styles.dangerButton}
            onClick={() => deactivateMutation.mutate()}
            disabled={deactivateMutation.isPending}
          >
            {deactivateMutation.isPending ? (
              <Loader2 size={14} className={styles.spinning} />
            ) : (
              <Trash2 size={14} />
            )}
            {t.settingsPage.removeAuth}
          </button>
        )}
      </div>
    </div>
  );
}