From f544b69fa5052f9c7b5b58c772a421e2985f821e Mon Sep 17 00:00:00 2001 From: Marco Montalbano Date: Wed, 17 Jan 2024 10:06:09 +0100 Subject: [PATCH] feat: add delete promotion button --- packages/app/src/data/ruleBuilder/config.tsx | 56 +++++++++++-------- packages/app/src/hooks/useDeleteOverlay.tsx | 53 ++++++++++++++++++ .../app/src/pages/PromotionDetailsPage.tsx | 23 ++++++-- 3 files changed, 105 insertions(+), 27 deletions(-) create mode 100644 packages/app/src/hooks/useDeleteOverlay.tsx diff --git a/packages/app/src/data/ruleBuilder/config.tsx b/packages/app/src/data/ruleBuilder/config.tsx index fabf1fd..47ad0db 100644 --- a/packages/app/src/data/ruleBuilder/config.tsx +++ b/packages/app/src/data/ruleBuilder/config.tsx @@ -18,35 +18,45 @@ export function usePromotionRules(promotion: Promotion) { data: ReturnType }>({ isLoading: true, data: null }) useEffect(() => { - promotion.promotion_rules?.forEach((promotionRule) => { - const formLabels = toFormLabels(promotionRule) + if ( + promotion.promotion_rules == null || + promotion.promotion_rules.length === 0 + ) { + setOutput({ + isLoading: false, + data: null + }) + } else { + promotion.promotion_rules.forEach((promotionRule) => { + const formLabels = toFormLabels(promotionRule) - const data = - formLabels?.flatMap(async (formLabel) => { - if (formLabel.rel == null) { - return formLabel - } + const data = + formLabels?.flatMap(async (formLabel) => { + if (formLabel.rel == null) { + return formLabel + } - const promise = sdkClient[formLabel.rel] - .list({ - filters: { id_in: formLabel.value.split(',').join(',') } - }) - .then((data) => data.map((d) => d.name)) - .then((values) => ({ - ...formLabel, - value: values.join(',') - })) + const promise = sdkClient[formLabel.rel] + .list({ + filters: { id_in: formLabel.value.split(',').join(',') } + }) + .then((data) => data.map((d) => d.name)) + .then((values) => ({ + ...formLabel, + value: values.join(',') + })) - return await promise - }) ?? [] + return await promise + }) ?? [] - void Promise.all(data).then((data) => { - setOutput({ - isLoading: false, - data + void Promise.all(data).then((data) => { + setOutput({ + isLoading: false, + data + }) }) }) - }) + } }, [promotion]) return output diff --git a/packages/app/src/hooks/useDeleteOverlay.tsx b/packages/app/src/hooks/useDeleteOverlay.tsx new file mode 100644 index 0000000..f40a5f4 --- /dev/null +++ b/packages/app/src/hooks/useDeleteOverlay.tsx @@ -0,0 +1,53 @@ +import type { Promotion } from '#data/dictionaries/promotion' +import { appRoutes } from '#data/routes' +import { + Button, + PageHeading, + useCoreSdkProvider, + useOverlay +} from '@commercelayer/app-elements' +import { useLocation } from 'wouter' + +interface OverlayHook { + show: () => void + Overlay: React.FC<{ promotion: Promotion }> +} + +export function useDeleteOverlay(): OverlayHook { + const { Overlay: OverlayElement, open, close } = useOverlay() + const { sdkClient } = useCoreSdkProvider() + const [, setLocation] = useLocation() + + return { + show: open, + Overlay: ({ promotion }) => { + return ( + + { + close() + }, + label: 'Cancel', + icon: 'x' + }} + description='This action cannot be undone, proceed with caution.' + /> + + + + ) + } + } +} diff --git a/packages/app/src/pages/PromotionDetailsPage.tsx b/packages/app/src/pages/PromotionDetailsPage.tsx index 872fc3b..5e4a272 100644 --- a/packages/app/src/pages/PromotionDetailsPage.tsx +++ b/packages/app/src/pages/PromotionDetailsPage.tsx @@ -1,6 +1,7 @@ import type { Promotion } from '#data/dictionaries/promotion' import { appRoutes } from '#data/routes' -import { getCurrencyCodes, usePromotionRules } from '#data/ruleBuilder/config' +import { usePromotionRules } from '#data/ruleBuilder/config' +import { useDeleteOverlay } from '#hooks/useDeleteOverlay' import { usePromotion } from '#hooks/usePromotion' import { Badge, @@ -20,6 +21,7 @@ import { formatDateRange, formatDateWithPredicate, getPromotionDisplayStatus, + goBack, useCoreSdkProvider, useTokenProvider } from '@commercelayer/app-elements' @@ -38,7 +40,9 @@ function Page( const { promotion, isLoading } = usePromotion(props.params.promotionId) const { data: rules } = usePromotionRules(promotion) - console.log('available currency codes', getCurrencyCodes(promotion)) + const { show: showDeleteOverlay, Overlay: DeleteOverlay } = useDeleteOverlay() + + // console.log('available currency codes', getCurrencyCodes(promotion)) return ( , + { + showDeleteOverlay() + }} /> ]} /> @@ -67,13 +78,17 @@ function Page( mode={mode} gap='only-top' navigationButton={{ - label: 'All promotions', + label: 'Back', onClick() { - setLocation(appRoutes.list.makePath({})) + goBack({ + setLocation, + defaultRelativePath: appRoutes.home.makePath({}) + }) } }} > +