Split AccountSettings

This commit is contained in:
2024-11-06 23:12:38 +01:00
parent 7f8c40c3a2
commit 0f6dcd3a60
4 changed files with 59 additions and 42 deletions

View File

@@ -0,0 +1,10 @@
import React from 'react';
import { Accordion, Title } from '@mantine/core';
const AccordionControl = ({ children }) => (
<Accordion.Control>
<Title order={4}>{children}</Title>
</Accordion.Control>
);
export default AccordionControl;

View File

@@ -7,16 +7,15 @@ import {
Title, Title,
Stack, Stack,
Accordion, Accordion,
TextInput,
Box,
} from '@mantine/core'; } from '@mantine/core';
import { notifications } from '@mantine/notifications'; import { notifications } from '@mantine/notifications';
import { useAuth } from '../../../contexts/AuthContext'; import { useAuth } from '../../../contexts/AuthContext';
import { useProfileSettings } from '../../../hooks/useProfileSettings'; import { useProfileSettings } from '../../../hooks/useProfileSettings';
import EmailPasswordModal from '../../modals/account/EmailPasswordModal'; import EmailPasswordModal from '../../modals/account/EmailPasswordModal';
import DeleteAccountModal from '../../modals/account/DeleteAccountModal';
import SecuritySettings from './SecuritySettings'; import SecuritySettings from './SecuritySettings';
import ProfileSettings from './ProfileSettings'; import ProfileSettings from './ProfileSettings';
import DangerZoneSettings from './DangerZoneSettings';
import AccordionControl from '../AccordionControl';
// Reducer for managing settings state // Reducer for managing settings state
const initialState = { const initialState = {
@@ -55,26 +54,11 @@ function settingsReducer(state, action) {
} }
} }
const AccordionControl = ({ children }) => (
<Accordion.Control>
<Title order={4}>{children}</Title>
</Accordion.Control>
);
const DangerZone = ({ onDeleteClick }) => (
<Box>
<Button color="red" variant="light" onClick={onDeleteClick} fullWidth>
Delete Account
</Button>
</Box>
);
const AccountSettings = ({ opened, onClose }) => { const AccountSettings = ({ opened, onClose }) => {
const { user, logout, refreshUser } = useAuth(); const { user, refreshUser } = useAuth();
const { loading, updateProfile, deleteAccount } = useProfileSettings(); const { loading, updateProfile } = useProfileSettings();
const [state, dispatch] = useReducer(settingsReducer, initialState); const [state, dispatch] = useReducer(settingsReducer, initialState);
const isInitialMount = useRef(true); const isInitialMount = useRef(true);
const [deleteModalOpened, setDeleteModalOpened] = useState(false);
const [emailModalOpened, setEmailModalOpened] = useState(false); const [emailModalOpened, setEmailModalOpened] = useState(false);
// Initialize settings on mount // Initialize settings on mount
@@ -169,15 +153,6 @@ const AccountSettings = ({ opened, onClose }) => {
} }
}; };
const handleDelete = async (password) => {
const result = await deleteAccount(password);
if (result.success) {
setDeleteModalOpened(false);
onClose();
logout();
}
};
return ( return (
<> <>
<Modal <Modal
@@ -240,7 +215,7 @@ const AccountSettings = ({ opened, onClose }) => {
<Accordion.Item value="danger"> <Accordion.Item value="danger">
<AccordionControl>Danger Zone</AccordionControl> <AccordionControl>Danger Zone</AccordionControl>
<Accordion.Panel> <Accordion.Panel>
<DangerZone onDeleteClick={() => setDeleteModalOpened(true)} /> <DangerZoneSettings />
</Accordion.Panel> </Accordion.Panel>
</Accordion.Item> </Accordion.Item>
</Accordion> </Accordion>
@@ -266,12 +241,6 @@ const AccountSettings = ({ opened, onClose }) => {
onConfirm={handleEmailConfirm} onConfirm={handleEmailConfirm}
email={state.localSettings.email} email={state.localSettings.email}
/> />
<DeleteAccountModal
opened={deleteModalOpened}
onClose={() => setDeleteModalOpened(false)}
onConfirm={handleDelete}
/>
</> </>
); );
}; };

View File

@@ -0,0 +1,43 @@
import React, { useState } from 'react';
import { Box, Button, Text } from '@mantine/core';
import DeleteAccountModal from '../../modals/account/DeleteAccountModal';
import { useAuth } from '../../../contexts/AuthContext';
import { useProfileSettings } from '../../../hooks/useProfileSettings';
const DangerZoneSettings = () => {
const { logout } = useAuth();
const { deleteAccount } = useProfileSettings();
const [deleteModalOpened, setDeleteModalOpened] = useState(false);
const handleDelete = async (password) => {
const result = await deleteAccount(password);
if (result.success) {
setDeleteModalOpened(false);
logout();
}
};
return (
<Box mb="md">
<Text size="sm" mb="sm" c="dimmed">
Once you delete your account, there is no going back. Please be certain.
</Text>
<Button
color="red"
variant="light"
onClick={() => setDeleteModalOpened(true)}
fullWidth
>
Delete Account
</Button>
<DeleteAccountModal
opened={deleteModalOpened}
onClose={() => setDeleteModalOpened(false)}
onConfirm={handleDelete}
/>
</Box>
);
};
export default DangerZoneSettings;

View File

@@ -16,6 +16,7 @@ import GitSettings from './GitSettings';
import GeneralSettings from './GeneralSettings'; import GeneralSettings from './GeneralSettings';
import { useModalContext } from '../../../contexts/ModalContext'; import { useModalContext } from '../../../contexts/ModalContext';
import DangerZoneSettings from './DangerZoneSettings'; import DangerZoneSettings from './DangerZoneSettings';
import AccordionControl from '../AccordionControl';
const initialState = { const initialState = {
localSettings: {}, localSettings: {},
@@ -53,12 +54,6 @@ function settingsReducer(state, action) {
} }
} }
const AccordionControl = ({ children }) => (
<Accordion.Control>
<Title order={4}>{children}</Title>
</Accordion.Control>
);
const WorkspaceSettings = () => { const WorkspaceSettings = () => {
const { currentWorkspace, updateSettings } = useWorkspace(); const { currentWorkspace, updateSettings } = useWorkspace();
const { settingsModalVisible, setSettingsModalVisible } = useModalContext(); const { settingsModalVisible, setSettingsModalVisible } = useModalContext();