Files
Homarr/src/components/layout/header/Actions/ToggleEditMode/ToggleEditMode.tsx

104 lines
3.2 KiB
TypeScript
Raw Normal View History

2022-12-24 17:18:16 +09:00
import axios from 'axios';
import Consola from 'consola';
2023-01-02 02:52:12 +09:00
import { ActionIcon, Button, Group, Paper, Popover, Space, Text } from '@mantine/core';
2023-01-01 17:26:09 +01:00
import { IconEditCircle, IconEditCircleOff, IconX } from '@tabler/icons';
2022-12-24 17:18:16 +09:00
import { getCookie } from 'cookies-next';
2022-12-20 16:54:22 +09:00
import { Trans, useTranslation } from 'next-i18next';
2022-12-24 17:18:16 +09:00
import { useEffect, useState } from 'react';
import { useConfigContext } from '../../../../../config/provider';
2022-12-23 17:29:58 +01:00
import { useScreenSmallerThan } from '../../../../../hooks/useScreenSmallerThan';
2022-12-10 17:58:01 +01:00
import { useEditModeStore } from '../../../../Dashboard/Views/useEditModeStore';
2023-01-01 17:26:09 +01:00
import { AddElementAction } from '../AddElementAction/AddElementAction';
2022-12-10 17:58:01 +01:00
export const ToggleEditModeAction = () => {
const { enabled, toggleEditMode } = useEditModeStore();
const [popoverManuallyHidden, setPopoverManuallyHidden] = useState<boolean>();
2022-12-10 17:58:01 +01:00
const { t } = useTranslation('layout/header/actions/toggle-edit-mode');
const smallerThanSm = useScreenSmallerThan('sm');
2022-12-24 17:18:16 +09:00
const { config } = useConfigContext();
useEffect(() => {
if (enabled || config === undefined || config?.schemaVersion === undefined) return;
const configName = getCookie('config-name')?.toString() ?? 'default';
axios.put(`/api/configs/${configName}`, { ...config });
Consola.log('Saved config to server', configName);
}, [enabled]);
2022-12-10 17:58:01 +01:00
2022-12-14 10:27:02 +01:00
const toggleButtonClicked = () => {
toggleEditMode();
2022-12-24 17:18:16 +09:00
2022-12-14 10:27:02 +01:00
setPopoverManuallyHidden(false);
};
2023-01-01 17:26:09 +01:00
const ToggleButtonDesktop = () => (
<Button
onClick={() => toggleButtonClicked()}
leftIcon={enabled ? <IconEditCircleOff /> : <IconEditCircle />}
variant="default"
radius="md"
color="blue"
style={{ height: 43 }}
>
<Text>{enabled ? t('button.enabled') : t('button.disabled')}</Text>
</Button>
);
const ToggleActionIconMobile = () => (
<ActionIcon
onClick={() => toggleButtonClicked()}
variant="default"
radius="md"
size="xl"
color="blue"
>
{enabled ? <IconEditCircleOff /> : <IconEditCircle />}
</ActionIcon>
);
2022-12-10 17:58:01 +01:00
return (
<Popover
opened={enabled && !smallerThanSm && !popoverManuallyHidden}
2023-01-02 02:52:12 +09:00
width="target"
transition="scale"
zIndex={199}
>
<Popover.Target>
2023-01-02 02:52:12 +09:00
{smallerThanSm ? (
enabled ? (
<Group style={{ flexWrap: 'nowrap' }}>
<AddElementAction type="action-icon" />
2023-01-01 17:26:09 +01:00
<ToggleActionIconMobile />
2023-01-02 02:52:12 +09:00
</Group>
) : (
2023-01-02 02:52:12 +09:00
<ToggleActionIconMobile />
)
) : enabled ? (
<Button.Group>
2023-01-01 17:26:09 +01:00
<ToggleButtonDesktop />
2023-01-02 02:52:12 +09:00
{enabled && <AddElementAction type="button" />}
</Button.Group>
) : (
<ToggleButtonDesktop />
)}
</Popover.Target>
2023-01-01 17:26:09 +01:00
2023-01-02 02:52:12 +09:00
<Popover.Dropdown p={4} px={6} mt={-5}>
<div style={{ position: 'absolute', top: 2, right: 2 }}>
<ActionIcon onClick={() => setPopoverManuallyHidden(true)}>
<IconX size={18} />
</ActionIcon>
</div>
<Text align="center" size="sm">
<Text weight="bold">{t('popover.title')}</Text>
<Text>
<Trans i18nKey="layout/header/actions/toggle-edit-mode:popover.text" />
2022-12-10 17:58:01 +01:00
</Text>
</Text>
</Popover.Dropdown>
</Popover>
2022-12-10 17:58:01 +01:00
);
};