lbry-desktop/ui/component/settingWalletServer/view.jsx

192 lines
4.9 KiB
React
Raw Normal View History

// @flow
import React, { useState, useEffect } from 'react';
import { FormField } from 'component/common/form';
2019-12-12 21:18:13 +01:00
import Button from 'component/button';
import * as ICONS from 'constants/icons';
import Icon from 'component/common/icon';
import ServerInputRow from './internal/inputRow';
type DaemonSettings = {
2019-12-12 21:18:13 +01:00
lbryum_servers: Array<>,
};
type DaemonStatus = {
wallet: any,
};
type StatusOfServer = {
host: string,
port: string,
availability: boolean,
latency: number,
2019-12-12 21:18:13 +01:00
};
2019-12-12 21:18:13 +01:00
type ServerTuple = Array<string>; // ['host', 'port']
type DisplayOfServer = {
host: string,
port: string,
availability: boolean,
2019-12-12 21:18:13 +01:00
};
2019-12-12 21:18:13 +01:00
type ServerStatus = Array<StatusOfServer>;
type ServerConfig = Array<ServerTuple>;
type DisplayList = Array<DisplayOfServer>;
type Props = {
daemonSettings: DaemonSettings,
getDaemonStatus: () => void,
2019-12-12 21:18:13 +01:00
setCustomWalletServers: any => void,
clearWalletServers: () => void,
2019-12-12 21:18:13 +01:00
customWalletServers: ServerConfig,
saveServerConfig: string => void,
fetchDaemonSettings: () => void,
2019-12-12 21:18:13 +01:00
hasWalletServerPrefs: boolean,
daemonStatus: DaemonStatus,
};
function SettingWalletServer(props: Props) {
const {
daemonSettings,
2019-12-12 21:18:13 +01:00
daemonStatus,
fetchDaemonSettings,
2019-12-12 21:18:13 +01:00
setCustomWalletServers,
getDaemonStatus,
clearWalletServers,
2019-12-12 21:18:13 +01:00
saveServerConfig,
customWalletServers,
hasWalletServerPrefs,
} = props;
2019-12-12 21:18:13 +01:00
const [advancedMode, setAdvancedMode] = useState(false);
const activeWalletServers: ServerStatus = (daemonStatus && daemonStatus.wallet && daemonStatus.wallet.servers) || [];
const currentServerConfig: ServerConfig = daemonSettings && daemonSettings.lbryum_servers;
const serverConfig: ServerConfig = customWalletServers.length ? customWalletServers : currentServerConfig;
const STATUS_INTERVAL = 5000;
2019-12-12 21:18:13 +01:00
console.log(hasWalletServerPrefs)
useEffect(() => {
2019-12-12 21:18:13 +01:00
if (hasWalletServerPrefs) {
setAdvancedMode(true);
}
}, []);
useEffect(() => {
const interval = setInterval(() => {
2019-12-12 21:18:13 +01:00
getDaemonStatus();
}, STATUS_INTERVAL);
return () => clearInterval(interval);
}, []);
useEffect(() => {
fetchDaemonSettings();
2019-12-12 21:18:13 +01:00
}, []);
function makeDisplayList(l) {
const displayList = [];
l.forEach(entry => {
displayList.push({
host: entry[0],
port: entry[1],
available:
2019-12-12 21:18:13 +01:00
activeWalletServers.some(s => s.host === entry[0] && String(s.port) === entry[1] && s.availability) || false,
});
});
return displayList;
}
function makeServerParam(configList) {
return configList.reduce((acc, cur) => {
acc.push(`${cur[0]}:${cur[1]}`);
return acc;
}, []);
}
function doClear() {
2019-12-12 21:18:13 +01:00
setAdvancedMode(false);
clearWalletServers();
}
function onAdd(serverTuple) {
2019-12-12 21:18:13 +01:00
let newServerConfig = serverConfig.concat();
newServerConfig.push(serverTuple);
2019-12-12 21:18:13 +01:00
updateServers(newServerConfig);
}
function onDelete(i) {
2019-12-12 21:18:13 +01:00
const newServerConfig = serverConfig.concat();
newServerConfig.splice(i, 1);
updateServers(newServerConfig);
}
function updateServers(newConfig) {
saveServerConfig(newConfig);
setCustomWalletServers(makeServerParam(newConfig));
}
return (
<React.Fragment>
2019-12-12 21:18:13 +01:00
<label>{__('Wallet servers')}</label>
<fieldset>
<FormField
type="radio"
name="default_wallet_servers"
2019-12-12 21:18:13 +01:00
checked={!advancedMode}
label={__('lbry.tv')}
onChange={e => {
if (e.target.checked) {
doClear();
}
}}
/>
<FormField
type="radio"
name="custom_wallet_servers"
2019-12-12 21:18:13 +01:00
checked={advancedMode}
onChange={e => {
2019-12-12 21:18:13 +01:00
setAdvancedMode(e.target.checked);
if (e.target.checked) {
2019-12-12 21:18:13 +01:00
setCustomWalletServers(makeServerParam(customWalletServers));
}
}}
2019-12-12 21:18:13 +01:00
label={__('customize')}
/>
2019-12-12 21:18:13 +01:00
</fieldset>
{advancedMode && (
<div>
<table className="table table--transactions">
<thead>
<tr>
<th>{__('Host')}</th>
<th>{__('Port')} </th>
<th>{__('Available')} </th>
<th>{__('Add/Delete')} </th>
</tr>
</thead>
<tbody>
2019-12-12 21:18:13 +01:00
{serverConfig &&
makeDisplayList(serverConfig).map((t, i) => (
<tr key={`${t.host}:${t.port}`}>
<td>{t.host}</td>
<td>{t.port}</td>
<td>{t.available && <Icon icon={ICONS.SUBSCRIBE} />}</td>
<td>
<Button button={'link'} icon={ICONS.REMOVE} onClick={() => onDelete(i)} />
</td>
</tr>
))}
<ServerInputRow update={onAdd} />
</tbody>
</table>
</div>
)}
<p className="help">{__(`Choose a different provider's wallet server.`)}</p>
</React.Fragment>
);
}
export default SettingWalletServer;