{"version":3,"file":"script/bundle-7.08ae3b47c7.js","mappings":"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","sources":["webpack://touchweb/./src/blueprint/theme/icons2/arrow-down.svg","webpack://touchweb/./src/apps/syi/services/config.ts","webpack://touchweb/./src/apps/syi/services/draft-service.ts","webpack://touchweb/./src/apps/syi/services/syi-ga4-service.ts","webpack://touchweb/./src/apps/syi/services/user-data.ts","webpack://touchweb/./src/apps/syi/state/actions/attributes-actions.js","webpack://touchweb/./src/apps/syi/state/actions/campaign-code-actions.ts","webpack://touchweb/./src/apps/syi/state/actions/charity-actions.js","webpack://touchweb/./src/apps/syi/state/actions/draft-actions.js","webpack://touchweb/./src/apps/syi/state/actions/fees-actions.js","webpack://touchweb/./src/apps/syi/state/actions/image-actions.ts","webpack://touchweb/./src/apps/syi/state/actions/long-description-actions.ts","webpack://touchweb/./src/apps/syi/state/actions/predictions-actions.ts","webpack://touchweb/./src/apps/syi/state/actions/price-actions.js","webpack://touchweb/./src/apps/syi/state/actions/shipping-actions.ts","webpack://touchweb/./src/apps/syi/services/shipping-provider-service.ts","webpack://touchweb/./src/apps/syi/state/constants.ts","webpack://touchweb/./src/apps/syi/state/drafts-api.ts","webpack://touchweb/./src/apps/syi/state/reducers/attributes.ts","webpack://touchweb/./src/apps/syi/state/reducers/buyer-region.ts","webpack://touchweb/./src/apps/syi/state/reducers/charity.ts","webpack://touchweb/./src/apps/syi/state/reducers/draft.ts","webpack://touchweb/./src/apps/syi/state/reducers/edit.ts","webpack://touchweb/./src/apps/syi/state/reducers/images.ts","webpack://touchweb/./src/apps/syi/state/reducers/item-duration.ts","webpack://touchweb/./src/apps/syi/state/reducers/long-description.ts","webpack://touchweb/./src/apps/syi/state/reducers/member-consent.ts","webpack://touchweb/./src/apps/syi/state/reducers/predictions-reducer.ts","webpack://touchweb/./src/apps/syi/state/reducers/shipping/shipping-reducer.ts","webpack://touchweb/./src/apps/syi/state/reducers/short-description.ts","webpack://touchweb/./src/apps/syi/state/reducers/syi.ts","webpack://touchweb/./src/apps/syi/state/reducers/template.ts","webpack://touchweb/./src/apps/syi/state/selectors/draft-selectors.ts","webpack://touchweb/./src/apps/syi/state/selectors/image-selectors.ts","webpack://touchweb/./src/apps/syi/state/selectors/predictions-selectors.ts","webpack://touchweb/./src/apps/syi/state/selectors/price-selectors.ts","webpack://touchweb/./src/apps/syi/state/selectors/syi.ts","webpack://touchweb/./src/apps/syi/state/templates-api.ts","webpack://touchweb/./src/apps/tradera/components/vip/bidding/bid-details.tsx","webpack://touchweb/./src/components/atoms/space/space.tsx","webpack://touchweb/./src/components/divider/divider.tsx","webpack://touchweb/./src/components/shipping/shipping-selector-dialog/tradera-package-measurements-api.ts","webpack://touchweb/./src/legacy/static/packages/analytics.ts","webpack://touchweb/./src/state/language/actions.js","webpack://touchweb/./src/state/push-notifications/constants.ts","webpack://touchweb/./src/state/services/fees-api.js","webpack://touchweb/./src/state/services/member-latest-published-listing-api.ts","webpack://touchweb/./src/state/shipping-region/api.js","webpack://touchweb/./src/state/views/view-item/constants.ts","webpack://touchweb/./src/state/views/view-item/item-state-helper.ts"],"sourcesContent":["function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport React from \"react\";\nexport default (({\n styles = {},\n ...props\n}) => /*#__PURE__*/React.createElement(\"svg\", _extends({\n viewBox: \"0 0 16 16\",\n xmlns: \"http://www.w3.org/2000/svg\"\n}, props), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8 9.2l4.9-5 1.4 1.4L8 12 1.7 5.6l1.4-1.4z\"\n})));","import { isServer } from 'tradera/utils/nextjs';\n\n// expect sellingGlobalConfig to exist on global window type\ndeclare global {\n interface Window {\n sellingGlobalConfig?: SellingJsConfig;\n }\n}\ntype SellingJsConfig = {\n draftImagesUrl: string;\n templateImagesUrl: string;\n myTraderaUrl: string;\n isVatRequired: boolean;\n selectableVatValues: number[];\n isHybridAppContext: boolean;\n isHybridAppWithHtmlUploadSupport: boolean;\n isHtmlEnabled: boolean;\n commissionMinimum: number;\n commissionCap: number;\n highlightFeaturePrice: number;\n rankUpFeaturePrice: number;\n isAddonsEnabled: boolean;\n isSyiAddPhotoNativeAppEnabled: boolean;\n isSyiMemberConsentEnabled: boolean;\n isSyiTenImagesEnabled: boolean;\n};\n\nconst config = {\n ...((!isServer && window.sellingGlobalConfig) || {\n draftImagesUrl: '',\n templateImagesUrl: '',\n myTraderaUrl: '',\n isVatRequired: false,\n selectableVatValues: [],\n isHybridAppContext: false,\n isHybridAppWithHtmlUploadSupport: false,\n isHtmlEnabled: false,\n commissionMinimum: 0,\n commissionCap: 0,\n highlightFeaturePrice: 0,\n rankUpFeaturePrice: 0,\n isAddonsEnabled: false,\n isSyiAddPhotoNativeAppEnabled: false,\n isSyiMemberConsentEnabled: false,\n isSyiTenImagesEnabled: false\n }),\n maxTemplates: 100,\n domainNameCategoryId: 344477\n};\n\nconfig.maxTemplates = 100;\nconfig.domainNameCategoryId = 344477;\n\nexport default config;\n","import { touchWebClient, webApiClient } from 'tradera/utils/http';\nimport featureToggles from 'tradera/apps/my-tradera/app/utils/feature-toggles';\nimport { isServer } from 'tradera/utils/nextjs';\nimport type {\n SaveDraftApiResponse,\n ItemDraft,\n CreateDraftFromTemplateApiResponse,\n CreateDraftFromTemplateApiRequest,\n GetDraftApiResponse,\n SaveDraftApiRequest,\n ItemDraftResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport type { SyiState } from 'tradera/apps/syi/state/reducer';\nimport { isNullOrUndefined } from 'tradera/utils/condition-check';\nimport qs from 'qs';\n\nconst defaultDrafts = isServer ? {} : window.sellingGlobalData?.defaultDrafts;\n\nconst resetUnwantedProperties = (draft: ItemDraft | null | undefined) => {\n return { ...draft, itemId: 0 };\n};\n\nconst getType = (draft: ItemDraft) => {\n const hasOpeningPrice = !isNullOrUndefined(draft.openingBid);\n const hasFixedPrice = !isNullOrUndefined(draft.fixedPrice);\n if (hasOpeningPrice && !hasFixedPrice) {\n return 'Auction';\n }\n\n if (hasOpeningPrice && hasFixedPrice) {\n return 'AuctionBin';\n }\n\n if (!hasOpeningPrice && hasFixedPrice) {\n return 'PureBin';\n }\n\n return 'Unknown';\n};\n\nconst ensureApplicationId = (draft: ItemDraft) => {\n return {\n ...draft,\n metadata: { ...draft.metadata, applicationId: 'SYI-Riot' }\n };\n};\n\nconst isPureBin = (draft: ItemDraft) => draft && getType(draft) === 'PureBin';\n\nconst isAuctionBin = (draft: ItemDraft) =>\n draft && getType(draft) === 'AuctionBin';\n\nconst getDefaultTemplateValue = (propertyName: K) =>\n defaultDrafts?.newTemplate?.[propertyName];\n\nexport const loadDraft = async (\n draftId: string,\n languageCodeIso2: string,\n countryCodeIso2: string\n) => {\n if (!draftId) {\n throw 'missing draftId';\n }\n\n const response = await webApiClient.get(\n `/selling/drafts/${draftId}?${qs.stringify({\n languageCodeIso2,\n countryCodeIso2\n })}`\n );\n\n return response.data.draft;\n};\n\nconst loadDefaultDraft = () => ({\n ...defaultDrafts.newItem,\n allowedBuyerRegion: undefined\n});\n\nconst loadDefaultTemplateDraft = () => ({\n ...defaultDrafts.newTemplate,\n allowedBuyerRegion: undefined\n});\n\nconst loadDraftFromTemplate = async (templateId: string) => {\n try {\n const response = await touchWebClient.post<\n CreateDraftFromTemplateApiResponse,\n CreateDraftFromTemplateApiRequest\n >('/selling/api/drafts/from-template', {\n templateId\n });\n const draft = response.data.draft;\n const draftWithoutItemId = resetUnwantedProperties(draft);\n return { ...draftWithoutItemId, draftReason: 'Template' };\n } catch {\n throw 'Could not load the draft from the template';\n }\n};\n\nconst saveDraft = async (draft: ItemDraft) => {\n if (draft.draftReason === 'Template') {\n // Drafts for Templates cannot be saved\n throw 'Cannot save Template draft';\n }\n\n const ensuredDraft = ensureApplicationId(draft);\n\n const response = await webApiClient.post<\n SaveDraftApiResponse,\n SaveDraftApiRequest\n >('/selling/drafts/', { draft: ensuredDraft });\n\n if (!response.data.draftId) {\n throw response.data;\n }\n\n return response.data;\n};\n\nconst resolveImages = (syiSlice: SyiState) => {\n const images = syiSlice.images.images\n .map((image) => {\n if (image.isListingImage) {\n return {\n draftImage: null,\n listingImage: {\n imageId: image.imageId,\n rotationDegrees: image.rotationDegrees,\n filename: image.filename,\n imageGroupId: image.imageGroupId,\n isUploadedBySystem: image.isUploadedBySystem\n },\n imageUrl: image.imageUrl\n };\n } else {\n return {\n draftImage: {\n imageId: image.imageId,\n rotationDegrees: image.rotationDegrees,\n isUploadedBySystem: image.isUploadedBySystem\n },\n listingImage: null,\n imageUrl: image.imageUrl\n };\n }\n })\n .filter(Boolean);\n return images;\n};\n\nexport const buildDraftFromState = (syiSlice: SyiState) => {\n const draft: ItemDraftResponse = {\n itemFeaturesNotOfferedToMember: false,\n draftId: syiSlice.draft.draftId,\n draftReason: syiSlice.draft.draftReason,\n memberId: syiSlice.draft.memberId || 0,\n itemId: syiSlice.draft.itemId || 0,\n restart: syiSlice.draft.restart || false,\n publishedPromoted: syiSlice.draft.publishedPromoted || false,\n publishedHighlighted: syiSlice.draft.publishedHighlighted || false,\n createdDate: syiSlice.draft.createdDate || '',\n lastModifiedDate: syiSlice.draft.lastModifiedDate || '',\n reference: syiSlice.draft.reference,\n additionalDescriptions: syiSlice.draft.additionalDescriptions, //TODO\n metadata: syiSlice.draft.metadata,\n templateId: syiSlice.draft.templateId\n ? syiSlice.draft.templateId\n : undefined,\n templateName: syiSlice.draft.templateName\n ? syiSlice.draft.templateName\n : undefined,\n shortDescription: syiSlice.shortDescription.shortDescription,\n longDescription: syiSlice.longDescription.longDescription,\n descriptionLanguageCodeIso2:\n syiSlice.shortDescription.descriptionLanguageCodeIso2,\n currency: syiSlice.draft.currency,\n resellPartner: syiSlice.draft.resellPartner,\n categoryId: syiSlice.category.draftCategoryId,\n categoryPath: syiSlice.category.draftCategoryPath,\n images: resolveImages(syiSlice),\n openingBid: syiSlice.price.openingBid,\n reservePrice: syiSlice.price.reservePrice,\n fixedPrice: syiSlice.price.isPureBinSelected\n ? syiSlice.price.fixedPrice\n : syiSlice.price.auctionBinPrice,\n vat: syiSlice.price.vat,\n durationDays: syiSlice.itemDuration.durationDays,\n customEndTime: syiSlice.itemDuration.customEndTime,\n shippingOptions: syiSlice.shipping.selectedShippingOptions,\n selectedShippingSize: syiSlice.shipping.selectedShippingSize,\n fromCountry: syiSlice.shipping.fromCountry,\n itemCondition: syiSlice.itemCondition.itemCondition,\n allowedBuyerRegion: syiSlice.buyerRegion?.selectedBuyerRegion,\n campaignCode: syiSlice.campaignCode.campaignCode,\n campaignCodeId: syiSlice.campaignCode.campaignCodeId,\n displayPromoted: syiSlice.extraFeatures.displayPromoted,\n displayHighlighted: syiSlice.extraFeatures.displayHighlighted,\n charityId: syiSlice.charityCampaign.charityId,\n charity:\n featureToggles.isPennybridgeCharitiesEnabled &&\n syiSlice.charity?.charityId\n ? syiSlice.charity\n : undefined,\n allowZeroDayAuctions:\n syiSlice.charityCampaign.allowZeroDayAuctions || false,\n version: syiSlice.draft.version || 0,\n attributeValues: {\n termAttributeValues: syiSlice.attributes.categoryAttributes.map(\n (attribute) => {\n const values = attribute.options.reduce((acc, option) => {\n if (option.isActive) {\n acc.push(option.value);\n }\n return acc;\n }, [] as string[]);\n return {\n id: attribute.id,\n backingField: attribute.backingField,\n userGenerated: true,\n values\n };\n }\n )\n }\n };\n\n return draft;\n};\n\nexport default {\n isPureBin,\n isAuctionBin,\n getDefaultTemplateValue,\n loadDefaultDraft,\n loadDefaultTemplateDraft,\n loadDraftFromTemplate,\n saveDraft\n};\n","import {\n GtmService,\n FlowId,\n type EventParams\n} from 'tradera/services/google-tagmanager/google-tagmanager-service';\n\ntype trackSYIFormProps = {\n eventName: SyiEventName;\n parameters?: Omit;\n};\n\ntype SyiEventName =\n | 'syi_start'\n | 'syi_form_start'\n | 'syi_title_input'\n | 'syi_shipped'\n | 'syi_image_input'\n | 'syi_description_input'\n | 'syi_category_input'\n | 'syi_attribute_input'\n | 'syi_price_input'\n | 'syi_pickup'\n | 'syi_confirmation'\n | 'syi_form_submit_success'\n | 'syi_form_submit_fail'\n | 'syi_photos_with_app'\n | 'syi_preview'\n | 'syi_listing_format'\n | 'syi_buy_now_price'\n | 'syi_ending_input'\n | 'syi_reserved_price'\n | 'syi_reference'\n | 'syi_donate'\n | 'syi_automatic_restart'\n | 'syi_image_drop'\n | 'magical_api_call'\n | 'syi_template_used';\n\nlet syiSessionId: string | null = null;\nlet hasTrackedFormStart = false;\n\nconst createSessionId = () => {\n const randomDigits = Math.random().toString().slice(2, 10);\n const timestamp = Date.now();\n return `${randomDigits}${timestamp}`;\n};\n\nexport const trackSyiForm = ({\n eventName,\n parameters = {}\n}: trackSYIFormProps) => {\n // eslint-disable-next-line better-mutation/no-mutation\n syiSessionId = syiSessionId || createSessionId();\n\n if (eventName !== 'syi_start' && !hasTrackedFormStart) {\n GtmService.trackGA4('syi_form_start', {\n flow_id: FlowId.SYI,\n form_name: 'syi_draft',\n syi_session_id: syiSessionId\n });\n\n // eslint-disable-next-line better-mutation/no-mutation\n hasTrackedFormStart = true;\n }\n\n GtmService.trackGA4(eventName, {\n ...parameters,\n flow_id: FlowId.SYI,\n syi_session_id: syiSessionId\n });\n};\n","import type {\n Charity,\n GetDefaultDraftApiResponse,\n MemberPaymentOption\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport { isServer } from 'tradera/utils/nextjs';\n\nexport type SellingJsData = {\n member: MemberData;\n charities: Charity[];\n isCompanyUser: boolean;\n isSwedishUser: boolean;\n defaultDrafts: GetDefaultDraftApiResponse;\n braintree: BraintreeData;\n initialBankIdForBinRequired: boolean;\n bankIdForBinRequired: boolean;\n maskedPersonalNumber: string;\n paymentOptions: MemberPaymentOption[];\n supportsVerification: boolean;\n birthdate: string;\n consent: ConsentData;\n selectedDescriptionLanguageCodeIso2: string;\n shippingFromCountryCodeIso2: string;\n combinedShippingDays: number;\n};\n\nexport type BraintreeData = {\n isBankAccountNumberProvided: boolean;\n maskedBankAccount: string;\n};\n\nexport type MemberData = {\n firstName: string;\n};\n\nexport type ConsentData = {\n hasTraderaPayConsent: boolean;\n isUnderLicense: boolean;\n needsConsentOfTraderaPayAgreement: string;\n signatoryVerificationRequired: boolean;\n};\n\n// extend window object with global data\ndeclare global {\n interface Window {\n sellingGlobalData: SellingJsData;\n }\n}\n\nexport default isServer ? undefined : window.sellingGlobalData;\n","import campaignCodeActions from './campaign-code-actions';\nimport { webApiClient } from 'tradera/utils/http';\nimport { selectCategoryAttributes } from '../selectors/attribute-selectors';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport ThrottledAction from 'tradera/apps/syi/utils/throttled-action';\nimport { logger } from 'packages/logger';\nimport { selectPreferredLanguage } from 'tradera/state/language/selectors';\nimport * as imageActions from './image-actions';\nimport {\n resetAttributes,\n resetImageAttributeSuggestions,\n setCategoryAttributeOption,\n setCategoryAttributes,\n setCategoryAttributesSuggestions,\n setDraftAttributes,\n setImageToColorSuggestions,\n updateCategoryAttributesOptionsStatuses,\n autoFillSuggestedAttributes\n} from '../reducers/attributes';\n\nconst throttleTimeout = 2000;\nconst suggestionsThrottle = new ThrottledAction(throttleTimeout, true);\nconst imageToColorsThrottle = new ThrottledAction(throttleTimeout, false);\n\nconst INPUT_TYPE_MAP = {\n Button: 'button',\n Color: 'color',\n Dropdown: 'dropdown'\n};\n\nconst COLOR_ATTRIBUTE_ID = 2;\n\nconst transformServerOption = (serverOption) => {\n return {\n value:\n typeof serverOption === 'string'\n ? serverOption\n : serverOption.value,\n sortOrder: serverOption.sortOrder,\n isActive: false,\n warningLabel: {\n title:\n serverOption.warningLabel !== undefined &&\n serverOption.warningLabel !== null\n ? serverOption.warningLabel.title\n : null,\n text:\n serverOption.warningLabel !== undefined &&\n serverOption.warningLabel !== null\n ? serverOption.warningLabel.text\n : null\n }\n };\n};\n\nconst transformServerAttribute = (attribute) => {\n return {\n id: attribute.id,\n title: attribute.displayName,\n description: attribute.description,\n sortOrder: attribute.sortOrder,\n backingField: attribute.backingField,\n options: attribute.possibleValues.map(transformServerOption),\n inputType: INPUT_TYPE_MAP[attribute.type],\n isMultiSelect: attribute.isMultiSelect,\n maxNumberOfValues: attribute.maxNumberOfValues,\n minNumberOfValues: attribute.minNumberOfValues,\n numberOfValuesSelected: 0,\n shouldTranslateValues: attribute.shouldTranslateValues,\n preserveOptionsOrder: attribute.preserveOptionsOrder\n };\n};\n\nexport const setAttributesFromDraft = (draft) => (dispatch) => {\n dispatch(setDraftAttributes(draft.attributeValues));\n};\n\nexport const reset = () => (dispatch) => {\n dispatch(resetAttributes());\n};\n\nexport const fetchForCategory = (categoryId) => async (dispatch, getState) => {\n dispatch(reset());\n\n if (!categoryId) {\n return;\n }\n\n try {\n const { languageCodeIso2 } = selectPreferredLanguage(getState());\n const response = await webApiClient.get(\n `/selling/attributes/?categoryId=${categoryId}&locale=${languageCodeIso2}`\n );\n dispatch(\n setCategoryAttributes(\n response.data.attributeDefinitions.map(transformServerAttribute)\n )\n );\n dispatch(updateCategoryAttributesOptionsStatuses());\n dispatch(campaignCodeActions.validateCampaignCode());\n dispatch(imageActions.fetchImageAttributeSuggestions());\n } catch (error) {\n dispatch(reset());\n throw error;\n }\n};\n\nexport const updateAttribute =\n (attributeId, optionValue, activate, onUpdated) => (dispatch, getState) => {\n const { maxNumberOfValues, numberOfValuesSelected, isMultiSelect } =\n selectCategoryAttributes(getState()).find(\n (a) => a.id === attributeId\n );\n\n if (\n activate &&\n isMultiSelect &&\n maxNumberOfValues === numberOfValuesSelected\n ) {\n return;\n }\n\n dispatch(\n setCategoryAttributeOption({\n attributeId,\n optionValue,\n activate\n })\n );\n dispatch(campaignCodeActions.validateCampaignCode());\n if (onUpdated) {\n onUpdated();\n }\n };\n\nexport const resetAttribute = (attributeId) => (dispatch) => {\n dispatch(\n setCategoryAttributeOption({\n attributeId,\n activate: false\n })\n );\n dispatch(campaignCodeActions.validateCampaignCode());\n};\n\nexport const throttledFetchCategoryAttributeSuggestions =\n (categoryId, shortDescription) => (dispatch) => {\n const action = () => {\n dispatch(\n fetchCategoryAttributeSuggestions(categoryId, shortDescription)\n );\n };\n suggestionsThrottle.execute(action);\n };\n\nexport const throttledFetchImageAttributeSuggestions =\n (draftImageIds) => (dispatch, getState) => {\n const featureSwitches = getState().environment.featureSwitches;\n const draftCategoryId =\n getSyiSlice(getState())?.category?.draftCategoryId;\n const categoryAttributes =\n getSyiSlice(getState())?.attributes?.categoryAttributes;\n const hasColorAttribute =\n categoryAttributes &&\n categoryAttributes.some(\n (attribute) => attribute.backingField === 'color'\n );\n\n if (\n !featureSwitches['syi-image-attribute-suggestions'] ||\n !draftImageIds ||\n draftImageIds.length === 0 ||\n !draftCategoryId ||\n draftCategoryId === 0 ||\n !hasColorAttribute\n ) {\n return;\n }\n const action = () => {\n dispatch(fetchImageAttributeSuggestions(draftImageIds));\n };\n imageToColorsThrottle.execute(action);\n };\n\nconst fetchImageAttributeSuggestions = (draftImageIds) => async (dispatch) => {\n dispatch(resetImageAttributeSuggestions());\n\n const paramKeyPart = 'imageIds=';\n const query = paramKeyPart + draftImageIds.join(`&${paramKeyPart}`);\n\n try {\n const response = await webApiClient.get(\n `/selling/image-colors?${query}`\n );\n\n const colors = response.data?.colorValues?.map((cv) => cv.color) || [];\n\n dispatch(\n setImageToColorSuggestions({\n suggestedAttributes: [\n {\n id: COLOR_ATTRIBUTE_ID,\n name: 'color',\n values: colors\n }\n ]\n })\n );\n } catch (error) {\n logger(error);\n }\n};\n\nexport const fetchCategoryAttributeSuggestions =\n (categoryId, shortDescription) => async (dispatch, getState) => {\n const featureSwitches = getState().environment.featureSwitches;\n if (!featureSwitches['syi-attribute-suggestions']) {\n return;\n }\n\n if (!categoryId || !shortDescription) {\n return;\n }\n\n const splitTestGroup =\n getState().environment.splitTestGroups[\n 'attribute_suggestion_extractor'\n ];\n if (!splitTestEnabled(splitTestGroup)) {\n return;\n }\n const extractorType = getAttributeSuggestionExtractor(splitTestGroup);\n\n try {\n const params = {\n categoryId,\n shortDescription,\n extractorType\n };\n const response = await webApiClient.post(\n '/selling/suggest/attributes',\n params\n );\n\n dispatch(\n setCategoryAttributesSuggestions({\n suggestedAttributes:\n response.data.attributeValues.termAttributeValues.map(\n transformServerAttributeSuggestion\n ),\n suggestionsExtractorType: response.data.extractorType\n })\n );\n dispatch(autoFillSuggestedAttributes());\n } catch (error) {\n dispatch({\n type: 'RESET_ATTRIBUTES'\n });\n throw error;\n }\n };\n\nconst splitTestEnabled = (splitTest) => splitTest !== 'control';\n\nconst getAttributeSuggestionExtractor = (splitTest) => {\n switch (splitTest) {\n case 'code':\n return 0;\n case 'tradera':\n return 1;\n case 'google':\n return 2;\n default:\n return 0;\n }\n};\n\nconst transformServerAttributeSuggestion = (attributeSuggestion) => {\n return {\n id: attributeSuggestion.id,\n name: attributeSuggestion.name,\n values: attributeSuggestion.values\n };\n};\n","/* eslint-disable promise/always-return */\n/* eslint-disable promise/catch-or-return */\nimport campaignService from 'tradera/apps/syi/services/campaign-service';\nimport ThrottledAction from 'tradera/apps/syi/utils/throttled-action';\nimport userData from 'tradera/apps/syi/services/user-data';\nimport { setDisplayPromoted, setDisplayHighlighted } from './draft-actions';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { AppDispatch, GetState } from 'tradera/state/configure-store';\nimport {\n disableZeroDayAuctions,\n enableRestart,\n enableZeroDayAuctions\n} from '../reducers/item-duration';\nimport { resetSelectedShippingOptions } from 'tradera/apps/syi/state/reducers/shipping/shipping-reducer';\nimport {\n initializeCampaignCodeState,\n resetCampaignBanner,\n resetFees,\n searchingForCampaignCodeIsDelayed,\n setCampaignValidationResult,\n setUnverifiedCampaignCode,\n toggleCampaignCodeCheckbox,\n validatingCampaignCodeBySearching\n} from 'tradera/apps/syi/state/reducers/campaign-code';\nimport type { Charity } from 'tradera/state/services/types/webapi-selling-generated';\nimport { disableRestart } from 'tradera/apps/syi/state/reducers/draft';\nimport {\n resetCharityCampaign as resetCharityCampaignReducer,\n setCharityCampaign\n} from 'tradera/apps/syi/state/reducers/charity-campaign';\n\nconst CHARITIES = userData?.charities || [];\nconst throttleTimeout = 2000;\nconst throttledCampaignCodeValidation = new ThrottledAction(throttleTimeout);\nlet delayedValidationTimeoutId: ReturnType | undefined =\n undefined;\n\nconst findBrandAttributeValues = (getState: GetState) => {\n if (\n !getSyiSlice(getState()).attributes ||\n !getSyiSlice(getState()).attributes.categoryAttributes\n ) {\n return [];\n }\n\n const brandAttribute = getSyiSlice(\n getState()\n ).attributes.categoryAttributes.find((attribute) => {\n const brandAttributeId = 3; //Brand Attribute has Id == 3\n if (attribute.id != brandAttributeId) {\n return false;\n }\n if (attribute.options.length === 0) {\n return false;\n }\n return true;\n });\n\n const brandAttributeValues = brandAttribute?.options\n .filter((option) => option.isActive)\n .map((option) => option.value);\n return brandAttributeValues ?? [];\n};\n\nconst resetCharityCampaign = (dispatch: AppDispatch, getState: GetState) => {\n const { name, forceFreeShipping: wasForceFreeShipping } =\n getSyiSlice(getState()).charityCampaign;\n if (!name) {\n return;\n }\n dispatch(resetCharityCampaignReducer());\n dispatch(disableZeroDayAuctions());\n if (wasForceFreeShipping) {\n dispatch(resetSelectedShippingOptions());\n }\n};\n\nconst resetCampaign = (dispatch: AppDispatch) => {\n dispatch(resetCharityCampaign);\n dispatch({\n type: 'UNSET_UNSOLD_FEE_FREE_FOR_CAMPAIGN'\n });\n dispatch(enableRestart());\n dispatch(resetFees());\n dispatch(resetCampaignBanner());\n};\n\nconst applyCharityFromCampaignCodeId =\n (campaignCodeId: number, campaignCode: string) =>\n (dispatch: AppDispatch) => {\n const charityCampaign = CHARITIES.find(\n (charityCampaign: Charity) =>\n charityCampaign.campaignCodeId === campaignCodeId\n );\n\n if (!charityCampaign) {\n dispatch(resetCharityCampaign);\n return;\n }\n\n dispatch(setCharityCampaign({ charityCampaign, campaignCode }));\n const { allowZeroDayAuctions, forceFreeShipping } = charityCampaign;\n\n if (allowZeroDayAuctions) {\n dispatch(enableZeroDayAuctions());\n }\n\n if (forceFreeShipping) {\n dispatch({\n type: 'FORCE_FREE_SHIPPING'\n });\n }\n\n dispatch(setDisplayPromoted(false));\n dispatch(setDisplayHighlighted(false));\n };\n\nconst validateCampaignCode =\n () => (dispatch: AppDispatch, getState: GetState) => {\n const campaignCode = getSyiSlice(getState()).campaignCode.campaignCode;\n if (!campaignCode || campaignCode.trim().length === 0) {\n return;\n }\n dispatch(validatingCampaignCodeBySearching());\n const isReadOnly = getSyiSlice(getState()).campaignCode.isReadOnly;\n throttledCampaignCodeValidation.execute(function () {\n const category = getSyiSlice(getState()).category;\n const brandAttributeValues = findBrandAttributeValues(getState);\n campaignService\n .validate(\n campaignCode,\n category.draftCategoryId.toString(),\n brandAttributeValues\n )\n .then((result) => {\n const {\n bannerDesktopImageUrl,\n bannerMobileImageUrl,\n bannerTabletImageUrl,\n campaignCodeId,\n hasEnded,\n isUnsoldFeeFree,\n maxFeeCap,\n provisionFactor = null,\n validationDisplayMessage\n } = result;\n\n // If the campaign is read-only, ignore if the code is invalid since it has already been used.\n const campaignCodeValid = isReadOnly\n ? true\n : result.campaignCodeValid;\n const campaignCodeMessage = isReadOnly\n ? null\n : result.campaignCodeMessage;\n\n const campaignCodeDescription = campaignCodeValid\n ? campaignCodeMessage\n : validationDisplayMessage;\n\n const commissionPercent =\n provisionFactor !== null\n ? `${provisionFactor * 100}`\n : null;\n\n dispatch(\n setCampaignValidationResult({\n bannerDesktopImageUrl,\n bannerMobileImageUrl,\n bannerTabletImageUrl,\n campaignCode,\n campaignCodeDescription,\n campaignCodeId,\n campaignCodeValid,\n hasEnded,\n maxFeeCap,\n commissionPercent\n })\n );\n\n if (!campaignCodeValid) {\n dispatch(resetCampaign);\n return;\n }\n\n if (isUnsoldFeeFree) {\n dispatch({\n type: 'SET_UNSOLD_FEE_FREE_FOR_CAMPAIGN'\n });\n }\n\n dispatch(disableRestart());\n\n if (campaignCodeId) {\n dispatch(\n applyCharityFromCampaignCodeId(\n campaignCodeId,\n campaignCode\n )\n );\n }\n });\n });\n };\n\nconst saveTypedCampaignCode =\n (inputCampaignCode: string) =>\n (dispatch: AppDispatch, getState: GetState) => {\n const campaignCode = inputCampaignCode?.trim() || null;\n dispatch(setUnverifiedCampaignCode(campaignCode));\n\n if (delayedValidationTimeoutId) {\n clearTimeout(delayedValidationTimeoutId);\n }\n\n if (campaignCode === null) {\n dispatch(resetCampaign);\n return;\n }\n\n /* eslint-disable-next-line better-mutation/no-mutation */\n delayedValidationTimeoutId = setTimeout(() => {\n if (delayedValidationTimeoutId) {\n clearTimeout(delayedValidationTimeoutId);\n }\n dispatch(validateCampaignCode());\n /* eslint-disable-next-line better-mutation/no-mutation */\n delayedValidationTimeoutId = setTimeout(() => {\n if (getSyiSlice(getState()).campaignCode.searching) {\n dispatch(searchingForCampaignCodeIsDelayed());\n }\n }, 100);\n }, 700);\n };\n\nconst setInitialCampaignCode =\n (\n campaignCode: string | null,\n campaignCodeId?: number,\n campaignCodeDescription?: string,\n isChangeItem?: boolean\n ) =>\n (dispatch: AppDispatch) => {\n const isReadOnly = !!campaignCodeId && !!isChangeItem;\n\n dispatch(\n initializeCampaignCodeState({\n campaignCode,\n campaignCodeId,\n campaignCodeDescription,\n isReadOnly\n })\n );\n dispatch(resetCampaign);\n\n // Always validate because this fetches info about the campaign like free shipping etc.\n // If the campaign is read-only, ignore if the code is invalid since it has already been used.\n dispatch(validateCampaignCode());\n };\n\nconst toggleShowInput = (isChecked: boolean) => (dispatch: AppDispatch) => {\n if (delayedValidationTimeoutId) {\n clearTimeout(delayedValidationTimeoutId);\n }\n dispatch(toggleCampaignCodeCheckbox(isChecked));\n dispatch(resetCampaign);\n};\n\nexport default {\n toggleShowInput,\n setInitialCampaignCode,\n saveTypedCampaignCode,\n validateCampaignCode\n};\n","import { axiosConfigs } from 'tradera/utils/api';\nimport { marketingApiClient } from 'tradera/utils/http';\nimport {\n resetCharity,\n setCharityShippingInfo,\n setCharityId,\n setCharityFromDraft,\n setCharityInfo\n} from 'tradera/apps/syi/state/reducers/charity';\nimport { logger } from 'packages/logger';\nimport { resetSelectedShippingOptions } from 'tradera/apps/syi/state/reducers/shipping/shipping-reducer';\n\nexport const setCharityFromDraftAndFetchInfo =\n (charityFromDraft) => (dispatch) => {\n dispatch(setCharityFromDraft(charityFromDraft));\n dispatch(setCharityAndFetchInfo(charityFromDraft.charityId));\n };\n\nexport const resetCharityAndShippingInfo = () => setCharityAndFetchInfo(null);\n\nexport const setCharityAndFetchInfo = (charityId) => (dispatch) => {\n dispatch(resetSelectedShippingOptions());\n dispatch(resetCharity());\n dispatch(setCharityId({ charityId }));\n dispatch(fetchCharityInfo(charityId));\n dispatch(fetchCharityShippingInfo(charityId));\n};\n\nconst fetchCharityInfo = (charityId) => async (dispatch) => {\n if (!charityId) {\n return;\n }\n try {\n const response = await getCharity(charityId);\n dispatch(setCharityInfo(response.data));\n } catch (error) {\n if (error?.response?.status !== 404) {\n logger(error);\n }\n }\n};\n\nconst fetchCharityShippingInfo = (charityId) => async (dispatch, getState) => {\n if (!charityId) {\n return;\n }\n try {\n const response = await getCharityShippingInfo(charityId);\n\n const isFreeShippingPaidByProviderEnabled =\n getState().environment.featureSwitches[\n 'free-shipping-paid-by-provider'\n ];\n\n if (isFreeShippingPaidByProviderEnabled) {\n dispatch(setCharityShippingInfo(response.data));\n if (response.data.freeShippingPaidByProviderName) {\n dispatch({\n type: 'FREE_SHIPPING_PAID_BY_PROVIDER',\n payload: {\n providerName:\n response.data.freeShippingPaidByProviderName\n }\n });\n }\n }\n if (response.data.forceFreeShipping) {\n dispatch({\n type: 'FORCE_FREE_SHIPPING'\n });\n }\n } catch (error) {\n if (error?.response?.status !== 404) {\n logger(error);\n }\n }\n};\n\nconst getCharityShippingInfo = (charityId) =>\n marketingApiClient.get(`/charity-shipping-info?charityId=${charityId}`, {\n ...axiosConfigs.notAuthenticated,\n cancelTokenId: 'getCharityShippingInfo'\n });\n\nconst getCharity = (charityId) =>\n marketingApiClient.get(`/syi/charity-details?charityId=${charityId}`, {\n ...axiosConfigs.notAuthenticated,\n cancelTokenId: 'getCharity'\n });\n","/* eslint-disable promise/always-return */\nimport publishService from 'tradera/apps/syi/services/publish-service';\nimport navigationService from 'tradera/apps/syi/services/navigation-service';\nimport draftService, {\n buildDraftFromState,\n loadDraft as loadDraftFromServer\n} from 'tradera/apps/syi/services/draft-service';\nimport categoryActions from './category-actions';\nimport * as imageActions from './image-actions';\nimport priceActions from './price-actions';\nimport { shortDescriptionActions } from './short-description-actions';\nimport { setDescriptionLanguageCodeIso2 } from 'tradera/apps/syi/state/reducers/short-description';\nimport { setLongDescriptionFromDraft } from './long-description-actions';\nimport { getAndSetShippingOptionsByWeight } from './shipping-actions';\nimport {\n resetSelectedShippingOptions,\n setSelectedShippingSize,\n setShippingFromCountry\n} from '../reducers/shipping/shipping-reducer';\nimport campaignCodeActions from './campaign-code-actions';\nimport {\n resetCharityAndShippingInfo,\n setCharityAndFetchInfo,\n setCharityFromDraftAndFetchInfo\n} from 'tradera/apps/syi/state/actions/charity-actions';\nimport feesActions from './fees-actions';\nimport { setAttributesFromDraft } from './attributes-actions';\nimport scribe from 'tradera/apps/syi/services/scribe';\nimport {\n setAllowedBuyerRegion,\n setAvailableAllowedBuyerRegions\n} from '../reducers/buyer-region';\nimport { resetImageAttributeSuggestions } from '../reducers/attributes';\nimport { handleServerValidationError } from './helpers/server-validation-error-helper';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport {\n selectCategorySuggestedAttributes,\n selectImageToColorSuggestedAttributes\n} from 'tradera/apps/syi/state/selectors/attribute-selectors';\nimport {\n selectRecommendedWeight,\n selectShippingRecommendations\n} from 'tradera/apps/syi/state/selectors/shipping-selectors';\nimport { selectFeatureSwitches } from 'tradera/state/environment/selectors';\nimport {\n trackAttributeSuggestions,\n trackShippingRecommendations\n} from './draft-tracking';\nimport { logger } from 'packages/logger';\nimport dayjs from 'dayjs';\nimport {\n getDefaultSelectedDescriptionLanguageCodeIso2,\n getDefaultShippingFromCountryCodeIso2\n} from 'tradera/apps/my-tradera/app/components/settings/selling/item-localization';\nimport userData from 'tradera/apps/syi/services/user-data';\nimport initData from 'init-data';\nimport { Tags, util } from '../drafts-api';\nimport {\n setCustomEndTime,\n setDurationDays,\n getCustomEndTimeForWeekdays\n} from '../reducers/item-duration';\nimport { GtmService as gtm } from 'tradera/services/google-tagmanager/google-tagmanager-service';\nimport {\n disableAutoSave,\n enableAutoSave,\n hideAllErrors,\n resetSyi,\n setDraftCanBeResumed,\n setIsDraftSaved,\n setIsEditOfPublishedItem,\n setPublishFailed,\n setPublishPending\n} from '../reducers/syi';\nimport { selectShippingRegionCountryCodeIso2 } from 'tradera/state/shipping-region/selectors';\nimport {\n addAdditionalDescription,\n setCurrency,\n setDraftId,\n setDraftIsLoading,\n setDraftProperties,\n setDraftReason,\n setDraftVersion,\n setMagicalSyiEnabled,\n ensureDraftReason,\n setResellPartner\n} from 'tradera/apps/syi/state/reducers/draft';\nimport { memberApi } from 'tradera/state/services/member-api';\nimport { trackSyiForm } from 'tradera/apps/syi/services/syi-ga4-service';\nimport {\n selectIsItemConditionDirty,\n selectItemCondition\n} from 'tradera/apps/syi/state/selectors/item-condition-selectors';\nimport { setHasUsedAutoFill } from 'tradera/apps/syi/state/reducers/predictions-reducer';\nimport { logError } from 'tradera/utils/api';\nimport { selectPreferredLanguageCode } from 'tradera/state/language/selectors';\n\nconst trackAddonBeforePublish = function (addOnfeatureName) {\n gtm.trackAction('Listing AddOns', addOnfeatureName, 'Before Publish');\n};\n\nexport const setDraft =\n (draft, params = {}) =>\n (dispatch, getState) => {\n const memberCountryCodeIso2 =\n selectShippingRegionCountryCodeIso2(getState());\n\n const fromCountry =\n draft.fromCountry ||\n userData.shippingFromCountryCodeIso2 ||\n getDefaultShippingFromCountryCodeIso2(memberCountryCodeIso2);\n\n dispatch(setShippingFromCountry({ fromCountry }));\n\n dispatch(disableAutoSave());\n dispatch(ensureDraftReason(draft));\n\n const isNewDraft =\n getSyiSlice(getState()).draft.draftId != draft.draftId ||\n getSyiSlice(getState()).draft.draftReason != draft.draftReason;\n const isChangeItem = draft.draftReason === 'ChangeItem';\n\n // Do first for actions that depends on this info.\n dispatch(setIsEditOfPublishedItem(isChangeItem));\n dispatch(hideAllErrors());\n\n dispatch(setDraftProperties(draft));\n\n dispatch(\n setAllowedBuyerRegion({\n allowedBuyerRegion: draft.allowedBuyerRegion\n })\n );\n dispatch(setAvailableAllowedBuyerRegions());\n // fallback to null to not become dirty if undefined\n dispatch(setItemConditionFromUser(draft.itemCondition ?? null));\n dispatch(\n campaignCodeActions.setInitialCampaignCode(\n draft.campaignCode,\n draft.campaignCodeId,\n draft.campaignCodeDescription,\n isChangeItem\n )\n );\n\n // Setting short description also loads top categories!\n dispatch(\n shortDescriptionActions.setShortDescription(draft.shortDescription)\n );\n dispatch(\n setDescriptionLanguageCodeIso2(\n draft.descriptionLanguageCodeIso2 ||\n userData.selectedDescriptionLanguageCodeIso2 ||\n getDefaultSelectedDescriptionLanguageCodeIso2(\n initData.languageCodeIso2,\n memberCountryCodeIso2\n )\n )\n );\n dispatch(setCurrency(draft.currency));\n dispatch(setResellPartner(draft.resellPartner));\n dispatch(\n categoryActions.setDraftCategory(\n draft.categoryId,\n draft.categoryPath\n )\n );\n\n dispatch(\n setDurationDays({ durationDays: draft.durationDays, isChangeItem })\n );\n\n /*\n * If the draft has a custom end time, use it.\n * If the draft is a new item and not from a template, use the custom end time for weekdays.\n * Otherwise, use undefined (do not set custom end time).\n */\n const customEndTime = draft.customEndTime\n ? draft.customEndTime\n : draft.draftReason === 'NewItem' && !draft.templateId\n ? getCustomEndTimeForWeekdays(draft.durationDays)\n : undefined;\n\n dispatch(\n setCustomEndTime({\n customEndTime: customEndTime,\n isChangeItem\n })\n );\n dispatch(setLongDescriptionFromDraft(draft.longDescription));\n dispatch(setDisplayPromoted(draft.displayPromoted));\n dispatch(setDisplayHighlighted(draft.displayHighlighted));\n dispatch(imageActions.setDraftImages(draft.images || []));\n dispatch(resetImageAttributeSuggestions());\n dispatch(\n priceActions.setFromDraft(\n draft.openingBid,\n draft.fixedPrice,\n draft.reservePrice,\n draft.charity?.charityId,\n draft.vat,\n isChangeItem\n )\n );\n\n const pennybridgeCharitiesEnabled =\n selectFeatureSwitches(getState())['pennybridge-charities'];\n\n if (pennybridgeCharitiesEnabled) {\n if (params.charityId) {\n dispatch(setCharityAndFetchInfo(params.charityId));\n } else if (draft.charity) {\n dispatch(setCharityFromDraftAndFetchInfo(draft.charity));\n }\n }\n dispatch(setAttributesFromDraft(draft));\n\n dispatch(getAndSetShippingOptionsByWeight(draft.shippingOptions));\n dispatch(setSelectedShippingSize(draft.selectedShippingSize));\n\n dispatch(enableAutoSave());\n\n dispatch(memberApi.endpoints.getMagicalSyiEnabled.initiate())\n .then((result) => {\n if (result.data) {\n dispatch(setMagicalSyiEnabled(result.data.enabled));\n }\n })\n .catch(() => {\n // Do nothing\n });\n\n if (isNewDraft) {\n scribe.sendSessionStart();\n }\n };\n\nconst loadDraft = (dispatch, draftId, languageCodeIso2, countryCodeIso2) => {\n dispatch(setDraftIsLoading(true));\n return loadDraftFromServer(draftId, languageCodeIso2, countryCodeIso2)\n .then((result) => {\n dispatch(setDraft(result));\n dispatch(setIsDraftSaved(true));\n return result;\n })\n .catch((result) => {\n navigationService.goToStart();\n throw result;\n })\n .finally(() => dispatch(setDraftIsLoading(false)));\n};\n\nexport const loadImagesFromDraft = (draftId) => async (dispatch, getState) => {\n const browserDraftImageUrls = (getSyiSlice(getState()).images.images || [])\n .map((image) => image.imageUrl)\n .filter(Boolean);\n\n const serverDraft = await loadDraftFromServer(draftId);\n const serverDraftImages = serverDraft.images || [];\n const serverDraftImageUrls = serverDraftImages.map(\n (image) => image.imageUrl\n );\n\n const changedImages = browserDraftImageUrls\n .filter((x) => !serverDraftImageUrls.includes(x))\n .concat(\n serverDraftImageUrls.filter(\n (x) => !browserDraftImageUrls.includes(x)\n )\n );\n const imagesHaveChanged = changedImages.length > 0;\n if (imagesHaveChanged) {\n dispatch(imageActions.setDraftImages(serverDraftImages));\n }\n return imagesHaveChanged;\n};\n\n// KATS: this should perhaps be moved to the draft service on BE - do not save a draft if it's not\n// complete. Then we could check in FE if the save action succeeded, and if it did then we know that it can be resumed.\nexport const canBeResumed = (\n draftId,\n draftReason,\n shortDescription,\n longDescription,\n images\n) => {\n if (!draftId) {\n return false;\n }\n\n if (draftReason !== 'NewItem') {\n return false;\n }\n\n var hasShortDescription =\n shortDescription && shortDescription.trim().length > 0;\n var hasLongDescription =\n longDescription && longDescription.trim().length > 0;\n var hasImage =\n Array.isArray(images) && images.some((image) => !!image.imageUrl);\n return hasShortDescription || hasLongDescription || hasImage;\n};\n\nexport const updateDraftCanBeResumed = () => (dispatch, getState) => {\n const draft = getSyiSlice(getState()).draft;\n const shortDescription =\n getSyiSlice(getState()).shortDescription.shortDescription;\n const longDescription =\n getSyiSlice(getState()).longDescription.longDescription;\n const images = getSyiSlice(getState()).images.images;\n\n // TODO: avoid duplication by using canBeResumed\n if (!draft.draftId) {\n return false;\n }\n\n if (draft.draftReason !== 'NewItem') {\n return false;\n }\n\n var hasShortDescription =\n shortDescription && shortDescription.trim().length > 0;\n var hasLongDescription =\n longDescription && longDescription.trim().length > 0;\n var hasImage = Array.isArray(images) && images.length > 0;\n const canBeResumed = hasShortDescription || hasLongDescription || hasImage;\n\n dispatch(setDraftCanBeResumed(canBeResumed));\n};\n\nexport const setDisplayPromoted = (displayPromoted) => (dispatch) => {\n dispatch({\n type: 'SET_DISPLAY_PROMOTED',\n payload: displayPromoted || false\n });\n dispatch(feesActions.updatePrices());\n};\n\nexport const setDisplayHighlighted = (displayHighlighted) => (dispatch) => {\n dispatch({\n type: 'SET_DISPLAY_HIGHLIGHTED',\n payload: displayHighlighted || false\n });\n dispatch(feesActions.updatePrices());\n};\n\nexport const publish = (t, doneCallback) => (dispatch, getState) => {\n dispatch(setPublishPending());\n\n const state = getSyiSlice(getState());\n const { displayHighlighted, displayPromoted } = state.extraFeatures;\n const reservePrice = state.price.reservePrice;\n const draft = buildDraftFromState(state);\n var splitTestGroups = getState().environment.splitTestGroups;\n var featureSwitches = getState().environment.featureSwitches;\n const customEndTime = state.itemDuration.customEndTime;\n\n if (draft.draftReason === 'NewItem') {\n gtm.trackAction(\n 'SYI',\n 'Creation time in seconds',\n String(dayjs().diff(dayjs(state.syi.creationStart), 'second'))\n );\n }\n\n publishService\n .publish(draft, state.memberConsent.hasTraderaPayConsent)\n .then((result) => {\n if (displayHighlighted) {\n trackAddonBeforePublish('Highlight');\n }\n if (displayPromoted) {\n trackAddonBeforePublish('Rank up');\n }\n if (reservePrice) {\n trackAddonBeforePublish('Reserve price');\n }\n if (customEndTime) {\n trackAddonBeforePublish('End time');\n }\n\n if (featureSwitches['syi-attribute-suggestions']) {\n const draftSelectedCategoryAttributes =\n draft.attributeValues.termAttributeValues;\n const suggestedCategoryAttributes =\n selectCategorySuggestedAttributes(getState()) || [];\n if (draftSelectedCategoryAttributes.length > 0) {\n trackAttributeSuggestions(\n draftSelectedCategoryAttributes,\n suggestedCategoryAttributes,\n splitTestGroups['attribute_suggestion_extractor'],\n state.draft.isNewDraft,\n result.itemId\n );\n }\n }\n\n if (featureSwitches['syi-image-attribute-suggestions']) {\n const draftSelectedColorAttributes =\n draft.attributeValues.termAttributeValues.filter(\n (a) => a.backingField === 'color'\n );\n const suggestedColorAttributes =\n selectImageToColorSuggestedAttributes(getState()) || [];\n if (draftSelectedColorAttributes) {\n trackAttributeSuggestions(\n draftSelectedColorAttributes,\n suggestedColorAttributes,\n 'ImageToColor',\n state.draft.isNewDraft,\n result.itemId\n );\n }\n }\n\n if (featureSwitches['shipping-recommendations']) {\n trackShippingRecommendations(\n draft.categoryId,\n draft.shippingOptions,\n selectRecommendedWeight(getState()) || 0,\n selectShippingRecommendations(getState()) || [],\n result.itemId\n );\n }\n\n const { predictions, shortDescription, longDescription } = state;\n const hasAiTitle =\n predictions.shortDescription ===\n shortDescription.shortDescription;\n const hasAiDescription =\n predictions.longDescription === longDescription.longDescription;\n\n trackSyiForm({\n eventName: 'syi_form_submit_success',\n parameters: {\n form_name: 'syi_draft',\n item_id: result.itemId,\n ai_title: hasAiTitle ? 1 : 0,\n ai_description: hasAiDescription ? 1 : 0,\n ai_images: predictions.numProcessedImages,\n ai_processing_time: predictions.aiProcessingTime,\n draft_id: draft.draftId\n }\n });\n\n doneCallback?.(result.itemId);\n\n dispatch(setDraft({}));\n navigationService.goToPublished(result.itemId);\n })\n .catch((response) => {\n logger('Failed to publish SYI draft', {\n contexts: {\n syiPublish: response\n }\n });\n\n if (\n hasResponseErrorCode(response, [\n 'DraftAlreadyPublished',\n 'DraftBelongsToAnotherMember'\n ])\n ) {\n navigationService.goToStart();\n dispatch(setDraft({}));\n } else if (hasResponseErrorCode(response, ['ValidationError'])) {\n handleServerValidationError(response.errors || [], dispatch, t);\n } else {\n dispatch(setPublishFailed());\n }\n });\n};\n\nconst hasResponseErrorCode = (responseOrNull, arrayOfErrorCodesToCheck) =>\n responseOrNull &&\n arrayOfErrorCodesToCheck.includes(responseOrNull.errorCode);\n\nexport const loadDraftIfMissing = (draftId) => (dispatch, getState) => {\n var draft = getSyiSlice(getState()).draft;\n const isAlreadyLoaded = draft.draftId === draftId;\n if (isAlreadyLoaded) {\n return Promise.resolve(draft);\n }\n const languageCodeIso2 = selectPreferredLanguageCode(getState());\n const countryCodeIso2 = selectShippingRegionCountryCodeIso2(getState());\n return loadDraft(dispatch, draftId, languageCodeIso2, countryCodeIso2);\n};\n\nexport const loadDefaultDraft =\n ({ charityId }) =>\n (dispatch) => {\n dispatch(resetSyi());\n dispatch(resetCharityAndShippingInfo());\n dispatch(setDraft(draftService.loadDefaultDraft(), { charityId }));\n dispatch(resetSelectedShippingOptions());\n };\n\nexport const loadDefaultTemplateDraft = () => (dispatch) => {\n dispatch(resetSyi());\n dispatch(resetCharityAndShippingInfo());\n var template = draftService.loadDefaultTemplateDraft();\n dispatch(setDraft({ ...template, templateId: 'new' }));\n};\n\nexport const useDraftAsTemplate = () => (dispatch) => {\n dispatch(setDraftReason('Template'));\n dispatch(setDraftId(null));\n};\n\nexport const triggerSave = () => (dispatch) => dispatch(saveDraft);\n\nexport const saveDraft = (dispatch, getState) => {\n const draft = buildDraftFromState(getSyiSlice(getState()));\n const version = getSyiSlice(getState()).draft.version || 0;\n return draftService\n .saveDraft(draft)\n .then((result) => {\n if (draft.draftId !== result.draftId) {\n dispatch(setDraftId(result.draftId));\n }\n if (version > 0 && version + 1 !== result.version) {\n // Unexpected version. The draft is being edited somewhere else.\n }\n dispatch(setIsDraftSaved(true));\n const wasNewDraftWithoutId = !draft.draftId && !!result.draftId;\n // since this function runs on a timer, we might have moved to a new route.\n // For example, when publishing a draft, we move to the published page, but\n // this function might run afterwards, which creates a new draft. Therefore,\n // make sure to only run this if we are still on the 'new' route. TWT-6947\n const routeIsNew = window.location.href.endsWith('/new');\n if (wasNewDraftWithoutId && routeIsNew) {\n navigationService.setDraftUrlWithoutReload(result.draftId);\n }\n // Must happen after new URL is set for re-render to happen.\n dispatch(setDraftVersion(result.version));\n // KATS: This is only manually dispatched since not all of the templates API is in RTK query yet\n dispatch(util.invalidateTags([Tags.DRAFT_LIST]));\n\n return result;\n })\n .catch((error) => {\n const response = error.responseJSON;\n\n logError(error, {\n contexts: {\n syiSave: response\n }\n });\n\n if (\n hasResponseErrorCode(response, [\n 'DraftAlreadyPublished',\n 'DraftBelongsToAnotherMember'\n ])\n ) {\n dispatch(setDraft({}));\n navigationService.goToStart();\n } else if (error.status == 404) {\n dispatch(setDraft({}));\n navigationService.goToStart();\n }\n });\n};\n\nconst setUsedAllowed = (isAllowed) => ({\n type: 'SET_ITEM_CONDITION_SELECTION_ERROR',\n payload: isAllowed ? null : 'syi_validation_used_not_allowed_for_category'\n});\n\nexport const setItemConditionFromUser = (condition) => (dispatch) => {\n dispatch({\n type: 'SET_ITEM_CONDITION_FROM_USER',\n payload: condition\n });\n dispatch(updateItemConditionRestrictionForCategory());\n};\n\nexport const setItemConditionFromPrediction =\n (condition) => (dispatch, getState) => {\n const isPristine = !selectIsItemConditionDirty(getState());\n if (!isPristine) {\n return;\n }\n const oldValue = selectItemCondition(getState());\n\n dispatch({\n type: 'SET_ITEM_CONDITION',\n payload: condition\n });\n\n if (oldValue !== condition) {\n dispatch(setHasUsedAutoFill(true));\n }\n\n dispatch(updateItemConditionRestrictionForCategory());\n };\n\nexport const updateItemConditionRestrictionForCategory =\n () => (dispatch, getState) => {\n const condition = getSyiSlice(getState()).itemCondition.itemCondition;\n const isUsed = condition === 'Used';\n if (isUsed) {\n const isAllowed = isUsedAllowed(getState);\n dispatch(setUsedAllowed(isAllowed));\n } else {\n dispatch(setUsedAllowed(true));\n }\n };\n\nconst isUsedAllowed = (getState) => {\n const categoryRestriction = getSyiSlice(getState()).syi.categoryRestriction;\n return !categoryRestriction || categoryRestriction.allowUsed !== false;\n};\n\nexport const resetItemCondition = () => ({\n type: 'RESET_ITEM_CONDITION'\n});\n\nexport const publishAdditionalDescription = (text) => (dispatch, getState) => {\n if (text && text.length > 0) {\n dispatch(addAdditionalDescription(text));\n }\n dispatch(setPublishPending());\n const draft = buildDraftFromState(getSyiSlice(getState()));\n publishService\n .publish(draft)\n .then((result) => {\n navigationService.goToPublished(result.itemId);\n dispatch(setDraft({}));\n })\n .catch(() => {\n dispatch(setPublishFailed());\n });\n};\n","import { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport { PossibleFeatures } from 'tradera/apps/syi/state/reducers/fees';\n\nconst updatePrices = () => (dispatch, getState) => {\n const featureFees = [];\n const state = getSyiSlice(getState());\n\n if (state.price.reservePrice) {\n featureFees.push(PossibleFeatures.reservePrice);\n }\n\n if (state.extraFeatures.displayHighlighted) {\n featureFees.push(PossibleFeatures.highlight);\n }\n\n if (state.extraFeatures.displayPromoted) {\n featureFees.push(PossibleFeatures.rankUp);\n }\n\n dispatch({\n type: 'SET_CHOSEN_EXTRA_FEATURES',\n payload: featureFees\n });\n};\n\nexport default {\n updatePrices\n};\n","/* eslint-disable better-mutation/no-mutation */\nimport { updateDraftCanBeResumed, loadImagesFromDraft } from './draft-actions';\nimport { logger } from 'packages/logger';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport { openAddPhoto } from 'tradera/apps/syi/services/native-app-service';\nimport { throttledFetchImageAttributeSuggestions } from './attributes-actions';\nimport { resetImageAttributeSuggestions } from '../reducers/attributes';\nimport { disableAutoSave, enableAutoSave } from '../reducers/syi';\nimport * as actions from '../reducers/images';\nimport type { Image as ImageType, Rotation } from '../reducers/images';\nimport type { AppDispatch, GetState } from 'tradera/state/configure-store';\nimport type { SocketIoChannel } from 'tradera/services/socket-io-channel';\nimport type { ItemDraftImage } from 'tradera/state/services/types/webapi-selling-generated';\nimport config from 'tradera/apps/syi/services/config';\nimport scribe from 'tradera/apps/syi/services/scribe';\nimport axios, { type AxiosError } from 'axios';\nimport { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\nimport { selectImageIds } from 'tradera/apps/syi/state/selectors/image-selectors';\nimport { fetchClassificationFromFirstImage } from 'tradera/apps/syi/state/actions/predictions-actions';\nimport { selectDraftId } from 'tradera/apps/syi/state/selectors/draft-selectors';\n\nconst MAX_IMAGES_FOR_IMAGE_TO_COLORS = 2;\n\nexport const setDraftImages =\n (images: ItemDraftImage[]) => (dispatch: AppDispatch) => {\n dispatch(actions.setDraftImages(images));\n\n dispatch(updateDraftCanBeResumed());\n\n const removeNullAndUndefinedFilter = (\n n: T | null | undefined\n ): n is T => !!n;\n const draftImageIds = images\n .slice(0, MAX_IMAGES_FOR_IMAGE_TO_COLORS)\n .map((image) => image.draftImage?.imageId)\n .filter(removeNullAndUndefinedFilter);\n if (draftImageIds.length > 0) {\n dispatch(throttledFetchImageAttributeSuggestions(draftImageIds));\n }\n };\n\nconst addImageAndUpdateSuggestions =\n (imageId: string, imageUrl: string, classify: boolean) =>\n (dispatch: AppDispatch, getState: GetState) => {\n dispatch(actions.addImage({ imageId, imageUrl }));\n\n const count = getSyiSlice(getState()).images.images.length;\n if (count <= MAX_IMAGES_FOR_IMAGE_TO_COLORS) {\n const images = getSyiSlice(getState()).images.images;\n handleAttributeSuggestionsForImages(dispatch, images);\n }\n if (classify) {\n const draftId = selectDraftId(getState());\n dispatch(fetchClassificationFromFirstImage({ imageId, draftId }));\n }\n dispatch(updateDraftCanBeResumed());\n };\n\nconst replaceImageAndUpdateSuggestions =\n (index: number, imageId: string, imageUrl: string) =>\n (dispatch: AppDispatch, getState: GetState) => {\n dispatch(actions.replaceImage({ index, imageUrl, imageId }));\n if (index < MAX_IMAGES_FOR_IMAGE_TO_COLORS) {\n const images = getSyiSlice(getState()).images.images;\n handleAttributeSuggestionsForImages(dispatch, images);\n }\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const removeImageAndUpdateSuggestions =\n (index: number) => (dispatch: AppDispatch, getState: GetState) => {\n dispatch(actions.removeImage({ index }));\n\n if (index < MAX_IMAGES_FOR_IMAGE_TO_COLORS) {\n const images = getSyiSlice(getState()).images.images;\n handleAttributeSuggestionsForImages(dispatch, images);\n }\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const changeImagePosition =\n (from: number, to: number) =>\n (dispatch: AppDispatch, getState: GetState) => {\n dispatch(actions.changeImagePosition({ from, to }));\n const isImageToColorImageChanged =\n (from >= MAX_IMAGES_FOR_IMAGE_TO_COLORS &&\n to < MAX_IMAGES_FOR_IMAGE_TO_COLORS) ||\n (to >= MAX_IMAGES_FOR_IMAGE_TO_COLORS &&\n from < MAX_IMAGES_FOR_IMAGE_TO_COLORS);\n if (isImageToColorImageChanged) {\n const images = getSyiSlice(getState()).images.images;\n handleAttributeSuggestionsForImages(dispatch, images);\n }\n };\n\nexport const removeImageWithId =\n (imageId: unknown) => (dispatch: AppDispatch, getState: GetState) => {\n const images = getSyiSlice(getState()).images.images;\n let imageIndex = -1;\n for (let i = images.length - 1; i >= 0; i--) {\n if (images[i].imageId === imageId) {\n imageIndex = i;\n break;\n }\n }\n if (imageIndex > -1) {\n dispatch(removeImageAndUpdateSuggestions(imageIndex));\n }\n\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const rotateImageClockwise =\n (index: number) => (dispatch: AppDispatch, getState: GetState) => {\n const images = getSyiSlice(getState()).images.images;\n let rotationDegrees = images[index]?.rotationDegrees || (0 as Rotation);\n switch (rotationDegrees) {\n case 0:\n rotationDegrees = 90;\n break;\n case 90:\n rotationDegrees = 180;\n break;\n case 180:\n rotationDegrees = 270;\n break;\n case 270:\n rotationDegrees = 0;\n break;\n }\n\n dispatch(\n actions.setImageRotation({\n index,\n rotationDegrees\n })\n );\n };\n\nconst allowedFileExtensions = ['.jpeg', '.jpg', '.png', '.gif'];\nconst maxFileSize = 1024 * 1024 * 20;\nconst validateFile = (file: File) => {\n if (file === undefined) {\n return 'syi_validation_images_upload_error'; //'Något blev fel vid uppladdningen av filen';\n }\n if (\n !allowedFileExtensions.some((fileExt) =>\n file.name.toLowerCase().endsWith(fileExt)\n )\n ) {\n return 'syi_validation_images_upload_wrong_type'; //'Filen du laddade upp är av fel typ.';\n }\n if (file.size > maxFileSize) {\n return 'syi_validation_images_upload_too_large'; //'Filen du laddade upp är för stor.';\n }\n return false;\n};\n\nexport const imagesDroppedThunk =\n (files: FileList, isTemplate: boolean) => async (dispatch: AppDispatch) => {\n await dispatch(uploadImagesThunk(files, isTemplate));\n };\n\nexport const imagesSelectedThunk =\n (fileInput: HTMLInputElement, isTemplate: boolean) =>\n async (dispatch: AppDispatch) => {\n if (!fileInput.files) return;\n await dispatch(uploadImagesThunk(fileInput.files, isTemplate));\n fileInput.value = '';\n };\n\nexport const imageCroppedThunk =\n (file: File, isTemplate: boolean, index: number) =>\n async (dispatch: AppDispatch) => {\n if (file.type && file.type.startsWith('image/')) {\n const validationResult = validateFile(file);\n if (validationResult) {\n dispatch(\n actions.setImageUploadFailed({\n errorMessage: validationResult\n })\n );\n return;\n }\n await dispatch(uploadImageWithFormData(file, isTemplate, index));\n }\n };\n\nconst uploadImagesThunk =\n (files: FileList, isTemplate: boolean) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n const imagesLeft =\n actions.MAX_NUMBER_OF_IMAGES -\n getSyiSlice(getState()).images.images.length;\n const imagesToUpload = Array.from(files).slice(0, imagesLeft);\n\n dispatch(\n actions.setImagesUploading({\n numberOfImages: imagesToUpload.length\n })\n );\n\n for (const file of imagesToUpload) {\n const validationResult = validateFile(file);\n if (validationResult) {\n dispatch(\n actions.setImageUploadFailed({\n errorMessage: validationResult\n })\n );\n return;\n }\n }\n for (const file of imagesToUpload) {\n await dispatch(uploadImageWithFormData(file, isTemplate));\n }\n };\n\nconst uploadImageWithFormData =\n (file: File, isTemplate: boolean, index?: number) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n const startTime = new Date().getTime();\n const formData = new FormData();\n formData.append('imageFile', file);\n\n const url = isTemplate\n ? config.templateImagesUrl\n : config.draftImagesUrl;\n try {\n const response = await axios.post(url, formData);\n const { errorCode, imageId, imageUrl } = response.data;\n if (errorCode) {\n if (errorCode === 'ImageMinimumDimensionsNotReached') {\n dispatch(\n actions.setImageUploadFailed({\n errorMessage:\n 'syi_validation_images_upload_too_small'\n })\n );\n }\n\n return;\n }\n\n // onImageUploaded start //\n const downloadingImage = new Image();\n downloadingImage.onload = () => {\n if (typeof index === 'number') {\n dispatch(\n replaceImageAndUpdateSuggestions(\n index,\n imageId,\n imageUrl\n )\n );\n } else {\n const isMagicalSyiActive =\n selectIsFeatureEnabled('magical-syi')(getState());\n\n const isFirstImage =\n getSyiSlice(getState()).images.images.length === 0;\n\n dispatch(\n addImageAndUpdateSuggestions(\n imageId,\n imageUrl,\n isFirstImage && isMagicalSyiActive\n )\n );\n }\n };\n downloadingImage.src = imageUrl;\n // onImageUploaded end //\n\n const endTime = new Date().getTime();\n scribe.sendDuration(\n 'image_upload_client_time',\n endTime - startTime\n );\n } catch (error: unknown) {\n dispatch(\n actions.setImageUploadFailed({\n errorMessage: 'syi_validation_images_upload_error' //'Ett fel inträffade vid uppladdningen'\n })\n );\n if (\n !(error as AxiosError).response &&\n (error as AxiosError).request\n ) {\n // The request was made but no response was received\n logger('Image upload failed. Reason: No response');\n } else {\n // Something happened in setting up the request that triggered an Error\n logger(\n 'Image upload failed. Reason: ' + (error as Error).message\n );\n }\n }\n };\n\nclass MissingDraftId extends Error {}\n\nconst hasRequest = (value: unknown) =>\n typeof value === 'object' && value && 'request' in value && !!value.request;\n\nconst hasResponse = (value: unknown) =>\n typeof value === 'object' &&\n value &&\n 'response' in value &&\n !!value.response;\n\nexport const nativeAppOpenAddPhotoThunk =\n (\n saveNowIfQueued: (\n draftId?: string\n ) => Promise<{ draftId?: string } | undefined>\n ) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n dispatch(setIsUploadingWithApp(true));\n try {\n dispatch(disableAutoSave());\n const currentDraftId = getSyiSlice(getState())?.draft?.draftId;\n const draft = await saveNowIfQueued(currentDraftId);\n const draftId = draft?.draftId || currentDraftId;\n if (!draftId) {\n throw new MissingDraftId();\n }\n await openAddPhoto(draftId);\n } catch (error) {\n if (error instanceof MissingDraftId) {\n logger('Missing draftId on app photo upload');\n } else if (!hasRequest(error) || hasResponse(error)) {\n // Do not log axios request errors, as they are client dependent (such as offline)\n logger(error);\n }\n dispatch(\n actions.setImageUploadFailed({\n errorMessage: 'syi_images_photo_with_mobile_error'\n })\n );\n dispatch(setIsUploadingWithApp(false));\n dispatch(enableAutoSave());\n }\n };\n\nexport const fetchImagesFromDraft =\n (draftId: string, draftSocket: SocketIoChannel) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n if (!draftId) {\n logger('DraftChanged event missing draft ID');\n }\n const imagesHaveChanged = await dispatch(loadImagesFromDraft(draftId));\n if (imagesHaveChanged) {\n dispatch(cancelMobileUpload(draftSocket));\n\n const isMagicalSyiActive =\n selectIsFeatureEnabled('magical-syi')(getState());\n\n const imageId = selectImageIds(getState())[0];\n\n const shouldClassify = isMagicalSyiActive && imageId;\n\n if (shouldClassify) {\n dispatch(\n fetchClassificationFromFirstImage({\n imageId: imageId.toString(),\n draftId\n })\n );\n }\n }\n };\n\nexport const setIsUploadingWithApp =\n (isUploadingWithApp: boolean) => (dispatch: AppDispatch) => {\n dispatch(\n actions.setMobileUpload({\n isUploadingWithApp\n })\n );\n };\n\nexport const cancelMobileUpload =\n (draftSocket: SocketIoChannel) => (dispatch: AppDispatch) => {\n draftSocket.disconnect();\n dispatch(setIsUploadingWithApp(false));\n dispatch(enableAutoSave());\n };\n\nconst handleAttributeSuggestionsForImages = (\n dispatch: AppDispatch,\n images: ImageType[]\n) => {\n const imageIds: unknown[] = [];\n images.slice(0, MAX_IMAGES_FOR_IMAGE_TO_COLORS).forEach((image) => {\n if (image.imageId && !image.isListingImage) {\n imageIds.push(image.imageId);\n }\n });\n if (imageIds.length > 0) {\n dispatch(throttledFetchImageAttributeSuggestions(imageIds));\n } else {\n dispatch(resetImageAttributeSuggestions());\n }\n};\n\nexport const fetchImageAttributeSuggestions =\n () => (dispatch: AppDispatch, getState: GetState) => {\n const images = getSyiSlice(getState()).images.images;\n handleAttributeSuggestionsForImages(dispatch, images);\n };\n\nexport const reset = () => (dispatch: AppDispatch) => {\n dispatch(setDraftImages([]));\n dispatch(updateDraftCanBeResumed());\n};\n","import {\n resetLongDescription,\n setLongDescription as setLongDescriptionReducer,\n setLongDescriptionFromDraft as setLongDescriptionFromDraftReducer\n} from 'tradera/apps/syi/state/reducers/long-description';\nimport { updateDraftCanBeResumed } from './draft-actions';\nimport type {\n AppDispatch,\n GetState,\n RootState\n} from 'tradera/state/configure-store';\nimport { selectLongDescription } from 'tradera/apps/syi/state/selectors/syi';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport type {\n OffsitePaymentDetectionApiRequest,\n OffsitePaymentDetectionApiResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport { webApiClient } from 'tradera/utils/http';\nimport { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\n\nexport const setLongDescription =\n (longDescription: string) => (dispatch: AppDispatch) => {\n dispatch(setLongDescriptionReducer(longDescription));\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const prependLongDescription =\n (longDescription: string) =>\n (dispatch: AppDispatch, getState: GetState) => {\n const currentLongDescription = selectLongDescription(getState());\n const newLongDescription = `${longDescription}\\n\\n${currentLongDescription}`;\n // Needs to be FromDraft, otherwise the update will not be shown\n // in the redactor-controlled textarea.\n dispatch(setLongDescriptionFromDraftReducer(newLongDescription));\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const setLongDescriptionFromDraft =\n (longDescription: string) => (dispatch: AppDispatch) => {\n dispatch(setLongDescriptionFromDraftReducer(longDescription));\n dispatch(updateDraftCanBeResumed());\n };\n\nexport const reset = () => (dispatch: AppDispatch) => {\n dispatch(resetLongDescription());\n dispatch(updateDraftCanBeResumed());\n};\n\nexport const fetchOffsitePaymentDetection = createAsyncThunk<\n OffsitePaymentDetectionApiResponse | null,\n OffsitePaymentDetectionApiRequest,\n {\n state: RootState;\n }\n>(\n 'syi/longDescription/fetchOffsitePaymentDetection',\n async (request: OffsitePaymentDetectionApiRequest, { getState }) => {\n const isOffsitePaymentDetectionEnabled = selectIsFeatureEnabled(\n 'offsite-payment-detection'\n )(getState());\n\n if (isOffsitePaymentDetectionEnabled) {\n const { data } = await webApiClient.post<\n OffsitePaymentDetectionApiResponse,\n OffsitePaymentDetectionApiRequest\n >(`/selling/offsite-payment-detection`, request);\n return data;\n } else {\n return null;\n }\n }\n);\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport qs from 'qs';\nimport { trackSyiForm } from 'tradera/apps/syi/services/syi-ga4-service';\nimport { setLongDescription } from 'tradera/apps/syi/state/reducers/long-description';\nimport {\n setAiProcessingTime,\n setHasUsedPredictedDescription,\n setNumProcessedImages,\n setPredictedLongDescription,\n setPredictedShortDescription,\n setShouldSuggestLongDescription,\n setShouldSuggestShortDescription\n} from 'tradera/apps/syi/state/reducers/predictions-reducer';\nimport { setShortDescription } from 'tradera/apps/syi/state/reducers/short-description';\nimport { selectDraftId } from 'tradera/apps/syi/state/selectors/draft-selectors';\nimport { selectImageIds } from 'tradera/apps/syi/state/selectors/image-selectors';\nimport { selectClassificationResponse } from 'tradera/apps/syi/state/selectors/predictions-selectors';\nimport {\n selectLongDescription,\n selectShortDescription\n} from 'tradera/apps/syi/state/selectors/syi';\nimport type { RootState } from 'tradera/state/configure-store';\nimport { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\nimport { selectPreferredLanguageCode } from 'tradera/state/language/selectors';\nimport type {\n ClassifyFromDraftImageApiResponse,\n ClassifyFromImageRequest,\n ConditionListingTypeFromCategoryRequest,\n GetConditionAndListingTypeFromCategoryApiResponse,\n PredictionsFromDraftImageApiResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport { webApiClient } from 'tradera/utils/http';\nimport { setItemConditionFromPrediction } from 'tradera/apps/syi/state/actions/draft-actions';\nimport priceActions from 'tradera/apps/syi/state/actions/price-actions';\nimport ItemTypes from 'tradera/constants/item-types';\n\nexport const fetchClassificationFromFirstImage = createAsyncThunk(\n 'syi/images/fetchClassificationFromFirstImage',\n async ({ imageId, draftId }: ClassifyFromImageRequest) => {\n const response =\n await webApiClient.get(\n `/selling/classify-from-image?${qs.stringify({\n imageId,\n draftId\n })}`\n );\n\n return response.data;\n }\n);\n\nexport const fetchPredictionsFromImages = createAsyncThunk<\n void,\n void,\n { state: RootState }\n>(\n 'predictions/fetchPredictionsFromImages',\n async (_, { dispatch, getState }) => {\n const languageCodeIso2 = selectPreferredLanguageCode(getState());\n const existingShortDescription = selectShortDescription(getState());\n const existingLongDescription = selectLongDescription(getState());\n const isModalFeatureToggleEnabled = selectIsFeatureEnabled(\n 'magical-syi-autofill-prompt'\n )(getState());\n const { itemClassification } =\n selectClassificationResponse(getState()) || {};\n\n const imageIds = selectImageIds(getState());\n const draftId = selectDraftId(getState());\n\n const response =\n await webApiClient.get(\n `/selling/predict-from-images?${qs.stringify({\n imageIds: imageIds,\n languageCodeIso2,\n itemClassification,\n draftId: draftId\n })}`\n );\n\n trackSyiForm({\n eventName: 'magical_api_call',\n parameters: { draft_id: draftId }\n });\n\n // If we already have descriptions, we don't want to overwrite them with the predicted one without asking the user first.\n // If we don't have short and long description, we want to set the predicted ones\n if (response.data.shortDescription) {\n dispatch(\n setPredictedShortDescription(response.data.shortDescription)\n );\n\n if (existingShortDescription && isModalFeatureToggleEnabled) {\n dispatch(\n setShouldSuggestShortDescription(\n response.data.shortDescription !==\n existingShortDescription\n )\n );\n } else {\n dispatch(setHasUsedPredictedDescription(true));\n dispatch(setShortDescription(response.data.shortDescription));\n }\n }\n\n if (response.data.longDescription) {\n dispatch(\n setPredictedLongDescription(response.data.longDescription)\n );\n\n if (existingLongDescription && isModalFeatureToggleEnabled) {\n dispatch(\n setShouldSuggestLongDescription(\n response.data.longDescription !==\n existingLongDescription\n )\n );\n } else {\n dispatch(setHasUsedPredictedDescription(true));\n dispatch(setLongDescription(response.data.longDescription));\n }\n }\n\n dispatch(setNumProcessedImages(response.data.numProcessedImages));\n dispatch(setAiProcessingTime(response.data.aiProcessingTime));\n }\n);\n\nexport const fetchConditionAndItemTypeFromCategory = createAsyncThunk(\n 'syi/images/fetchConditionAndItemTypeFromCategory',\n async (\n { isCompany, categoryId }: ConditionListingTypeFromCategoryRequest,\n { dispatch }\n ) => {\n const response =\n await webApiClient.get(\n `/selling/condition-listing-type-from-category?${qs.stringify({\n isCompany,\n categoryId\n })}`\n );\n\n if (response.data.condition) {\n dispatch(setItemConditionFromPrediction(response.data.condition));\n }\n dispatch(\n priceActions.setIsPureBinSelectedFromPrediction(\n response.data.itemType === ItemTypes.PURE_BIN\n )\n );\n\n return response.data;\n }\n);\n","import feesActions from './fees-actions';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport { resetCharityAndShippingInfo } from 'tradera/apps/syi/state/actions/charity-actions';\nimport { PURE_BIN_CATEGORY_IDS, ITEM_TYPE } from '../constants';\nimport { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\nimport { setCustomEndTime } from '../reducers/item-duration';\nimport { selectMagicalSyiSettngEnabled } from 'tradera/apps/syi/state/selectors/draft-selectors';\nimport { selectIsPureBinSelected } from 'tradera/apps/syi/state/selectors/price-selectors';\nimport { setHasUsedAutoFill } from 'tradera/apps/syi/state/reducers/predictions-reducer';\n\nfunction toIntOrNull(number) {\n var i = parseInt(number);\n if (isFinite(i)) {\n return i;\n }\n return null;\n}\n\nfunction isNullOrUndefined(val) {\n return val === null || val === undefined;\n}\n\nconst setOpeningBid = (openingBid) => (dispatch) => {\n dispatch({\n type: 'SET_OPENING_BID',\n payload: toIntOrNull(openingBid)\n });\n};\n\nconst setFixedPrice = (fixedPrice) => (dispatch) => {\n dispatch({\n type: 'SET_FIXED_PRICE',\n payload: toIntOrNull(fixedPrice)\n });\n};\n\nconst setReservePrice = (reservePrice) => (dispatch) => {\n dispatch({\n type: 'SET_RESERVE_PRICE',\n payload: toIntOrNull(reservePrice)\n });\n dispatch(feesActions.updatePrices());\n};\n\nconst setAuctionBinPrice = (auctionBinPrice) => (dispatch) => {\n dispatch({\n type: 'SET_AUCTION_BIN_PRICE',\n payload: toIntOrNull(auctionBinPrice)\n });\n};\n\nconst setReservePriceVisibility = (visible) => (dispatch) => {\n dispatch({\n type: 'SET_RESERVE_PRICE_VISIBILITY',\n payload: visible\n });\n if (!visible) {\n dispatch(setReservePrice(null));\n }\n};\n\nconst setCharityDonationVisibility = (visible) => (dispatch) => {\n dispatch({\n type: 'SET_CHARITY_DONATION_VISIBILITY',\n payload: visible\n });\n if (!visible) {\n dispatch(resetCharityAndShippingInfo());\n }\n};\n\nconst setEditCharity = (editCharity) => (dispatch) => {\n dispatch({\n type: 'SET_EDIT_CHARITY',\n payload: editCharity\n });\n};\n\nconst setIsPureBinSelected = (isPureBinSelected) => (dispatch, getState) => {\n dispatch({\n type: 'SET_IS_PURE_BIN_SELECTED',\n isPureBinSelected,\n isChangeItem: getSyiSlice(getState()).syi.isEditOfPublishedItem\n });\n if (isPureBinSelected) {\n dispatch(setOpeningBid(null));\n dispatch(setAuctionBinPrice(null));\n dispatch(setReservePrice(null));\n dispatch(setCustomEndTime(null));\n } else {\n dispatch(setFixedPrice(null));\n }\n};\n\nconst setIsPureBinSelectedFromPrediction =\n (isPureBinSelected) => (dispatch, getState) => {\n const isPristine = !getSyiSlice(getState()).price.isDirty;\n if (!isPristine) return;\n\n const oldValue = selectIsPureBinSelected(getState());\n\n dispatch(setIsPureBinSelected(isPureBinSelected));\n\n if (oldValue !== isPureBinSelected) {\n dispatch(setHasUsedAutoFill(true));\n }\n };\n\nconst setSelectedItemType = (itemType) => (dispatch, getState) => {\n dispatch({\n type: 'SET_SELECTED_ITEM_TYPE',\n itemType,\n isChangeItem: getSyiSlice(getState()).syi.isEditOfPublishedItem\n });\n\n if (itemType === ITEM_TYPE.BIN) {\n dispatch(setOpeningBid(null));\n dispatch(setAuctionBinPrice(null));\n dispatch(setReservePrice(null));\n dispatch(setCustomEndTime(null));\n } else if (itemType === ITEM_TYPE.AUCTION) {\n dispatch(setFixedPrice(null));\n dispatch(setAuctionBinPrice(null));\n } else if (itemType === ITEM_TYPE.AUCTION_AND_BIN) {\n dispatch(setFixedPrice(null));\n }\n};\n\nconst setVat = (vat) => (dispatch) => {\n dispatch({\n type: 'SET_VAT',\n payload: vat\n });\n};\n\nconst setFromDraft =\n (openingBid, fixedPrice, reservePrice, charityId, vat, isChangeItem) =>\n (dispatch) => {\n const queryParams = new URLSearchParams(location.search);\n const queryParamCharityId = queryParams.get('charityId');\n const hasOpeningBid = !isNullOrUndefined(openingBid);\n const hasFixedPrice = !isNullOrUndefined(fixedPrice);\n const hasReservePrice = !isNullOrUndefined(reservePrice);\n const hasCharityId =\n !isNullOrUndefined(charityId) ||\n !isNullOrUndefined(queryParamCharityId);\n const isAuction = hasOpeningBid && !hasFixedPrice;\n const isAuctionBin = hasOpeningBid && hasFixedPrice;\n const isPureBin = !hasOpeningBid && hasFixedPrice;\n\n dispatch(setVat(vat));\n\n // TODO: fewer changes to the state makes the page load faster...\n if (isAuction) {\n dispatch(setOpeningBid(openingBid));\n dispatch(setReservePrice(reservePrice));\n dispatch(setAuctionBinPrice(null));\n dispatch(setFixedPrice(null));\n dispatch(setReservePriceVisibility(hasReservePrice));\n dispatch(setCharityDonationVisibility(hasCharityId));\n dispatch(setIsPureBinSelected(false));\n dispatch(setSelectedItemType(ITEM_TYPE.AUCTION));\n } else if (isAuctionBin) {\n dispatch(setOpeningBid(openingBid));\n dispatch(setReservePrice(reservePrice));\n dispatch(setAuctionBinPrice(fixedPrice));\n dispatch(setFixedPrice(null));\n dispatch(setReservePriceVisibility(hasReservePrice));\n dispatch(setCharityDonationVisibility(hasCharityId));\n dispatch(setIsPureBinSelected(false));\n dispatch(setSelectedItemType(ITEM_TYPE.AUCTION_AND_BIN));\n } else if (isPureBin) {\n dispatch(setOpeningBid(null));\n dispatch(setReservePrice(null));\n dispatch(setAuctionBinPrice(null));\n dispatch(setFixedPrice(fixedPrice));\n dispatch(setReservePriceVisibility(false));\n dispatch(setCharityDonationVisibility(false));\n dispatch(setIsPureBinSelected(true));\n dispatch(setSelectedItemType(ITEM_TYPE.BIN));\n } else {\n dispatch(setOpeningBid(null));\n dispatch(setReservePrice(null));\n dispatch(setAuctionBinPrice(null));\n dispatch(setFixedPrice(null));\n dispatch(setReservePriceVisibility(false));\n dispatch(setCharityDonationVisibility(hasCharityId));\n dispatch(setIsPureBinSelected(false));\n }\n\n dispatch({\n type: 'SET_RESERVE_PRICE_CAN_CHANGE_BUT_NOT_BE_REMOVED',\n payload: isChangeItem && hasReservePrice\n });\n };\n\nconst reset = () => (dispatch) => {\n dispatch({\n type: 'RESET_PRICES_AND_VAT'\n });\n};\n\nconst rootCategoryHasBeenSelected = (categoryId) => (dispatch, getState) => {\n const isPureBinCategory = PURE_BIN_CATEGORY_IDS.includes(categoryId);\n const isMagicalSyiFeatureEnabled =\n selectIsFeatureEnabled('magical-syi')(getState());\n const isMagicalSyiSettingEnabled =\n selectMagicalSyiSettngEnabled(getState());\n const isAutoFillConditionAndListingTypeEnabled = selectIsFeatureEnabled(\n 'auto-fill-condition-and-listing-type'\n )(getState());\n const isEditOfPublishedItem =\n getSyiSlice(getState()).syi.isEditOfPublishedItem;\n\n // We do not want to change the auction type if the user is editing a\n // published item, since that's not allowed anyway\n if (\n !isEditOfPublishedItem &&\n !isMagicalSyiFeatureEnabled &&\n !isAutoFillConditionAndListingTypeEnabled &&\n !isMagicalSyiSettingEnabled\n ) {\n dispatch(setIsPureBinSelected(isPureBinCategory));\n }\n};\n\nexport default {\n setOpeningBid,\n setFixedPrice,\n setReservePrice,\n setAuctionBinPrice,\n setReservePriceVisibility,\n setCharityDonationVisibility,\n setEditCharity,\n setIsPureBinSelected,\n setIsPureBinSelectedFromPrediction,\n setFromDraft,\n rootCategoryHasBeenSelected,\n setVat,\n reset,\n setSelectedItemType\n};\n","import { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\nimport {\n getShippingProvidersByWeight,\n getShippingRecommendations\n} from 'tradera/apps/syi/services/shipping-provider-service';\nimport {\n getSyiSlice,\n selectItemIdFromDraft\n} from 'tradera/apps/syi/state/selectors/syi';\n\nimport { logger } from 'packages/logger';\nimport {\n selectFirstRecommendedByWeight,\n selectSelectedShippingOptions\n} from '../reducers/shipping/shipping-selectors';\nimport { selectShippingRegionCountryCodeIso2 } from 'tradera/state/shipping-region/selectors';\nimport { isDenmarkCountryCode } from 'tradera/localization/countrycode';\nimport { trackSyiForm } from 'tradera/apps/syi/services/syi-ga4-service';\nimport {\n clearShippingRecommendations,\n setShippingOptionsByWeight,\n setShippingOptionsError,\n setTakeawaySelected,\n setShippingRecommendations as setShippingRecommendationsReducer,\n setShippingOptionSelected,\n setShippingOptionsLoading\n} from 'tradera/apps/syi/state/reducers/shipping/shipping-reducer';\nimport type { AppDispatch, GetState } from 'tradera/state/configure-store';\nimport type { ShippingOption } from 'tradera/state/services/types/webapi-discover-generated';\nimport {\n selectDraftId,\n selectMagicalSyiSettngEnabled\n} from 'tradera/apps/syi/state/selectors/draft-selectors';\nimport { setHasUsedAutoFill } from 'tradera/apps/syi/state/reducers/predictions-reducer';\nimport { preferredShippingProvidersApi } from 'tradera/components/shipping/preferred-shipping-providers/preferred-shipping-providers-api';\nimport { isNullOrUndefined } from 'tradera/utils/condition-check';\n\nexport const setOfferTakeaway =\n (offerTakeaway: boolean) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n const draftId = selectDraftId(getState());\n\n trackSyiForm({\n eventName: 'syi_pickup',\n parameters: {\n boolean_value: offerTakeaway ? 1 : 0,\n draft_id: draftId\n }\n });\n dispatch(setTakeawaySelected({ offerTakeaway }));\n };\n\nexport const getAndSetShippingOptionsByWeight =\n (shippingOptions?: ShippingOption[]) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n try {\n const { charity, shipping } = getSyiSlice(getState());\n const itemId = selectItemIdFromDraft(getState());\n const { charityId } = charity;\n let fromCountry: string | null =\n selectShippingRegionCountryCodeIso2(getState());\n if (isDenmarkCountryCode(fromCountry)) {\n fromCountry = shipping.fromCountry;\n }\n\n dispatch(setShippingOptionsLoading(true));\n\n const { data } = await getShippingProvidersByWeight(\n fromCountry,\n charityId,\n itemId\n );\n const { productsPerWeightSpan } = data;\n\n dispatch(\n setShippingOptionsByWeight({\n productsPerWeightSpan,\n shippingOptions:\n shippingOptions ||\n selectSelectedShippingOptions(getState())\n })\n );\n } catch (error) {\n dispatch(setShippingOptionsError());\n }\n };\n\nexport const setShippingRecommendations =\n (categoryId: number) =>\n async (dispatch: AppDispatch, getState: GetState) => {\n const isShippingRecommendationsEnabled = selectIsFeatureEnabled(\n 'shipping-recommendations'\n )(getState());\n\n if (!isShippingRecommendationsEnabled || !categoryId) {\n return;\n }\n\n const isTShirtSizesEnabled = selectIsFeatureEnabled(\n 'tshirt-sizes-shipping-selector'\n )(getState());\n\n // If t-shirt sizes is enabled, we want to show onboarding if user\n // hasn't selected shipping providers - and onboarding won't show\n // if user has selected shipping providers.\n if (isTShirtSizesEnabled) {\n const { data } = await dispatch(\n preferredShippingProvidersApi.endpoints.getSelectedShippingProviders.initiate()\n );\n if (isNullOrUndefined(data?.selectedShippingProviders)) {\n return;\n }\n }\n\n try {\n const { categoryShippingRecommendations } =\n await getShippingRecommendations(categoryId);\n const { recommendedWeight, shippingRecommendations } =\n categoryShippingRecommendations;\n dispatch(\n setShippingRecommendationsReducer({\n recommendedWeight,\n shippingRecommendations\n })\n );\n dispatch(setFirstRecommendationAsSelected());\n } catch (error) {\n dispatch(clearShippingRecommendations());\n logger(\n 'Get ShippingRecommendations failed. Reason: ' +\n (typeof error === 'object' && error && 'message' in error\n ? error.message\n : '')\n );\n }\n };\n\nexport const setFirstRecommendationAsSelected =\n () => (dispatch: AppDispatch, getState: GetState) => {\n const state = getState();\n const hasUserAutofillEnabledInSettings =\n selectMagicalSyiSettngEnabled(state);\n\n const alreadySelectedShippingOptions =\n selectSelectedShippingOptions(state);\n\n const preFillShippingEnabled = selectIsFeatureEnabled(\n 'magical-syi-autofill-shipping'\n )(state);\n\n if (\n alreadySelectedShippingOptions.length > 0 ||\n !hasUserAutofillEnabledInSettings ||\n !preFillShippingEnabled\n ) {\n return;\n }\n\n const firstRecommendation = selectFirstRecommendedByWeight(state);\n\n if (firstRecommendation) {\n dispatch(setShippingOptionSelected([firstRecommendation]));\n dispatch(setHasUsedAutoFill(true));\n }\n };\n","import { axiosConfigs } from 'tradera/utils/api';\nimport qs from 'qs';\nimport {\n webApiClient,\n shippingRecommendationsClient\n} from 'tradera/utils/http';\nimport type { GetShippingProductsForCountryByWeightSpanApiResponse } from 'tradera/state/services/types/webapi-selling-generated';\nimport type { SHIPPING_PROVIDERS } from 'tradera/components/shipping-product/shipping-providers';\n\nexport const getShippingProvidersByWeight = (\n fromCountry: string | null,\n charityId: number | null,\n itemId?: number\n) => {\n const params = {\n fromCountryCode: fromCountry,\n charityId,\n itemId\n };\n\n return webApiClient.get(\n `/selling/shipping-products-for-country-by-weight-span?${qs.stringify(\n params\n )}`,\n axiosConfigs.authenticated\n );\n};\n\nexport type ShippingRecommendation = {\n shippingProductId: number;\n shippingProvider: SHIPPING_PROVIDERS;\n weight: number;\n};\n\nexport type CategoryShippingRecommendationsResponse = {\n categoryShippingRecommendations: {\n categoryId: number;\n recommendedWeight: number;\n shippingRecommendations: ShippingRecommendation[];\n };\n};\n\nexport const getShippingRecommendations = (categoryId: number) =>\n shippingRecommendationsClient.query(\n `GetCategoryShippingRecommendations?CategoryId=${categoryId}`\n );\n","export const DRAFT_REASON = {\n NEW_ITEM: 'NewItem',\n CHANGE_ITEM: 'ChangeItem',\n CHANGE_ITEM_WITH_BIDS: 'ChangeItemWithBids',\n COPY_OTHER_MEMBERS_ITEM: 'CopyOtherMembersItem',\n COPY_OWN_ITEM: 'CopyOwnItem',\n SELL_SIMILAR_ITEM: 'SellSimilarItem',\n RESTART_ITEM: 'RestartItem'\n};\n\nexport const ITEM_TYPE = {\n BIN: 'bin',\n AUCTION: 'auction',\n AUCTION_AND_BIN: 'auction_and_bin'\n};\n\n// Clothes, Accessories, Shoes\nconst CSA_CATEGORY_IDS = [16, 1612, 1623];\n\nexport const PURE_BIN_CATEGORY_IDS = [...CSA_CATEGORY_IDS];\n","import { createApi } from '@reduxjs/toolkit/query/react';\nimport { isomorphicWebApiBaseQuery } from 'tradera/state/services/utils/webapi-base-query';\nimport { canBeResumed } from './actions/draft-actions';\nimport type {\n DeleteDraftsApiRequest,\n DraftsRequest,\n GetDraftsPageApiResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\n\nexport enum Tags {\n DRAFT_LIST = 'DRAFT_LIST'\n}\n\nexport const draftsApi = createApi({\n reducerPath: 'draftsApi',\n baseQuery: isomorphicWebApiBaseQuery,\n tagTypes: Object.keys(Tags),\n endpoints: (builder) => ({\n deleteDrafts: builder.mutation({\n invalidatesTags: [Tags.DRAFT_LIST],\n query: (parameters) => {\n return {\n url: '/api/webapi/selling/drafts',\n method: 'DELETE',\n body: parameters\n };\n }\n }),\n loadDrafts: builder.query<\n GetDraftsPageApiResponse,\n DraftsRequest | undefined\n >({\n providesTags: [Tags.DRAFT_LIST],\n query: (params) => ({\n url: '/api/webapi/selling/drafts',\n method: 'GET',\n params\n }),\n transformResponse: (response: GetDraftsPageApiResponse) => {\n return {\n ...response,\n items: response.items?.filter((item) =>\n canBeResumed(\n item.draftId,\n item.draftReason,\n item.shortDescription,\n item.longDescription,\n [\n {\n imageUrl: item.images?.find(\n (image) => image.imageUrl\n )\n }\n ]\n )\n )\n };\n }\n })\n })\n});\n\nexport const { useDeleteDraftsMutation, useLoadDraftsQuery, util } = draftsApi;\n","/* eslint-disable better-mutation/no-mutation */\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport {\n filterSelectableSuggestions,\n filterCombinedSelectableSuggestions\n} from './attributes-helpers';\nimport type { SyiAttribute } from '../../components/attributes/types';\n\ntype CategorySuggestedAttribute = {\n id: number;\n name: string;\n values: string[];\n};\n\ntype TermAttributeValue = {\n id: number;\n backingField: string;\n userGenerated: boolean;\n values: string[];\n};\n\ntype InitialState = {\n categoryAttributes: SyiAttribute[];\n draftAttributes:\n | Record\n | {\n termAttributeValues: TermAttributeValue[];\n numberAttributeValues: [];\n };\n selectableSuggestedAttributes: CategorySuggestedAttribute[];\n selectableCategorySuggestedAttributes: SyiAttribute[];\n selectableImageToColorSuggestedAttributes: SyiAttribute[];\n imageToColorSuggestedAttributes: CategorySuggestedAttribute[];\n validationErrors: Record;\n categorySuggestedAttributes: CategorySuggestedAttribute[];\n suggestionsExtractorType: string;\n};\n\nconst initialState: InitialState = {\n // The attributes for the current category\n categoryAttributes: [],\n // The attributes of the draft.\n /**\n draftAttributes: {\n termAttributeValues: [\n {\n id: 1,\n backingField: 'clothes_size',\n userGenerated: true,\n values: [\n 'b'\n ]\n }\n ],\n numberAttributeValues: []\n }\n */\n draftAttributes: {},\n // A list of the selected attributes (draftAttributes) for display on the page.\n // Exists for ease of use in views.\n // Format:\n /**\n {\n title: 'Klädstorlek',\n value: 'L'\n }\n */\n selectableSuggestedAttributes: [],\n selectableCategorySuggestedAttributes: [],\n selectableImageToColorSuggestedAttributes: [],\n // Attribute suggestions from the image-to-color service.\n imageToColorSuggestedAttributes: [],\n validationErrors: {},\n categorySuggestedAttributes: [],\n suggestionsExtractorType: ''\n};\n\nconst updateSelectableImageToColorSuggestedAttributes = (\n state: InitialState\n) => {\n state.selectableImageToColorSuggestedAttributes =\n filterSelectableSuggestions(\n state.imageToColorSuggestedAttributes,\n state.categoryAttributes\n );\n updateSelectableSuggestedAttributes(state);\n};\n\nconst updateSelectableSuggestedAttributes = (state: InitialState) => {\n state.selectableSuggestedAttributes = filterCombinedSelectableSuggestions(\n state.selectableCategorySuggestedAttributes,\n state.selectableImageToColorSuggestedAttributes,\n state.categoryAttributes\n );\n};\n\nconst attributeSlice = createSlice({\n name: 'attributes',\n initialState,\n reducers: {\n setCategoryAttributesSuggestions: (\n state,\n action: PayloadAction<{\n suggestedAttributes: CategorySuggestedAttribute[];\n suggestionsExtractorType: string;\n }>\n ) => {\n const { payload } = action;\n state.categorySuggestedAttributes = payload.suggestedAttributes;\n state.selectableCategorySuggestedAttributes =\n filterSelectableSuggestions(\n payload.suggestedAttributes,\n state.categoryAttributes\n );\n state.suggestionsExtractorType = payload.suggestionsExtractorType;\n updateSelectableSuggestedAttributes(state);\n state.validationErrors = validate(state);\n },\n autoFillSuggestedAttributes: (state) => {\n state.categoryAttributes.forEach((attribute) => {\n // Abort if the attribute has any option that's already active.\n // If loading a draft, an option might already be selected and we don't want to overwrite that.\n if (attribute.options.find((option) => option.isActive)) {\n return;\n }\n\n // only allow for certain attributes to be auto-filled. This is a limitation of the model as per 2024-08-15\n if (![1, 2, 3, 91].includes(attribute.id)) {\n return;\n }\n\n const suggestedAttributeValues =\n state.selectableSuggestedAttributes\n .find((suggested) => suggested.id === attribute.id)\n ?.values // do not auto-fill more values than the attribute allows\n .slice(0, attribute.maxNumberOfValues) || [];\n\n if (suggestedAttributeValues.length > 0) {\n attribute.options = attribute.options.map((option) => {\n if (suggestedAttributeValues.includes(option.value)) {\n return { ...option, isActive: true };\n }\n return option;\n });\n attribute.numberOfValuesSelected = attribute.options.filter(\n (option) => option.isActive\n ).length;\n }\n });\n },\n setImageToColorSuggestions: (\n state,\n action: PayloadAction<{\n suggestedAttributes: CategorySuggestedAttribute[];\n }>\n ) => {\n const { payload } = action;\n state.imageToColorSuggestedAttributes = payload.suggestedAttributes;\n updateSelectableImageToColorSuggestedAttributes(state);\n state.validationErrors = validate(state);\n },\n\n setCategoryAttributeOption: (\n state,\n action: PayloadAction<{\n attributeId: number;\n optionValue: string;\n activate: boolean;\n }>\n ) => {\n const { payload } = action;\n const attribute = state.categoryAttributes.find(\n (a) => a.id === payload.attributeId\n );\n if (attribute) {\n let options = attribute.options;\n if (\n !attribute.isMultiSelect ||\n (!payload.optionValue && !payload.activate)\n ) {\n options = options.map((o) =>\n !o.isActive ? o : { ...o, isActive: false }\n );\n }\n if (payload.optionValue) {\n options = options.map((o) =>\n o.value !== payload.optionValue\n ? o\n : { ...o, isActive: payload.activate }\n );\n }\n const numberOfValuesSelected = options.filter(\n (o) => o.isActive\n ).length;\n attribute.options = options;\n attribute.numberOfValuesSelected = numberOfValuesSelected;\n }\n state.validationErrors = validate(state);\n },\n updateCategoryAttributesOptionsStatuses: (state) => {\n state.categoryAttributes.forEach((a) => {\n const draftAttributeValues =\n state.draftAttributes.termAttributeValues?.find(\n (tav) => a.id === tav.id\n )?.values || [];\n a.options?.forEach((o) => {\n const isActive = draftAttributeValues.includes(o.value);\n o.isActive = isActive;\n });\n a.numberOfValuesSelected = a.options?.filter(\n (o) => o.isActive\n ).length;\n });\n state.validationErrors = validate(state);\n },\n setDraftAttributes: (state, action) => {\n state.draftAttributes = { ...action.payload };\n state.validationErrors = validate(state);\n },\n setCategoryAttributes: (state, action) => {\n state.categoryAttributes = [...action.payload];\n updateSelectableImageToColorSuggestedAttributes(state);\n state.validationErrors = validate(state);\n },\n resetAttributes: () => initialState,\n resetSelectedAttributes: (state) => {\n state.categoryAttributes.forEach((attribute) => {\n attribute.options?.forEach((option) => {\n option.isActive = false;\n });\n attribute.numberOfValuesSelected = 0;\n });\n },\n\n resetImageAttributeSuggestions: (state) => {\n state.imageToColorSuggestedAttributes =\n initialState.imageToColorSuggestedAttributes;\n updateSelectableImageToColorSuggestedAttributes(state);\n state.validationErrors = validate(state);\n }\n }\n});\n\nconst validate = (state: InitialState) => {\n const validationErrors: Record = {};\n state.categoryAttributes.forEach((attribute) => {\n if (attribute.minNumberOfValues === 0) {\n return;\n }\n if (attribute.options?.length === 0) {\n // There were no options to choose from.\n // May not happen when backend implementation is done,\n // we should not get an empty list of options.\n return;\n }\n const values = attribute.options?.reduce((acc, option) => {\n if (option.isActive) {\n acc.push(option.value);\n }\n return acc;\n }, [] as string[]);\n if (values?.length === 0 && attribute.backingField) {\n validationErrors[attribute.backingField] =\n `attributes:::syi_validation_missing_attribute_${attribute.backingField}`;\n }\n });\n return validationErrors;\n};\n\nconst { actions, reducer } = attributeSlice;\nexport const {\n setCategoryAttributesSuggestions,\n setImageToColorSuggestions,\n setCategoryAttributeOption,\n updateCategoryAttributesOptionsStatuses,\n setDraftAttributes,\n setCategoryAttributes,\n resetAttributes,\n resetSelectedAttributes,\n resetImageAttributeSuggestions,\n autoFillSuggestedAttributes\n} = actions;\n\nexport default reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport initData from 'tradera/legacy/static/packages/init-data';\nimport { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { AppDispatch, GetState } from 'tradera/state/configure-store';\n\nconst defaultRegionValue = 'EU';\n\ninterface BuyerRegion {\n value: string;\n text: string;\n}\n\ninterface BuyerRegionState {\n defaultBuyerRegion: BuyerRegion;\n availableAllowedBuyerRegions: BuyerRegion[];\n selectedBuyerRegion: string;\n selectedBuyerRegionText: string;\n availableAllowedBuyerRegionsForEditWithBids: boolean;\n isSetAllowedBuyerRegionToAtLeastEuEnabled: boolean;\n}\n\nconst initModuleGlobals = (): BuyerRegionState | null => {\n if (\n !initData.pageSpecificData ||\n !initData.pageSpecificData.allowedBuyerRegions\n ) {\n return null;\n }\n\n const availableAllowedBuyerRegions: BuyerRegion[] =\n initData.pageSpecificData.allowedBuyerRegions;\n const defaultBuyerRegion = availableAllowedBuyerRegions.find(\n (r: BuyerRegion) => r.value === defaultRegionValue\n ) as BuyerRegion;\n\n return {\n defaultBuyerRegion,\n availableAllowedBuyerRegions,\n selectedBuyerRegion: defaultBuyerRegion.value,\n selectedBuyerRegionText: defaultBuyerRegion.text,\n availableAllowedBuyerRegionsForEditWithBids: false,\n isSetAllowedBuyerRegionToAtLeastEuEnabled:\n initData?.featureSwitches?.[\n 'international-shipping-schenker-eu-default'\n ] || false\n };\n};\n\nconst buyerRegionSlice = createSlice({\n name: 'buyer-region',\n initialState: initModuleGlobals(),\n reducers: {\n setAllowedBuyerRegion: (\n state,\n action: PayloadAction<{ allowedBuyerRegion: string }>\n ) => {\n if (state) {\n const region = state.availableAllowedBuyerRegions.find(\n (r) => r.value === action.payload.allowedBuyerRegion\n );\n const { value, text } = region || state.defaultBuyerRegion;\n\n state.selectedBuyerRegion = value;\n state.selectedBuyerRegionText = text;\n }\n },\n setAvailableAllowedBuyerRegions: (\n state,\n action: PayloadAction<{ availableRegions: BuyerRegion[] }>\n ) => {\n if (state) {\n state.availableAllowedBuyerRegions =\n action.payload.availableRegions;\n state.availableAllowedBuyerRegionsForEditWithBids = true;\n }\n }\n }\n});\n\nexport const setAvailableAllowedBuyerRegions =\n () => (dispatch: AppDispatch, getState: GetState) => {\n const draftState = getSyiSlice(getState()).draft;\n const regionState = getSyiSlice(getState()).buyerRegion;\n if (regionState) {\n const regions = regionState.availableAllowedBuyerRegions;\n const selectedRegion = regionState.selectedBuyerRegion;\n const filters: { [key: string]: (region: BuyerRegion) => boolean } =\n {\n Sweden: (region) =>\n ['Sweden', 'Nordic', 'EU', 'International'].indexOf(\n region.value\n ) > -1,\n Nordic: (region) =>\n ['Nordic', 'International'].indexOf(region.value) > -1,\n EU: (region) =>\n ['EU', 'International'].indexOf(region.value) > -1,\n International: (region) =>\n ['International'].indexOf(region.value) > -1\n };\n const useFilter = draftState.draftReason === 'ChangeItemWithBids';\n const filter =\n (useFilter && filters[selectedRegion]) || (() => true);\n const availableRegions = regions.filter(filter);\n dispatch(\n buyerRegionSlice.actions.setAvailableAllowedBuyerRegions({\n availableRegions\n })\n );\n }\n };\n\nexport const { setAllowedBuyerRegion } = buyerRegionSlice.actions;\n\nexport default buyerRegionSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { createSlice } from '@reduxjs/toolkit';\nimport type { ItemDraftCharity } from 'tradera/state/services/types/webapi-selling-generated';\n\n// if on server there is no window object\nconst windowExists = typeof window !== 'undefined';\n\nconst isNewDraft = windowExists\n ? window.location?.pathname?.endsWith('new')\n : false;\nconst queryParams = windowExists\n ? new URLSearchParams(window.location?.search)\n : null;\nconst queryParamCharityId = queryParams?.get('charityId');\nconst preselectCharity = isNewDraft && queryParamCharityId;\n\ntype CharitySlice = ItemDraftCharity & {\n forceFreeShipping: boolean;\n isFreeShippingPaidByProvider: boolean;\n freeShippingPaidByProviderName: string | null;\n description: string | null;\n logoUrl: string | null;\n name: string | null;\n};\n\nconst initialStateShipping = {\n forceFreeShipping: false,\n isFreeShippingPaidByProvider: false,\n freeShippingPaidByProviderName: null\n};\n\nconst initialState: CharitySlice = {\n anonymous: true,\n charityId: preselectCharity ? Number(queryParamCharityId) : 0,\n description: null,\n logoUrl: null,\n name: null,\n percentageToDonate: preselectCharity ? 100 : 0,\n ...initialStateShipping\n};\n\nconst charitySlice = createSlice({\n name: 'charity',\n initialState,\n reducers: {\n setCharityId: (state, { payload }) => {\n state.charityId = payload.charityId;\n if (payload.charityId) {\n state.percentageToDonate = 100;\n } else {\n state.percentageToDonate = 0;\n }\n },\n setCharityInfo: (\n state,\n { payload: { name, description, logoUrl } }\n ) => {\n return { ...state, name, description, logoUrl };\n },\n setCharityAnonymous: (state, { payload }) => {\n state.anonymous = payload.anonymous;\n },\n setCharityFromDraft: (state, { payload }) => {\n state.charityId = payload.charityId;\n state.percentageToDonate = payload.percentageToDonate;\n state.anonymous = payload.anonymous;\n },\n resetCharity: () => {\n return { ...initialState };\n },\n setCharityShippingInfo: (state, { payload }) => {\n return { ...state, ...payload };\n }\n }\n});\n\nexport const {\n resetCharity,\n setCharityAnonymous,\n setCharityFromDraft,\n setCharityId,\n setCharityInfo,\n setCharityShippingInfo\n} = charitySlice.actions;\n\nexport default charitySlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\n\nimport dayjs from 'dayjs';\nimport pick from 'lodash/pick';\nimport { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport type {\n ItemAdditionalDescription,\n ItemDraftMetadata\n} from 'tradera/state/services/types/webapi-selling-generated';\n\nexport type DraftSlice = {\n isLoading: boolean;\n draftId?: string;\n draftReason?: string;\n memberId?: number;\n itemId?: number;\n restart?: boolean;\n publishedPromoted?: boolean;\n publishedHighlighted?: boolean;\n createdDate?: string;\n lastModifiedDate?: string;\n publishedDate?: unknown;\n publishedAsItemType?: unknown;\n reference?: string | null;\n referenceIsReadonly?: boolean;\n additionalDescriptions: ItemAdditionalDescription[];\n metadata?: ItemDraftMetadata;\n templateId?: string;\n templateName?: string;\n version?: number;\n isNewDraft?: unknown;\n descriptionLanguageCodeIso2?: string;\n currency?: string;\n resellPartner?: string;\n magicalSyiEnabled?: boolean;\n};\n\nconst initialState: DraftSlice = {\n isLoading: false,\n additionalDescriptions: []\n};\n\nconst draftSlice = createSlice({\n name: 'draft',\n initialState,\n reducers: {\n setDraftProperties(state, action: PayloadAction>) {\n const draft = action.payload;\n const referenceIsReadonly =\n draft.reference?.includes('Sello artnr') ?? false;\n if (JSON.stringify(state) != JSON.stringify(draft)) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n Object.assign(\n state,\n pick(draft, [\n 'draftId',\n 'draftReason',\n 'memberId',\n 'itemId',\n 'restart',\n 'publishedPromoted',\n 'publishedHighlighted',\n 'createdDate',\n 'lastModifiedDate',\n 'publishedDate',\n 'publishedAsItemType',\n 'reference',\n 'additionalDescriptions',\n 'metadata',\n 'templateId',\n 'templateName',\n 'version'\n ]),\n {\n referenceIsReadonly,\n isNewDraft: !draft.draftId\n }\n );\n },\n setDraftId(state, action: PayloadAction) {\n if (state.draftId !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.draftId = action.payload;\n },\n setRestart(state, action: PayloadAction) {\n if (state.restart !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.restart = action.payload;\n },\n disableRestart(state) {\n if (state.restart !== false) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.restart = false;\n },\n setReference(state, action: PayloadAction) {\n if (state.reference !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.reference = action.payload;\n },\n addAdditionalDescription(state, action: PayloadAction) {\n const newAdditionalDescriptions = [\n ...state.additionalDescriptions,\n { message: action.payload } as ItemAdditionalDescription\n ];\n if (\n JSON.stringify(state.additionalDescriptions) !=\n JSON.stringify(newAdditionalDescriptions)\n ) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.additionalDescriptions = newAdditionalDescriptions;\n },\n setDraftReason(state, action: PayloadAction) {\n if (state.draftReason !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.draftReason = action.payload;\n },\n ensureDraftReason(state) {\n if (!state.draftReason) {\n state.draftReason = 'NewItem';\n }\n },\n setDraftVersion(state, action: PayloadAction) {\n if (state.version !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.version = action.payload;\n },\n resetDraft(state) {\n if (JSON.stringify(state) != JSON.stringify(initialState)) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n Object.assign(state, initialState);\n },\n setDraftIsLoading(state, action: PayloadAction) {\n if (state.isLoading !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.isLoading = action.payload;\n },\n setCurrency(state, action: PayloadAction) {\n if (state.currency !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.currency = action.payload;\n },\n setResellPartner(state, action: PayloadAction) {\n if (state.resellPartner !== action.payload) {\n state.lastModifiedDate = dayjs().toISOString();\n }\n state.resellPartner = action.payload;\n },\n setMagicalSyiEnabled(state, action: PayloadAction) {\n state.magicalSyiEnabled = action.payload;\n }\n }\n});\n\nexport const {\n setDraftProperties,\n setDraftId,\n setRestart,\n disableRestart,\n setReference,\n addAdditionalDescription,\n setDraftReason,\n ensureDraftReason,\n setDraftVersion,\n resetDraft,\n setDraftIsLoading,\n setCurrency,\n setResellPartner,\n setMagicalSyiEnabled\n} = draftSlice.actions;\n\nexport default draftSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport type { DraftSlice } from './draft';\n\ntype EditState = {\n draftBeforeChange: DraftSlice | null;\n};\n\nconst initialState: EditState = {\n draftBeforeChange: null\n};\n\nconst editSlice = createSlice({\n name: 'edit',\n initialState,\n reducers: {\n setDraftBeforeChange: (state, action: PayloadAction) => {\n state.draftBeforeChange = action.payload;\n }\n }\n});\n\nexport const { setDraftBeforeChange } = editSlice.actions;\n\nexport default editSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport { hideAllErrors } from './syi';\nimport type {\n ItemDraftImage,\n TemplateImage\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport config from 'tradera/apps/syi/services/config';\n\n// This will be increased when supporting more images.\nexport const MAX_NUMBER_OF_IMAGES = config.isSyiTenImagesEnabled ? 10 : 5;\nexport const ALLOWED_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'];\n\nexport enum ITEM_CLASSIFICATIONS_FOR_PREDICTION {\n Books = 'books',\n Cameras = 'cameras',\n Clothes = 'clothes',\n DigitalMedia = 'digital_media',\n // Other means that we cannot do predictions for this category\n Other = 'other',\n Shoes = 'shoes',\n Stamps = 'stamps',\n Watches = 'watches'\n}\n\ntype ImagesSlice = {\n images: Image[];\n uploadingCount: number;\n validationError: string | null;\n uploadError: string | null;\n isUploadingWithApp: boolean;\n};\n\nexport type Rotation = 0 | 90 | 180 | 270;\ntype DraftImage = {\n imageId: string;\n isUploadedBySystem: boolean;\n imageUrl: string;\n rotationDegrees: Rotation;\n isListingImage: false;\n};\ntype ListingImage = {\n imageId: number;\n imageGroupId: number;\n filename: string;\n isUploadedBySystem: boolean;\n imageUrl: string;\n rotationDegrees: Rotation;\n isListingImage: true;\n};\ntype OtherImage = {\n imageId: string;\n imageUrl: string;\n isListingImage: false;\n rotationDegrees: Rotation;\n isUploadedBySystem: false;\n};\nexport type Image = DraftImage | ListingImage | OtherImage;\n\nconst initialState: ImagesSlice = {\n images: [],\n uploadingCount: 0,\n validationError: null,\n uploadError: null,\n isUploadingWithApp: false\n};\n\nexport function setValidation(state: ImagesSlice) {\n if (state.uploadingCount > 0) {\n state.validationError = 'syi_validation_images_uploading';\n } else if (state.images.length === 0) {\n state.validationError = 'syi_validation_images';\n } else if (state.images.every((image) => image.isUploadedBySystem)) {\n // If there isn't at least one image uploaded by the user (can be uploaded by Klarna for example)\n state.validationError = 'syi_validation_images_not_uploaded_by_user';\n } else {\n state.validationError = null;\n }\n}\n\nfunction resetUploadError(state: ImagesSlice) {\n state.uploadError = null;\n}\n\nconst imagesSlice = createSlice({\n name: 'images',\n initialState,\n reducers: {\n setDraftImages: (\n state,\n action: PayloadAction\n ) => {\n state.images = action.payload.map((image) => {\n if ('draftImage' in image && image.draftImage) {\n return {\n imageUrl: image.imageUrl,\n imageId: image.draftImage.imageId,\n isUploadedBySystem: image.draftImage.isUploadedBySystem,\n rotationDegrees: image.draftImage.rotationDegrees,\n isListingImage: false\n } as DraftImage;\n }\n if ('listingImage' in image && image.listingImage) {\n return {\n imageUrl: image.imageUrl,\n imageId: image.listingImage.imageId,\n imageGroupId: image.listingImage.imageGroupId,\n filename: image.listingImage.filename,\n isUploadedBySystem:\n image.listingImage.isUploadedBySystem,\n rotationDegrees: image.listingImage.rotationDegrees,\n isListingImage: true\n } as ListingImage;\n }\n if ('imageId' in image && image.imageId) {\n return {\n imageUrl: image.imageUrl,\n imageId: image.imageId,\n isUploadedBySystem: false,\n rotationDegrees: image.rotationDegrees,\n isListingImage: false\n } as OtherImage;\n }\n throw Error('Unknown image type');\n });\n resetUploadError(state);\n setValidation(state);\n },\n addImage: (\n state,\n action: PayloadAction<{\n imageUrl: string;\n imageId: string;\n }>\n ) => {\n if (state.images.length >= MAX_NUMBER_OF_IMAGES) {\n return;\n }\n\n const { imageId, imageUrl } = action.payload;\n state.images.push({\n imageId,\n imageUrl,\n isListingImage: false,\n isUploadedBySystem: false,\n rotationDegrees: 0\n });\n if (state.uploadingCount > 0) {\n state.uploadingCount--;\n }\n resetUploadError(state);\n setValidation(state);\n },\n replaceImage: (\n state,\n action: PayloadAction<{\n index: number;\n imageUrl: string;\n imageId: string;\n }>\n ) => {\n const { imageId, imageUrl, index } = action.payload;\n\n if (!state.images[index]) {\n throw Error('Replace image failed');\n }\n state.images[index] = {\n imageId,\n imageUrl,\n isListingImage: false,\n isUploadedBySystem: false,\n rotationDegrees: 0\n };\n resetUploadError(state);\n setValidation(state);\n },\n removeImage: (state, action: PayloadAction<{ index: number }>) => {\n const { index } = action.payload;\n if (!state.images[index]) {\n throw new Error('Remove failed, invalid position.');\n }\n\n state.images.splice(index, 1);\n resetUploadError(state);\n setValidation(state);\n },\n changeImagePosition: (\n state,\n action: PayloadAction<{ from: number; to: number }>\n ) => {\n const { from, to } = action.payload;\n if (!state.images[from] || !state.images[to]) {\n throw new Error(\n 'Change image position failed, invalid position.'\n );\n }\n\n const movedImage = state.images.splice(from, 1);\n state.images.splice(to, 0, movedImage[0]);\n resetUploadError(state);\n setValidation(state);\n },\n setImageRotation: (\n state,\n action: PayloadAction<{\n index: number;\n rotationDegrees: Rotation;\n }>\n ) => {\n const { index, rotationDegrees } = action.payload;\n if (!state.images[index]) {\n throw new Error('Set rotation failed, invalid position.');\n }\n\n state.images[index].rotationDegrees = rotationDegrees;\n resetUploadError(state);\n setValidation(state);\n },\n setImageUploadFailed: (\n state,\n action: PayloadAction<{ errorMessage: string }>\n ) => {\n const { errorMessage } = action.payload;\n if (state.uploadingCount > 0) {\n state.uploadingCount--;\n }\n state.uploadError = errorMessage;\n setValidation(state);\n },\n setImagesUploading: (\n state,\n action: PayloadAction<{ numberOfImages: number }>\n ) => {\n const { numberOfImages } = action.payload;\n state.uploadingCount = numberOfImages;\n resetUploadError(state);\n setValidation(state);\n },\n setMobileUpload: (\n state,\n action: PayloadAction<{ isUploadingWithApp: boolean }>\n ) => {\n const { isUploadingWithApp } = action.payload;\n state.isUploadingWithApp = isUploadingWithApp;\n\n if (action.payload.isUploadingWithApp) {\n resetUploadError(state);\n }\n }\n },\n extraReducers: (builder) => {\n builder.addCase(hideAllErrors.type, (state) => {\n state.uploadError = null;\n });\n }\n});\n\nexport default imagesSlice.reducer;\n\nexport const {\n setDraftImages,\n addImage,\n replaceImage,\n removeImage,\n changeImagePosition,\n setImageRotation,\n setImageUploadFailed,\n setImagesUploading,\n setMobileUpload\n} = imagesSlice.actions;\n","import { dayjs } from 'tradera/utils/date';\nimport userData from 'tradera/apps/syi/services/user-data';\nimport draftService from 'tradera/apps/syi/services/draft-service';\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport { disableRestart } from 'tradera/apps/syi/state/reducers/draft';\n\ntype ItemDurationSlice = {\n isRestartAvailable: boolean;\n durationDays: number | null | undefined;\n customEndTime?: string;\n allowZeroDayAuctions: boolean;\n validationErrors: { customEndTime?: string };\n};\n\nconst getEndDate = (durationDays: number, customEndTime?: string) => {\n const endDate = dayjs().startOf('date').add(durationDays, 'day');\n if (!customEndTime) return endDate;\n\n const [hours, minutes] = customEndTime.split(':').map(Number);\n return endDate.hour(hours).minute(minutes);\n};\n\nconst getValidationErrors = (\n durationDays: number,\n allowZeroDayAuctions: boolean,\n customEndTime?: string\n) => {\n let customEndTimeError = null;\n const endDate = getEndDate(durationDays, customEndTime);\n\n if (allowZeroDayAuctions) {\n const earliestEndDate = dayjs().add(5, 'minute');\n\n if (endDate.isBefore(earliestEndDate)) {\n customEndTimeError = 'syi_validation_duration_too_short_zero_day'; //'Din valda sluttid är för tidig. Annonser får avslutas tidigast efter 5 minuter.';\n }\n } else if (customEndTime) {\n const earliestEndDate = dayjs().add(3, 'day');\n\n if (endDate.isBefore(earliestEndDate, 'minute')) {\n customEndTimeError = 'syi_validation_duration_too_short'; //'Din valda sluttid är för tidig. Annonser får avslutas tidigast efter 72 timmar.';\n }\n }\n\n return customEndTimeError ? { customEndTime: customEndTimeError } : {};\n};\n\n/**\n * Maps the current hour to an specific end hour.\n * This is to default the end time to the evening slot.\n * @param startHour - The current hour (0-23)\n * @returns The end hour (18-21)\n */\nconst mapHourToEndHour = (startHour: number) => {\n // Add 1 to distribute hours evenly across 4 evening slots (18-21)\n const cycleIndex = startHour + 1;\n\n // Get value 1-4 to determine which evening hour to use\n const remainder = cycleIndex % 4 || 4;\n\n switch (remainder) {\n case 1:\n return 18;\n case 2:\n return 19;\n case 3:\n return 20;\n case 4:\n return 21;\n }\n};\n\nexport const getCustomEndTimeForWeekdays = (durationDays: number) => {\n const endDate = dayjs().add(durationDays, 'day');\n const endingOnWeekend = endDate.day() === 0 || endDate.day() === 6;\n const currentHour = dayjs().hour();\n\n // If ending on weekend or if current hour is already between 17 and 22 (inclusive), do nothing\n if (endingOnWeekend || (currentHour >= 17 && currentHour <= 22)) {\n return undefined;\n }\n\n const currentMinute = dayjs().minute();\n const endHour = mapHourToEndHour(currentHour);\n const customEndTime = `${endHour}:${currentMinute.toString().padStart(2, '0')}`;\n\n return customEndTime;\n};\n\nconst initialState: ItemDurationSlice = {\n isRestartAvailable: true,\n durationDays: userData?.defaultDrafts?.newItem?.durationDays,\n customEndTime: undefined,\n allowZeroDayAuctions: false,\n validationErrors: {}\n};\n\nconst newStateWithoutCampaignRelatedProps = (\n state: ItemDurationSlice,\n durationDays: number,\n allowZeroDayAuctions: boolean,\n customEndTime?: string\n) => {\n const validationErrors = getValidationErrors(\n durationDays,\n allowZeroDayAuctions,\n customEndTime\n );\n return {\n ...state,\n durationDays,\n customEndTime,\n validationErrors\n };\n};\n\nconst itemDurationSlice = createSlice({\n name: 'itemDuration',\n initialState,\n reducers: {\n setDurationDays: (\n state,\n action: PayloadAction<{\n durationDays: number;\n isChangeItem?: boolean;\n }>\n ) => {\n const { durationDays, isChangeItem } = action.payload;\n const validationErrors = isChangeItem\n ? {}\n : getValidationErrors(\n durationDays,\n state.allowZeroDayAuctions,\n state.customEndTime\n );\n return {\n ...state,\n durationDays,\n validationErrors\n };\n },\n setCustomEndTime: (\n state,\n action: PayloadAction<{\n customEndTime: string;\n isChangeItem?: boolean;\n } | null>\n ) => {\n const { customEndTime, isChangeItem } = action.payload || {};\n\n const validationErrors =\n customEndTime && !isChangeItem\n ? getValidationErrors(\n state.durationDays ?? 0,\n state.allowZeroDayAuctions,\n customEndTime\n )\n : {};\n\n return {\n ...state,\n customEndTime,\n validationErrors\n };\n },\n resetDurationAndEndTime: (state) => {\n const durationDays =\n draftService.getDefaultTemplateValue('durationDays');\n const customEndTime =\n draftService.getDefaultTemplateValue('customEndTime');\n const newState = newStateWithoutCampaignRelatedProps(\n state,\n durationDays ?? 0,\n state.allowZeroDayAuctions,\n customEndTime ?? undefined\n );\n\n return newState;\n },\n // maybe this can be removed ..\n resetCustomEndTime: (state) => {\n return {\n ...state,\n customEndTime: initialState.customEndTime\n };\n },\n disableZeroDayAuctions: (state) => {\n const durationDays =\n (state.durationDays ?? 0) >= 3 ? state.durationDays : 3;\n\n return {\n ...state,\n allowZeroDayAuctions: false,\n durationDays\n };\n },\n enableZeroDayAuctions: (state) => {\n return {\n ...state,\n allowZeroDayAuctions: true\n };\n },\n enableRestart: (state) => {\n return {\n ...state,\n isRestartAvailable: true\n };\n }\n },\n extraReducers(builder) {\n builder.addCase(disableRestart, (state) => {\n return {\n ...state,\n isRestartAvailable: false\n };\n });\n }\n});\n\nexport default itemDurationSlice.reducer;\n\nexport const {\n setDurationDays,\n setCustomEndTime,\n resetDurationAndEndTime,\n resetCustomEndTime,\n disableZeroDayAuctions,\n enableZeroDayAuctions,\n enableRestart\n} = itemDurationSlice.actions;\n","/* eslint-disable better-mutation/no-mutation */\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport { fetchOffsitePaymentDetection } from 'tradera/apps/syi/state/actions/long-description-actions';\n\nconst MAX_DESCRIPTION_LENGTH = 7000;\n\nfunction validate(textWithHtml: string | null) {\n if (textWithHtml && textWithHtml.length > MAX_DESCRIPTION_LENGTH) {\n return 'syi_validation_description_to_long';\n }\n\n const elm = document.createElement('div');\n elm.innerHTML = textWithHtml || '';\n\n if (elm.textContent) {\n return elm.textContent.trim() !== ''\n ? null\n : 'syi_validation_missing_description';\n } else if (elm.innerText) {\n return elm.innerText.trim() !== ''\n ? null\n : 'syi_validation_missing_description';\n }\n return 'syi_validation_missing_description';\n}\n\n// By ensuring that shortDescription is always a string makes\n// it easy to know when it has really changed to something significant.\nfunction ensureString(s?: string | null) {\n return !s ? '' : s;\n}\n\ntype longDescriptionSlice = {\n longDescription: string | null;\n validationError: string | null;\n isCurrentDescriptionFromDraft: boolean;\n fromDraftCounter: number;\n isOffsitePaymentDetected?: boolean;\n};\nconst initialState: longDescriptionSlice = {\n longDescription: null,\n validationError: null,\n isCurrentDescriptionFromDraft: false,\n fromDraftCounter: 0,\n isOffsitePaymentDetected: false\n};\n\nconst longDescriptionSlice = createSlice({\n name: 'longDescription',\n initialState,\n reducers: {\n setLongDescription: (state, action: PayloadAction) => {\n state.isCurrentDescriptionFromDraft = false;\n state.longDescription = ensureString(action.payload);\n state.validationError = validate(action.payload);\n },\n setLongDescriptionFromDraft: (\n state,\n action: PayloadAction\n ) => {\n state.isCurrentDescriptionFromDraft = true;\n state.longDescription = ensureString(action.payload);\n state.validationError = validate(action.payload);\n state.fromDraftCounter += 1;\n },\n resetLongDescription: (state) => {\n const defaultValue = null;\n state.isCurrentDescriptionFromDraft = false;\n state.longDescription = defaultValue;\n state.validationError = validate(defaultValue);\n }\n },\n extraReducers: (builder) => {\n builder.addCase(\n fetchOffsitePaymentDetection.fulfilled,\n (state, action) => {\n state.isOffsitePaymentDetected =\n action?.payload?.isOffsitePaymentDetected || false;\n }\n );\n }\n});\n\nexport const {\n setLongDescription,\n setLongDescriptionFromDraft,\n resetLongDescription\n} = longDescriptionSlice.actions;\n\nexport default longDescriptionSlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\nimport userData from 'tradera/apps/syi/services/user-data';\nimport config from 'tradera/apps/syi/services/config';\n\nconst setValidationError = (condition: boolean | undefined) =>\n condition ? 'syi_summary_terms_active_consent_missing_error' : null;\n\nconst validate = (state: MemberConsentState) => {\n return {\n ...state,\n validationError: setValidationError(!state.hasTraderaPayConsent)\n };\n};\n\ntype MemberConsentState = {\n isUnderLicense?: boolean;\n hasTraderaPayConsent?: boolean;\n initalConsentGiven?: boolean;\n shouldGiveConsent?: boolean;\n needsConsentOfTraderaPayAgreement?: string;\n signatoryVerificationRequired?: boolean;\n validationError?: string | null;\n};\n\nconst createInitalState = (): MemberConsentState => {\n if (!userData || !userData.consent || !userData.braintree) {\n // seems syi is not loaded, return empty object\n return {};\n }\n // Companies need to verify signatory when consent to money transfer license.\n // And this is not possible on SYI and should therefor not be shown or validated.\n const shouldBypassConsent = userData.consent.signatoryVerificationRequired;\n\n const shouldGiveConsent = config.isSyiMemberConsentEnabled;\n const hasTraderaPayConsent = !!userData.consent.hasTraderaPayConsent;\n const needsConsentOfTraderaPayAgreement =\n userData.consent.needsConsentOfTraderaPayAgreement;\n const hasValidationError =\n shouldGiveConsent &&\n !shouldBypassConsent &&\n !userData.consent.hasTraderaPayConsent;\n\n return {\n isUnderLicense: userData.consent.isUnderLicense,\n hasTraderaPayConsent,\n initalConsentGiven: hasTraderaPayConsent,\n shouldGiveConsent,\n needsConsentOfTraderaPayAgreement,\n signatoryVerificationRequired:\n userData.consent.signatoryVerificationRequired,\n validationError: setValidationError(hasValidationError)\n };\n};\n\nconst initialState = createInitalState();\n\nconst memberConsentSlice = createSlice({\n name: 'memberConsent',\n initialState,\n reducers: {\n setTraderaPayConsent: (state, action) =>\n validate({\n ...state,\n hasTraderaPayConsent: action.payload\n })\n }\n});\n\nexport const { setTraderaPayConsent } = memberConsentSlice.actions;\nexport default memberConsentSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport {\n fetchClassificationFromFirstImage,\n fetchPredictionsFromImages\n} from 'tradera/apps/syi/state/actions/predictions-actions';\nimport { ITEM_CLASSIFICATIONS_FOR_PREDICTION } from 'tradera/apps/syi/state/reducers/images';\nimport type { ClassifyFromDraftImageApiResponse } from 'tradera/state/services/types/webapi-selling-generated';\n\nconst setValidationError = (condition: boolean | undefined) =>\n condition ? 'syi_validation_prediction_publish_consent' : null;\n\nconst validate = (state: PredictionsState) => {\n return {\n ...state,\n validationError: setValidationError(!state.hasAutoFillConsent)\n };\n};\n\ntype PredictionsState = {\n isLoadingPredictions: boolean;\n shortDescription?: string;\n longDescription?: string;\n shouldSuggestShortDescription?: boolean;\n shouldSuggestLongDescription?: boolean;\n numProcessedImages?: number;\n aiProcessingTime?: number;\n\n classification: ClassifyFromDraftImageApiResponse | null;\n canGetPredictionFromImages: boolean;\n isClassificationPending: boolean;\n hasUsedPredictedDescription: boolean;\n hasAutoFillConsent: boolean;\n validationError?: string | null;\n hasUsedAutoFill: boolean;\n};\n\nconst initialState: PredictionsState = {\n isLoadingPredictions: false,\n classification: null,\n canGetPredictionFromImages: false,\n isClassificationPending: false,\n hasUsedAutoFill: false,\n hasUsedPredictedDescription: false,\n hasAutoFillConsent: false,\n shortDescription: undefined,\n validationError: null\n};\n\nconst predictionsSlice = createSlice({\n name: 'predictions',\n initialState,\n reducers: {\n setPredictedShortDescription: (state, action) => {\n state.shortDescription = action.payload;\n },\n setPredictedLongDescription: (state, action) => {\n state.longDescription = action.payload;\n },\n setShouldSuggestShortDescription: (state, action) => {\n state.shouldSuggestShortDescription = action.payload;\n },\n setShouldSuggestLongDescription: (state, action) => {\n state.shouldSuggestLongDescription = action.payload;\n },\n setHasUsedPredictedDescription: (\n state,\n action: PayloadAction\n ) =>\n validate({\n ...state,\n hasUsedAutoFill: action.payload,\n hasUsedPredictedDescription: action.payload,\n hasAutoFillConsent: false\n }),\n setHasUsedAutoFill: (state, action: PayloadAction) =>\n validate({\n ...state,\n hasUsedAutoFill: action.payload\n }),\n setNumProcessedImages: (state, action) => {\n state.numProcessedImages = action.payload;\n },\n setAiProcessingTime: (state, action) => {\n state.aiProcessingTime = action.payload;\n },\n setHasAutoFillConsent: (state, action) =>\n validate({\n ...state,\n hasAutoFillConsent: action.payload\n })\n },\n extraReducers: (builder) => {\n builder.addCase(fetchClassificationFromFirstImage.pending, (state) => {\n state.classification = null;\n state.isClassificationPending = true;\n state.canGetPredictionFromImages = false;\n });\n builder.addCase(\n fetchClassificationFromFirstImage.fulfilled,\n (state, action) => {\n state.classification = action.payload;\n state.isClassificationPending = false;\n state.canGetPredictionFromImages =\n action.payload.itemClassification !==\n ITEM_CLASSIFICATIONS_FOR_PREDICTION.Other;\n }\n );\n builder.addCase(fetchClassificationFromFirstImage.rejected, (state) => {\n state.classification = null;\n state.isClassificationPending = false;\n state.canGetPredictionFromImages = false;\n });\n builder.addCase(fetchPredictionsFromImages.pending, (state) => {\n state.isLoadingPredictions = true;\n });\n builder.addCase(fetchPredictionsFromImages.fulfilled, (state) => {\n state.isLoadingPredictions = false;\n });\n builder.addCase(fetchPredictionsFromImages.rejected, (state) => {\n state.isLoadingPredictions = false;\n });\n }\n});\n\nexport const {\n setPredictedShortDescription,\n setPredictedLongDescription,\n setShouldSuggestShortDescription,\n setShouldSuggestLongDescription,\n setHasUsedAutoFill,\n setHasUsedPredictedDescription,\n setNumProcessedImages,\n setAiProcessingTime,\n setHasAutoFillConsent\n} = predictionsSlice.actions;\nexport default predictionsSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport { getSelectedShippingProducts } from './shipping-selectors';\nimport { validate } from './validate';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n ProductsPerWeightSpan,\n ShippingOption,\n ShippingProduct\n} from 'tradera/state/services/types/webapi-selling-generated';\nimport type { ShippingRecommendation } from 'tradera/apps/syi/services/shipping-provider-service';\n\nconst getUuid = () => uuidv4();\n\nexport type DecoratedShippingProduct = ShippingProduct & {\n cost: number | null;\n productId: number;\n type: string;\n uuid: string;\n outage?: boolean;\n};\n\nexport type DecoratedProductsPerWeightSpan = Omit<\n ProductsPerWeightSpan,\n 'products'\n> & {\n products: DecoratedShippingProduct[];\n};\n\ntype ShippingState = {\n validationErrors: Record;\n globalValidationError: string | null;\n shippingByWeight: DecoratedProductsPerWeightSpan[] | undefined;\n shippingRecommendations: ShippingRecommendation[];\n recommendedWeight: number | null;\n selectedShippingOptions: DecoratedShippingProduct[];\n selectedShippingSize: string | null;\n shippingOptionsLoading: boolean;\n shippingOptionsError: boolean;\n offerTakeaway: boolean;\n offerShipping: boolean;\n fromCountry: string | null;\n packagingCost: number | null;\n};\n\nconst initialState: ShippingState = validate({\n validationErrors: {},\n globalValidationError: null,\n shippingByWeight: [],\n shippingRecommendations: [],\n recommendedWeight: null,\n selectedShippingOptions: [],\n selectedShippingSize: null,\n shippingOptionsLoading: false,\n shippingOptionsError: false,\n offerTakeaway: false,\n offerShipping: false,\n fromCountry: null\n});\n\nconst shippingContainsTakeaway = (shippingOptions: ShippingOption[]) =>\n shippingOptions.some(\n (shippingOption) =>\n shippingOption.type === 'Takeaway' ||\n shippingOption.type === 'TakeawayOnly'\n );\n\nconst shippingContainsProduct = (shippingOptions: ShippingOption[]) =>\n shippingOptions.some(\n (shippingOption) =>\n shippingOption.type !== 'Takeaway' &&\n shippingOption.type !== 'TakeawayOnly'\n );\n\nconst shippingSlice = createSlice({\n name: 'shipping',\n initialState,\n reducers: {\n resetSelectedShippingOptions: (state) => {\n state.selectedShippingOptions = [];\n state.offerShipping = false;\n state.offerTakeaway = false;\n state.selectedShippingSize = null;\n return validate(state);\n },\n setShippingOptionsByWeight: (\n state,\n action: PayloadAction<{\n productsPerWeightSpan:\n | ProductsPerWeightSpan[]\n | null\n | undefined;\n shippingOptions: ShippingOption[];\n }>\n ) => {\n const { productsPerWeightSpan, shippingOptions } = action.payload;\n\n state.offerShipping = shippingContainsProduct(shippingOptions);\n state.offerTakeaway = shippingContainsTakeaway(shippingOptions);\n\n //Decorate products with cost, type & productId for draft api:\n const productsDecorated = productsPerWeightSpan?.map(\n (weightClass) => {\n const productsWithDecoration =\n weightClass.products?.map(\n (product) => ({\n ...product,\n cost: product.price,\n productId: product.id,\n type: product.providerId || '',\n uuid: getUuid()\n })\n );\n return {\n ...weightClass,\n products: productsWithDecoration ?? []\n };\n }\n );\n\n state.shippingByWeight = productsDecorated;\n state.selectedShippingOptions = getSelectedShippingProducts(\n productsDecorated,\n shippingOptions,\n state.offerTakeaway\n );\n state.shippingOptionsLoading = false;\n state.shippingOptionsError = false;\n return validate(state);\n },\n setShippingOptionsLoading: (state, action: PayloadAction) => {\n state.shippingOptionsLoading = action.payload;\n return validate(state);\n },\n setShippingOptionSelected: (\n state,\n action: PayloadAction\n ) => {\n const { payload } = action;\n\n const selectedOptions = getSelectedShippingProducts(\n state.shippingByWeight,\n payload,\n state.offerTakeaway\n );\n\n if (shippingContainsProduct(selectedOptions)) {\n state.offerShipping = true;\n } else {\n state.offerShipping = false;\n }\n\n state.selectedShippingOptions = selectedOptions;\n\n return validate(state);\n },\n setSelectedShippingSize: (\n state,\n action: PayloadAction\n ) => {\n state.selectedShippingSize = action.payload;\n return validate(state);\n },\n setPackagingCost: (state, action: PayloadAction) => {\n state.packagingCost = action.payload;\n return validate(state);\n },\n setTakeawaySelected: (\n state,\n action: PayloadAction<{ offerTakeaway: boolean }>\n ) => {\n state.offerTakeaway = action.payload.offerTakeaway;\n state.selectedShippingOptions = getSelectedShippingProducts(\n state.shippingByWeight,\n state.selectedShippingOptions,\n state.offerTakeaway\n );\n\n return validate(state);\n },\n setShippingOptionsError: (state) => {\n state.shippingOptionsLoading = false;\n state.shippingOptionsError = true;\n\n return validate(state);\n },\n setShippingFromCountry: (\n state,\n action: PayloadAction<{ fromCountry: string }>\n ) => {\n state.fromCountry = action.payload.fromCountry;\n },\n clearShippingRecommendations: (state) => {\n state.recommendedWeight = initialState.recommendedWeight;\n state.shippingRecommendations =\n initialState.shippingRecommendations;\n },\n setShippingRecommendations: (\n state,\n action: PayloadAction<{\n recommendedWeight: number;\n shippingRecommendations: ShippingRecommendation[];\n }>\n ) => {\n const { recommendedWeight, shippingRecommendations } =\n action.payload;\n\n state.recommendedWeight = recommendedWeight;\n state.shippingRecommendations = shippingRecommendations;\n return validate(state);\n }\n }\n});\n\nexport const {\n setShippingFromCountry,\n setShippingOptionsByWeight,\n setShippingOptionsError,\n setShippingRecommendations,\n clearShippingRecommendations,\n setTakeawaySelected,\n setShippingOptionSelected,\n resetSelectedShippingOptions,\n setShippingOptionsLoading,\n setSelectedShippingSize,\n setPackagingCost\n} = shippingSlice.actions;\n\nexport default shippingSlice.reducer;\n","import { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport { isDenmarkCountryCode } from 'tradera/localization/countrycode';\nimport initData from 'tradera/legacy/static/packages/init-data';\n\ntype ShortDescriptionSlice = {\n shortDescription: string | null;\n validationError?: string | null;\n descriptionLanguageCodeIso2: string | null;\n isDescriptionLanguageCodeIso2ChangeAvailable: boolean;\n};\nconst initialState: ShortDescriptionSlice = {\n shortDescription: null,\n validationError: null,\n descriptionLanguageCodeIso2: null,\n isDescriptionLanguageCodeIso2ChangeAvailable:\n initData &&\n initData.memberCountryCodeIso2 &&\n isDenmarkCountryCode(initData.memberCountryCodeIso2)\n};\n\nconst getValidationError = (state: ShortDescriptionSlice) => {\n if (!state.shortDescription || state.shortDescription.trim() === '') {\n return 'syi_validation_missing_title';\n }\n\n if (\n state.isDescriptionLanguageCodeIso2ChangeAvailable &&\n !state.descriptionLanguageCodeIso2\n ) {\n return 'syi_validation_missing_descriptionLanguageCodeIso2';\n }\n};\n\nconst validate = (state: ShortDescriptionSlice) => ({\n ...state,\n validationError: getValidationError(state)\n});\n\nconst shortDescriptionSlice = createSlice({\n name: 'shortDescription',\n initialState,\n reducers: {\n setShortDescription: (state, action: PayloadAction) =>\n validate({ ...state, shortDescription: action.payload }),\n resetShortDescription: (state) =>\n validate({ ...state, shortDescription: null }),\n setDescriptionLanguageCodeIso2: (\n state,\n action: PayloadAction\n ) =>\n validate({\n ...state,\n descriptionLanguageCodeIso2: action.payload\n })\n }\n});\n\nexport const {\n setShortDescription,\n resetShortDescription,\n setDescriptionLanguageCodeIso2\n} = shortDescriptionSlice.actions;\n\nexport default shortDescriptionSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport { createSlice, type PayloadAction } from '@reduxjs/toolkit';\nimport type {\n ItemDraftResponse,\n GetCategoryRestrictionApiResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\n\ntype SyiState = {\n creationStart: number | null;\n allErrorsVisible: boolean;\n isEditOfPublishedItem: boolean;\n publishPending: boolean;\n publishFailed: boolean;\n publishFailedReasonDisplayText: string | null;\n publishedItemPendingVip: { itemId: string } | null;\n publishedItem: ItemDraftResponse | null;\n openModal: string | null;\n openModalData: null;\n autoSaveEnabled: boolean;\n draftCanBeResumed: boolean;\n itemUpdating: boolean;\n itemUpdated: boolean;\n isDraftSaved: boolean;\n publishDelayed: boolean;\n categoryRestriction: GetCategoryRestrictionApiResponse | null;\n fadeUi: boolean;\n};\n\nconst initialState: SyiState = {\n creationStart: null,\n allErrorsVisible: false,\n isEditOfPublishedItem: false,\n publishPending: false,\n publishFailed: false,\n publishFailedReasonDisplayText: null,\n publishedItemPendingVip: null,\n publishedItem: null,\n openModal: null,\n openModalData: null,\n autoSaveEnabled: false,\n draftCanBeResumed: false,\n itemUpdating: false,\n itemUpdated: false,\n isDraftSaved: false,\n publishDelayed: false,\n categoryRestriction: null,\n fadeUi: false\n};\n\nconst syiSlice = createSlice({\n name: 'syi',\n initialState,\n reducers: {\n resetSyi: () => initialState,\n /**\n *\n * @param action Epoch\n */\n setCreationStart: (state, action: PayloadAction) => {\n state.creationStart = action.payload;\n },\n showAllErrors: (state) => {\n state.allErrorsVisible = true;\n },\n hideAllErrors: (state) => {\n state.allErrorsVisible = false;\n },\n setIsEditOfPublishedItem: (state, action: PayloadAction) => {\n state.isEditOfPublishedItem = action.payload;\n },\n setPublishedItemPendingVip: (\n state,\n action: PayloadAction<{ itemId: string }>\n ) => {\n state.publishedItemPendingVip = action.payload;\n state.publishedItem = null;\n state.publishFailed = false;\n state.publishFailedReasonDisplayText = null;\n state.publishPending = false;\n state.publishDelayed = false;\n },\n setPublishedItemDelayed: (\n state,\n action: PayloadAction<{ itemId: string }>\n ) => {\n state.publishedItemPendingVip = action.payload;\n state.publishedItem = null;\n state.publishFailed = false;\n state.publishFailedReasonDisplayText = null;\n state.publishPending = false;\n state.publishDelayed = true;\n },\n setPublishedItem: (state, action: PayloadAction) => {\n state.publishedItem = action.payload;\n state.publishedItemPendingVip = null;\n state.publishFailed = false;\n state.publishFailedReasonDisplayText = null;\n state.publishPending = false;\n state.publishDelayed = false;\n },\n setPublishFailed: (state, action: PayloadAction) => {\n state.publishedItem = null;\n state.publishedItemPendingVip = null;\n state.publishFailed = true;\n state.publishFailedReasonDisplayText = action.payload;\n state.publishPending = false;\n state.publishDelayed = false;\n },\n setPublishPending: (state) => {\n state.publishedItem = null;\n state.publishedItemPendingVip = null;\n state.publishFailed = false;\n state.publishFailedReasonDisplayText = null;\n state.publishPending = true;\n state.publishDelayed = false;\n },\n setCategoryRestriction: (\n state,\n action: PayloadAction\n ) => {\n state.categoryRestriction = action.payload;\n },\n toggleModal: (state, action: PayloadAction) => {\n state.openModal =\n state.openModal === action.payload ? null : action.payload;\n },\n enableAutoSave: (state) => {\n state.autoSaveEnabled = true;\n },\n disableAutoSave: (state) => {\n state.autoSaveEnabled = false;\n },\n setDraftCanBeResumed: (state, action: PayloadAction) => {\n state.draftCanBeResumed = action.payload;\n },\n setItemUpdating: (state, action: PayloadAction) => {\n state.itemUpdating = action.payload;\n },\n setItemUpdated: (state, action: PayloadAction) => {\n state.itemUpdated = action.payload;\n },\n setIsDraftSaved: (state, action: PayloadAction) => {\n state.isDraftSaved = action.payload;\n },\n setFadeUi: (state, action: PayloadAction) => {\n state.fadeUi = action.payload;\n }\n }\n});\n\nexport const {\n resetSyi,\n setCreationStart,\n showAllErrors,\n hideAllErrors,\n setIsEditOfPublishedItem,\n setPublishedItemPendingVip,\n setPublishedItemDelayed,\n setPublishedItem,\n setPublishFailed,\n setPublishPending,\n setCategoryRestriction,\n toggleModal,\n enableAutoSave,\n disableAutoSave,\n setDraftCanBeResumed,\n setItemUpdating,\n setItemUpdated,\n setIsDraftSaved,\n setFadeUi\n} = syiSlice.actions;\n\nexport default syiSlice.reducer;\n","/* eslint-disable better-mutation/no-mutation */\nimport { type PayloadAction, createSlice } from '@reduxjs/toolkit';\nimport type { ItemDraftResponse } from 'tradera/state/services/types/webapi-selling-generated';\ntype TemplateState = {\n ignoreProperties: (keyof ItemDraftResponse)[];\n};\n\nconst initialState: TemplateState = {\n ignoreProperties: []\n};\n\nconst templateReducer = createSlice({\n name: 'template',\n initialState,\n reducers: {\n resetIgnoreProperties: (state) => {\n state.ignoreProperties = [];\n },\n addIgnoreProperties: (\n state,\n action: PayloadAction>\n ) => {\n state.ignoreProperties = [\n ...new Set([...state.ignoreProperties, ...action.payload])\n ];\n },\n removeIgnoreProperties: (\n state,\n action: PayloadAction>\n ) => {\n state.ignoreProperties = state.ignoreProperties.filter(\n (prop) => !action.payload.includes(prop)\n );\n }\n }\n});\n\nexport const {\n resetIgnoreProperties,\n addIgnoreProperties,\n removeIgnoreProperties\n} = templateReducer.actions;\n\nexport default templateReducer.reducer;\n","import { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { RootState } from 'tradera/state/configure-store';\n\nexport const selectMagicalSyiSettngEnabled = (state: RootState) =>\n !!getSyiSlice(state).draft.magicalSyiEnabled;\n\nexport const selectDraftId = (state: RootState) =>\n getSyiSlice(state).draft.draftId;\n\nexport const selectDraft = (state: RootState) => getSyiSlice(state).draft;\n","import { createSelector } from '@reduxjs/toolkit';\nimport { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { RootState } from 'tradera/state/configure-store';\n\nexport const selectIsUploadingFirstImage = createSelector(\n (state: RootState) => getSyiSlice(state).images.uploadingCount,\n (state: RootState) => getSyiSlice(state).images.images.length,\n (uploadingCount, imageCount) => uploadingCount > 0 && imageCount === 0\n);\n\nexport const selectImageIds = createSelector(\n (state: RootState) => getSyiSlice(state).images.images,\n (images) => images.map((image) => image.imageId)\n);\n","import { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { RootState } from 'tradera/state/configure-store';\n\nexport const selectIsClassificationPending = (state: RootState) =>\n getSyiSlice(state).predictions.isClassificationPending;\n\nexport const selectCanGetPredictionFromImages = (state: RootState) =>\n getSyiSlice(state).predictions.canGetPredictionFromImages;\n\nexport const selectClassificationResponse = (state: RootState) =>\n getSyiSlice(state).predictions.classification;\n\nexport const selectIsLoadingPredictions = (state: RootState) =>\n getSyiSlice(state).predictions.isLoadingPredictions;\n\nexport const selectPredictedShortDescription = (state: RootState) =>\n getSyiSlice(state).predictions.shortDescription;\n\nexport const selectPredictedLongDescription = (state: RootState) =>\n getSyiSlice(state).predictions.longDescription;\n\nexport const selectShouldSuggestShortDescription = (state: RootState) =>\n getSyiSlice(state).predictions.shouldSuggestShortDescription;\n\nexport const selectShouldSuggestLongDescription = (state: RootState) =>\n getSyiSlice(state).predictions.shouldSuggestLongDescription;\n\nexport const selectHasUsedPredictedDescription = (state: RootState) =>\n getSyiSlice(state).predictions.hasUsedPredictedDescription;\n\nexport const selectHasUsedAutoFill = (state: RootState) =>\n getSyiSlice(state).predictions.hasUsedAutoFill;\n","import { getSyiSlice } from 'tradera/apps/syi/state/selectors/syi';\nimport type { RootState } from 'tradera/state/configure-store';\n\nexport const selectPrice = (state: RootState) => getSyiSlice(state).price;\nexport const selectIsPureBinSelected = (state: RootState) =>\n getSyiSlice(state).price.isPureBinSelected;\n","import type { RootState } from 'tradera/state/configure-store';\n\nexport const getSyiSlice = (state: RootState) => state.views.syi;\nexport const selectShortDescription = (state: RootState) =>\n getSyiSlice(state).shortDescription.shortDescription;\n\nexport const selectLongDescription = (state: RootState) =>\n getSyiSlice(state).longDescription.longDescription;\n\nexport const selectItemIdFromDraft = (state: RootState) =>\n getSyiSlice(state).draft?.itemId || undefined;\n\nexport const selectFadeUi = (state: RootState) =>\n getSyiSlice(state).syi.fadeUi || false;\n\nexport const selectIsDraftSaved = (state: RootState) =>\n getSyiSlice(state).syi.isDraftSaved || false;\n","import { createApi } from '@reduxjs/toolkit/query/react';\nimport { isomorphicWebApiBaseQuery } from 'tradera/state/services/utils/webapi-base-query';\nimport type {\n DeleteTemplatesApiRequest,\n GetTemplatesApiResponse\n} from 'tradera/state/services/types/webapi-selling-generated';\n\nexport enum Tags {\n TEMPLATES_LIST = 'TEMPLATES_LIST'\n}\n\nexport const templatesApi = createApi({\n reducerPath: 'templatesApi',\n baseQuery: isomorphicWebApiBaseQuery,\n tagTypes: Object.keys(Tags),\n endpoints: (builder) => ({\n deleteTemplate: builder.mutation({\n invalidatesTags: [Tags.TEMPLATES_LIST],\n query: (parameters) => {\n return {\n url: '/api/webapi/selling/templates',\n method: 'DELETE',\n body: parameters\n };\n }\n }),\n loadTemplates: builder.query({\n providesTags: [Tags.TEMPLATES_LIST],\n query: () => '/api/webapi/selling/templates?take=100'\n })\n })\n});\n\nexport const { useDeleteTemplateMutation, useLoadTemplatesQuery, util } =\n templatesApi;\n","import { useTranslator } from 'tradera/lang/translate';\nimport { ITEM_STATES } from 'tradera/state/views/view-item/constants';\nimport { AnimateOnValueChange } from './animate-on-value-change';\nimport LocalizedPrice from 'tradera/localization/localized-price';\nimport { Button } from 'tradera/components/atoms/button/button';\nimport type { PaymentCalculations } from 'tradera/state/services/types/webapi-browse-generated';\nimport { MandatoryBuyerProtectionInfo } from 'tradera/apps/tradera/components/vip/bidding/mandatory-buyer-protection-info';\nimport type { BuyerProtectionModalType } from 'tradera/apps/tradera/components/vip/seller-details/buyer-protection-info-modal';\nimport { classNames } from 'tradera/utils/class-names';\n\ntype BidDetailsProps = {\n bidCount?: number | null;\n itemState: ITEM_STATES | null;\n leadingBidAmount?: number | null;\n onShowBids: () => void;\n setBuyerProtectionModal: (type: BuyerProtectionModalType) => void;\n openingBid?: number | null;\n finalPrice?: number | null;\n paymentCalculations: PaymentCalculations;\n reservePriceReached?: boolean;\n};\n\nexport const BidDetails = ({\n bidCount,\n itemState,\n leadingBidAmount,\n onShowBids,\n setBuyerProtectionModal,\n openingBid,\n finalPrice,\n paymentCalculations,\n reservePriceReached\n}: BidDetailsProps) => {\n const { t } = useTranslator();\n const itemIsActive =\n itemState === ITEM_STATES.ONGOING_AUCTION_BIN ||\n itemState === ITEM_STATES.ONGOING_AUCTION;\n\n const hasBids = !!bidCount && bidCount > 0;\n const amountDetails = getAmountDetails(\n itemState,\n leadingBidAmount,\n openingBid,\n hasBids,\n finalPrice,\n paymentCalculations.paymentAmountForBid || 0,\n paymentCalculations.paymentAmountForFixedPrice || 0\n );\n\n const amountTitle = (\n

\n {t(amountDetails.title)}\n

\n );\n\n const amountValue = (\n \n \n \n \n

\n );\n\n const bidValue = (\n

\n ∙\n {hasBids ? (\n {\n e?.preventDefault();\n onShowBids();\n }}>\n {bidCount} {t('vip_bid')}\n \n ) : (\n \n {bidCount} {t('vip_bid')}\n \n )}\n

\n );\n\n const showBidCount =\n itemState !== ITEM_STATES.ENDED_AUCTION_BIN_BOUGHT_AS_BIN;\n\n return (\n <>\n \n
\n
\n {amountTitle}\n {showBidCount && bidValue}\n
\n
{amountValue}
\n
\n {paymentCalculations.isBuyerProtectionMandatory && (\n \n )}\n \n \n );\n};\n\nexport const getAmountDetails = (\n itemState: ITEM_STATES | null,\n leadingBid?: number | null,\n openingBid?: number | null,\n hasBids?: boolean,\n finalPrice?: number | null,\n paymentAmountForBid?: number | null,\n paymentAmountForFixedPrice?: number | null\n) => {\n if (itemState === ITEM_STATES.ENDED_AUCTION_WITH_WINNING_BID) {\n return {\n title: 'vip_finalPrice',\n amount: finalPrice,\n amountIncludingBuyerProtection: paymentAmountForBid\n };\n }\n\n if (finalPrice && finalPrice > 0) {\n return {\n title: 'vip_soldFor',\n amount: finalPrice,\n amountIncludingBuyerProtection: paymentAmountForFixedPrice\n };\n }\n\n if (hasBids) {\n return {\n title: 'vip_leadingBid',\n amount: leadingBid,\n amountIncludingBuyerProtection: paymentAmountForBid\n };\n }\n return {\n title: 'vip_openingBid',\n amount: openingBid,\n amountIncludingBuyerProtection: paymentAmountForBid\n };\n};\n","import type React from 'react';\nimport { forwardRef } from 'react';\nimport { classNames } from 'tradera/utils/class-names';\nimport type { OnlyAs, PolyRefFunction } from 'react-polymorphed';\n\nconst polyRef = forwardRef as PolyRefFunction;\n\ntype Gap = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type SpaceProps = {\n /**\n * Default: 'horizontal'\n */\n direction?:\n | 'horizontal'\n | 'vertical'\n | 'horizontal-reverse'\n | 'vertical-reverse';\n /**\n * Default: 'center' for horizontal, 'start' for vertical\n */\n align?: 'start' | 'center' | 'end' | 'normal' | 'baseline';\n /**\n * Default: 'start'\n */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n /**\n * Gap sizes as defined by Blueprint. Default: 1. Can be a single value or an array of two values for horizontal and vertical gaps.\n */\n gap?: Gap | [Gap, Gap];\n /**\n * Default: false\n */\n wrap?: boolean;\n /**\n * Default: false\n * If true, the component will be rendered as an inline-flex element.\n */\n inline?: boolean;\n grow?: boolean;\n\n children: React.ReactNode;\n} & React.HTMLAttributes;\n\n/**\n * A component to use when you want to space out elements in a row or column.\n * Example:\n * \n * \n * \n * \n */\nexport const Space = polyRef<\n 'div',\n SpaceProps,\n OnlyAs<'div' | 'section' | 'article' | 'label' | 'span' | 'fieldset'>\n>(\n (\n {\n as: Component = 'div',\n direction = 'horizontal',\n align: alignProp,\n gap = 1,\n wrap = false,\n inline = false,\n className,\n children,\n justify,\n grow,\n ...rest\n },\n ref\n ) => {\n const defaultAlign = direction === 'horizontal' ? 'center' : 'normal';\n const align = alignProp ?? defaultAlign;\n\n const gapX = Array.isArray(gap) ? gap[0] : (gap ?? 1);\n const gapY = Array.isArray(gap) ? gap[1] : (gap ?? 1);\n\n const gapClass = `gap-x-${gapX} gap-y-${gapY}`;\n\n return (\n \n {children}\n \n );\n }\n);\n","import type React from 'react';\nimport { forwardRef } from 'react';\nimport { classNames } from 'tradera/utils/class-names';\n\nimport styles from './divider.module.scss';\n\nimport type { PolyRefFunction } from 'react-polymorphed';\n\nconst polyRef = forwardRef as PolyRefFunction;\n\nexport type DividerProps = React.PropsWithChildren<{\n dark?: boolean;\n className?: string;\n thick?: boolean;\n /**\n * Will hide `last-of-type` via CSS\n */\n hideLast?: boolean;\n}>;\n\nexport const Divider = polyRef<'hr', DividerProps>(\n (\n { as, children, className, dark, thick, hideLast, ...props },\n forwardRef\n ) => {\n const Component = as ?? (children ? 'div' : 'hr');\n const role = Component !== 'hr' ? 'separator' : undefined;\n\n return (\n \n {children ? (\n {children}\n ) : null}\n \n );\n }\n);\n","import { createApi } from '@reduxjs/toolkit/query/react';\nimport type { GetTraderaPackageMeasurementsApiResponse } from 'tradera/state/services/types/webapi-selling-generated';\nimport { isomorphicWebApiBaseQuery } from 'tradera/state/services/utils/webapi-base-query';\n\nexport const traderaPackageMeasurementsApi = createApi({\n reducerPath: 'traderaPackageMeasurementsApi',\n baseQuery: isomorphicWebApiBaseQuery,\n endpoints: (builder) => ({\n getPackageMeasurements: builder.query<\n GetTraderaPackageMeasurementsApiResponse,\n void\n >({\n query: () => ({\n url: '/api/webapi/selling/tradera-package-measurements',\n method: 'GET'\n })\n })\n })\n});\n\nexport const { useGetPackageMeasurementsQuery } = traderaPackageMeasurementsApi;\n","/**\n OBSOLETE - use google tag manager service instead:\n src\\frontend\\services\\google-tagmanager-service.js\n\n * Ported from Applications/TouchWeb/src/legacy/static/app/ui/layout/google-tagmanager.js\n * Best way to import this module is `import * as Analytics from 'analytics'`\n */\n\nimport * as Sentry from '@sentry/react';\n\ntype WindowWithDataLayer = Window & {\n dataLayer: Record[];\n ga?: (\n command: string,\n eventName: string,\n category: string,\n variable?: string,\n value?: string,\n label?: string\n ) => void;\n};\n\ndeclare const window: WindowWithDataLayer;\n\ntype AnalyticsData = {\n category?: string;\n action?: string;\n label?: string;\n value?: string;\n hitCallback?: unknown[];\n userTriggered?: boolean;\n};\n\nexport const pushToDataLayer = (payload: Record) => {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(payload);\n};\nexport const trackPageView = () =>\n window.ga\n ? window.ga('send', 'pageview', location.pathname)\n : pushToDataLayer({ event: 'trackPageview' });\nexport const isNonInteractive = (analyticsData: AnalyticsData) =>\n analyticsData.userTriggered === undefined\n ? true\n : !analyticsData.userTriggered;\n/**\n * trackTiming\n * @param {*} category\n * @param {*} variable\n * @param {*} value\n * @param {*} label\n */\nexport const trackTiming = (\n category: string,\n variable: string,\n value: string,\n label = ''\n) =>\n window.ga\n ? window.ga('send', 'timing', category, variable, value, label)\n : false;\n\n/**\n * Track Analytics Event\n */\nexport const trackEvent = (analyticsData: AnalyticsData) => {\n if (!analyticsData) {\n return;\n }\n pushToDataLayer({\n event: 'trackEvent',\n eventCategory: analyticsData.category || '',\n eventAction: analyticsData.action || '',\n eventLabel: analyticsData.label || '',\n eventValue: analyticsData.value || '0',\n eventNonInteractive: isNonInteractive(analyticsData),\n hitCallback: analyticsData.hitCallback || []\n });\n\n Sentry.addBreadcrumb({\n type: 'default',\n level: 'info',\n category: isNonInteractive(analyticsData) ? 'tracking' : 'ui-action',\n message: 'Analytics Event',\n data: analyticsData\n });\n};\n\n// Export object for Sinon stubbing\nexport default {\n pushToDataLayer,\n trackEvent,\n trackPageView,\n trackTiming\n};\n","import Analytics from 'packages/analytics';\nimport { logger } from 'packages/logger';\nimport locationUtils from 'tradera/utils/location';\nimport api from './api';\nimport { selectIsLoggedIn } from 'tradera/state/member/selectors';\n\n/**\n * Sets new preferred language\n * @param {string} code - example: 'sv' or 'en'\n */\nexport const setPreferredLanguage =\n (code, toLocalizedUrl) => async (dispatch, getState) => {\n Analytics.trackEvent({\n category: 'Settings',\n action: 'Language',\n label: code\n });\n\n try {\n if (selectIsLoggedIn(getState())) {\n await api.saveLanguageSetting(code, toLocalizedUrl);\n }\n locationUtils.reloadLocalized(code);\n } catch (error) {\n logger(error);\n }\n };\n","export const MODAL_TYPES = {\n default: 'default',\n wishlistReminders: 'wishlistReminders',\n selling: 'selling'\n} as const;\n\nexport const CHANNEL_TAG_GROUPS = {\n wishlistReminders: [\n 'wishlist_reminder_3_min_optin',\n 'wishlist_reminder_15_min_optin'\n ],\n buyingListingOutbid: ['member_outbid_optin'],\n buyingListingWon: ['member_won_optin'],\n sellingListingFirstBid: ['selling_first_bid_optin'],\n sellingListingAllBids: ['selling_new_bid_optin'],\n sellingListingSold: ['selling_sold_optin'],\n sellingPaymentReceived: ['selling_payment_received_optin']\n} as const;\n","import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';\n\nexport const feesApi = createApi({\n reducerPath: 'feesApi',\n baseQuery: fetchBaseQuery({\n baseUrl: '/api/webapi/selling/commissionfee'\n }),\n endpoints: (builder) => ({\n // itemType and price does not affect the provision fee,\n // therefore we defaults to itemType `Auction` and price `1`\n getCommissionFee: builder.query({\n query: ({ categoryId }) =>\n `?categoryId=${categoryId}&itemType=Auction&price=1`\n })\n })\n});\n\nexport const { useGetCommissionFeeQuery } = feesApi;\n","import { createApi } from '@reduxjs/toolkit/query/react';\nimport type { MemberLatestPublishedListingApiResponse } from 'tradera/state/services/types/webapi-member-generated';\nimport { isomorphicWebApiBaseQuery } from 'tradera/state/services/utils/webapi-base-query';\n\nexport const memberLatestPublishedListingApi = createApi({\n reducerPath: 'memberLatestPublishedListing',\n baseQuery: isomorphicWebApiBaseQuery,\n endpoints: (builder) => ({\n getMemberLatestPublishedListing: builder.query<\n MemberLatestPublishedListingApiResponse,\n void\n >({\n query: () =>\n '/api/webapi/member/selling/member-latest-published-listing'\n })\n })\n});\n\nexport const { useGetMemberLatestPublishedListingQuery } =\n memberLatestPublishedListingApi;\n","import axios from 'axios';\n\nimport ENDPOINTS from 'tradera/constants/endpoints';\nimport { finalizeResponse, handleError, logError } from 'tradera/utils/api';\nimport { removeBannedCountries } from 'tradera/localization/countries';\n\nexport const fetchAvailableShippingCountries = () =>\n axios\n .get(ENDPOINTS.AVAILABLE_SHIPPING_COUNTRIES)\n .then(finalizeResponse())\n .then(({ data }) => ({\n shippingCountries: data.availableCountries\n .map((country) => ({\n countryCodeIso2: country.countryCodeIso2.toLowerCase(),\n countryNameEng: country.countryNameEng\n }))\n .filter(removeBannedCountries)\n }))\n .catch(handleError())\n .catch(logError);\n","export enum VIEW_ITEM_STATES {\n INITIALIZING = 'INITIALIZING',\n NOT_STARTED = 'NOT_STARTED',\n ACTIVE = 'ACTIVE',\n ENDING = 'ENDING',\n ENDED = 'ENDED'\n}\n\nexport enum ITEM_STATES {\n NOT_STARTED_AUCTION = 'NOT_STARTED_AUCTION',\n NOT_STARTED_AUCTION_BIN = 'NOT_STARTED_AUCTION_BIN',\n NOT_STARTED_FIXED_PRICE = 'NOT_STARTED_FIXED_PRICE',\n ONGOING_AUCTION = 'ONGOING_AUCTION',\n ONGOING_AUCTION_BIN = 'ONGOING_AUCTION_BIN',\n ONGOING_FIXED_PRICE = 'ONGOING_FIXED_PRICE',\n ENDED_AUCTION_WITHOUT_BID = 'ENDED_AUCTION_WITHOUT_BID',\n ENDED_AUCTION_WITH_WINNING_BID = 'ENDED_AUCTION_WITH_WINNING_BID',\n ENDED_AUCTION_SOLD_THROUGH_PURCHASE_OFFER = 'ENDED_AUCTION_SOLD_THROUGH_PURCHASE_OFFER',\n ENDED_AUCTION_WITHOUT_WINNING_BID = 'ENDED_AUCTION_WITHOUT_WINNING_BID',\n ENDED_AUCTION_BIN_BOUGHT_AS_BIN = 'ENDED_AUCTION_BIN_BOUGHT_AS_BIN',\n ENDED_AUCTION_BIN_SOLD_THROUGH_PURCHASE_OFFER = 'ENDED_AUCTION_BIN_SOLD_THROUGH_PURCHASE_OFFER',\n ENDED_PURE_BIN_SOLD_THROUGH_PURCHASE_OFFER = 'ENDED_PURE_BIN_SOLD_THROUGH_PURCHASE_OFFER',\n ENDED_FIXED_PRICE = 'ENDED_FIXED_PRICE',\n ENDED_CANCELLED = 'ENDED_CANCELLED',\n UNKNOWN = 'UNKNOWN'\n}\n","import { logger } from 'packages/logger';\nimport TRANSACTION_TYPES from 'tradera/constants/transaction-types';\nimport ITEM_TYPES from 'tradera/constants/item-types';\nimport { ITEM_STATES } from './constants';\n\nconst getEndedItemState = (\n itemType: ITEM_TYPES,\n bidCount: number,\n reservePriceReached: boolean,\n nextValidBidAmount: number,\n transactionType?: TRANSACTION_TYPES,\n leadingBidMemberId?: number,\n isCancelled?: boolean\n): ITEM_STATES => {\n if (isCancelled) {\n return ITEM_STATES.ENDED_CANCELLED;\n }\n\n const isAuction = itemType === ITEM_TYPES.AUCTION;\n const isAuctionBin = itemType === ITEM_TYPES.AUCTION_BIN;\n const isPureBin = itemType === ITEM_TYPES.PURE_BIN;\n const isShopItem = itemType === ITEM_TYPES.SHOP_ITEM;\n\n // transactionType may not be set if feature-toggle 'always-enrich-with-transactiontype' is off in WebApi.\n if (isAuctionBin) {\n switch (transactionType) {\n case TRANSACTION_TYPES.AUCTION:\n return ITEM_STATES.ENDED_AUCTION_WITH_WINNING_BID;\n case TRANSACTION_TYPES.BIN:\n return ITEM_STATES.ENDED_AUCTION_BIN_BOUGHT_AS_BIN;\n case TRANSACTION_TYPES.PURCHASE_OFFER_ON_ENDED:\n return ITEM_STATES.ENDED_AUCTION_BIN_SOLD_THROUGH_PURCHASE_OFFER;\n }\n }\n if (isPureBin) {\n switch (transactionType) {\n case TRANSACTION_TYPES.PURCHASE_OFFER_ON_ACTIVE:\n return ITEM_STATES.ENDED_PURE_BIN_SOLD_THROUGH_PURCHASE_OFFER;\n case TRANSACTION_TYPES.PURCHASE_OFFER_ON_ENDED:\n return ITEM_STATES.ENDED_PURE_BIN_SOLD_THROUGH_PURCHASE_OFFER;\n }\n }\n if (isAuction) {\n switch (transactionType) {\n case TRANSACTION_TYPES.AUCTION:\n return ITEM_STATES.ENDED_AUCTION_WITH_WINNING_BID;\n case TRANSACTION_TYPES.PURCHASE_OFFER_ON_ENDED:\n return ITEM_STATES.ENDED_AUCTION_SOLD_THROUGH_PURCHASE_OFFER;\n }\n }\n\n // When transactionType is not available (feature toggle is off), we can still figure out\n // that the item was bought with buy-it-now price if there are no bids and a leading bidder exist.\n if (\n !transactionType &&\n isAuctionBin &&\n bidCount === 0 &&\n reservePriceReached &&\n leadingBidMemberId\n ) {\n return ITEM_STATES.ENDED_AUCTION_BIN_BOUGHT_AS_BIN;\n }\n\n if ((isAuction || isAuctionBin) && bidCount === 0) {\n return ITEM_STATES.ENDED_AUCTION_WITHOUT_BID;\n }\n if (bidCount > 0 && !reservePriceReached) {\n return ITEM_STATES.ENDED_AUCTION_WITHOUT_WINNING_BID;\n }\n if (bidCount > 0 && reservePriceReached) {\n return ITEM_STATES.ENDED_AUCTION_WITH_WINNING_BID;\n }\n if (isPureBin || isShopItem) {\n return ITEM_STATES.ENDED_FIXED_PRICE;\n }\n logger(\n `Unknown ended state for parameters: ${JSON.stringify({\n itemType,\n bidCount,\n reservePriceReached,\n nextValidBidAmount\n })}`\n );\n return ITEM_STATES.UNKNOWN;\n};\n\nconst getOngoingItemState = (itemType: ITEM_TYPES): ITEM_STATES => {\n if (itemType === ITEM_TYPES.AUCTION) {\n return ITEM_STATES.ONGOING_AUCTION;\n }\n if (itemType === ITEM_TYPES.AUCTION_BIN) {\n return ITEM_STATES.ONGOING_AUCTION_BIN;\n }\n if (itemType === ITEM_TYPES.PURE_BIN || itemType === ITEM_TYPES.SHOP_ITEM) {\n return ITEM_STATES.ONGOING_FIXED_PRICE;\n }\n logger(\n `Unknown ongoing state for parameters: ${JSON.stringify({\n itemType\n })}`\n );\n return ITEM_STATES.UNKNOWN;\n};\n\nconst getNotStartedItemState = (itemType: ITEM_TYPES): ITEM_STATES => {\n if (itemType === ITEM_TYPES.AUCTION) {\n return ITEM_STATES.NOT_STARTED_AUCTION;\n }\n if (itemType === ITEM_TYPES.AUCTION_BIN) {\n return ITEM_STATES.NOT_STARTED_AUCTION_BIN;\n }\n if (itemType === ITEM_TYPES.PURE_BIN || itemType === ITEM_TYPES.SHOP_ITEM) {\n return ITEM_STATES.NOT_STARTED_FIXED_PRICE;\n }\n logger(\n `Unknown not started state for parameters: ${JSON.stringify({\n itemType\n })}`\n );\n return ITEM_STATES.UNKNOWN;\n};\n\nexport const getItemState = (\n hasEnded: boolean,\n hasStarted: boolean,\n itemType: ITEM_TYPES,\n bidCount: number,\n reservePriceReached: boolean,\n nextValidBidAmount: number,\n transactionType?: TRANSACTION_TYPES,\n leadingBidMemberId?: number,\n isCancelled?: boolean\n) => {\n if (hasEnded) {\n return getEndedItemState(\n itemType,\n bidCount,\n reservePriceReached,\n nextValidBidAmount,\n transactionType,\n leadingBidMemberId,\n isCancelled\n );\n }\n\n if (!hasStarted) {\n return getNotStartedItemState(itemType);\n }\n\n return getOngoingItemState(itemType);\n};\n"],"names":["_extends","Object","assign","bind","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","apply","this","_ref","styles","props","_objectWithoutProperties","_excluded","React","viewBox","xmlns","d","config","_objectSpread","isServer","window","sellingGlobalConfig","draftImagesUrl","templateImagesUrl","myTraderaUrl","isVatRequired","selectableVatValues","isHybridAppContext","isHybridAppWithHtmlUploadSupport","isHtmlEnabled","commissionMinimum","commissionCap","highlightFeaturePrice","rankUpFeaturePrice","isAddonsEnabled","isSyiAddPhotoNativeAppEnabled","isSyiMemberConsentEnabled","isSyiTenImagesEnabled","maxTemplates","domainNameCategoryId","defaultDrafts","_window$sellingGlobal","sellingGlobalData","getType","draft","hasOpeningPrice","isNullOrUndefined","openingBid","hasFixedPrice","fixedPrice","isPureBin","isAuctionBin","getDefaultTemplateValue","propertyName","_defaultDrafts$newTem","newTemplate","loadDefaultDraft","newItem","allowedBuyerRegion","undefined","loadDefaultTemplateDraft","loadDraftFromTemplate","async","response","touchWebClient","post","templateId","draftWithoutItemId","itemId","resetUnwantedProperties","data","draftReason","saveDraft","ensuredDraft","metadata","applicationId","ensureApplicationId","webApiClient","draftId","syiSessionId","hasTrackedFormStart","trackSyiForm","eventName","_ref$parameters","parameters","Math","random","toString","slice","Date","now","GtmService","trackGA4","flow_id","FlowId","SYI","form_name","syi_session_id","suggestionsThrottle","ThrottledAction","imageToColorsThrottle","INPUT_TYPE_MAP","Button","Color","Dropdown","transformServerOption","serverOption","value","sortOrder","isActive","warningLabel","title","text","transformServerAttribute","attribute","id","displayName","description","backingField","options","possibleValues","map","inputType","type","isMultiSelect","maxNumberOfValues","minNumberOfValues","numberOfValuesSelected","shouldTranslateValues","preserveOptionsOrder","reset","dispatch","resetAttributes","fetchForCategory","categoryId","getState","languageCodeIso2","selectPreferredLanguage","get","setCategoryAttributes","attributeDefinitions","updateCategoryAttributesOptionsStatuses","campaignCodeActions","validateCampaignCode","imageActions","error","throttledFetchCategoryAttributeSuggestions","shortDescription","execute","action","fetchCategoryAttributeSuggestions","throttledFetchImageAttributeSuggestions","draftImageIds","_getSyiSlice","_getSyiSlice$category","_getSyiSlice2","_getSyiSlice2$attribu","featureSwitches","environment","draftCategoryId","getSyiSlice","category","categoryAttributes","attributes","hasColorAttribute","some","fetchImageAttributeSuggestions","resetImageAttributeSuggestions","paramKeyPart","query","join","_response$data","_response$data$colorV","colors","colorValues","cv","color","setImageToColorSuggestions","suggestedAttributes","name","values","logger","splitTestGroup","splitTestGroups","splitTestEnabled","extractorType","getAttributeSuggestionExtractor","params","setCategoryAttributesSuggestions","attributeValues","termAttributeValues","transformServerAttributeSuggestion","suggestionsExtractorType","autoFillSuggestedAttributes","splitTest","attributeSuggestion","CHARITIES","userData","charities","throttledCampaignCodeValidation","delayedValidationTimeoutId","resetCharityCampaign","_getSyiSlice$charityC","charityCampaign","wasForceFreeShipping","forceFreeShipping","resetCharityCampaignReducer","disableZeroDayAuctions","resetSelectedShippingOptions","resetCampaign","enableRestart","resetFees","resetCampaignBanner","campaignCode","trim","validatingCampaignCodeBySearching","isReadOnly","brandAttributeValues","brandAttribute","find","filter","option","findBrandAttributeValues","campaignService","validate","then","result","bannerDesktopImageUrl","bannerMobileImageUrl","bannerTabletImageUrl","campaignCodeId","hasEnded","isUnsoldFeeFree","maxFeeCap","_result$provisionFact","provisionFactor","validationDisplayMessage","campaignCodeValid","campaignCodeMessage","campaignCodeDescription","commissionPercent","setCampaignValidationResult","disableRestart","applyCharityFromCampaignCodeId","setCharityCampaign","allowZeroDayAuctions","enableZeroDayAuctions","setDisplayPromoted","setDisplayHighlighted","toggleShowInput","isChecked","clearTimeout","toggleCampaignCodeCheckbox","setInitialCampaignCode","isChangeItem","initializeCampaignCodeState","saveTypedCampaignCode","inputCampaignCode","setUnverifiedCampaignCode","setTimeout","searching","searchingForCampaignCodeIsDelayed","resetCharityAndShippingInfo","setCharityAndFetchInfo","charityId","resetCharity","setCharityId","fetchCharityInfo","fetchCharityShippingInfo","getCharity","setCharityInfo","_error$response","status","getCharityShippingInfo","setCharityShippingInfo","freeShippingPaidByProviderName","payload","providerName","_error$response2","marketingApiClient","axiosConfigs","notAuthenticated","cancelTokenId","canBeResumed","longDescription","images","hasShortDescription","hasLongDescription","hasImage","Array","isArray","image","imageUrl","updateDraftCanBeResumed","setDraftCanBeResumed","displayPromoted","feesActions","updatePrices","displayHighlighted","setUsedAllowed","isAllowed","setItemConditionFromPrediction","condition","selectIsItemConditionDirty","oldValue","selectItemCondition","setHasUsedAutoFill","updateItemConditionRestrictionForCategory","itemCondition","isUsedAllowed","categoryRestriction","syi","allowUsed","featureFees","state","price","reservePrice","push","PossibleFeatures","extraFeatures","highlight","rankUp","handleAttributeSuggestionsForImages","imageIds","forEach","imageId","isListingImage","fetchOffsitePaymentDetection","createAsyncThunk","request","selectIsFeatureEnabled","fetchClassificationFromFirstImage","qs","fetchPredictionsFromImages","_","_ref2","selectPreferredLanguageCode","existingShortDescription","selectShortDescription","existingLongDescription","selectLongDescription","isModalFeatureToggleEnabled","itemClassification","selectClassificationResponse","selectImageIds","selectDraftId","draft_id","setPredictedShortDescription","setShouldSuggestShortDescription","setHasUsedPredictedDescription","setShortDescription","setPredictedLongDescription","setShouldSuggestLongDescription","setLongDescription","setNumProcessedImages","numProcessedImages","setAiProcessingTime","aiProcessingTime","fetchConditionAndItemTypeFromCategory","_ref4","_ref5","isCompany","priceActions","setIsPureBinSelectedFromPrediction","itemType","ItemTypes","PURE_BIN","toIntOrNull","number","parseInt","isFinite","val","setOpeningBid","setFixedPrice","setReservePrice","setAuctionBinPrice","auctionBinPrice","setReservePriceVisibility","visible","setCharityDonationVisibility","setIsPureBinSelected","isPureBinSelected","isEditOfPublishedItem","setCustomEndTime","setSelectedItemType","ITEM_TYPE","BIN","AUCTION","AUCTION_AND_BIN","setVat","vat","setEditCharity","editCharity","isDirty","selectIsPureBinSelected","setFromDraft","queryParamCharityId","URLSearchParams","location","search","hasOpeningBid","hasReservePrice","hasCharityId","isAuction","rootCategoryHasBeenSelected","isPureBinCategory","PURE_BIN_CATEGORY_IDS","includes","isMagicalSyiFeatureEnabled","isMagicalSyiSettingEnabled","selectMagicalSyiSettngEnabled","isAutoFillConditionAndListingTypeEnabled","setShippingRecommendations","preferredShippingProvidersApi","endpoints","getSelectedShippingProviders","initiate","selectedShippingProviders","_await$getShippingRec","shippingRecommendationsClient","getShippingRecommendations","categoryShippingRecommendations","recommendedWeight","shippingRecommendations","setShippingRecommendationsReducer","setFirstRecommendationAsSelected","clearShippingRecommendations","message","hasUserAutofillEnabledInSettings","alreadySelectedShippingOptions","selectSelectedShippingOptions","preFillShippingEnabled","firstRecommendation","selectFirstRecommendedByWeight","setShippingOptionSelected","Tags","draftsApi","createApi","reducerPath","baseQuery","isomorphicWebApiBaseQuery","tagTypes","keys","builder","deleteDrafts","mutation","invalidatesTags","DRAFT_LIST","url","method","body","loadDrafts","providesTags","transformResponse","_response$items","items","item","_item$images","useDeleteDraftsMutation","useLoadDraftsQuery","util","initialState","draftAttributes","selectableSuggestedAttributes","selectableCategorySuggestedAttributes","selectableImageToColorSuggestedAttributes","imageToColorSuggestedAttributes","validationErrors","categorySuggestedAttributes","updateSelectableImageToColorSuggestedAttributes","filterSelectableSuggestions","updateSelectableSuggestedAttributes","filterCombinedSelectableSuggestions","attributeSlice","createSlice","reducers","_state$selectableSugg","suggestedAttributeValues","suggested","setCategoryAttributeOption","a","attributeId","optionValue","activate","o","_state$draftAttribute","_state$draftAttribute2","_a$options","_a$options2","draftAttributeValues","tav","setDraftAttributes","resetSelectedAttributes","_attribute$options","_attribute$options2","_attribute$options3","reduce","acc","actions","reducer","buyerRegionSlice","initModuleGlobals","_initData$featureSwit","initData","pageSpecificData","allowedBuyerRegions","availableAllowedBuyerRegions","defaultBuyerRegion","r","selectedBuyerRegion","selectedBuyerRegionText","availableAllowedBuyerRegionsForEditWithBids","isSetAllowedBuyerRegionToAtLeastEuEnabled","setAllowedBuyerRegion","setAvailableAllowedBuyerRegions","availableRegions","windowExists","isNewDraft","_window$location","_window$location$path","pathname","endsWith","queryParams","_window$location2","preselectCharity","anonymous","Number","logoUrl","percentageToDonate","isFreeShippingPaidByProvider","charitySlice","_ref2$payload","setCharityAnonymous","_ref3","setCharityFromDraft","_charitySlice$actions","isLoading","additionalDescriptions","draftSlice","setDraftProperties","_draft$reference$incl","_draft$reference","referenceIsReadonly","reference","JSON","stringify","lastModifiedDate","dayjs","toISOString","pick","setDraftId","setRestart","restart","setReference","addAdditionalDescription","newAdditionalDescriptions","setDraftReason","ensureDraftReason","setDraftVersion","version","resetDraft","setDraftIsLoading","setCurrency","currency","setResellPartner","resellPartner","setMagicalSyiEnabled","magicalSyiEnabled","_draftSlice$actions","editSlice","draftBeforeChange","setDraftBeforeChange","MAX_NUMBER_OF_IMAGES","ITEM_CLASSIFICATIONS_FOR_PREDICTION","setValidation","uploadingCount","validationError","every","isUploadedBySystem","resetUploadError","uploadError","imagesSlice","isUploadingWithApp","setDraftImages","draftImage","rotationDegrees","listingImage","imageGroupId","filename","Error","addImage","_action$payload","replaceImage","_action$payload2","index","removeImage","splice","changeImagePosition","_action$payload3","from","to","movedImage","setImageRotation","_action$payload4","setImageUploadFailed","errorMessage","setImagesUploading","numberOfImages","setMobileUpload","extraReducers","addCase","hideAllErrors","_imagesSlice$actions","getValidationErrors","durationDays","customEndTime","customEndTimeError","endDate","getEndDate","startOf","add","_customEndTime$split$2","_slicedToArray","split","hours","minutes","hour","minute","earliestEndDate","isBefore","isRestartAvailable","_userData$defaultDraf","_userData$defaultDraf2","itemDurationSlice","setDurationDays","_state$durationDays","resetDurationAndEndTime","draftService","newState","newStateWithoutCampaignRelatedProps","resetCustomEndTime","_state$durationDays2","_itemDurationSlice$ac","textWithHtml","elm","document","createElement","innerHTML","textContent","innerText","ensureString","s","longDescriptionSlice","isCurrentDescriptionFromDraft","fromDraftCounter","isOffsitePaymentDetected","setLongDescriptionFromDraft","resetLongDescription","fulfilled","_longDescriptionSlice","setValidationError","createInitalState","consent","braintree","shouldBypassConsent","signatoryVerificationRequired","shouldGiveConsent","hasTraderaPayConsent","needsConsentOfTraderaPayAgreement","hasValidationError","isUnderLicense","initalConsentGiven","memberConsentSlice","setTraderaPayConsent","hasAutoFillConsent","isLoadingPredictions","classification","canGetPredictionFromImages","isClassificationPending","hasUsedAutoFill","hasUsedPredictedDescription","predictionsSlice","shouldSuggestShortDescription","shouldSuggestLongDescription","setHasAutoFillConsent","pending","Other","rejected","_predictionsSlice$act","globalValidationError","shippingByWeight","selectedShippingOptions","selectedShippingSize","shippingOptionsLoading","shippingOptionsError","offerTakeaway","offerShipping","fromCountry","shippingContainsProduct","shippingOptions","shippingOption","shippingSlice","setShippingOptionsByWeight","productsPerWeightSpan","shippingContainsTakeaway","productsDecorated","weightClass","_weightClass$products","productsWithDecoration","products","product","cost","productId","providerId","uuid","uuidv4","getSelectedShippingProducts","setShippingOptionsLoading","selectedOptions","setSelectedShippingSize","setPackagingCost","packagingCost","setTakeawaySelected","setShippingOptionsError","setShippingFromCountry","_shippingSlice$action","descriptionLanguageCodeIso2","isDescriptionLanguageCodeIso2ChangeAvailable","memberCountryCodeIso2","isDenmarkCountryCode","getValidationError","shortDescriptionSlice","resetShortDescription","setDescriptionLanguageCodeIso2","_shortDescriptionSlic","creationStart","allErrorsVisible","publishPending","publishFailed","publishFailedReasonDisplayText","publishedItemPendingVip","publishedItem","openModal","openModalData","autoSaveEnabled","draftCanBeResumed","itemUpdating","itemUpdated","isDraftSaved","publishDelayed","fadeUi","syiSlice","resetSyi","setCreationStart","showAllErrors","setIsEditOfPublishedItem","setPublishedItemPendingVip","setPublishedItemDelayed","setPublishedItem","setPublishFailed","setPublishPending","setCategoryRestriction","toggleModal","enableAutoSave","disableAutoSave","setItemUpdating","setItemUpdated","setIsDraftSaved","setFadeUi","_syiSlice$actions","templateReducer","ignoreProperties","resetIgnoreProperties","addIgnoreProperties","Set","removeIgnoreProperties","prop","_templateReducer$acti","createSelector","imageCount","predictions","views","templatesApi","deleteTemplate","TEMPLATES_LIST","loadTemplates","useDeleteTemplateMutation","useLoadTemplatesQuery","getAmountDetails","itemState","leadingBid","hasBids","finalPrice","paymentAmountForBid","paymentAmountForFixedPrice","ITEM_STATES","ENDED_AUCTION_WITH_WINNING_BID","amount","amountIncludingBuyerProtection","Space","polyRef","forwardRef","ref","_ref$as","as","Component","_ref$direction","direction","alignProp","align","_ref$gap","gap","_ref$wrap","wrap","_ref$inline","inline","className","children","justify","grow","rest","gapClass","_jsx","classNames","Divider","dark","thick","hideLast","role","component","traderaPackageMeasurementsApi","getPackageMeasurements","useGetPackageMeasurementsQuery","pushToDataLayer","dataLayer","isNonInteractive","analyticsData","userTriggered","trackEvent","event","eventCategory","eventAction","eventLabel","label","eventValue","eventNonInteractive","hitCallback","Sentry","level","trackPageView","ga","trackTiming","variable","setPreferredLanguage","code","toLocalizedUrl","Analytics","selectIsLoggedIn","api","locationUtils","MODAL_TYPES","default","wishlistReminders","selling","CHANNEL_TAG_GROUPS","buyingListingOutbid","buyingListingWon","sellingListingFirstBid","sellingListingAllBids","sellingListingSold","sellingPaymentReceived","feesApi","fetchBaseQuery","baseUrl","getCommissionFee","useGetCommissionFeeQuery","memberLatestPublishedListingApi","getMemberLatestPublishedListing","useGetMemberLatestPublishedListingQuery","fetchAvailableShippingCountries","axios","ENDPOINTS","AVAILABLE_SHIPPING_COUNTRIES","finalizeResponse","shippingCountries","availableCountries","country","countryCodeIso2","toLowerCase","countryNameEng","removeBannedCountries","catch","handleError","logError","getItemState","hasStarted","bidCount","reservePriceReached","nextValidBidAmount","transactionType","leadingBidMemberId","isCancelled","getEndedItemState","ENDED_CANCELLED","ITEM_TYPES","AUCTION_BIN","isShopItem","SHOP_ITEM","TRANSACTION_TYPES","ENDED_AUCTION_BIN_BOUGHT_AS_BIN","PURCHASE_OFFER_ON_ENDED","ENDED_AUCTION_BIN_SOLD_THROUGH_PURCHASE_OFFER","PURCHASE_OFFER_ON_ACTIVE","ENDED_PURE_BIN_SOLD_THROUGH_PURCHASE_OFFER","ENDED_AUCTION_SOLD_THROUGH_PURCHASE_OFFER","ENDED_AUCTION_WITHOUT_BID","ENDED_AUCTION_WITHOUT_WINNING_BID","ENDED_FIXED_PRICE","UNKNOWN","ONGOING_AUCTION","ONGOING_AUCTION_BIN","ONGOING_FIXED_PRICE","getOngoingItemState","NOT_STARTED_AUCTION","NOT_STARTED_AUCTION_BIN","NOT_STARTED_FIXED_PRICE","getNotStartedItemState"],"sourceRoot":""}