Skip to content

Commit 2f800bf

Browse files
authored
Add delete account support (#302)
* Add delete account support * add peer approval form item * block menu for non owners
1 parent 0199ea8 commit 2f800bf

File tree

5 files changed

+519
-253
lines changed

5 files changed

+519
-253
lines changed

src/store/account/actions.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {ActionType, createAction, createAsyncAction} from 'typesafe-actions';
22
import {Account} from './types';
3-
import {ApiError, ChangeResponse, RequestPayload} from '../../services/api-client/types';
3+
import {ApiError, ChangeResponse, DeleteResponse, RequestPayload} from '../../services/api-client/types';
44

55
const actions = {
66
getAccounts: createAsyncAction(
@@ -16,6 +16,13 @@ const actions = {
1616
)<RequestPayload<Account>, ChangeResponse<Account | null>, ChangeResponse<Account | null>>(),
1717
setUpdateAccount: createAction('SET_UPDATED_ACCOUNT')<ChangeResponse<Account | null>>(),
1818
resetUpdateAccount: createAction('RESET_UPDATED_ACCOUNT')<null>(),
19+
deleteAccount: createAsyncAction(
20+
'DELETE_ACCOUNT_REQUEST',
21+
'DELETE_ACCOUNT_SUCCESS',
22+
'DELETE_ACCOUNT_FAILURE'
23+
)<RequestPayload<string>, DeleteResponse<string | null>, DeleteResponse<string | null>>(),
24+
resetDeletedAccount: createAction('RESET_DELETED_ACCOUNT')<null>(),
25+
setDeleteAccount: createAction('SET_DELETE_ACCOUNT')<DeleteResponse<string | null>>(),
1926
};
2027

2128

src/store/account/reducer.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import { createReducer } from 'typesafe-actions';
22
import { combineReducers } from 'redux';
33
import { Account } from './types';
44
import actions, { ActionTypes } from './actions';
5-
import {ApiError, ChangeResponse} from "../../services/api-client/types";
5+
import {ApiError, ChangeResponse, DeleteResponse} from "../../services/api-client/types";
66

77
type StateType = Readonly<{
88
data: Account[] | null;
99
loading: boolean;
1010
failed: ApiError | null;
1111
savedAccount: ChangeResponse<Account | null>;
12+
deletedAccount: DeleteResponse<string | null>;
1213
}>;
1314

1415
const initialState: StateType = {
@@ -22,6 +23,13 @@ const initialState: StateType = {
2223
error: null,
2324
data : null
2425
},
26+
deletedAccount: <DeleteResponse<string | null>>{
27+
loading: false,
28+
success: false,
29+
failure: false,
30+
error: null,
31+
data : null
32+
},
2533
};
2634

2735
const data = createReducer<Account[], ActionTypes>(initialState.data as Account[])
@@ -45,10 +53,18 @@ const updatedAccount = createReducer<ChangeResponse<Account | null>, ActionTypes
4553
.handleAction(actions.setUpdateAccount, (store, action) => action.payload)
4654
.handleAction(actions.resetUpdateAccount, () => initialState.savedAccount)
4755

56+
const deleteAccount = createReducer<DeleteResponse<string | null>, ActionTypes>(initialState.deletedAccount)
57+
.handleAction(actions.deleteAccount.request, () => initialState.deletedAccount)
58+
.handleAction(actions.deleteAccount.success, (store, action) => action.payload)
59+
.handleAction(actions.deleteAccount.failure, (store, action) => action.payload)
60+
.handleAction(actions.setDeleteAccount, (store, action) => action.payload)
61+
.handleAction(actions.resetDeletedAccount, () => initialState.deletedAccount)
62+
4863

4964
export default combineReducers({
5065
data,
5166
loading,
5267
failed,
53-
updatedAccount
68+
updatedAccount,
69+
deleteAccount
5470
});

src/store/account/sagas.ts

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import {all, call, put, takeLatest} from 'redux-saga/effects';
2-
import {ApiError, ApiResponse, ChangeResponse} from '../../services/api-client/types';
1+
import {all, call, put, select, takeLatest} from 'redux-saga/effects';
2+
import {ApiError, ApiResponse, ChangeResponse, DeleteResponse} from '../../services/api-client/types';
33
import {Account} from './types'
44
import service from './service';
55
import actions from './actions';
6+
import {deletePeer} from "../peer/sagas";
67

78
export function* getAccounts(action: ReturnType<typeof actions.getAccounts.request>): Generator {
89
try {
@@ -55,10 +56,55 @@ export function* updateAccount(action: ReturnType<typeof actions.updateAccount.r
5556
}
5657
}
5758

59+
export function* deleteAccount(
60+
action: ReturnType<typeof actions.deleteAccount.request>
61+
): Generator {
62+
try {
63+
yield call(actions.setDeleteAccount, {
64+
loading: true,
65+
success: false,
66+
failure: false,
67+
error: null,
68+
data: null,
69+
} as DeleteResponse<string | null>);
70+
71+
const effect = yield call(service.deleteAccount, action.payload);
72+
const response = effect as ApiResponse<any>;
73+
74+
yield put(
75+
actions.deleteAccount.success({
76+
loading: false,
77+
success: true,
78+
failure: false,
79+
error: null,
80+
data: response.body,
81+
} as DeleteResponse<string | null>)
82+
);
83+
84+
const accounts = (yield select((state) => state.peer.data)) as Account[];
85+
yield put(
86+
actions.getAccounts.success(
87+
accounts.filter((p: Account) => p.id !== action.payload.payload)
88+
)
89+
);
90+
} catch (err) {
91+
yield put(
92+
actions.deleteAccount.failure({
93+
loading: false,
94+
success: false,
95+
failure: false,
96+
error: err as ApiError,
97+
data: null,
98+
} as DeleteResponse<string | null>)
99+
);
100+
}
101+
}
102+
58103
export default function* sagas(): Generator {
59104
yield all([
60105
takeLatest(actions.getAccounts.request, getAccounts),
61106
takeLatest(actions.updateAccount.request, updateAccount),
107+
takeLatest(actions.deleteAccount.request, deleteAccount),
62108
]);
63109
}
64110

src/store/account/service.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,11 @@ export default {
1515
`/api/accounts/${id}`,
1616
payload
1717
);
18-
}
18+
},
19+
async deleteAccount(payload:RequestPayload<string>): Promise<ApiResponse<any>> {
20+
return apiClient.delete<any>(
21+
`/api/accounts/` + payload.payload,
22+
payload
23+
);
24+
},
1925
};

0 commit comments

Comments
 (0)