210 lines
6.4 KiB
JavaScript
210 lines
6.4 KiB
JavaScript
// @flow
|
|
|
|
import React from 'react';
|
|
import { FormField } from 'component/common/form';
|
|
import Button from 'component/button';
|
|
import * as DAEMON_SETTINGS from 'constants/daemon_settings';
|
|
import { formatBytes } from 'util/format-bytes';
|
|
import { isTrulyANumber } from 'util/number';
|
|
import I18nMessage from 'component/i18nMessage';
|
|
const BYTES_PER_MB = 1048576;
|
|
const ENABLE_AUTOMATIC_HOSTING = false;
|
|
|
|
type Price = {
|
|
currency: string,
|
|
amount: number,
|
|
};
|
|
|
|
type DaemonStatus = {
|
|
disk_space: {
|
|
content_blobs_storage_used_mb: string,
|
|
published_blobs_storage_used_mb: string,
|
|
running: true,
|
|
seed_blobs_storage_used_mb: string,
|
|
total_used_mb: string,
|
|
},
|
|
};
|
|
|
|
type SetDaemonSettingArg = boolean | string | number | Price;
|
|
|
|
type DaemonSettings = {
|
|
download_dir: string,
|
|
share_usage_data: boolean,
|
|
max_key_fee?: Price,
|
|
max_connections_per_download?: number,
|
|
save_files: boolean,
|
|
save_blobs: boolean,
|
|
ffmpeg_path: string,
|
|
};
|
|
|
|
type Props = {
|
|
// --- select ---
|
|
daemonSettings: DaemonSettings,
|
|
daemonStatus: DaemonStatus,
|
|
// --- perform ---
|
|
setDaemonSetting: (string, ?SetDaemonSettingArg) => void,
|
|
cleanBlobs: () => string,
|
|
diskSpace?: DiskSpace,
|
|
getDaemonStatus: () => void,
|
|
};
|
|
|
|
function SettingDataHosting(props: Props) {
|
|
const { daemonSettings, daemonStatus, setDaemonSetting, cleanBlobs, diskSpace, getDaemonStatus } = props;
|
|
|
|
const { disk_space: blobSpace } = daemonStatus;
|
|
const contentSpaceUsed = Number(blobSpace.content_blobs_storage_used_mb);
|
|
const blobLimitSetting = daemonSettings[DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB] || '0';
|
|
const [contentBlobSpaceLimitGB, setContentBlobSpaceLimit] = React.useState(
|
|
blobLimitSetting ? String(blobLimitSetting / 1024) : '10'
|
|
);
|
|
const [applying, setApplying] = React.useState(false);
|
|
|
|
const networkSpaceUsed = Number(blobSpace.seed_blobs_storage_used_mb);
|
|
const networkLimitSetting = daemonSettings[DAEMON_SETTINGS.NETWORK_STORAGE_LIMIT_MB] || '0';
|
|
const [networkBlobSpaceLimitGB, setNetworkBlobSpaceLimit] = React.useState(
|
|
networkLimitSetting ? String(networkLimitSetting / 1024) : '0'
|
|
);
|
|
|
|
const [unlimited, setUnlimited] = React.useState(blobLimitSetting === '0');
|
|
|
|
React.useEffect(() => {
|
|
getDaemonStatus();
|
|
}, []);
|
|
|
|
function convertGbToMb(gb) {
|
|
return Number(gb) * 1024;
|
|
}
|
|
|
|
function handleContentLimitChange(gb) {
|
|
if (gb === '') {
|
|
setContentBlobSpaceLimit('');
|
|
} else if (gb === '0') {
|
|
setContentBlobSpaceLimit('0.01'); // setting 0 means unlimited.
|
|
} else {
|
|
if (isTrulyANumber(Number(gb))) {
|
|
setContentBlobSpaceLimit(gb);
|
|
}
|
|
}
|
|
}
|
|
|
|
function handleNetworkLimitChange(gb) {
|
|
if (gb === '') {
|
|
setNetworkBlobSpaceLimit('');
|
|
} else {
|
|
const numberGb = Number(gb);
|
|
if (isTrulyANumber(numberGb)) {
|
|
setNetworkBlobSpaceLimit(gb);
|
|
}
|
|
}
|
|
}
|
|
|
|
async function handleApply() {
|
|
setApplying(true);
|
|
if (unlimited) {
|
|
await setDaemonSetting(DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB, '0');
|
|
} else {
|
|
await setDaemonSetting(
|
|
DAEMON_SETTINGS.BLOB_STORAGE_LIMIT_MB,
|
|
String(contentBlobSpaceLimitGB === '0.01' ? '1' : convertGbToMb(contentBlobSpaceLimitGB))
|
|
);
|
|
}
|
|
await setDaemonSetting(
|
|
DAEMON_SETTINGS.NETWORK_STORAGE_LIMIT_MB,
|
|
String(convertGbToMb(Number(networkBlobSpaceLimitGB)))
|
|
);
|
|
await cleanBlobs();
|
|
getDaemonStatus();
|
|
setApplying(false);
|
|
}
|
|
|
|
function validHostingAmount(amountString) {
|
|
const numberAmount = Number(amountString);
|
|
return amountString.length && ((numberAmount && String(numberAmount)) || numberAmount === 0);
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<div className={'fieldset-section'}>
|
|
<FormField
|
|
type="checkbox"
|
|
name="save_blobs"
|
|
onChange={() => setDaemonSetting('save_blobs', !daemonSettings.save_blobs)}
|
|
checked={daemonSettings.save_blobs}
|
|
label={__('Enable Data Hosting')}
|
|
helper={
|
|
diskSpace && (
|
|
<I18nMessage
|
|
tokens={{
|
|
free: formatBytes(Number(diskSpace.free) * 1024, 0),
|
|
total: formatBytes(Number(diskSpace.total) * 1024, 0),
|
|
}}
|
|
>
|
|
%free% of %total% available
|
|
</I18nMessage>
|
|
)
|
|
}
|
|
/>
|
|
</div>
|
|
{daemonSettings.save_blobs && (
|
|
<div className={'fieldset-section'}>
|
|
<FormField
|
|
type="radio"
|
|
name="no_hosting_limit"
|
|
checked={unlimited}
|
|
label={__('Unlimited View Hosting')}
|
|
onChange={() => setUnlimited(true)}
|
|
/>
|
|
<FormField
|
|
type="radio"
|
|
name="set_hosting_limit"
|
|
checked={!unlimited}
|
|
onChange={() => setUnlimited(false)}
|
|
label={__('Choose View Hosting Limit')}
|
|
/>
|
|
{!unlimited && (
|
|
<FormField
|
|
name="content_blob_limit_gb"
|
|
type="number"
|
|
min={0}
|
|
onWheel={(e) => e.preventDefault()}
|
|
label={__(`View Hosting Limit (GB)`)}
|
|
onChange={(e) => handleContentLimitChange(e.target.value)}
|
|
value={Number(contentBlobSpaceLimitGB) <= Number('0.01') ? '0' : contentBlobSpaceLimitGB}
|
|
/>
|
|
)}
|
|
<div className={'help'}>{`Currently using ${formatBytes(contentSpaceUsed * BYTES_PER_MB)}`}</div>
|
|
</div>
|
|
)}
|
|
{daemonSettings.save_blobs && ENABLE_AUTOMATIC_HOSTING && (
|
|
<fieldset-section>
|
|
<FormField
|
|
name="network_blob_limit_gb"
|
|
type="number"
|
|
label={__(`Automatic Hosting (GB)`)}
|
|
onChange={(e) => handleNetworkLimitChange(e.target.value)}
|
|
value={networkBlobSpaceLimitGB}
|
|
/>
|
|
<div className={'help'}>{`Auto-hosting ${formatBytes(networkSpaceUsed * BYTES_PER_MB)}`}</div>
|
|
</fieldset-section>
|
|
)}
|
|
<div className={'card__actions'}>
|
|
<Button
|
|
disabled={
|
|
(unlimited && blobLimitSetting === '0') ||
|
|
(!unlimited &&
|
|
(blobLimitSetting === convertGbToMb(contentBlobSpaceLimitGB) || // &&
|
|
// networkLimitSetting === convertGbToMb(networkBlobSpaceLimitGB)
|
|
!validHostingAmount(String(contentBlobSpaceLimitGB)))) ||
|
|
applying
|
|
}
|
|
type="button"
|
|
button="primary"
|
|
onClick={handleApply}
|
|
label={__('Apply')}
|
|
/>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default SettingDataHosting;
|