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,
|
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],
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user