docs(changeset): feat(error-manager): implement centralized error reporting system

This commit is contained in:
2026-02-07 21:11:48 +02:00
parent 7bf94f306a
commit d7b1eb26f3
18 changed files with 806 additions and 187 deletions

View File

@@ -5,7 +5,6 @@ import { useStoreWithEqualityFn } from 'zustand/traditional';
import { createStore } from 'zustand/vanilla';
import type {
AppState,
BarState,
ExtractState,
GlobalState,
@@ -21,10 +20,6 @@ import type {
import { loadStorage, saveStorage } from './GlobalStateStore.utils';
const initialState: GlobalState = {
app: {
controls: {},
environment: 'production',
},
layout: {
bottomBar: { open: false },
leftBar: { open: false },
@@ -35,10 +30,14 @@ const initialState: GlobalState = {
menu: [],
},
owner: {
guid: '',
id: 0,
name: '',
},
program: {
controls: {},
environment: 'production',
guid: '',
name: '',
slug: '',
},
@@ -47,8 +46,10 @@ const initialState: GlobalState = {
authToken: '',
connected: true,
loading: false,
loggedIn: false,
},
user: {
guid: '',
username: '',
},
};
@@ -140,13 +141,6 @@ const createNavigationSlice = (set: SetState) => ({
})),
});
const createAppSlice = (set: SetState) => ({
setApp: (updates: Partial<AppState>) =>
set((state: GlobalState) => ({
app: { ...state.app, ...updates },
})),
});
const createComplexActions = (set: SetState, get: GetState) => ({
fetchData: async (url?: string) => {
try {
@@ -164,9 +158,9 @@ const createComplexActions = (set: SetState, get: GetState) => ({
set((state: GlobalState) => ({
...state,
...result,
app: {
...state.app,
...result?.app,
program: {
...state.program,
...result?.program,
updatedAt: new Date().toISOString(),
},
session: {
@@ -188,25 +182,101 @@ const createComplexActions = (set: SetState, get: GetState) => ({
}
},
isLoggedIn: (): boolean => {
const session = get().session;
if (!session.loggedIn || !session.authToken) {
return false;
}
if (session.expiryDate && new Date(session.expiryDate) < new Date()) {
return false;
}
return true;
},
login: async (authToken?: string) => {
set((state: GlobalState) => ({
session: {
...state.session,
authToken: authToken ?? '',
},
}));
await get().fetchData();
try {
set((state: GlobalState) => ({
session: {
...state.session,
authToken: authToken ?? '',
expiryDate: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
loading: true,
loggedIn: true,
},
}));
await get().fetchData();
const currentState = get();
const result = await currentState.onLogin?.(currentState);
if (result) {
set((state: GlobalState) => ({
...state,
owner: result.owner ? { ...state.owner, ...result.owner } : state.owner,
program: result.program ? { ...state.program, ...result.program } : state.program,
session: result.session ? { ...state.session, ...result.session } : state.session,
user: result.user ? { ...state.user, ...result.user } : state.user,
}));
}
} catch (e) {
set((state: GlobalState) => ({
session: {
...state.session,
connected: false,
error: `Login Exception: ${String(e)}`,
loading: false,
loggedIn: false,
},
}));
} finally {
set((state: GlobalState) => ({
session: {
...state.session,
loading: false,
},
}));
}
},
logout: async () => {
set((state: GlobalState) => ({
...initialState,
session: {
...initialState.session,
apiURL: state.session.apiURL,
},
}));
await get().fetchData();
try {
set((state: GlobalState) => ({
...initialState,
session: {
...initialState.session,
apiURL: state.session.apiURL,
expiryDate: undefined,
loading: true,
loggedIn: false,
},
}));
await get().fetchData();
const currentState = get();
const result = await currentState.onLogout?.(currentState);
if (result) {
set((state: GlobalState) => ({
...state,
owner: result.owner ? { ...state.owner, ...result.owner } : state.owner,
program: result.program ? { ...state.program, ...result.program } : state.program,
session: result.session ? { ...state.session, ...result.session } : state.session,
user: result.user ? { ...state.user, ...result.user } : state.user,
}));
}
} catch (e) {
set((state: GlobalState) => ({
session: {
...state.session,
connected: false,
error: `Logout Exception: ${String(e)}`,
loading: false,
},
}));
} finally {
set((state: GlobalState) => ({
session: {
...state.session,
loading: false,
},
}));
}
},
});
@@ -218,7 +288,6 @@ const GlobalStateStore = createStore<GlobalStateStoreType>((set, get) => ({
...createUserSlice(set),
...createLayoutSlice(set),
...createNavigationSlice(set),
...createAppSlice(set),
...createComplexActions(set, get),
}));
@@ -267,6 +336,10 @@ const getAuthToken = (): string => {
return GlobalStateStore.getState().session.authToken;
};
const isLoggedIn = (): boolean => {
return GlobalStateStore.getState().isLoggedIn();
};
const setAuthToken = (token: string) => {
GlobalStateStore.getState().setAuthToken(token);
};
@@ -275,4 +348,4 @@ const GetGlobalState = (): GlobalStateStoreType => {
return GlobalStateStore.getState();
}
export { getApiURL, getAuthToken, GetGlobalState, GlobalStateStore, setApiURL, setAuthToken, useGlobalStateStore };
export { getApiURL, getAuthToken, GetGlobalState, GlobalStateStore, isLoggedIn, setApiURL, setAuthToken, useGlobalStateStore };