openreplay/frontend/app/components/shared/SessionSettings/components/DefaultTimezone.tsx
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

130 lines
4.1 KiB
TypeScript

import { Radio, Button } from 'antd';
import { useObserver } from 'mobx-react-lite';
import React, { useEffect } from 'react';
import { toast } from 'react-toastify';
import { useStore } from 'App/mstore';
import { Timezone } from 'App/mstore/types/sessionSettings';
import { Icon } from 'UI';
import Select from 'Shared/Select';
import { useTranslation } from 'react-i18next';
type TimezonesDropdown = Timezone[];
function DefaultTimezone() {
const { t } = useTranslation();
const { settingsStore } = useStore();
const sessionSettings = useObserver(() => settingsStore.sessionSettings);
const [changed, setChanged] = React.useState(false);
const [shownTimezone, setShownTimezone] = React.useState<'user' | 'local'>(
sessionSettings.shownTimezone,
);
const timezoneOptions: TimezonesDropdown =
settingsStore.sessionSettings.defaultTimezones;
const [timezone, setTimezone] = React.useState(
settingsStore.sessionSettings.timezone,
);
const [isLocal, setIsLocal] = React.useState(
settingsStore.sessionSettings.usingLocal,
);
useEffect(() => {
if (!timezone) setTimezone({ label: 'Local Timezone', value: 'system' });
}, []);
const getCurrentTimezone = () => {
const timezoneOffset = Math.floor(new Date().getTimezoneOffset() / -60);
const remainingVal = Math.abs(new Date().getTimezoneOffset() % 60);
const sign = timezoneOffset > 0 ? '+' : '-';
const tzOffsHrs = Math.abs(timezoneOffset).toString().padStart(2, '0');
const tzOffsMins = remainingVal
? `:${remainingVal.toString().padStart(2, '0')}`
: '';
const timezoneValue = `UTC${sign}${tzOffsHrs}${tzOffsMins}`;
const selectedTimezone = timezoneOptions.find(
(option) => option.value === timezoneValue,
);
return selectedTimezone || null;
};
const setCurrentTimezone = () => {
const selectedTimezone = getCurrentTimezone();
if (selectedTimezone) {
setTimezone(selectedTimezone);
setIsLocal(true);
sessionSettings.updateTimezone(selectedTimezone, true);
toast.success('Default timezone saved successfully');
}
};
const onSelectChange = ({ value }: { value: Timezone }) => {
setTimezone(value);
setChanged(true);
};
const onTimezoneSave = () => {
setChanged(false);
sessionSettings.updateTimezone(timezone);
setIsLocal(false);
toast.success('Default timezone saved successfully');
};
const updateDisplayedTZ = (value: 'user' | 'local') => {
sessionSettings.updateKey('shownTimezone', value);
setShownTimezone(value);
};
return (
<>
<h3 className="text-lg">{t('Default Timezone')}</h3>
<div className="my-1">
{t(
'Set the timezone for this project. All Sessions, Charts will be referenced to this.',
)}
</div>
<div>
<Radio.Group
onChange={(e) => {
updateDisplayedTZ(e.target.value);
}}
value={shownTimezone}
>
<Radio.Button value="local">{t('Local Timezone')}</Radio.Button>
<Radio.Button value="user">{t("End User's Timezone")}</Radio.Button>
</Radio.Group>
</div>
{shownTimezone === 'local' ? (
<>
<div className="mt-2 flex items-center" style={{ width: '265px' }}>
<Select
options={timezoneOptions}
defaultValue={timezone.value}
className="w-full"
value={timezoneOptions.find(
(option) => option.value === timezone.value,
)}
onChange={onSelectChange}
/>
<div className="col-span-3 ml-3">
<Button
disabled={!changed}
type="default"
onClick={onTimezoneSave}
>
{t('Update')}
</Button>
</div>
</div>
<div className="mt-3 flex gap-1 items-center">
<div onClick={setCurrentTimezone} className="link">
{t('Apply my current timezone')}
</div>
{isLocal ? <Icon name="check" size={18} /> : null}
</div>
</>
) : null}
</>
);
}
export default DefaultTimezone;