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