1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-18 13:48:58 +02:00

refactor: feature switch promises

This commit is contained in:
Tymoteusz Czech 2023-10-20 09:38:41 +02:00
parent 032c8cf960
commit c233979317
No known key found for this signature in database
GPG Key ID: 133555230D88D75F

View File

@ -15,18 +15,6 @@ import {
UseFeatureToggleSwitchType, UseFeatureToggleSwitchType,
} from './FeatureToggleSwitch.types'; } from './FeatureToggleSwitch.types';
type Middleware = (next: () => void) => void;
const composeAndRunMiddlewares = (middlewares: Middleware[]) => {
const runMiddleware = (currentIndex: number) => {
if (currentIndex < middlewares.length) {
middlewares[currentIndex](() => runMiddleware(currentIndex + 1));
}
};
runMiddleware(0);
};
export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = ( export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
projectId: string, projectId: string,
) => { ) => {
@ -63,19 +51,22 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
async (newState: boolean, config: OnFeatureToggleSwitchArgs) => { async (newState: boolean, config: OnFeatureToggleSwitchArgs) => {
let shouldActivateDisabledStrategies = false; let shouldActivateDisabledStrategies = false;
const confirmProductionChanges: Middleware = (next) => { const confirmProductionChanges = async () => {
if (config.isChangeRequestEnabled) { if (config.isChangeRequestEnabled) {
// skip if change requests are enabled // skip if change requests are enabled
return next(); return;
} }
if (!isProdGuardEnabled(config.environmentType || '')) { if (!isProdGuardEnabled(config.environmentType || '')) {
return next(); return;
} }
return new Promise<void>((resolve, reject) => {
setProdGuardModalState({ setProdGuardModalState({
open: true, open: true,
label: `${!newState ? 'Disable' : 'Enable'} Environment`, label: `${
!newState ? 'Disable' : 'Enable'
} Environment`,
loading: false, loading: false,
onClose: () => { onClose: () => {
setProdGuardModalState((prev) => ({ setProdGuardModalState((prev) => ({
@ -83,6 +74,7 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
open: false, open: false,
})); }));
config.onRollback?.(); config.onRollback?.();
reject();
}, },
onClick: () => { onClick: () => {
setProdGuardModalState((prev) => ({ setProdGuardModalState((prev) => ({
@ -90,16 +82,18 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
open: false, open: false,
loading: true, loading: true,
})); }));
next(); resolve();
}, },
}); });
});
}; };
const ensureActiveStrategies: Middleware = (next) => { const ensureActiveStrategies = async () => {
if (!config.hasStrategies || config.hasEnabledStrategies) { if (!config.hasStrategies || config.hasEnabledStrategies) {
return next(); return;
} }
return new Promise<void>((resolve, reject) => {
setEnableEnvironmentDialogState({ setEnableEnvironmentDialogState({
isOpen: true, isOpen: true,
environment: config.environmentName, environment: config.environmentName,
@ -109,6 +103,7 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
isOpen: false, isOpen: false,
})); }));
config.onRollback?.(); config.onRollback?.();
reject();
}, },
onActivateDisabledStrategies: () => { onActivateDisabledStrategies: () => {
setEnableEnvironmentDialogState((prev) => ({ setEnableEnvironmentDialogState((prev) => ({
@ -116,27 +111,30 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
isOpen: false, isOpen: false,
})); }));
shouldActivateDisabledStrategies = true; shouldActivateDisabledStrategies = true;
next(); resolve();
}, },
onAddDefaultStrategy: () => { onAddDefaultStrategy: () => {
setEnableEnvironmentDialogState((prev) => ({ setEnableEnvironmentDialogState((prev) => ({
...prev, ...prev,
isOpen: false, isOpen: false,
})); }));
next(); resolve();
}, },
}); });
});
}; };
const addToChangeRequest: Middleware = (next) => { const addToChangeRequest = async () => {
if (!config.isChangeRequestEnabled) { if (!config.isChangeRequestEnabled) {
return next(); return;
} }
return new Promise<void>((_resolve, reject) => {
setChangeRequestDialogCallback(() => { setChangeRequestDialogCallback(() => {
setChangeRequestDialogCallback(undefined); setChangeRequestDialogCallback(undefined);
// always reset to previous state when using change requests // always reset to previous state when using change requests
config.onRollback?.(); config.onRollback?.();
reject();
}); });
onChangeRequestToggle( onChangeRequestToggle(
@ -145,11 +143,12 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
newState, newState,
shouldActivateDisabledStrategies, shouldActivateDisabledStrategies,
); );
});
}; };
const handleToggleEnvironmentOn: Middleware = async (next) => { const handleToggleEnvironmentOn = async () => {
if (newState !== true) { if (newState !== true) {
return next(); return;
} }
try { try {
@ -167,13 +166,12 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
config.onSuccess?.(); config.onSuccess?.();
} catch (error: unknown) { } catch (error: unknown) {
setToastApiError(formatUnknownError(error)); setToastApiError(formatUnknownError(error));
config.onRollback?.();
} }
}; };
const handleToggleEnvironmentOff: Middleware = async (next) => { const handleToggleEnvironmentOff = async () => {
if (newState !== false) { if (newState !== false) {
return next(); return;
} }
try { try {
@ -190,17 +188,16 @@ export const useFeatureToggleSwitch: UseFeatureToggleSwitchType = (
config.onSuccess?.(); config.onSuccess?.();
} catch (error: unknown) { } catch (error: unknown) {
setToastApiError(formatUnknownError(error)); setToastApiError(formatUnknownError(error));
config.onRollback?.();
} }
}; };
return composeAndRunMiddlewares([ try {
confirmProductionChanges, await confirmProductionChanges();
ensureActiveStrategies, await ensureActiveStrategies();
addToChangeRequest, await addToChangeRequest();
handleToggleEnvironmentOff, await handleToggleEnvironmentOff();
handleToggleEnvironmentOn, await handleToggleEnvironmentOn();
]); } catch {}
}, },
[setProdGuardModalState], [setProdGuardModalState],
); );