mirror of
https://git.sr.ht/~ashkeel/strimertul
synced 2024-09-18 01:50:50 +00:00
refactor: remove typecasting from thunks
This commit is contained in:
parent
4de2b0a817
commit
2cf63534e5
1 changed files with 71 additions and 80 deletions
|
@ -9,7 +9,7 @@ import {
|
||||||
Dispatch,
|
Dispatch,
|
||||||
PayloadAction,
|
PayloadAction,
|
||||||
} from '@reduxjs/toolkit';
|
} from '@reduxjs/toolkit';
|
||||||
import KilovoltWS from '@strimertul/kilovolt-client';
|
import KilovoltWS, { KilovoltMessage } from '@strimertul/kilovolt-client';
|
||||||
import type { kvError } from '@strimertul/kilovolt-client/types/messages';
|
import type { kvError } from '@strimertul/kilovolt-client/types/messages';
|
||||||
import { AuthenticateKVClient, IsServerReady } from '@wailsapp/go/main/App';
|
import { AuthenticateKVClient, IsServerReady } from '@wailsapp/go/main/App';
|
||||||
import { delay } from '~/lib/time';
|
import { delay } from '~/lib/time';
|
||||||
|
@ -20,26 +20,27 @@ import {
|
||||||
LoyaltyRedeem,
|
LoyaltyRedeem,
|
||||||
LoyaltyStorage,
|
LoyaltyStorage,
|
||||||
} from './types';
|
} from './types';
|
||||||
|
import { ThunkConfig } from '..';
|
||||||
|
|
||||||
|
type ThunkAPIState = { api: APIState };
|
||||||
|
|
||||||
interface AppThunkAPI {
|
interface AppThunkAPI {
|
||||||
dispatch: Dispatch;
|
dispatch: Dispatch;
|
||||||
getState: () => unknown;
|
getState: () => ThunkAPIState;
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeGetterThunk<T>(key: string) {
|
function makeGetSetThunks<T>(key: string) {
|
||||||
return async (_: void, { getState }: AppThunkAPI) => {
|
const getter = createAsyncThunk<T, void, { state: ThunkAPIState }>(
|
||||||
const { api } = getState() as { api: APIState };
|
`api/get/${key}`,
|
||||||
|
async (_, { getState }) => {
|
||||||
|
const { api } = getState();
|
||||||
return api.client.getJSON<T>(key);
|
return api.client.getJSON<T>(key);
|
||||||
};
|
},
|
||||||
}
|
);
|
||||||
|
const setter = createAsyncThunk<KilovoltMessage, T, { state: ThunkAPIState }>(
|
||||||
function makeSetterThunk<T>(
|
`api/set/${key}`,
|
||||||
key: string,
|
async (data: T, { getState, dispatch }: AppThunkAPI) => {
|
||||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
const { api } = getState();
|
||||||
getter: AsyncThunk<T, void, {}>,
|
|
||||||
) {
|
|
||||||
return async (data: T, { getState, dispatch }: AppThunkAPI) => {
|
|
||||||
const { api } = getState() as { api: APIState };
|
|
||||||
const result = await api.client.putJSON(key, data);
|
const result = await api.client.putJSON(key, data);
|
||||||
if ('ok' in result) {
|
if ('ok' in result) {
|
||||||
if (result.ok) {
|
if (result.ok) {
|
||||||
|
@ -50,14 +51,7 @@ function makeSetterThunk<T>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
},
|
||||||
}
|
|
||||||
|
|
||||||
function makeGetSetThunks<T>(key: string) {
|
|
||||||
const getter = createAsyncThunk(`api/get/${key}`, makeGetterThunk<T>(key));
|
|
||||||
const setter = createAsyncThunk(
|
|
||||||
`api/set/${key}`,
|
|
||||||
makeSetterThunk<T>(key, getter),
|
|
||||||
);
|
);
|
||||||
return { getter, setter };
|
return { getter, setter };
|
||||||
}
|
}
|
||||||
|
@ -117,10 +111,12 @@ export const createWSClient = createAsyncThunk(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export const getUserPoints = createAsyncThunk(
|
export const getUserPoints = createAsyncThunk<
|
||||||
'api/getUserPoints',
|
LoyaltyStorage,
|
||||||
async (_: void, { getState }) => {
|
void,
|
||||||
const { api } = getState() as { api: APIState };
|
ThunkConfig
|
||||||
|
>('api/getUserPoints', async (_, { getState }) => {
|
||||||
|
const { api } = getState();
|
||||||
const keys = await api.client.getKeysByPrefix(loyaltyPointsPrefix);
|
const keys = await api.client.getKeysByPrefix(loyaltyPointsPrefix);
|
||||||
const userpoints: LoyaltyStorage = {};
|
const userpoints: LoyaltyStorage = {};
|
||||||
Object.entries(keys).forEach(([k, v]) => {
|
Object.entries(keys).forEach(([k, v]) => {
|
||||||
|
@ -129,27 +125,20 @@ export const getUserPoints = createAsyncThunk(
|
||||||
) as LoyaltyPointsEntry;
|
) as LoyaltyPointsEntry;
|
||||||
});
|
});
|
||||||
return userpoints;
|
return userpoints;
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export const setUserPoints = createAsyncThunk(
|
export const setUserPoints = createAsyncThunk<
|
||||||
'api/setUserPoints',
|
KilovoltMessage,
|
||||||
async (
|
{ user: string; points: number; relative: boolean },
|
||||||
{
|
ThunkConfig
|
||||||
user,
|
>('api/setUserPoints', async ({ user, points, relative }, { getState }) => {
|
||||||
points,
|
const { api } = getState();
|
||||||
relative,
|
|
||||||
}: { user: string; points: number; relative: boolean },
|
|
||||||
{ getState },
|
|
||||||
) => {
|
|
||||||
const { api } = getState() as { api: APIState };
|
|
||||||
const entry: LoyaltyPointsEntry = { points };
|
const entry: LoyaltyPointsEntry = { points };
|
||||||
if (relative) {
|
if (relative) {
|
||||||
entry.points += api.loyalty.users[user]?.points ?? 0;
|
entry.points += api.loyalty.users[user]?.points ?? 0;
|
||||||
}
|
}
|
||||||
return api.client.putJSON(loyaltyPointsPrefix + user, entry);
|
return api.client.putJSON(loyaltyPointsPrefix + user, entry);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export const modules = {
|
export const modules = {
|
||||||
httpConfig: makeModule(
|
httpConfig: makeModule(
|
||||||
|
@ -242,21 +231,23 @@ export const modules = {
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
export const createRedeem = createAsyncThunk(
|
export const createRedeem = createAsyncThunk<
|
||||||
'api/createRedeem',
|
KilovoltMessage,
|
||||||
async (redeem: LoyaltyRedeem, { getState }) => {
|
LoyaltyRedeem,
|
||||||
const { api } = getState() as { api: APIState };
|
ThunkConfig
|
||||||
|
>('api/createRedeem', async (redeem: LoyaltyRedeem, { getState }) => {
|
||||||
|
const { api } = getState();
|
||||||
return api.client.putJSON(loyaltyCreateRedeemKey, redeem);
|
return api.client.putJSON(loyaltyCreateRedeemKey, redeem);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
export const removeRedeem = createAsyncThunk(
|
export const removeRedeem = createAsyncThunk<
|
||||||
'api/removeRedeem',
|
KilovoltMessage,
|
||||||
async (redeem: LoyaltyRedeem, { getState }) => {
|
LoyaltyRedeem,
|
||||||
const { api } = getState() as { api: APIState };
|
ThunkConfig
|
||||||
|
>('api/removeRedeem', async (redeem: LoyaltyRedeem, { getState }) => {
|
||||||
|
const { api } = getState();
|
||||||
return api.client.putJSON(loyaltyRemoveRedeemKey, redeem);
|
return api.client.putJSON(loyaltyRemoveRedeemKey, redeem);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
|
|
||||||
const moduleChangeReducers = Object.fromEntries(
|
const moduleChangeReducers = Object.fromEntries(
|
||||||
Object.entries(modules).map(([key, mod]) => [
|
Object.entries(modules).map(([key, mod]) => [
|
||||||
|
@ -419,10 +410,10 @@ kvErrorReceived = createAsyncThunk(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
export const useAuthBypass = createAsyncThunk(
|
export const useAuthBypass = createAsyncThunk<void, void, ThunkConfig>(
|
||||||
'api/authBypass',
|
'api/authBypass',
|
||||||
async (_: void, { getState, dispatch }) => {
|
async (_: void, { getState, dispatch }) => {
|
||||||
const { api } = getState() as { api: APIState };
|
const { api } = getState();
|
||||||
const response = await api.client.send({ command: '_uid' });
|
const response = await api.client.send({ command: '_uid' });
|
||||||
if ('ok' in response && response.ok && 'data' in response) {
|
if ('ok' in response && response.ok && 'data' in response) {
|
||||||
const uid = response.data;
|
const uid = response.data;
|
||||||
|
|
Loading…
Reference in a new issue