TelegramPWA/src/components/left/settings/SettingsDataStorage.tsx
Alexander Zinchuk 4f42b676ce Settings: Performance mode (#3045)
Co-authored-by: Alexander Zinchuk <alx.zinchuk@gmail.com>
2023-04-25 17:28:03 +04:00

179 lines
5.5 KiB
TypeScript

import type { FC } from '../../../lib/teact/teact';
import React, { memo, useCallback } from '../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../global';
import type { ISettings } from '../../../types';
import { AUTODOWNLOAD_FILESIZE_MB_LIMITS } from '../../../config';
import { pick } from '../../../util/iteratees';
import useLang from '../../../hooks/useLang';
import useHistoryBack from '../../../hooks/useHistoryBack';
import Checkbox from '../../ui/Checkbox';
import RangeSlider from '../../ui/RangeSlider';
type OwnProps = {
isActive?: boolean;
onReset: () => void;
};
type StateProps = Pick<ISettings, (
'canAutoLoadPhotoFromContacts' |
'canAutoLoadPhotoInPrivateChats' |
'canAutoLoadPhotoInGroups' |
'canAutoLoadPhotoInChannels' |
'canAutoLoadVideoFromContacts' |
'canAutoLoadVideoInPrivateChats' |
'canAutoLoadVideoInGroups' |
'canAutoLoadVideoInChannels' |
'canAutoLoadFileFromContacts' |
'canAutoLoadFileInPrivateChats' |
'canAutoLoadFileInGroups' |
'canAutoLoadFileInChannels' |
'autoLoadFileMaxSizeMb'
)>;
const SettingsDataStorage: FC<OwnProps & StateProps> = ({
isActive,
onReset,
canAutoLoadPhotoFromContacts,
canAutoLoadPhotoInPrivateChats,
canAutoLoadPhotoInGroups,
canAutoLoadPhotoInChannels,
canAutoLoadVideoFromContacts,
canAutoLoadVideoInPrivateChats,
canAutoLoadVideoInGroups,
canAutoLoadVideoInChannels,
canAutoLoadFileFromContacts,
canAutoLoadFileInPrivateChats,
canAutoLoadFileInGroups,
canAutoLoadFileInChannels,
autoLoadFileMaxSizeMb,
}) => {
const { setSettingOption } = getActions();
const lang = useLang();
useHistoryBack({
isActive,
onBack: onReset,
});
const renderFileSizeCallback = useCallback((value: number) => {
return lang('AutodownloadSizeLimitUpTo', lang('FileSize.MB', String(AUTODOWNLOAD_FILESIZE_MB_LIMITS[value]), 'i'));
}, [lang]);
const handleFileSizeChange = useCallback((value: number) => {
setSettingOption({ autoLoadFileMaxSizeMb: AUTODOWNLOAD_FILESIZE_MB_LIMITS[value] });
}, [setSettingOption]);
function renderContentSizeSlider() {
const value = AUTODOWNLOAD_FILESIZE_MB_LIMITS.indexOf(autoLoadFileMaxSizeMb);
return (
<div className="pt-5">
<RangeSlider
label={lang('AutoDownloadMaxFileSize')}
min={0}
max={5}
value={value !== -1 ? value : 2}
renderValue={renderFileSizeCallback}
onChange={handleFileSizeChange}
/>
</div>
);
}
function renderAutoDownloadBlock(
title: string,
key: 'Photo' | 'Video' | 'File',
canAutoLoadFromContacts: boolean,
canAutoLoadInPrivateChats: boolean,
canAutoLoadInGroups: boolean,
canAutoLoadInChannels: boolean,
) {
return (
<div className="settings-item">
<h4 className="settings-item-header" dir={lang.isRtl ? 'rtl' : undefined}>{title}</h4>
<Checkbox
label={lang('AutoDownloadSettings.Contacts')}
checked={canAutoLoadFromContacts}
// TODO rewrite to support `useCallback`
// eslint-disable-next-line react/jsx-no-bind
onCheck={(isChecked) => setSettingOption({ [`canAutoLoad${key}FromContacts`]: isChecked })}
/>
<Checkbox
label={lang('AutoDownloadSettings.PrivateChats')}
checked={canAutoLoadInPrivateChats}
// eslint-disable-next-line react/jsx-no-bind
onCheck={(isChecked) => setSettingOption({ [`canAutoLoad${key}InPrivateChats`]: isChecked })}
/>
<Checkbox
label={lang('AutoDownloadSettings.GroupChats')}
checked={canAutoLoadInGroups}
// eslint-disable-next-line react/jsx-no-bind
onCheck={(isChecked) => setSettingOption({ [`canAutoLoad${key}InGroups`]: isChecked })}
/>
<Checkbox
label={lang('AutoDownloadSettings.Channels')}
checked={canAutoLoadInChannels}
// eslint-disable-next-line react/jsx-no-bind
onCheck={(isChecked) => setSettingOption({ [`canAutoLoad${key}InChannels`]: isChecked })}
/>
{key === 'File' && renderContentSizeSlider()}
</div>
);
}
return (
<div className="settings-content custom-scroll">
{renderAutoDownloadBlock(
lang('AutoDownloadPhotosTitle'),
'Photo',
canAutoLoadPhotoFromContacts,
canAutoLoadPhotoInPrivateChats,
canAutoLoadPhotoInGroups,
canAutoLoadPhotoInChannels,
)}
{renderAutoDownloadBlock(
lang('AutoDownloadVideosTitle'),
'Video',
canAutoLoadVideoFromContacts,
canAutoLoadVideoInPrivateChats,
canAutoLoadVideoInGroups,
canAutoLoadVideoInChannels,
)}
{renderAutoDownloadBlock(
'Auto-download files', // Proper translation is not available yet
'File',
canAutoLoadFileFromContacts,
canAutoLoadFileInPrivateChats,
canAutoLoadFileInGroups,
canAutoLoadFileInChannels,
)}
</div>
);
};
export default memo(withGlobal<OwnProps>(
(global): StateProps => {
return pick(global.settings.byKey, [
'canAutoLoadPhotoFromContacts',
'canAutoLoadPhotoInPrivateChats',
'canAutoLoadPhotoInGroups',
'canAutoLoadPhotoInChannels',
'canAutoLoadVideoFromContacts',
'canAutoLoadVideoInPrivateChats',
'canAutoLoadVideoInGroups',
'canAutoLoadVideoInChannels',
'canAutoLoadFileFromContacts',
'canAutoLoadFileInPrivateChats',
'canAutoLoadFileInGroups',
'canAutoLoadFileInChannels',
'autoLoadFileMaxSizeMb',
]);
},
)(SettingsDataStorage));