File size: 3,007 Bytes
25f22bf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import accountService from '../../services/accountService';
// Initial state
const initialState = {
items: [],
loading: false,
error: null
};
// Async thunks
export const fetchAccounts = createAsyncThunk(
'accounts/fetchAccounts',
async (_, { rejectWithValue }) => {
try {
const response = await accountService.getAll();
return response.data.accounts;
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
export const addAccount = createAsyncThunk(
'accounts/addAccount',
async (accountData, { rejectWithValue }) => {
try {
const response = await accountService.create(accountData);
return response.data;
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
export const deleteAccount = createAsyncThunk(
'accounts/deleteAccount',
async (accountId, { rejectWithValue }) => {
try {
const response = await accountService.delete(accountId);
return { ...response.data, accountId };
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
// Accounts slice
const accountsSlice = createSlice({
name: 'accounts',
initialState,
reducers: {
clearError: (state) => {
state.error = null;
}
},
extraReducers: (builder) => {
// Fetch accounts
builder
.addCase(fetchAccounts.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchAccounts.fulfilled, (state, action) => {
state.loading = false;
state.items = action.payload;
})
.addCase(fetchAccounts.rejected, (state, action) => {
state.loading = false;
state.error = action.payload?.message || 'Failed to fetch accounts';
})
// Add account
.addCase(addAccount.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(addAccount.fulfilled, (state, action) => {
state.loading = false;
// Add the new account to the list
state.items = [...state.items, action.payload];
})
.addCase(addAccount.rejected, (state, action) => {
state.loading = false;
state.error = action.payload?.message || 'Failed to add account';
})
// Delete account
.addCase(deleteAccount.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(deleteAccount.fulfilled, (state, action) => {
state.loading = false;
// Remove the deleted account from the list
state.items = state.items.filter(account => account.id !== action.payload.accountId);
})
.addCase(deleteAccount.rejected, (state, action) => {
state.loading = false;
state.error = action.payload?.message || 'Failed to delete account';
});
}
});
export const { clearError } = accountsSlice.actions;
export default accountsSlice.reducer; |