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,93 +51,104 @@ 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;
} }
setProdGuardModalState({ return new Promise<void>((resolve, reject) => {
open: true, setProdGuardModalState({
label: `${!newState ? 'Disable' : 'Enable'} Environment`, open: true,
loading: false, label: `${
onClose: () => { !newState ? 'Disable' : 'Enable'
setProdGuardModalState((prev) => ({ } Environment`,
...prev, loading: false,
open: false, onClose: () => {
})); setProdGuardModalState((prev) => ({
config.onRollback?.(); ...prev,
}, open: false,
onClick: () => { }));
setProdGuardModalState((prev) => ({ config.onRollback?.();
...prev, reject();
open: false, },
loading: true, onClick: () => {
})); setProdGuardModalState((prev) => ({
next(); ...prev,
}, open: false,
loading: true,
}));
resolve();
},
});
}); });
}; };
const ensureActiveStrategies: Middleware = (next) => { const ensureActiveStrategies = async () => {
if (!config.hasStrategies || config.hasEnabledStrategies) { if (!config.hasStrategies || config.hasEnabledStrategies) {
return next(); return;
} }
setEnableEnvironmentDialogState({ return new Promise<void>((resolve, reject) => {
isOpen: true, setEnableEnvironmentDialogState({
environment: config.environmentName, isOpen: true,
onClose: () => { environment: config.environmentName,
setEnableEnvironmentDialogState((prev) => ({ onClose: () => {
...prev, setEnableEnvironmentDialogState((prev) => ({
isOpen: false, ...prev,
})); isOpen: false,
config.onRollback?.(); }));
}, config.onRollback?.();
onActivateDisabledStrategies: () => { reject();
setEnableEnvironmentDialogState((prev) => ({ },
...prev, onActivateDisabledStrategies: () => {
isOpen: false, setEnableEnvironmentDialogState((prev) => ({
})); ...prev,
shouldActivateDisabledStrategies = true; isOpen: false,
next(); }));
}, shouldActivateDisabledStrategies = true;
onAddDefaultStrategy: () => { resolve();
setEnableEnvironmentDialogState((prev) => ({ },
...prev, onAddDefaultStrategy: () => {
isOpen: false, setEnableEnvironmentDialogState((prev) => ({
})); ...prev,
next(); isOpen: false,
}, }));
resolve();
},
});
}); });
}; };
const addToChangeRequest: Middleware = (next) => { const addToChangeRequest = async () => {
if (!config.isChangeRequestEnabled) { if (!config.isChangeRequestEnabled) {
return next(); return;
} }
setChangeRequestDialogCallback(() => { return new Promise<void>((_resolve, reject) => {
setChangeRequestDialogCallback(undefined); setChangeRequestDialogCallback(() => {
// always reset to previous state when using change requests setChangeRequestDialogCallback(undefined);
config.onRollback?.(); // always reset to previous state when using change requests
}); config.onRollback?.();
reject();
});
onChangeRequestToggle( onChangeRequestToggle(
config.featureId, config.featureId,
config.environmentName, config.environmentName,
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],
); );