import {Action} from "../SelectActionPopupWindow"; import {atom, useAtom} from "jotai"; import {ComponentRuntimeDataWithParentType} from "../components"; import React from "react"; import {Note} from "../cards"; import {cloneDeep, set, unset, get} from "lodash"; import {produce} from "immer"; import {OfferData, TestablePartial, useNodesStore} from "../store"; import { atomsStore, PopupWindowState, PopupWindowStateContext, SelectActionContextOffers, SelectActionPopupWindowStateAtom, TreeContextData } from "../atoms"; import {useOpenTestablesPopupWindow} from "../useOpenTestablesPopupWindow"; import {getOffersPopupWindowContext} from "../../OffersBranch"; import {FALSE} from "sass"; import {generateIdForType} from "../NodeHelpers"; import {equals, TierType} from "../tiers"; import {AmountValidatorOptions} from "../cards/filterinterfaces"; import {QuantityMeta} from "../cards/Quantity"; import {ComponentMeta, ComponentsMeta, getComponentMeta, getComponentMetaData} from "../ComponentsMeta"; import {__, CouponsPlus} from "../../globals"; import {NonImplementedMessage} from "./NonImplementedMessage"; import {getOpenPopupsCount} from "../hooks"; import {getPopupStackDimensionCalculators} from "../ulitilies"; const SelectedOfferAtom = atom | null>(null) const SelectedOffersAtom = atom([]) atomsStore.set(SelectedOfferAtom, null) atomsStore.set(SelectedOffersAtom, []) function isEditMode(): boolean { const {context: {data}} = atomsStore.get(SelectActionPopupWindowStateAtom) as PopupWindowState // @ts-ignore return !!data?.offerId } const getDefaultOptionsForFirstTierSubchild = (meta: ComponentMeta): Record => { const tiertype = meta?.tierType || TierType.Numeric let options: Record = cloneDeep(getComponentMetaData(meta).defaultOptions) || {} if (meta?.tierDefaultOptions?.first) { options = meta.tierDefaultOptions.first() } else if (tiertype === TierType.Numeric) { // as a self-invoking anonymous function to create a new instance each time options = (() => ({ quantity: equals(1) }) as AmountValidatorOptions )() } return pickByPaths(options, meta.tierFields || []) } export const pickByPaths = (obj: any, pathsToInclude: string[]): any => { const result = {}; pathsToInclude.forEach(path => { const value = get(obj, path); if (value !== undefined) { set(result, path, value); } }); return result; } let testableisOpen = false const isNotImplemented = CouponsPlus.implementations.branches.tiered === false // @ts-ignore export const selectTierNew: Action = { id: 'select-tier', isNotImplemented, data: { name: __('Add Path/Tiered/Bulk Offers'), icon: }, reset: () => { atomsStore.set(SelectedOfferAtom, null) atomsStore.set(SelectedOffersAtom, []) }, // @ts-ignore screens: ({context: {targetBranchId}}) => [ { id: 2, // BECAUSE 1 IS THE MAIN SELECT ACTIONS SCREEN title: '', showBottomNavigation: () => !isNotImplemented, content: ({screenNavigation, close, width}) => { if (testableisOpen) { return } const openTestablesPopup = useOpenTestablesPopupWindow(); if (isNotImplemented) { return
} //const addBranchOffer = useNodesStore(store => store.addBranchOffer) // @ts-ignore const context = { id: 'tier-new', scope: 'tier-base', data: { supportedComponentTypes: ['filter', 'condition'], componentType: 'filter', targetType: 'testableComposite', // supportsOptionalQuantity: false, supportsMultipleComponents: false, targetId: targetBranchId, // string id if testableComposite, index if root (eg: 0 for the first root, 1 for the second root, etc.) mainWindow: { title: __('What will the tiers be based on?'), description: '', }, ...getPopupStackDimensionCalculators(getOpenPopupsCount()) } } as PopupWindowStateContext; testableisOpen = true // we need: component type: filter, condition, etc openTestablesPopup({ // @ts-ignore context, onClose: (data) => { const {addTreeNode} = useNodesStore.getState() const {status, components, componentType} = data const meta = getComponentMeta(`${componentType}s`, components?.[0]?.type) // code is repeated from select-offers, should ideally be refactored to remove duplication if (status === 'success' && components?.length > 0) { const baseTestableId = generateIdForType('testable'); addTreeNode( { parentBranchTestableId: baseTestableId, testable: { id: generateIdForType('testable.partial'), options: getDefaultOptionsForFirstTierSubchild(meta!) } as Omit>, 'id'>, branch: { id: generateIdForType('branch'), type: 'select-action', children: [] } }, { parentBranchId: targetBranchId, newTieredBranchData: { baseTestable: { ...components[0]!, testableType: componentType as 'filter' | 'condition' }, tierType: meta?.tierType || TierType.Numeric, } } ) close(status) } else { // failed, so go back to the previous screen // this usually happens when the user hit "back" or the "x" button on the popup screenNavigation.prev() } setTimeout(() => { testableisOpen = false }, 500) } }) return }, } ], }