Skip to content

Commit

Permalink
refactor(promo-manager): hooks refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
vanilla-wave committed Sep 2, 2024
1 parent fb020ca commit 43b5dad
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 46 deletions.
18 changes: 0 additions & 18 deletions src/promo-manager/core/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ import type {
InitPromoManagerOptions,
Nullable,
ProgressInfoConfig,
Promo,
PromoBaseState as BaseState,
PromoGroup,
PromoGroupSlug,
PromoManagerStatus,
PromoOptions,
Expand Down Expand Up @@ -260,22 +258,6 @@ export class Controller {
return 'canRun';
};

getFirstAvailablePromoFromGroup = (slug: PromoGroupSlug): Nullable<PromoSlug> => {
const promoGroup = Object.values(this.options.config.promoGroups).find(
(currentPromoGroup: PromoGroup<unknown>) => currentPromoGroup.slug === slug,
);

if (!promoGroup) {
return null;
}

return (
promoGroup.promos.find(
(promo: Promo) => this.isAbleToRun(promo.slug) || this.isPending(promo.slug),
)?.slug ?? null
);
};

getActivePromo = (promoGroup?: PromoGroupSlug): Nullable<PromoSlug> => {
const activePromo = this.state.base.activePromo;

Expand Down
51 changes: 23 additions & 28 deletions src/promo-manager/core/getHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,40 @@ import type {Controller} from './controller';
import type {PromoGroupSlug, PromoSlug} from './types';

export function getHooks(controller: Controller) {
const usePromoManager = (promo: PromoSlug) => {
const usePromoManager = () => {
const activePromo = useSyncExternalStore(
controller.subscribe,
() => controller.state.base.activePromo,
);

return useMemo(
() => ({
activePromo,
requestStartPromo: controller.requestStart,
finisPromo: controller.finishPromo,
cancelPromo: controller.cancelPromo,
skipPromo: controller.skipPromo,
}),
[activePromo],
);
};

const usePromo = (promo: PromoSlug) => {
const status = useSyncExternalStore(controller.subscribe, () =>
controller.getPromoStatus(promo),
);

return useMemo(
() => ({
status,
requestStart: () => {
controller.requestStart(promo).catch((error) => {
controller.logger.error(error);
});
},
requestStart: () => controller.requestStart(promo),
finish: (closeActiveTimeout?: number) =>
controller.finishPromo(promo, closeActiveTimeout),
cancel: (closeActiveTimeout?: number) =>
controller.cancelPromo(promo, closeActiveTimeout),
skipPromo: () => controller.skipPromo(promo),
updateProgressInfo: () => controller.updateProgressInfo(promo),
skip: () => controller.skipPromo(promo),
}),
[promo, status],
[status],
);
};

Expand All @@ -49,27 +62,9 @@ export function getHooks(controller: Controller) {
);
};

const useAvailablePromo = (group: PromoGroupSlug) => {
const promo = useSyncExternalStore(controller.subscribe, () =>
controller.getFirstAvailablePromoFromGroup(group),
);

return useMemo(
() => ({
promo,
requestStart: () => controller.requestStart(promo),
finish: (closeActiveTimeout?: number) =>
controller.finishPromo(promo, closeActiveTimeout),
cancel: (closeActiveTimeout?: number) =>
controller.cancelPromo(promo, closeActiveTimeout),
}),
[promo],
);
};

return {
usePromoManager,
useAvailablePromo,
usePromo,
useActivePromo,
};
}

0 comments on commit 43b5dad

Please sign in to comment.