summaryrefslogtreecommitdiff
path: root/src/components/ProxyGroup.js
blob: d824920a9fae579256b7bd56d058a30184c3a9b2 (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
import React from 'react';
import cx from 'classnames';

import Proxy, { ProxySmall } from './Proxy';
import { SectionNameType } from './shared/Basic';

import s0 from './ProxyGroup.module.css';

import { switchProxy } from '../store/proxies';

const { memo, useCallback, useMemo } = React;

function ProxyGroup({ name, proxies, apiConfig, dispatch }) {
  const group = proxies[name];
  const { all, type, now } = group;

  const isSelectable = useMemo(() => type === 'Selector', [type]);

  const itemOnTapCallback = useCallback(
    proxyName => {
      if (!isSelectable) return;

      dispatch(switchProxy(apiConfig, name, proxyName));
      // switchProxyFn(name, proxyName);
    },
    [apiConfig, dispatch, name, isSelectable]
  );

  return (
    <div className={s0.group}>
      <div className={s0.header}>
        <SectionNameType name={name} type={group.type} />
      </div>
      <ProxyList
        all={all}
        now={now}
        isSelectable={isSelectable}
        itemOnTapCallback={itemOnTapCallback}
      />
    </div>
  );
}

type ProxyListProps = {
  all: string[],
  now?: string,
  isSelectable?: boolean,
  itemOnTapCallback?: string => void
};
export function ProxyList({
  all,
  now,
  isSelectable,
  itemOnTapCallback
}: ProxyListProps) {
  return (
    <div className={s0.list}>
      {all.map(proxyName => {
        const proxyClassName = cx(s0.proxy, {
          [s0.proxySelectable]: isSelectable
        });
        return (
          <div
            className={proxyClassName}
            key={proxyName}
            onClick={() => {
              if (!isSelectable || !itemOnTapCallback) return;
              itemOnTapCallback(proxyName);
            }}
          >
            <Proxy name={proxyName} now={proxyName === now} />
          </div>
        );
      })}
    </div>
  );
}

export function ProxyListSummaryView({
  all,
  now,
  isSelectable,
  itemOnTapCallback
}: ProxyListProps) {
  return (
    <div className={s0.list}>
      {all.map(proxyName => {
        const proxyClassName = cx(s0.proxy, {
          [s0.proxySelectable]: isSelectable
        });
        return (
          <div
            className={proxyClassName}
            key={proxyName}
            onClick={() => {
              if (!isSelectable || !itemOnTapCallback) return;
              itemOnTapCallback(proxyName);
            }}
          >
            <ProxySmall name={proxyName} now={proxyName === now} />
          </div>
        );
      })}
    </div>
  );
}

export default memo(ProxyGroup);