Skip to content

Commit f1c143c

Browse files
committed
feat: accounts side panel, implement list and remove account
1 parent 148c7d6 commit f1c143c

File tree

1 file changed

+193
-4
lines changed

1 file changed

+193
-4
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,196 @@
1-
import { EuiPanel } from '@elastic/eui';
2-
import type { ReactNode } from 'react';
1+
import type { EuiBasicTableColumn } from '@elastic/eui';
2+
import {
3+
EuiButton,
4+
EuiButtonIcon,
5+
EuiCallOut,
6+
EuiCode,
7+
EuiConfirmModal,
8+
EuiFlexGroup,
9+
EuiFlexItem,
10+
EuiInMemoryTable,
11+
EuiPanel,
12+
EuiSpacer,
13+
EuiToolTip,
14+
} from '@elastic/eui';
15+
import {
16+
type ReactNode,
17+
useCallback,
18+
useEffect,
19+
useMemo,
20+
useState,
21+
} from 'react';
22+
import type { Maybe } from '../../../common/types.js';
23+
import { runInBackground } from '../../lib/async/run-in-background.js';
24+
25+
interface TableRowItem {
26+
accountName: string;
27+
}
328

429
export const SidebarItemAccounts: React.FC = (): ReactNode => {
5-
// TODO
6-
return <EuiPanel>Accounts</EuiPanel>;
30+
// When displaying models to add, edit, or remove an account,
31+
// this record indicates the contextual record from the table.
32+
const [record, setRecord] = useState<Maybe<TableRowItem>>(undefined);
33+
34+
const [showAddAccountModal, setShowAddAccountModal] = useState(false);
35+
const [showEditAccountModal, setShowEditAccountModal] = useState(false);
36+
const [showRemoveAccountModal, setShowRemoveAccountModal] = useState(false);
37+
38+
const [tableRowItems, setTableRowItems] = useState<Array<TableRowItem>>([]);
39+
40+
const loadAccounts = useCallback(async () => {
41+
const accounts = await window.api.listAccounts();
42+
43+
setTableRowItems(
44+
accounts.map((account) => {
45+
return {
46+
accountName: account.accountName,
47+
};
48+
})
49+
);
50+
}, []);
51+
52+
const closeModals = useCallback(() => {
53+
setShowAddAccountModal(false);
54+
setShowEditAccountModal(false);
55+
setShowRemoveAccountModal(false);
56+
setRecord(undefined);
57+
}, []);
58+
59+
const onAddAccountClick = useCallback(() => {
60+
// TODO show prompt to enter account name and password
61+
closeModals();
62+
setRecord({ accountName: '' });
63+
setShowAddAccountModal(true);
64+
}, [closeModals]);
65+
66+
const onEditAccountClick = useCallback(
67+
(tableRowItem: TableRowItem) => {
68+
// TODO show prompt to edit account name and password
69+
closeModals();
70+
setRecord(tableRowItem);
71+
setShowEditAccountModal(true);
72+
},
73+
[closeModals]
74+
);
75+
76+
const onRemoveAccountClick = useCallback(
77+
(tableRowItem: TableRowItem) => {
78+
closeModals();
79+
setRecord(tableRowItem);
80+
setShowRemoveAccountModal(true);
81+
},
82+
[closeModals]
83+
);
84+
85+
const onAccountRemoveConfirm = useCallback(() => {
86+
if (!record) {
87+
return;
88+
}
89+
runInBackground(async () => {
90+
closeModals();
91+
await window.api.removeAccount({
92+
accountName: record.accountName,
93+
});
94+
await loadAccounts();
95+
});
96+
}, [record, loadAccounts, closeModals]);
97+
98+
const accountAddModal = useMemo(() => {
99+
return <>add</>;
100+
}, []);
101+
102+
const accountEditModal = useMemo(() => {
103+
return <>edit</>;
104+
}, []);
105+
106+
const accountRemoveModal = useMemo(() => {
107+
return (
108+
<EuiConfirmModal
109+
title={
110+
<>
111+
Remove account <EuiCode>{record?.accountName}</EuiCode>?
112+
</>
113+
}
114+
onCancel={closeModals}
115+
onConfirm={onAccountRemoveConfirm}
116+
cancelButtonText="Cancel"
117+
confirmButtonText="Remove"
118+
buttonColor="danger"
119+
defaultFocusedButton="cancel"
120+
>
121+
Any associated characters will also be removed.
122+
</EuiConfirmModal>
123+
);
124+
}, [record, closeModals, onAccountRemoveConfirm]);
125+
126+
useEffect(() => {
127+
runInBackground(async () => {
128+
await loadAccounts();
129+
});
130+
}, [loadAccounts]);
131+
132+
const columns: Array<EuiBasicTableColumn<TableRowItem>> = [
133+
{
134+
field: 'accountName',
135+
name: 'Account',
136+
dataType: 'string',
137+
},
138+
{
139+
field: 'actions',
140+
name: 'Actions',
141+
render: (_value: unknown, record: TableRowItem) => {
142+
return (
143+
<EuiFlexGroup responsive={true} gutterSize="s" alignItems="center">
144+
<EuiFlexItem grow={false}>
145+
<EuiToolTip content="Edit account" position="bottom">
146+
<EuiButtonIcon
147+
iconType="pencil"
148+
display="base"
149+
color="warning"
150+
onClick={() => onEditAccountClick(record)}
151+
/>
152+
</EuiToolTip>
153+
</EuiFlexItem>
154+
<EuiFlexItem grow={false}>
155+
<EuiToolTip content="Remove account" position="bottom">
156+
<EuiButtonIcon
157+
iconType="cross"
158+
display="base"
159+
color="danger"
160+
onClick={() => onRemoveAccountClick(record)}
161+
/>
162+
</EuiToolTip>
163+
</EuiFlexItem>
164+
</EuiFlexGroup>
165+
);
166+
},
167+
},
168+
];
169+
170+
return (
171+
<EuiPanel>
172+
<EuiCallOut title="My Accounts" iconType="key" size="s">
173+
Securely add your DragonRealms accounts, then use the Characters menu to
174+
add and play your characters.
175+
</EuiCallOut>
176+
177+
<EuiSpacer size="m" />
178+
179+
<EuiButton size="s" onClick={() => onAddAccountClick()}>
180+
Add Account
181+
</EuiButton>
182+
183+
<EuiSpacer size="m" />
184+
185+
{tableRowItems.length > 0 && (
186+
<EuiInMemoryTable items={tableRowItems} columns={columns} />
187+
)}
188+
189+
<EuiSpacer size="m" />
190+
191+
{showAddAccountModal && accountAddModal}
192+
{showEditAccountModal && accountEditModal}
193+
{showRemoveAccountModal && accountRemoveModal}
194+
</EuiPanel>
195+
);
7196
};

0 commit comments

Comments
 (0)