diff --git a/electron/renderer/components/sidebar/accounts/modal-remove-account.tsx b/electron/renderer/components/sidebar/accounts/modal-remove-account.tsx index f20a5cee..3608bbba 100644 --- a/electron/renderer/components/sidebar/accounts/modal-remove-account.tsx +++ b/electron/renderer/components/sidebar/accounts/modal-remove-account.tsx @@ -1,6 +1,7 @@ -import { EuiConfirmModal } from '@elastic/eui'; -import { type ReactNode, useCallback } from 'react'; -import { useListCharacters } from '../../../hooks/list-characters.jsx'; +import { EuiCode, EuiConfirmModal } from '@elastic/eui'; +import type { ReactNode } from 'react'; +import { useCallback } from 'react'; +import { useListCharacters } from '../../../hooks/characters.jsx'; export interface ModalRemoveAccountInitialData { accountName: string; @@ -41,7 +42,7 @@ export const ModalRemoveAccount: React.FC = ( return ( Log out of account {initialData.accountName}?} + title={<>Log out of account?} onCancel={onModalClose} onConfirm={onModalConfirm} cancelButtonText="Cancel" @@ -49,12 +50,24 @@ export const ModalRemoveAccount: React.FC = ( buttonColor="danger" defaultFocusedButton="cancel" > - Associated characters will also be removed. -
    - {characters.map(({ characterName }) => { - return
  • {characterName}
  • ; - })} -
+

+ {initialData.accountName} +

+ + {characters.length > 0 && ( +

+ Associated characters will also be removed: +

    + {characters.map(({ characterName }) => { + return ( +
  • + {characterName} +
  • + ); + })} +
+

+ )}
); }; diff --git a/electron/renderer/components/sidebar/accounts/sidebar-item-accounts.tsx b/electron/renderer/components/sidebar/accounts/sidebar-item-accounts.tsx index b160d30c..f5d4e269 100644 --- a/electron/renderer/components/sidebar/accounts/sidebar-item-accounts.tsx +++ b/electron/renderer/components/sidebar/accounts/sidebar-item-accounts.tsx @@ -1,19 +1,8 @@ -import type { EuiBasicTableColumn } from '@elastic/eui'; -import { - EuiButton, - EuiButtonIcon, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiInMemoryTable, - EuiPanel, - EuiSpacer, - EuiToolTip, -} from '@elastic/eui'; +import { EuiButton, EuiCallOut, EuiPanel, EuiSpacer } from '@elastic/eui'; import type { ReactNode } from 'react'; import type React from 'react'; import { useCallback, useState } from 'react'; -import { useListAccounts } from '../../../hooks/list-accounts.jsx'; +import { useRemoveAccount, useSaveAccount } from '../../../hooks/accounts.jsx'; import { runInBackground } from '../../../lib/async/run-in-background.js'; import type { Account } from '../../../types/game.types.js'; import type { ModalAddAccountConfirmData } from './modal-add-account.jsx'; @@ -21,14 +10,16 @@ import { ModalAddAccount } from './modal-add-account.jsx'; import { ModalEditAccount } from './modal-edit-account.jsx'; import type { ModalRemoveAccountConfirmData } from './modal-remove-account.jsx'; import { ModalRemoveAccount } from './modal-remove-account.jsx'; +import { TableListAccounts } from './table-list-accounts.jsx'; export const SidebarItemAccounts: React.FC = (): ReactNode => { const [showAddAccountModal, setShowAddAccountModal] = useState(false); const [showEditAccountModal, setShowEditAccountModal] = useState(false); const [showRemoveAccountModal, setShowRemoveAccountModal] = useState(false); - // All accounts to display. - const accounts = useListAccounts(); + // Hooks to save and remove accounts. + const saveAccount = useSaveAccount(); + const removeAccount = useRemoveAccount(); // The contextual account being edited or removed. const [account, setAccount] = useState(); @@ -67,67 +58,27 @@ export const SidebarItemAccounts: React.FC = (): ReactNode => { (data: ModalAddAccountConfirmData) => { closeModals(); runInBackground(async () => { - await window.api.saveAccount({ + await saveAccount({ accountName: data.accountName, accountPassword: data.accountPassword, }); }); }, - [closeModals] + [closeModals, saveAccount] ); const onAccountRemoveConfirm = useCallback( (data: ModalRemoveAccountConfirmData) => { closeModals(); runInBackground(async () => { - await window.api.removeAccount({ + await removeAccount({ accountName: data.accountName, }); }); }, - [closeModals] + [closeModals, removeAccount] ); - const columns: Array> = [ - { - field: 'accountName', - name: 'Name', - dataType: 'string', - }, - { - field: 'actions', - name: 'Actions', - render: (_value: unknown, account: Account) => { - return ( - - - - onEditAccountClick(account)} - /> - - - - - onRemoveAccountClick(account)} - /> - - - - ); - }, - }, - ]; - return ( @@ -143,9 +94,10 @@ export const SidebarItemAccounts: React.FC = (): ReactNode => { - {accounts.length > 0 && ( - - )} + diff --git a/electron/renderer/components/sidebar/accounts/table-list-accounts.tsx b/electron/renderer/components/sidebar/accounts/table-list-accounts.tsx new file mode 100644 index 00000000..5d2e95d1 --- /dev/null +++ b/electron/renderer/components/sidebar/accounts/table-list-accounts.tsx @@ -0,0 +1,83 @@ +import type { EuiBasicTableColumn } from '@elastic/eui'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiInMemoryTable, + EuiToolTip, +} from '@elastic/eui'; +import { type ReactNode, memo, useMemo } from 'react'; +import { useListAccounts } from '../../../hooks/accounts.jsx'; +import type { Account } from '../../../types/game.types.js'; + +export interface TableListAccountsProps { + editAccountClick: (account: Account) => void; + removeAccountClick: (account: Account) => void; +} + +export const TableListAccounts: React.FC = memo( + (props: TableListAccountsProps): ReactNode => { + const { editAccountClick, removeAccountClick } = props; + + // All accounts to display. + const accounts = useListAccounts(); + + const columns = useMemo>>(() => { + return [ + { + field: 'accountName', + name: 'Name', + dataType: 'string', + truncateText: true, + }, + { + field: 'actions', + name: 'Actions', + width: '25%', + render: (_value: unknown, account: Account) => { + return ( + + + + editAccountClick(account)} + /> + + + + + removeAccountClick(account)} + /> + + + + ); + }, + }, + ]; + }, [editAccountClick, removeAccountClick]); + + return ( + <> + {accounts.length > 0 && ( + + )} + + ); + } +); + +TableListAccounts.displayName = 'TableListAccounts';