104 lines
3.4 KiB
JavaScript
104 lines
3.4 KiB
JavaScript
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
|
import { company } from '../api';
|
|
import { normalizeCompany } from '../utils/companyForm';
|
|
import {
|
|
bootstrapSession,
|
|
createCompany,
|
|
loginWithGoogle,
|
|
logout,
|
|
selectCompany,
|
|
} from './authSlice';
|
|
|
|
export const loadCurrentCompany = createAsyncThunk(
|
|
'company/loadCurrent',
|
|
async (_, { getState }) => {
|
|
const companyId = getState().auth.user?.selectedCompanyId;
|
|
if (!companyId) return null;
|
|
const data = await company.getById(companyId);
|
|
return normalizeCompany(data.company);
|
|
},
|
|
);
|
|
|
|
export const updateCompany = createAsyncThunk(
|
|
'company/update',
|
|
async (payload, { getState }) => {
|
|
const companyId = getState().auth.user?.selectedCompanyId;
|
|
if (!companyId) throw new Error('Kein Unternehmen ausgewählt.');
|
|
await company.update(companyId, payload);
|
|
const data = await company.getById(companyId);
|
|
return normalizeCompany(data.company, payload);
|
|
},
|
|
);
|
|
|
|
const initialState = {
|
|
current: null,
|
|
status: 'idle',
|
|
error: null,
|
|
};
|
|
|
|
const companySlice = createSlice({
|
|
name: 'company',
|
|
initialState,
|
|
reducers: {},
|
|
extraReducers: (builder) => {
|
|
builder
|
|
.addCase(loadCurrentCompany.pending, (state) => {
|
|
state.status = 'loading';
|
|
state.error = null;
|
|
})
|
|
.addCase(loadCurrentCompany.fulfilled, (state, action) => {
|
|
state.status = 'succeeded';
|
|
state.current = action.payload;
|
|
})
|
|
.addCase(loadCurrentCompany.rejected, (state, action) => {
|
|
state.status = 'failed';
|
|
state.error = action.error.message;
|
|
})
|
|
.addCase(updateCompany.pending, (state) => {
|
|
state.status = 'loading';
|
|
state.error = null;
|
|
})
|
|
.addCase(updateCompany.fulfilled, (state, action) => {
|
|
state.status = 'succeeded';
|
|
state.current = action.payload;
|
|
})
|
|
.addCase(updateCompany.rejected, (state, action) => {
|
|
state.status = 'failed';
|
|
state.error = action.error.message;
|
|
})
|
|
.addCase(logout.fulfilled, (state) => {
|
|
state.current = null;
|
|
state.status = 'idle';
|
|
state.error = null;
|
|
});
|
|
},
|
|
});
|
|
|
|
export const selectCurrentCompany = (state) => state.company.current;
|
|
export const selectCompanyId = (state) => state.company.current?.id ?? null;
|
|
export const selectCompanyStatus = (state) => state.company.status;
|
|
export const selectCompanyError = (state) => state.company.error;
|
|
export const selectCompanyName = (state) => state.company.current?.name;
|
|
export const selectCompanyIso639 = (state) => state.company.current?.iso639;
|
|
export const selectCompanyTaxrate = (state) => state.company.current?.taxrate ?? null;
|
|
export const selectCompanyReducedTaxrate = (state) => state.company.current?.reducedtaxrate ?? null;
|
|
export const selectCompanyRootCategoryId = (state) => state.company.current?.rootCategoryId ?? null;
|
|
|
|
export function companyLoadListener(listenerMiddleware) {
|
|
listenerMiddleware.startListening({
|
|
matcher: (action) =>
|
|
bootstrapSession.fulfilled.match(action) ||
|
|
loginWithGoogle.fulfilled.match(action) ||
|
|
selectCompany.fulfilled.match(action) ||
|
|
createCompany.fulfilled.match(action),
|
|
effect: async (_action, api) => {
|
|
const companyId = api.getState().auth.user?.selectedCompanyId;
|
|
if (companyId) {
|
|
api.dispatch(loadCurrentCompany());
|
|
}
|
|
},
|
|
});
|
|
}
|
|
|
|
export default companySlice.reducer;
|