{"version":3,"sources":["utils/logging.ts","utils/asyncUtils.ts","ducks/carts/cartEnums.ts","ducks/carts/cartsInterfaces.ts","ducks/carts/cartsSelectors.ts","ducks/carts/thunks/addConfigurationToCartThunk.ts","ducks/carts/thunks/bulkAddItemsToCartThunk.ts","ducks/carts/thunks/bulkUpdateCartThunk.ts","ducks/carts/thunks/deleteCartLinesThunk.ts","ducks/carts/thunks/deleteCartLineThunk.ts","ducks/carts/thunks/fetchActiveCartThunk.ts","ducks/carts/thunks/deleteCartThunk.ts","ducks/carts/thunks/fetchSavedCartsThunk.ts","ducks/carts/thunks/setActiveCartThunk.ts","ducks/carts/thunks/splitLineThunk.ts","ducks/carts/thunks/submitOrderThunk.ts","ducks/carts/thunks/updateCartLineThunk.ts","ducks/carts/cartsSlice.ts","ducks/core/coreInterfaces.ts","ducks/core/coreSelectors.ts","ducks/core/thunks/initApp.ts","ducks/core/coreSlice.ts","hooks/redux/useAppDispatch.ts","hooks/redux/useAppSelector.ts","components/Spinner/Spinner.module.scss","ducks/auth/thunks/checkAuthTokensThunk.ts","ducks/auth/authSlice.ts","ducks/orders/thunks/fetchOrdersThunk.ts","ducks/orders/thunks/fetchOrderThunk.ts","components/ColorLine.tsx","components/Spinner/Spinner.tsx","utils/brandAbbreviations.ts","ducks/catalog/thunks/fetchCatalogThunk.ts","ducks/auth/thunks/fetchCurrentAccessTokenThunk.ts","ducks/auth/thunks/loginThunk.ts","ducks/auth/thunks/logoutThunk.ts","ducks/auth/thunks/switchDealerThunk.ts","utils/fiscalYearUtils.ts","hooks/useLoadingSwitches.ts","ducks/catalog/catalogEntityAdapters.ts","ducks/catalog/catalogSelectors.ts","ducks/catalog/thunks/fetchInstructionsThunk.ts","ducks/catalog/thunks/fetchItemThunk.ts","ducks/catalog/thunks/fetchPricesThunk.ts","ducks/catalog/thunks/fetchProductColorsThunk.ts","ducks/catalog/thunks/fetchSubPartsThunk.ts","ducks/catalog/catalogSlice.ts","components/TermsAndConditions/TermsAndConditionsLink.tsx","components/ButtonLink.tsx","ducks/configurator/thunks/createConfigurationThunk.ts","ducks/configurator/thunks/deleteConfigurationThunk.ts","ducks/configurator/thunks/fetchConfigurationsThunk.ts","ducks/configurator/thunks/updateConfigurationThunk.ts","ducks/configurator/configuratorSlice.ts","ducks/configurator/configuratorSelectors.ts","ducks/profile/thunks/fetchProfileThunk.ts","ducks/profile/thunks/updateContactThunk.tsx","ducks/profile/thunks/updateProfileThunk.ts","ducks/profile/profileSlice.ts","ducks/profile/profileSelectors.ts","ducks/orders/ordersEnums.ts","ducks/orders/ordersSlice.ts","ducks/orders/ordersSelectors.ts","hooks/useDialog.tsx","hooks/useLookups.ts","ducks/newsFeed/newsFeedEntityAdapters.ts","ducks/newsFeed/newsFeedSelectors.ts","ducks/newsFeed/legacyActions/updateNewsFeedPost.ts","ducks/newsFeed/thunks/fetchNewsFeedPostsThunk.ts","ducks/newsFeed/thunks/fetchNewsFeedPostThunk.ts","ducks/newsFeed/newsFeedSlice.ts","ducks/addresses/addressesEntityAdapters.ts","ducks/addresses/addressesSelectors.ts","ducks/addresses/thunks/fetchAddressesThunk.ts","ducks/addresses/thunks/validateAddressThunk.ts","ducks/addresses/addressesSlice.ts","ducks/cashDiscounts/thunks/fetchCashDiscountsThunks.ts","ducks/cashDiscounts/cashDiscountsSlice.ts","ducks/cashDiscounts/cashDiscountsSelectors.ts","ducks/inventory/inventorySelectors.ts","ducks/inventory/thunks/fetchInventory.ts","ducks/inventory/inventorySlice.ts","utils/auth/authConfigs.ts","utils/auth/EntraService.ts","utils/auth/AuthService.ts","components/CopyrightText.tsx","components/TermsAndConditions/TermsAndConditionsDialog.tsx","login/SocialButtons.module.scss","login/LogoutAlert.module.scss","utils/objectUtils.ts","ducks/preSeason/preSeasonEntityAdapters.ts","ducks/preSeason/preSeasonSelectors.ts","ducks/preSeason/thunks/editPreSeasonOrderThunk.ts","ducks/preSeason/thunks/fetchCatalogSectionThunk.ts","ducks/preSeason/thunks/initPreSeasonApprovalThunk.ts","ducks/preSeason/thunks/initPreSeasonThunk.ts","ducks/preSeason/thunks/initSubmitPreSeasonThunk.ts","ducks/preSeason/thunks/recalcPreSeasonOrderThunk.ts","ducks/preSeason/thunks/rejectPreSeasonOrderThunk.ts","ducks/preSeason/thunks/submitPreSeasonOrderThunk.ts","ducks/preSeason/thunks/submitPreSeasonToAxThunk.ts","ducks/preSeason/thunks/submitPreseasonWorksheetThunk.ts","ducks/preSeason/thunks/updatePreSeasonApprovalThunk.ts","ducks/preSeason/thunks/updatePreSeasonItemThunk.ts","ducks/preSeason/thunks/updateTargetLevelThunk.ts","ducks/preSeason/preSeasonSlice.ts","hooks/useAnchroEl.ts","hooks/useForm.ts","hooks/useLocalStorageSort.ts","hooks/useOnScreen.ts","hooks/useRealtime.ts","ducks/lookups/lookupsEntityAdapters.ts","ducks/lookups/lookupsSelectors.ts","ducks/lookups/thunks/fetchLookupsThunk.ts","ducks/lookups/lookupsSlice.ts","ducks/index.ts","layout/SplashPage.tsx","login/LoginButton.tsx","login/LoginErrorServerErrorBody.tsx","login/LoginErrorUnauthorizedBody.tsx","login/LoginErrorDialog.tsx","login/LoginButtonPanel.tsx","login/LogoutAlert.tsx","login/LoginPage.tsx","Root.tsx","serviceWorker.ts","utils/ErrorLoggerService.ts","utils/customErrors/HttpError.ts","utils/HttpService.ts","configRedux.ts","index.tsx","styles/styledComponentsTheme.ts"],"names":["sendError","e","console","error","executeApiRequest","apiFunc","a","parseJson","response","requestFailed","apiReponse","statusCode","status","ok","json","value","exception","CartStatus","CartLineMergeType","_getCartLines","cartLines","cartId","Object","values","filter","x","removed","notUndefined","getCarts","createSelector","state","carts","addresses","entities","addressHash","cartStatusId","Active","Inactive","map","address","addressId","undefined","cartLineIds","y","salesOrders","getCart","_","cartMin","getActiveCart","activeCartId","activeCartBase","getActiveCartLines","activeCart","getCartItemCount","request","cartLinesHash","cartsHash","itemId","reduce","total","cartLineId","line","quantity","getCartLineTotal","cashDiscounts","core","settings","paymentTerms","catalog","items","cartLine","products","baseCartLineTotal","price","isPaymentDiscountable","find","paymentTermId","paymentMethod","cashDiscount","isItemDiscountDisabled","cashDiscountDisabled","requestedShipDate","Date","flatMap","discounts","isWithinInterval","end","endDate","start","startDate","amount","getActiveCartTotal","lines","getCartProducts","cartHash","cartLineHash","productHash","getActiveCartLinesByItemId","ItemId","getIsItemInCart","length","getCartLines","getCartTotal","cart","getCartBrandBreakdown","brandSelectors","selectAll","brands","summed","hash","brand","obj","item","id","abbreviation","addConfigurationToCartThunk","createAsyncThunk","configurationNumber","dispatch","getState","rejectWithValue","isEmployee","getIsEmployee","coreActions","toggleWorkingOnItDialog","httpService","post","result","toast","type","errors","toggleMessageDialog","bulkAddItemsToCartThunk","updateObj","message","bulkUpdateCartThunk","disableSpinner","contactId","shipMethod","warehouseId","deleteCartLinesThunk","delete","deleteCartLineThunk","fetchActiveCartThunk","get","deleteCartThunk","fetchSavedCartsThunk","setActiveCartThunk","notificationString","toggleActiveCartMessageDialog","splitLineThunk","newQuantity","submitOrderThunk","updateCartLineThunk","disableDialog","description","initialState","activeCartLineIds","activeItems","CartLIneRealtimeUpdate","createAction","cartsSlice","createSlice","name","reducers","extraReducers","builder","normalizeCarts","normalizedCarts","current","omit","keyBy","processUpdates","action","payload","update","currentCart","updatedCart","axContactId","uniq","removedLineIds","includes","freightCharge","modifiedAt","modifiedByName","modifiedBy","shipToName","termsChecked","inventColorId","setActiveCart","newState","normalized","addCase","fulfilled","initAppThunk","initPreSeasonThunk","psCart","initSubmitPreSeasonThunk","psCarts","initPreSeasonApprovalThunk","updateTargetLevelThunk","editedAt","editedBy","pending","meta","arg","updatePreSeasonItemThunk","rejected","submitPreSeasonToAxThunk","Submitted","salesIds","axSalesId","submittedAt","processedAt","rejectPreSeasonOrderThunk","recalcPreSeasonOrderThunk","loginThunk","fetchCurrentAccessTokenThunk","switchDealerThunk","cartsReducer","actions","reducer","UserType","Admin","Employee","User","getMe","me","accountNum","dealerName","email","iconColor","phoneNumber","userType","getFeatureFlag","featureFlags","feature","flags","dealerEnabled","employeeEnabled","getIsDealerSelected","auth","employeeSelectedDealer","selected","getIsPreseasonActive","preSeason","startOfDay","getTime","ps","date","getPaymentTermObj","paymentTerm","getPaymentTerm","paymentTermObj","getPaymentTermLabel","fetchData","url","showFullLoading","Promise","all","fetchLookupsThunk","errorLogger","setUser","appInitialized","appInitializing","ui","showActiveCartMessageDialog","showMessageDialog","showWorkingOnIt","coreSlice","logoutThunk","coreReducer","useAppDispatch","useDispatch","useAppSelector","useSelector","module","exports","checkAuthTokensThunk","tokens","AuthService","getAuthTokens","rejectionReason","reason","decodedToken","isAccessTokenExpired","refreshAccessToken","refreshToken","getInitialState","mostRecentDealer","isDealerSwitching","isLoggedIn","isLoggingIn","loginError","showLogoutAlert","authSlice","authReducer","fetchOrdersThunk","page","take","searchTerm","orderStatus","orderBy","orderByDirection","totalItems","fetchOrderThunk","salesId","ColorLineDiv","styled","div","variant","theme","pallette","common","brandColors","llc","ColorLine","React","Spinner","className","classes","spinner","rect1","rect2","rect3","rect4","rect5","brandAbbreviationToString","brandAbbreviation","brandAbbreviationToPanelHeader","brandIdToCssTextClass","brandId","brandAbbreviationToCssBackgroundClass","fetchCatalogThunk","searchString","productFamilyId","productFamilies","dpProductFamilySelectors","encodeURIComponent","ids","productFamilyIds","join","results","fetchCurrentAccessToken","accessToken","provider","fetchGoogleAuthorizationCode","fetchAuthorizationCode","authCode","log","fetchGoogleAccessToken","fetchAccessToken","accessTokenResponse","isAuthed","rejectedEmail","serverError","keys","localStorage","startsWith","forEach","removeItem","logout","dealer","fiscalRange","getFiscalYearRange","year","yearNum","parseInt","getFiscalYear","getMonth","getFullYear","toString","useLoadingSwitches","defaultValues","hasError","isLoading","useState","loading","setLoading","executeRef","useRef","func","isAsyncThunkAction","unwrapResult","tags","useMemo","execute","switches","catalogEntityAdapters","colors","createEntityAdapter","selectId","sortComparer","b","localeCompare","prices","catalogSelectors","getSelectors","priceSelectors","getIsCashDiscountDisabled","itemHash","getItemColors","getCatalogPage","pageHash","filters","createCatalogFilterKey","pages","getProducts","itemIds","getCatalogTotalItems","getItemSubParts","subPartHash","qtyRequired","fetchInstructionsThunk","fetchItemThunk","includePrices","itemIdArr","Array","isArray","createQueryString","fetchPricesThunk","fetchProductColorsThunk","fetchSubPartsThunk","instructions","processProducts","catalogSlice","updates","upsertMany","upsertOne","key","existingItem","fetchCatalogSectionThunk","processed","catalogReducer","TermsAndConditionsLink","useDialog","dialog","openDialog","closeDialog","onClick","isOpen","Boolean","onClose","StyledButton","button","ButtonLink","buttonProps","createConfigurationThunk","allDealers","smRecommended","deleteConfigurationThunk","configNumber","fetchConfigurationsThunk","configSelectors","selectById","updateConfigurationThunk","config","put","configAdapter","configs","configuratorSlice","removeOne","configuratorReducer","configurator","getExperlogixConfigs","fetchProfileThunk","updateContactThunk","contact","updateProfileThunk","profile","contactsEntityAdapter","lastName","firstName","contacts","titles","profileReducer","contactsSelectors","SalesStatus","None","Open_or_Backorder","Delivered","Invoiced","Cancelled","ordersAdapter","minOrders","orders","ordersSlice","ordersReducer","ordersSelectors","getOrder","setDialog","useCallback","useLookups","types","notLoaded","getNonLoadedOrLoadingLookups","useEffect","resolve","newsFeedEntityAdapters","posts","dpNewsFeedPostId","startDateUtc","newsFeedSelectors","newsFeed","updateNewsFeedPostAction","fetchNewsFeedPostsThunk","fetchNewsFeedPostThunk","postId","newsFeedSlice","access","newsFeedReducer","addressesEntityAdapter","addressesSelectors","getDefaultAddresses","axRecId","fetchAddressesThunk","validateAddressThunk","addressesSlice","isValid","addy","addressTypeId","businessEntityId","city","latitude","longitude","primary","stateId","street","street2","zipcode","addressesReducer","_fetchCashDiscountsThunk","fiscalYear","cashDiscountsEntityAdapter","slice","cashDiscountsReducer","getCashDiscount","getInventory","inventory","arr","fetchInventory","inventorySlice","setInventory","inventoryReducer","oauthConfigs","adfs","authorizationEndpoint","clientId","oauthType","popupOptions","height","width","redirectUri","window","location","origin","protocol","host","resource","google","scope","twitter","CLIENT_ID","EntraService","userAppAgent","cleanUpMsal","getAccessTokenSilent","token","loginPopup","authority","prompt","scopes","idToken","rawIdToken","acquireTokenSilent","tokenRequest","toLowerCase","logger","msal","level","Warning","navigateToLoginRequestUrl","cache","cacheLocation","system","storageTypes","accessTokenDecoded","accessTokenKey","mostRecentDealerKey","refreshTokenKey","storageLocations","dealerString","this","getStorageValue","JSON","parse","setStorageValue","stringify","fromStorage","full","removeStorageValue","clearStorage","decodedString","queryString","substring","replace","code","split","keyValue","decodeURIComponent","getItem","setItem","search","parseQueryString","reject","openLoginPopup","Error","top","screenY","outerHeight","left","screenX","outerWidth","oauthUrl","authPopup","open","focus","interval","setInterval","closed","clearInterval","popupOrigin","getQueryResponse","close","authUrl","fetch","body","headers","method","decoded","jwtDecode","tokenResponse","setAuthTokensInStorage","process","urlEncoded","URLSearchParams","append","responseTokens","access_token","refresh_token","currenTokens","exp","StyledDiv","CopyrightText","currentYear","TermsBody","TermsAndConditionsDialog","show","onHide","bsSize","Body","style","padding","fallback","preSeasonEntityAdapters","approvalTypes","preseasonApprovalTypeId","catalogSections","preseasonCatalogSectionId","programLevels","programLevelId","preSeasonCatalogSelectors","preSeasonProgramLevelSelectors","preSeasonAprovalTypeSelectors","getCartApprovals","approvals","getActivePreSeasonCart","activeCartBrand","psCartHash","levelHash","targetProgramLevelId","getPreSeasonCarts","getAvailableProgramLevels","availableLevels","levelIds","getAvailableCatalogSections","availableCatalogSections","catalogSectionIds","sectionHash","getSalesHistory","salesHistory","salesHash","colorId","history","inSeason","preseason","getCatalogSectionPrimaryBrandColorClass","section","getFlattenedPreseasonItemGroups","catalogItemGroups","sectionId","itemGroupHash","order","orderedProducts","i","p","newItems","color","push","colorName","getPaymentTermShippingOptions","shippingWeeks","paymentTermShipRanges","ranges","paymTermMap","paymTermObj","available","editPreSeasonOrderThunk","submitPreSeasonOrderThunk","submitPreSeasonWorksheetThunk","worksheet","updatePreSeasonApprovalThunk","approvalTypeId","currentBrand","floorPlanHash","isApprovalUser","worksheets","PreSeasonApprovalRealtimeUpdate","PreSeasonCartRealtimeUpdate","preSeasonReducer","noramlizePsCart","imported","preseasonGoalTypeId","submitted","submittedAtUtc","submittedByEmail","submittedByName","levels","worksheetResult","weeks","groups","applicableCart","programTargetLevelId","submittedBy","newApproval","useAnchorEl","anchorEl","setAnchorEl","currentTarget","useForm","val","setVal","hasChanges","setHasChanges","field","newVal","useLocalStorageSort","defaultFilters","setFilters","handleSet","updated","useOnScreen","ref","isIntersecting","setIntersecting","observer","IntersectionObserver","entry","observe","disconnect","client","Realtime","useRealtime","channelName","info","channels","channel","subscribe","data","store","unsubscribe","channelCompareFunc","sort","lookupEntityAdapters","dpNewsFeedTags","dpNewsFeedTagId","dpProductFamilies","states","warehouses","lookups","stateSelectors","warehouseSelectors","dpNewsFeedTagSelectors","loaded","getIsLookupLoading","loadingArr","every","getBrandName","loadedArr","abbreviateion","toLoad","lookupsReducer","typedKey","rootReducer","combineReducers","Container","props","white","SplashPage","alt","src","labels","label","icon","faGoogle","faTwitter","LoginButton","handleClick","buttonStyle","LoginErrorServerErrorBody","faExclamationTriangle","size","LoginErrorUnauthorizedBody","faUser","faBan","LoginErrorDialog","Modal","Footer","Button","bsStyle","LoginButtonPanel","Alert","LogoutAlert","margin","href","target","rel","showAlert","FlexColumn","LoginPage","MainPage","Root","hostname","match","ErrorLoggerService","apiKey","environment","_env","rg4js","excludedHostnames","userDetails","fullName","identifier","isAnonymous","errorObj","customData","HttpError","preloadedState","HttpService","baseUrl","accessTokenFunc","errorLogFunc","logoutFunc","fetchAccessTokenFunc","includePrefix","fileUrl","fileName","executeRequest","blob","objectUrl","URL","createObjectURL","anchor","document","createElement","download","click","revokeObjectURL","Headers","stringedPayload","fullUrl","createHttpError","apiEndpoint","httpStatus","exceptionMessage","configureStore","devTools","shouldHotReload","currentTokens","defaultTitle","titleTemplate","ReactDOM","render","Helmet","breakpoints","mobile","hydrohoist","poly","rhino","shoreline","shoremaster","danger","success","warning","position","autoClose","newestOnTop","pauseOnHover","transition","Slide","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch"],"mappings":"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","file":"static/js/main.d52dfbd9.chunk.js","sourcesContent":["export const sendError = (e: unknown): void => {\r\n console.error(e);\r\n};\r\n","import { sendError } from '../utils/logging';\r\n\r\nexport interface IAsyncResponse {\r\n value?: T;\r\n requestFailed: boolean;\r\n exception?: Error;\r\n statusCode?: number;\r\n}\r\n\r\nexport interface IPagedResponse {\r\n items: T[];\r\n totalItems: number;\r\n}\r\n\r\nexport async function executeApiRequest(\r\n apiFunc: () => Promise,\r\n parseJson: boolean = true\r\n): Promise> {\r\n const response: IAsyncResponse = { requestFailed: false };\r\n\r\n try {\r\n const apiReponse = await apiFunc();\r\n response.statusCode = apiReponse.status;\r\n response.requestFailed = !apiReponse.ok;\r\n\r\n if (parseJson) {\r\n response.value = await apiReponse.json();\r\n }\r\n } catch (e) {\r\n sendError(e);\r\n response.exception = e;\r\n response.requestFailed = true;\r\n }\r\n\r\n return response;\r\n}\r\n\r\nexport interface IEditObject {\r\n editedAt: string;\r\n editedBy: string;\r\n value: T;\r\n}\r\n","export enum CartStatus {\r\n Active = 1,\r\n Inactive,\r\n Submitted,\r\n Deleted,\r\n Abandoned\r\n}\r\n","import { IAddress } from '../addresses';\r\nimport { IItemBase } from '../catalog';\r\n\r\nexport interface IActiveCart {\r\n activeCart: {\r\n accountNum: string;\r\n cart?: IActiveCartCart;\r\n cartId?: number;\r\n email: string;\r\n } | null;\r\n id: string;\r\n notificationString: string;\r\n products: IItemBase[] | null;\r\n}\r\n\r\nexport interface IUpdateCartLineResult {\r\n cartId: number;\r\n modifiedAt: string;\r\n modifiedBy: string;\r\n cartLines: ICartLine[];\r\n removedLineIds: number[];\r\n errors: IUpdateCartLineError[];\r\n addressId?: number;\r\n shipMethod?: string;\r\n shipToName?: string | null;\r\n termsChecked?: boolean;\r\n freightCharge?: boolean;\r\n requestedShipDate?: string;\r\n description?: string;\r\n contactId?: string;\r\n}\r\n\r\nexport interface IUpdateCartLineError {\r\n itemId: string;\r\n quantity: number;\r\n description: string;\r\n message: string;\r\n}\r\n\r\ninterface ICartBase {\r\n axContactId: string | null;\r\n cartId: number;\r\n description: string | null;\r\n createdByEmail: string;\r\n createdByName: string;\r\n createdAt: string;\r\n modifiedAt: string;\r\n modifiedByEmail: string;\r\n modifiedByName: string;\r\n shipMethod: string;\r\n cartStatusId: number;\r\n cartTypeId: number;\r\n submittedUserType?: number;\r\n submittedBy: string;\r\n submittedAt: string;\r\n addressId: number;\r\n requestedShipDate: string;\r\n freightCharge: boolean | null;\r\n termsChecked: boolean | null;\r\n shipToName: null | string;\r\n salesOrders: { axSalesId: string; cartId: number }[] | null;\r\n}\r\n\r\nexport interface IActiveCartCart extends ICartPartial {\r\n address?: {\r\n addressId: number;\r\n addressTypeId: number;\r\n axRecId: number | null;\r\n city: string;\r\n country: string | null;\r\n countyId: number | null;\r\n geo: unknown;\r\n locationTypeId: number;\r\n name: string;\r\n state: {\r\n id: number;\r\n name: string;\r\n abbreviation: string;\r\n country: string;\r\n type: 'state' | 'province';\r\n fipsId: string;\r\n };\r\n stateId: number;\r\n street: string;\r\n street2: string;\r\n upsValidated: boolean;\r\n validated: boolean;\r\n zipcode: string;\r\n };\r\n}\r\n\r\nexport interface ICartNormalized extends ICartBase {\r\n cartLineIds: number[];\r\n}\r\n\r\ninterface ICartPartial extends ICartBase {\r\n cartLines: ICartLine[] | null;\r\n salesOrders: { cartId: number; axSalesId: string }[] | null;\r\n}\r\n\r\nexport interface ICart extends ICartPartial {\r\n address?: IAddress;\r\n}\r\n\r\nexport interface ICartLine {\r\n cartLineId: number;\r\n cartId: number;\r\n itemId: string;\r\n description?: string;\r\n quantity: number;\r\n paymentMethod?: string;\r\n inventColorId?: string;\r\n brand?: string;\r\n price?: number;\r\n removed?: boolean;\r\n createdAt?: string;\r\n createdByEmail?: string;\r\n modifiedAt?: string;\r\n modifiedByEmail?: string;\r\n retailPrice?: number;\r\n requestedShipDate?: string;\r\n warehouseId: string;\r\n inventTransId: string | null;\r\n}\r\n\r\nexport interface IBulkUpdateCartRequest {\r\n cartId: number;\r\n paymentMethod?: string;\r\n requestedShipDate?: Date;\r\n preseasonYear?: string;\r\n preseasonBrand?: string;\r\n warehouseId?: string;\r\n shipMethod?: string;\r\n addressId?: number;\r\n shipToName?: string;\r\n termsChecked?: boolean;\r\n freightCharge?: boolean;\r\n description?: string;\r\n contactId?: string;\r\n}\r\n\r\nexport interface IBulkUpdateItem {\r\n itemId: string;\r\n inventColorId?: string;\r\n quantity: number;\r\n}\r\n\r\nexport interface IBulkUpdateItemsRequest {\r\n mergeType: CartLineMergeType;\r\n items: IBulkUpdateItem[];\r\n}\r\n\r\nexport enum CartLineMergeType {\r\n /** Replace any matching cart line with the new value */\r\n Replace = 1,\r\n /** If there are any matching item ids, merge the two values */\r\n Merge,\r\n /** Remove the item from the cart */\r\n EmptyCart,\r\n /** Merge the cart line is there are no errors */\r\n SafeMerge\r\n}\r\n\r\nexport interface IGroupedCart {\r\n brand: string;\r\n cartLines: ICartLine[];\r\n paymentMethod: string;\r\n requestedShipDate: string;\r\n warehouseId: string;\r\n}\r\n\r\nexport interface ICartPurchaseOrderNumber {\r\n cartId: number;\r\n brand: string;\r\n paymentMethod: string;\r\n purchaseOrderNumber: string;\r\n requestedShipDate: string;\r\n}\r\n\r\nexport interface ISubmitCartResponse {\r\n errors: string[];\r\n isValid: boolean;\r\n axErrors: string[];\r\n axValid: boolean;\r\n salesIds: string[];\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport isWithinInterval from 'date-fns/esm/isWithinInterval';\r\nimport { RootState } from '..';\r\nimport { notUndefined } from '../../utils/objectUtils';\r\nimport { brandSelectors } from '../lookups';\r\nimport { CartStatus } from './cartEnums';\r\nimport { ICart, ICartLine } from './cartsInterfaces';\r\n\r\nexport const _getCartLines = (cartLines: Record, cartId: number) =>\r\n Object.values(cartLines)\r\n .filter(x => x?.cartId === cartId && !x.removed)\r\n .filter(notUndefined);\r\n\r\nexport const getCarts = createSelector(\r\n [(state: RootState) => state.carts, (state: RootState) => state.addresses.entities],\r\n (carts, addressHash): ICart[] => {\r\n return Object.values(carts.carts)\r\n .filter(notUndefined)\r\n .filter(x => x.cartStatusId === CartStatus.Active || x.cartStatusId === CartStatus.Inactive) // make sure it's active or inactive\r\n .map(x => ({\r\n ...x,\r\n address: x.addressId ? addressHash[x.addressId] : undefined,\r\n cartLines: x.cartLineIds.map(y => carts.cartLines[y]).filter(notUndefined),\r\n salesOrders: null\r\n }));\r\n }\r\n);\r\n\r\nexport const getCart = createSelector(\r\n [\r\n (state: RootState) => state.carts.carts,\r\n (state: RootState) => state.carts.cartLines,\r\n (_: RootState, cartId: number) => cartId\r\n ],\r\n (carts, cartLines, cartId) => {\r\n const cartMin = carts[cartId];\r\n\r\n if (cartMin) {\r\n const cart: ICart = {\r\n ...cartMin,\r\n cartLines: _getCartLines(cartLines, cartId)\r\n };\r\n\r\n return cart;\r\n }\r\n }\r\n);\r\n\r\nexport const getActiveCart = createSelector(\r\n [\r\n (state: RootState) => state.carts.activeCartId,\r\n (state: RootState) => state.carts.cartLines,\r\n (state: RootState) => state.carts.carts,\r\n (state: RootState) => state.addresses.entities\r\n ],\r\n (activeCartId, cartLines, carts, addressHash): ICart | undefined => {\r\n if (activeCartId) {\r\n const activeCartBase = carts[activeCartId];\r\n\r\n return activeCartBase\r\n ? {\r\n ...activeCartBase,\r\n address: activeCartBase.addressId ? addressHash[activeCartBase.addressId] : undefined,\r\n cartLines: activeCartBase.cartLineIds\r\n .map(x => cartLines[x])\r\n .filter(notUndefined)\r\n .filter(x => x && !x.removed),\r\n salesOrders: null\r\n }\r\n : undefined;\r\n }\r\n return undefined;\r\n }\r\n);\r\n\r\nexport const getActiveCartLines = createSelector(\r\n getActiveCart,\r\n (activeCart): ICartLine[] => activeCart?.cartLines ?? []\r\n);\r\n\r\nexport const getCartItemCount = createSelector(\r\n [\r\n (state: RootState) => state.carts.cartLines,\r\n (state: RootState) => state.carts.carts,\r\n (_: RootState, request: { cartId: number; itemId: string }) => request\r\n ],\r\n (cartLinesHash, cartsHash, { cartId, itemId }) => {\r\n const cartLineIds = cartsHash[cartId]?.cartLineIds ?? [];\r\n\r\n return cartLineIds.reduce((total, cartLineId) => {\r\n const line = cartLinesHash[cartLineId];\r\n\r\n return line && line.itemId === itemId ? (total += line.quantity) : total;\r\n }, 0);\r\n }\r\n);\r\n\r\nexport const getCartLineTotal = createSelector(\r\n [\r\n (state: RootState) => state.cashDiscounts.entities,\r\n (state: RootState) => state.core.settings?.paymentTerms ?? [],\r\n (state: RootState) => Object.values(state.catalog.items.entities),\r\n (_: RootState, cartLine: ICartLine) => cartLine\r\n ],\r\n (cashDiscounts, paymentTerms, products, cartLine): number => {\r\n const baseCartLineTotal = cartLine.price ? cartLine.price * cartLine.quantity : 0;\r\n const isPaymentDiscountable =\r\n paymentTerms.find(x => x.paymentTermId === cartLine.paymentMethod)?.cashDiscount ?? false;\r\n const isItemDiscountDisabled = products.find(x => x?.cashDiscountDisabled ?? false);\r\n\r\n if (!isPaymentDiscountable || isItemDiscountDisabled) {\r\n return baseCartLineTotal;\r\n }\r\n\r\n const requestedShipDate = cartLine.requestedShipDate ? new Date(cartLine.requestedShipDate) : undefined;\r\n\r\n const cashDiscount = requestedShipDate\r\n ? Object.values(cashDiscounts)\r\n .flatMap(x => x?.discounts ?? [])\r\n .find(x =>\r\n isWithinInterval(requestedShipDate, {\r\n end: new Date(x.endDate),\r\n start: new Date(x.startDate)\r\n })\r\n )\r\n : undefined;\r\n\r\n return cashDiscount ? baseCartLineTotal * (1 - cashDiscount.amount / 100) : baseCartLineTotal;\r\n }\r\n);\r\n\r\nexport const getActiveCartTotal = createSelector(\r\n [(state: RootState) => state, getActiveCartLines],\r\n (state, lines): number => lines.reduce((total, line) => (total += getCartLineTotal(state, line)), 0)\r\n);\r\n\r\nexport const getCartProducts = createSelector(\r\n [\r\n (state: RootState) => state.carts.carts,\r\n (state: RootState) => state.carts.cartLines,\r\n (state: RootState) => state.catalog.items.entities,\r\n (_: RootState, cartId: number) => cartId\r\n ],\r\n (cartHash, cartLineHash, productHash, cartId) => {\r\n const cartLineIds = cartHash[cartId]?.cartLineIds ?? [];\r\n const cartLines = cartLineIds\r\n .map(x => cartLineHash[x])\r\n .filter(notUndefined)\r\n .filter(x => !x.removed);\r\n const products = cartLines.map(x => productHash[x.itemId]).filter(notUndefined);\r\n\r\n return products;\r\n }\r\n);\r\n\r\nexport const getActiveCartLinesByItemId = createSelector(\r\n [getActiveCartLines, (_: RootState, itemId: string) => itemId],\r\n (cartLines, ItemId): ICartLine[] => cartLines.filter(x => x.itemId === ItemId)\r\n);\r\n\r\nexport const getIsItemInCart = createSelector(getActiveCartLinesByItemId, (cartLines): boolean => cartLines.length > 0);\r\n\r\nexport const getCartLines = createSelector(\r\n [(state: RootState) => state.carts.cartLines, (_: RootState, cartId: number) => cartId],\r\n _getCartLines\r\n);\r\n\r\nexport const getIsCartSubmitted = createSelector(\r\n [(state: RootState) => state.carts.carts, (_: RootState, cartId: number) => cartId],\r\n (carts, cartId): boolean => {\r\n const cart = carts[cartId];\r\n\r\n return cart?.cartStatusId === 3;\r\n }\r\n);\r\n\r\nexport const getCartTotal = createSelector([(state: RootState) => state, getCartLines], (state, lines): number =>\r\n lines.reduce((total, line) => (total += getCartLineTotal(state, line)), 0)\r\n);\r\n\r\nexport const getCartBrandBreakdown = createSelector([brandSelectors.selectAll, getCartLines], (brands, cartLines) => {\r\n const summed = cartLines.reduce>((hash, line) => {\r\n if (line && line.price && line.brand) {\r\n const amount = line.quantity * line.price;\r\n if (!hash[line.brand]) {\r\n hash[line.brand] = 0;\r\n }\r\n\r\n hash[line.brand] = hash[line.brand] + amount;\r\n }\r\n return hash;\r\n }, {});\r\n\r\n return brands.reduce>((obj, item) => {\r\n obj[item.id] = summed[item.abbreviation] ? summed[item.abbreviation] : 0;\r\n return obj;\r\n }, {});\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions, getIsEmployee } from '../../core';\r\nimport { IUpdateCartLineResult } from '../cartsInterfaces';\r\n\r\nexport const addConfigurationToCartThunk = createAsyncThunk(\r\n 'carts/addConfiguration',\r\n async (\r\n { configurationNumber, cartId, quantity = 1 }: { configurationNumber: string; cartId?: number; quantity?: number },\r\n { dispatch, getState, rejectWithValue }\r\n ) => {\r\n const state = getState() as RootState;\r\n cartId = cartId ?? state.carts.activeCartId;\r\n const isEmployee = getIsEmployee(state);\r\n\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const result = await executeApiRequest(() =>\r\n httpService.post('/Cart/AddConfiguration', { cartId, configurationNumber, quantity })\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (result.requestFailed) {\r\n toast(`Failed to add configuration ${configurationNumber} to cart. Please try again.`, { type: 'error' });\r\n return rejectWithValue(`Failed to add configuration ${configurationNumber} to cart.`);\r\n }\r\n\r\n if (result.value) {\r\n if (isUpdateCartLineResult(result.value)) {\r\n if (result.value.errors.length > 0) {\r\n if (isEmployee) {\r\n // TODO implment this dialog\r\n //yield put(modalActions.showModal('PROCESS_CARTLINE_ERRORS', { updateErrors: value.errors }));\r\n } else {\r\n const message =\r\n `Your configuration contains non-standard parts, but don't worry, it has been saved.` +\r\n ` Please contact the Customer Care Team at 877-998-2314 for help adding this configuration to your cart.`;\r\n\r\n dispatch(coreActions.toggleMessageDialog(message));\r\n }\r\n\r\n toast(`Added ${result.value.cartLines.length} items to cart with ${result.value.errors.length} warnings.`, {\r\n type: 'warning'\r\n });\r\n } else {\r\n toast(`Added ${result.value.cartLines.length} items to cart.`, { type: 'success' });\r\n }\r\n\r\n return result.value;\r\n } else {\r\n dispatch(\r\n coreActions.toggleMessageDialog(\r\n `This configuration was unable to be validated. Please open the configuration to view and fix the problems.`\r\n )\r\n );\r\n }\r\n }\r\n }\r\n);\r\n\r\nfunction isUpdateCartLineResult(obj: unknown): obj is IUpdateCartLineResult {\r\n return (obj as IUpdateCartLineResult)?.cartId !== undefined;\r\n}\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { IBulkUpdateItemsRequest } from '..';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { IUpdateCartLineResult } from '../cartsInterfaces';\r\n\r\nexport const bulkAddItemsToCartThunk = createAsyncThunk(\r\n 'carts/bulkAddItems',\r\n async (\r\n { updateObj, cartId }: { updateObj: IBulkUpdateItemsRequest; cartId?: number },\r\n { rejectWithValue, dispatch, getState }\r\n ) => {\r\n cartId = cartId ?? (getState() as RootState).carts.activeCartId;\r\n\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const result = await executeApiRequest(() =>\r\n httpService.post(`/Cart/${cartId}/BulkAddItems`, updateObj)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (result.requestFailed) {\r\n const message = 'Updating failed. Please retry.';\r\n toast(message, { type: 'error' });\r\n return rejectWithValue(message);\r\n }\r\n\r\n toast(`${result.value?.cartLines.length} items upated/added.`, { type: 'success' });\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { IBulkUpdateCartRequest, IUpdateCartLineResult } from '../cartsInterfaces';\r\n\r\nexport const bulkUpdateCartThunk = createAsyncThunk(\r\n 'carts/bulkUpdate',\r\n async (\r\n { request, disableSpinner }: { request: IBulkUpdateCartRequest; disableSpinner?: boolean },\r\n { rejectWithValue, dispatch }\r\n ) => {\r\n if (!disableSpinner) {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n }\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/Cart/${request.cartId}/BulkUpdate`, request)\r\n );\r\n if (!disableSpinner) {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n }\r\n\r\n if (response.requestFailed) {\r\n toast('There was a problem updating the cart. Please Retry', { type: 'error' });\r\n return rejectWithValue('Failed to bulk update cart');\r\n }\r\n\r\n if (request.paymentMethod !== undefined) {\r\n toast(`Updated Cart Payment Methods`, { type: 'success' });\r\n }\r\n if (request.contactId !== undefined) {\r\n toast(`Updated Cart contact`, { type: 'success' });\r\n }\r\n if (request.requestedShipDate !== undefined) {\r\n toast(`Updated Cart Requested Ship Date`, { type: 'success' });\r\n }\r\n if (request.addressId !== undefined) {\r\n toast(`Updated Cart address`, { type: 'success' });\r\n }\r\n if (request.shipMethod !== undefined) {\r\n toast(`Updated ship method`, { type: 'success' });\r\n }\r\n if (request.warehouseId !== undefined) {\r\n toast(`Updated Warehouse to ${request.warehouseId}`, { type: 'success' });\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { IUpdateCartLineResult } from '../';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const deleteCartLinesThunk = createAsyncThunk(\r\n 'carts/deleteCartLines',\r\n async (cartLineIds: number[], { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() =>\r\n httpService.delete(`/CartLines`, cartLineIds)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n toast(`There was a problem removing the cart line. Please retry.`, { type: 'error' });\r\n return rejectWithValue('Failed To delete cartline');\r\n }\r\n\r\n toast(`${cartLineIds.length} Cart Lines removed successfully.`, { type: 'info' });\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { IUpdateCartLineResult } from '../';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const deleteCartLineThunk = createAsyncThunk(\r\n 'carts/deleteCartLine',\r\n async (cartLineId: number, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() =>\r\n httpService.delete(`/CartLines/${cartLineId}`)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n toast(`There was a problem removing the cart line. Please retry.`, { type: 'error' });\r\n return rejectWithValue('Failed To delete cartline');\r\n }\r\n\r\n toast('Cart Line removed successfully.', { type: 'info' });\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IActiveCart } from '../';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const fetchActiveCartThunk = createAsyncThunk('carts/fetchActive', async (_, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() => httpService.get('/Cart/ActiveCart'));\r\n\r\n if (result.requestFailed) {\r\n rejectWithValue('Failed to fetch active cart');\r\n }\r\n\r\n return result.value;\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { fetchActiveCartThunk } from './fetchActiveCartThunk';\r\n\r\nexport const deleteCartThunk = createAsyncThunk(\r\n 'carts/delete',\r\n async (cartId: number, { dispatch, rejectWithValue, getState }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() => httpService.delete(`/Cart/${cartId}`), false);\r\n\r\n if (cartId === (getState() as RootState).carts.activeCartId) {\r\n await dispatch(fetchActiveCartThunk());\r\n }\r\n\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n const message = `Failed to delete cart ${cartId}.`;\r\n\r\n toast(message, { type: 'error' });\r\n return rejectWithValue(message);\r\n }\r\n\r\n toast(`Sucessfully removed cart ${cartId}`, { type: 'info' });\r\n\r\n return cartId;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { ICart } from '../cartsInterfaces';\r\n\r\nexport const fetchSavedCartsThunk = createAsyncThunk('carts/savedCarts', async (_, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get('/Cart'));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch saved carts');\r\n }\r\n\r\n return response.value;\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { IActiveCart } from '../cartsInterfaces';\r\n\r\nexport const setActiveCartThunk = createAsyncThunk(\r\n 'carts/setActiveCart',\r\n async (cartId: number, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() => httpService.post(`/Cart/ActiveCart/${cartId}`));\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to set Active Cart');\r\n }\r\n\r\n if (response.value?.notificationString) {\r\n dispatch(coreActions.toggleActiveCartMessageDialog(response.value.notificationString));\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IUpdateCartLineResult } from '../';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const splitLineThunk = createAsyncThunk(\r\n 'carts/splitLine',\r\n async ({ cartLineId, newQuantity }: { cartLineId: number; newQuantity: number }, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/CartLines/${cartLineId}/Split`, newQuantity)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to split cart line');\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { ISubmitCartResponse } from '../cartsInterfaces';\r\nimport { fetchActiveCartThunk } from './fetchActiveCartThunk';\r\n\r\nexport const submitOrderThunk = createAsyncThunk('carts/submitOrder', async (cartId: number, { dispatch }) => {\r\n const result = await executeApiRequest(() => httpService.post(`/Cart/${cartId}/Submit`));\r\n\r\n if (!result.requestFailed) {\r\n dispatch(fetchActiveCartThunk());\r\n }\r\n\r\n return result.value;\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { ICartLine, IUpdateCartLineResult } from '../';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const updateCartLineThunk = createAsyncThunk(\r\n 'carts/updateCartLine',\r\n async (\r\n { cartLine, disableDialog }: { cartLine: ICartLine; disableDialog?: boolean },\r\n { rejectWithValue, dispatch }\r\n ) => {\r\n if (!disableDialog) {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n }\r\n const response = await executeApiRequest(() => httpService.post('/CartLines', cartLine));\r\n if (!disableDialog) {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n }\r\n\r\n if (response.requestFailed) {\r\n toast('There was a problem adding this item to the cart. Please retry.', { type: 'error' });\r\n\r\n return rejectWithValue('Failed To Update cartline');\r\n }\r\n\r\n toast(\r\n `${cartLine.description ? cartLine.description : cartLine.itemId} ${\r\n cartLine.cartLineId > 0 ? 'updated' : 'added'\r\n }`,\r\n { type: 'success' }\r\n );\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAction, createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { keyBy, omit, uniq } from 'lodash-es';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { initAppThunk } from '../core';\r\nimport {\r\n initPreSeasonApprovalThunk,\r\n initPreSeasonThunk,\r\n initSubmitPreSeasonThunk,\r\n recalcPreSeasonOrderThunk,\r\n rejectPreSeasonOrderThunk,\r\n submitPreSeasonToAxThunk,\r\n updatePreSeasonItemThunk,\r\n updateTargetLevelThunk\r\n} from '../preSeason';\r\nimport { CartStatus } from './cartEnums';\r\nimport {\r\n IActiveCart,\r\n IActiveCartCart,\r\n ICart,\r\n ICartLine,\r\n ICartNormalized,\r\n IUpdateCartLineResult\r\n} from './cartsInterfaces';\r\nimport {\r\n addConfigurationToCartThunk,\r\n bulkAddItemsToCartThunk,\r\n bulkUpdateCartThunk,\r\n deleteCartLinesThunk,\r\n deleteCartLineThunk,\r\n deleteCartThunk,\r\n fetchActiveCartThunk,\r\n fetchSavedCartsThunk,\r\n setActiveCartThunk,\r\n splitLineThunk,\r\n updateCartLineThunk\r\n} from './thunks';\r\n\r\ninterface ICartsState {\r\n activeCartId: number | undefined;\r\n carts: Record;\r\n cartLines: Record;\r\n activeCartLineIds: number[];\r\n activeItems: string[];\r\n}\r\n\r\nconst initialState: ICartsState = {\r\n activeCartId: undefined,\r\n activeCartLineIds: [],\r\n activeItems: [],\r\n cartLines: {},\r\n carts: {}\r\n};\r\n\r\nconst CartLIneRealtimeUpdate = createAction('carts/realtime/cartLinesUpdate');\r\n\r\nconst cartsSlice = createSlice({\r\n initialState,\r\n name: 'carts',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n const normalizeCarts = (\r\n state: ICartsState,\r\n carts: Array\r\n ): { carts: Record; cartLines: Record } => {\r\n const normalizedCarts = carts.map(x => {\r\n const current = state.carts[x.cartId] ?? { cartLineIds: [] };\r\n\r\n const updated = omit(\r\n {\r\n ...current,\r\n ...x,\r\n cartLineIds: x.cartLines ? x.cartLines.map(y => y.cartLineId) : current.cartLineIds\r\n },\r\n 'cartLines'\r\n );\r\n\r\n return updated;\r\n });\r\n\r\n const cartHash = keyBy(normalizedCarts, x => x.cartId);\r\n const cartLines = keyBy(\r\n carts.flatMap(x => x.cartLines ?? []),\r\n x => x.cartLineId\r\n );\r\n\r\n return { cartLines, carts: cartHash };\r\n };\r\n\r\n const processUpdates = (\r\n state: ICartsState,\r\n action: PayloadAction\r\n ): ICartsState => {\r\n if (!action.payload) {\r\n return state;\r\n }\r\n const update = action.payload;\r\n const currentCart = state.carts[update.cartId];\r\n\r\n const updatedCart: ICartNormalized | undefined = currentCart\r\n ? {\r\n ...currentCart,\r\n addressId: action.payload.addressId ?? currentCart?.addressId,\r\n axContactId: action.payload.contactId ?? currentCart.axContactId,\r\n cartLineIds: uniq([\r\n ...(currentCart.cartLineIds\r\n ? currentCart.cartLineIds.filter(x => !update.removedLineIds.includes(x))\r\n : []),\r\n ...update.cartLines.map(x => x.cartLineId)\r\n ]),\r\n description: action.payload.description ?? currentCart.description,\r\n freightCharge: action.payload.freightCharge ?? currentCart.freightCharge,\r\n modifiedAt: update.modifiedAt,\r\n modifiedByName: update.modifiedBy,\r\n requestedShipDate: action.payload.requestedShipDate ?? currentCart.requestedShipDate,\r\n shipMethod: action.payload.shipMethod ?? currentCart.shipMethod,\r\n shipToName: action.payload.addressId ? action.payload.shipToName ?? '' : currentCart.shipToName,\r\n termsChecked: action.payload.termsChecked ?? currentCart.termsChecked\r\n }\r\n : undefined;\r\n\r\n const newState: ICartsState = {\r\n ...state,\r\n activeCartLineIds: state.activeCartLineIds.filter(\r\n x => !action.payload?.cartLines.map(y => y.cartLineId).includes(x)\r\n ),\r\n activeItems: state.activeItems.filter(\r\n x => !action.payload?.cartLines.map(y => `${y.itemId}_${y.inventColorId}`).includes(x)\r\n ),\r\n cartLines: { ...omit(state.cartLines, update.removedLineIds), ...keyBy(update.cartLines, x => x.cartLineId) },\r\n carts: { ...omit(state.carts, update.cartId), [update.cartId]: updatedCart }\r\n };\r\n\r\n return newState;\r\n };\r\n\r\n const setActiveCart = (state: ICartsState, action: PayloadAction): ICartsState => {\r\n const newState = { ...state };\r\n if (action.payload) {\r\n newState.activeCartId = action.payload.activeCart?.cartId;\r\n\r\n if (action.payload.activeCart?.cart) {\r\n const normalized = normalizeCarts(newState, [action.payload.activeCart.cart]);\r\n newState.cartLines = { ...newState.cartLines, ...normalized.cartLines };\r\n newState.carts = { ...newState.carts, ...normalized.carts };\r\n }\r\n }\r\n\r\n return newState;\r\n };\r\n\r\n builder\r\n .addCase(CartLIneRealtimeUpdate, processUpdates)\r\n .addCase(deleteCartThunk.fulfilled, (state, action) => {\r\n state.carts = omit(state.carts, action.payload);\r\n })\r\n .addCase(fetchSavedCartsThunk.fulfilled, (state, action) => {\r\n if (action.payload && action.payload.length > 0) {\r\n const normalized = normalizeCarts(state, action.payload);\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(\r\n initAppThunk.fulfilled,\r\n (\r\n state,\r\n {\r\n payload: {\r\n activeCart: { activeCart }\r\n }\r\n }\r\n ) => {\r\n state.activeCartId = activeCart?.cartId;\r\n\r\n if (activeCart?.cart) {\r\n const normalized = normalizeCarts(state, [activeCart.cart]);\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n }\r\n )\r\n .addCase(initPreSeasonThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const normalized = normalizeCarts(state, [action.payload.psCart.cart]);\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(initSubmitPreSeasonThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const carts = action.payload.psCarts.map(x => x.cart);\r\n const normalized = normalizeCarts(state, carts);\r\n\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(initPreSeasonApprovalThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const carts = action.payload.psCarts.map(x => x.cart);\r\n const normalized = normalizeCarts(state, carts);\r\n\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(updateTargetLevelThunk.fulfilled, (state, action) => {\r\n if (action.payload?.value.cartLines) {\r\n if (action.payload.value.cartLines.length > 0) {\r\n const cart = state.carts[action.payload.value.cartLines[0].cartId];\r\n\r\n if (cart) {\r\n state.carts = {\r\n ...state.carts,\r\n [cart.cartId]: { ...cart, modifiedAt: action.payload.editedAt, modifiedByName: action.payload.editedBy }\r\n };\r\n }\r\n\r\n state.cartLines = { ...state.cartLines, ...keyBy(action.payload.value.cartLines, x => x.cartLineId) };\r\n }\r\n }\r\n })\r\n .addCase(updateCartLineThunk.pending, (state, action) => {\r\n if (action.meta.arg.cartLine.cartLineId > 0) {\r\n state.activeCartLineIds = [...state.activeCartLineIds, action.meta.arg.cartLine.cartLineId];\r\n } else {\r\n state.activeItems = [\r\n ...state.activeItems,\r\n `${action.meta.arg.cartLine.itemId}_${action.meta.arg.cartLine.inventColorId}`\r\n ];\r\n }\r\n })\r\n .addCase(updatePreSeasonItemThunk.pending, (state, action) => {\r\n state.activeItems = [...state.activeItems, `${action.meta.arg.itemId}_${action.meta.arg.inventColorId}`];\r\n })\r\n .addCase(updatePreSeasonItemThunk.rejected, (state, action) => {\r\n state.activeItems = state.activeItems.filter(\r\n x => x !== `${action.meta.arg.itemId}_${action.meta.arg.inventColorId}`\r\n );\r\n })\r\n .addCase(submitPreSeasonToAxThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const cart = state.carts[action.meta.arg.cart.cartId];\r\n\r\n if (cart) {\r\n state.carts[cart.cartId] = {\r\n ...cart,\r\n cartStatusId: CartStatus.Submitted,\r\n salesOrders: action.payload.salesIds.map<{ axSalesId: string; cartId: number }>(x => ({\r\n axSalesId: x,\r\n cartId: cart.cartId\r\n })),\r\n submittedAt: action.payload.processedAt\r\n };\r\n }\r\n }\r\n })\r\n .addCase(rejectPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload?.cart) {\r\n const normalized = normalizeCarts(state, [action.payload.cart]);\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(recalcPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload?.cart) {\r\n const normalized = normalizeCarts(state, [action.payload.cart]);\r\n state.cartLines = { ...state.cartLines, ...normalized.cartLines };\r\n state.carts = { ...state.carts, ...normalized.carts };\r\n }\r\n })\r\n .addCase(setActiveCartThunk.fulfilled, setActiveCart)\r\n .addCase(fetchActiveCartThunk.fulfilled, setActiveCart)\r\n .addCase(splitLineThunk.fulfilled, processUpdates)\r\n .addCase(updatePreSeasonItemThunk.fulfilled, processUpdates)\r\n .addCase(updateCartLineThunk.fulfilled, processUpdates)\r\n .addCase(deleteCartLineThunk.fulfilled, processUpdates)\r\n .addCase(deleteCartLinesThunk.fulfilled, processUpdates)\r\n .addCase(bulkUpdateCartThunk.fulfilled, processUpdates)\r\n .addCase(addConfigurationToCartThunk.fulfilled, processUpdates)\r\n .addCase(bulkAddItemsToCartThunk.fulfilled, processUpdates)\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: cartsActions, reducer: cartsReducer } = cartsSlice;\r\n","export interface IMe {\r\n accountNum: string | null;\r\n dealerName: string | null;\r\n email: string;\r\n iconColor: string;\r\n name: string;\r\n phoneNumber: string;\r\n userType: number;\r\n}\r\n\r\nexport const UserType = {\r\n Admin: 2,\r\n Employee: 1,\r\n User: 3\r\n} as const;\r\n\r\nexport interface IConfiguratorAccess {\r\n enabled: boolean;\r\n dealerDisabled: boolean;\r\n url: string;\r\n}\r\n\r\nexport interface ISettings {\r\n experlogix: IConfiguratorAccess;\r\n freeShipping: IFreeShippingAccess;\r\n paymentTerms: IPaymentTerm[];\r\n preSeason: { startDate: string; endDate: string; fiscalYear: string };\r\n shipping: {\r\n canCanadaDropShip: boolean;\r\n shipMethods: { label: string; value: string; parcelShipMethod: boolean }[];\r\n };\r\n featureFlags: IFeatureFlags;\r\n footerLogos: { order: number; brandId: number }[];\r\n}\r\n\r\nexport interface IPaymentTerm {\r\n cashDiscount: boolean;\r\n description: string;\r\n paymentTermId: string;\r\n}\r\n\r\nexport interface IFreeShippingAccess {\r\n dealerEnabled: boolean;\r\n validShipMethods: string[];\r\n validRange: { startDate: string; endDate: string };\r\n}\r\n\r\nexport interface IFeatureFlags {\r\n newsFeed: IFeatureFlag;\r\n catalog: IFeatureFlag;\r\n configurator: IFeatureFlag;\r\n preSeason: IFeatureFlag;\r\n carts: IFeatureFlag;\r\n orders: IFeatureFlag;\r\n logisticsSupport: IFeatureFlag;\r\n salesSupport: IFeatureFlag;\r\n warrantySupport: IFeatureFlag;\r\n}\r\n\r\ninterface IFeatureFlag {\r\n dealerEnabled: boolean;\r\n employeeEnabled: boolean;\r\n}\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { isWithinInterval, startOfDay } from 'date-fns';\r\nimport { RootState } from '../';\r\nimport { IFeatureFlags, IMe, UserType } from './coreInterfaces';\r\n\r\nexport const getMe = createSelector(\r\n (state: RootState) => state.core.me,\r\n (me): IMe =>\r\n me ?? {\r\n accountNum: '',\r\n dealerName: 'Unknown',\r\n email: '',\r\n iconColor: 'grey',\r\n name: '?',\r\n phoneNumber: '',\r\n userType: UserType.User\r\n }\r\n);\r\n\r\nexport const getIsEmployee = createSelector(getMe, me => me.userType === UserType.Employee);\r\n\r\nexport const getFeatureFlag = createSelector(\r\n [(state: RootState) => state.core.settings?.featureFlags, (_: RootState, feature?: keyof IFeatureFlags) => feature],\r\n (flags, feature) => (flags && feature ? flags[feature] : { dealerEnabled: false, employeeEnabled: false })\r\n);\r\n\r\nexport const getIsDealerSelected = createSelector(\r\n [getIsEmployee, (state: RootState) => state.auth.employeeSelectedDealer],\r\n (isEmployee, selected) => !isEmployee || (isEmployee && selected.accountNum)\r\n);\r\n\r\nexport const getIsPreseasonActive = createSelector(\r\n [(state: RootState) => state.core.settings?.preSeason, () => startOfDay(new Date()).getTime()],\r\n (ps, date): boolean =>\r\n ps ? isWithinInterval(date, { end: new Date(ps.endDate), start: new Date(ps.startDate) }) : false\r\n);\r\n\r\nconst getPaymentTermObj = createSelector(\r\n [\r\n (state: RootState) => state.core.settings?.paymentTerms ?? [],\r\n (_: RootState, paymentTermId?: string) => paymentTermId\r\n ],\r\n (paymentTerms, paymentTermId) => ({\r\n paymentTerm: paymentTerms.find(x => x.paymentTermId === paymentTermId),\r\n paymentTermId\r\n })\r\n);\r\n\r\nexport const getPaymentTerm = createSelector(getPaymentTermObj, paymentTermObj => paymentTermObj.paymentTerm);\r\n\r\nexport const getPaymentTermLabel = createSelector(\r\n getPaymentTermObj,\r\n ({ paymentTerm, paymentTermId }) => paymentTerm?.description ?? paymentTermId\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { errorLogger, httpService } from '../../..';\r\nimport { IActiveCart } from '../../carts';\r\nimport { ICashDiscount } from '../../cashDiscounts';\r\nimport { fetchLookupsThunk } from '../../lookups';\r\nimport { IMe, ISettings } from '../coreInterfaces';\r\nimport { coreActions } from '../coreSlice';\r\n\r\nasync function fetchData(url: string): Promise {\r\n const response = await httpService.get(url);\r\n\r\n return await response.json();\r\n}\r\n\r\nexport const initAppThunk = createAsyncThunk(\r\n 'core/initApp',\r\n async (showFullLoading: boolean, { rejectWithValue, dispatch }) => {\r\n try {\r\n const [me, settings, activeCart, cashDiscounts] = await Promise.all([\r\n fetchData('/Me'),\r\n fetchData('/Settings'),\r\n fetchData('/Cart/ActiveCart'),\r\n fetchData('/CashDiscounts?fiscalYear='),\r\n import(/* webpackChunkName: 'MainPage' */ '../../../layout/MainPage'),\r\n dispatch(fetchLookupsThunk(['brands']))\r\n ]);\r\n\r\n if (me) {\r\n errorLogger.setUser(me.email, me.name);\r\n }\r\n\r\n if (activeCart.notificationString) {\r\n dispatch(coreActions.toggleActiveCartMessageDialog(activeCart.notificationString));\r\n }\r\n\r\n return { activeCart, cashDiscounts, me, settings };\r\n } catch (error) {\r\n return rejectWithValue('Failed to init app');\r\n }\r\n }\r\n);\r\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { fetchCurrentAccessTokenThunk } from '../auth/thunks/fetchCurrentAccessTokenThunk';\r\nimport { loginThunk } from '../auth/thunks/loginThunk';\r\nimport { logoutThunk } from '../auth/thunks/logoutThunk';\r\nimport { switchDealerThunk } from '../auth/thunks/switchDealerThunk';\r\nimport { IMe, ISettings } from './coreInterfaces';\r\nimport { initAppThunk } from './thunks';\r\n\r\ninterface ICoreState {\r\n appInitialized: boolean;\r\n appInitializing: boolean;\r\n me: IMe | undefined;\r\n settings: ISettings | undefined;\r\n ui: {\r\n showActiveCartMessageDialog: string | undefined;\r\n showMessageDialog: string | undefined;\r\n showWorkingOnIt: boolean;\r\n };\r\n}\r\n\r\nconst initialState: ICoreState = {\r\n appInitialized: false,\r\n appInitializing: false,\r\n me: undefined,\r\n settings: undefined,\r\n ui: {\r\n showActiveCartMessageDialog: undefined,\r\n showMessageDialog: undefined,\r\n showWorkingOnIt: false\r\n }\r\n};\r\n\r\nconst coreSlice = createSlice({\r\n initialState,\r\n name: 'core',\r\n reducers: {\r\n toggleActiveCartMessageDialog: (state, action: PayloadAction) => {\r\n state.ui.showActiveCartMessageDialog = action.payload;\r\n },\r\n toggleMessageDialog: (state, action: PayloadAction) => {\r\n state.ui.showMessageDialog = action.payload;\r\n },\r\n toggleWorkingOnItDialog: state => {\r\n state.ui.showWorkingOnIt = !state.ui.showWorkingOnIt;\r\n }\r\n },\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(initAppThunk.pending, (state, action) => {\r\n state.appInitializing = action.meta.arg;\r\n })\r\n .addCase(initAppThunk.fulfilled, (state, action) => {\r\n state.appInitialized = true;\r\n state.appInitializing = false;\r\n state.me = action.payload?.me;\r\n state.settings = action.payload?.settings;\r\n })\r\n .addCase(initAppThunk.rejected, state => {\r\n state.appInitialized = false;\r\n state.appInitializing = false;\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(logoutThunk.fulfilled, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: coreActions, reducer: coreReducer } = coreSlice;\r\n","import { useDispatch } from 'react-redux';\r\nimport { store } from '../../';\r\n\r\nexport type AppDispatch = typeof store.dispatch;\r\nexport const useAppDispatch = () => useDispatch();\r\n","import { TypedUseSelectorHook, useSelector } from 'react-redux';\r\nimport { RootState } from '../../ducks';\r\n\r\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"spinner\":\"Spinner_spinner__INoys\",\"sk-stretchdelay\":\"Spinner_sk-stretchdelay__2sPI_\",\"rect1\":\"Spinner_rect1__ucsHM\",\"rect2\":\"Spinner_rect2__Rh8RK\",\"rect3\":\"Spinner_rect3__3sxUU\",\"rect4\":\"Spinner_rect4__6jBxs\",\"rect5\":\"Spinner_rect5__3SVU9\"};","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { RootState } from '../..';\r\nimport { IAccessTokenResponse } from '../../../utils/auth/authInterfaces';\r\nimport { AuthService } from '../../../utils/auth/AuthService';\r\nimport { initAppThunk } from '../../core';\r\n\r\ntype RejectionTypes = 'failedToRefresh' | 'noAuthToken' | '';\r\n\r\nexport const checkAuthTokensThunk = createAsyncThunk<\r\n IAccessTokenResponse | undefined,\r\n void,\r\n { rejectValue: { reason: RejectionTypes } }\r\n>('auth/checkAuthTokens', async (_, { dispatch, rejectWithValue, getState }) => {\r\n const state = getState() as RootState;\r\n let tokens = AuthService.getAuthTokens();\r\n const rejectionReason: { reason: RejectionTypes } = { reason: '' };\r\n\r\n if (tokens) {\r\n if (!tokens.decodedToken || AuthService.isAccessTokenExpired(tokens.decodedToken)) {\r\n // there is no token, need a new one\r\n\r\n try {\r\n tokens = await AuthService.refreshAccessToken(\r\n tokens.refreshToken,\r\n state.auth.employeeSelectedDealer.accountNum\r\n );\r\n } catch {\r\n rejectionReason.reason = 'failedToRefresh';\r\n return rejectWithValue(rejectionReason);\r\n }\r\n }\r\n // we need to check the most recent dealer against the decoded token, if they don't match, fetch a new token\r\n else if (tokens.decodedToken && tokens.decodedToken.accountNum !== state.auth.employeeSelectedDealer.accountNum) {\r\n // the accountNums don't match, we need to get a new token\r\n try {\r\n tokens = await AuthService.refreshAccessToken(\r\n tokens.refreshToken,\r\n state.auth.employeeSelectedDealer.accountNum\r\n );\r\n } catch {\r\n rejectionReason.reason = 'failedToRefresh';\r\n return rejectWithValue(rejectionReason);\r\n }\r\n }\r\n\r\n dispatch(initAppThunk(true));\r\n return tokens;\r\n }\r\n\r\n rejectionReason.reason = 'noAuthToken';\r\n return rejectWithValue(rejectionReason);\r\n});\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { AuthService } from '../../utils/auth/AuthService';\r\nimport {\r\n checkAuthTokensThunk,\r\n fetchCurrentAccessTokenThunk,\r\n loginThunk,\r\n logoutThunk,\r\n switchDealerThunk\r\n} from './thunks';\r\n\r\ninterface IAuthState {\r\n employeeSelectedDealer: { accountNum: string; name: string };\r\n isDealerSwitching: boolean;\r\n isLoggedIn: boolean;\r\n isLoggingIn: boolean;\r\n loginError: boolean;\r\n showLogoutAlert: boolean;\r\n}\r\n\r\nconst getInitialState = (): IAuthState => ({\r\n employeeSelectedDealer: AuthService.mostRecentDealer,\r\n isDealerSwitching: false,\r\n isLoggedIn: false,\r\n isLoggingIn: false,\r\n loginError: false,\r\n showLogoutAlert: false\r\n});\r\n\r\nconst authSlice = createSlice({\r\n initialState: getInitialState(),\r\n name: 'auth',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(checkAuthTokensThunk.pending, state => {\r\n state.isLoggingIn = true;\r\n state.loginError = false;\r\n })\r\n .addCase(checkAuthTokensThunk.fulfilled, state => {\r\n state.isLoggedIn = true;\r\n state.isLoggingIn = false;\r\n })\r\n .addCase(checkAuthTokensThunk.rejected, (state, action) => {\r\n state.isLoggingIn = false;\r\n state.isLoggedIn = false;\r\n\r\n if (action.payload?.reason === 'failedToRefresh') {\r\n state.loginError = true;\r\n }\r\n })\r\n .addCase(fetchCurrentAccessTokenThunk.fulfilled, (state, action) => {\r\n if (\r\n action.payload.decodedToken?.accountNum !== state.employeeSelectedDealer.accountNum &&\r\n !state.isDealerSwitching\r\n ) {\r\n // if for some reason the returned access token has a different account number than is displayed\r\n // to the user\r\n state.employeeSelectedDealer = {\r\n accountNum: action.payload.decodedToken?.accountNum ?? '',\r\n name: ''\r\n };\r\n }\r\n })\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, state => {\r\n state.isLoggedIn = false;\r\n state.loginError = true;\r\n state.isLoggingIn = false;\r\n state.employeeSelectedDealer = { accountNum: '', name: '' };\r\n })\r\n .addCase(loginThunk.pending, state => {\r\n state.isLoggingIn = true;\r\n state.loginError = false;\r\n })\r\n .addCase(loginThunk.fulfilled, state => {\r\n state.isLoggedIn = true;\r\n state.isLoggingIn = false;\r\n })\r\n .addCase(loginThunk.rejected, state => {\r\n state.isLoggingIn = false;\r\n state.isLoggedIn = false;\r\n state.loginError = true;\r\n state.employeeSelectedDealer = { accountNum: '', name: '' };\r\n })\r\n .addCase(logoutThunk.fulfilled, () => ({ ...getInitialState(), showLogoutAlert: true }))\r\n .addCase(switchDealerThunk.pending, state => {\r\n state.isDealerSwitching = true;\r\n })\r\n .addCase(switchDealerThunk.fulfilled, (state, action) => {\r\n state.isDealerSwitching = false;\r\n if (action.payload) {\r\n state.employeeSelectedDealer = action.payload;\r\n }\r\n })\r\n .addCase(switchDealerThunk.rejected, state => {\r\n state.isDealerSwitching = false;\r\n state.isLoggedIn = false;\r\n state.isLoggingIn = false;\r\n state.loginError = true;\r\n state.employeeSelectedDealer = { accountNum: '', name: '' };\r\n });\r\n }\r\n});\r\n\r\nexport const { actions: authActions, reducer: authReducer } = authSlice;\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest, IPagedResponse } from '../../../utils/asyncUtils';\r\nimport { IOrderMin, IOrderSearchFilter } from '../ordersInterfaces';\r\n\r\nexport const fetchOrdersThunk = createAsyncThunk(\r\n 'orders/fetchOrders',\r\n async (\r\n { page, take, searchTerm, orderStatus, preSeason, orderBy, orderByDirection }: IOrderSearchFilter,\r\n { rejectWithValue }\r\n ) => {\r\n const response = await executeApiRequest>(() =>\r\n httpService.get(\r\n `/Orders?skip=${\r\n page === 1 ? 0 : (page - 1) * take\r\n }&take=${take}&searchTerm=${searchTerm}&orderStatus=${orderStatus}${\r\n preSeason ? '&preSeason=1' : ''\r\n }&orderBy=${orderBy}&orderByDirection=${orderByDirection}`\r\n )\r\n );\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch orders');\r\n }\r\n\r\n return response.value ?? { items: [], totalItems: 0 };\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IOrder } from '../ordersInterfaces';\r\n\r\nexport const fetchOrderThunk = createAsyncThunk('orders/fetchOrder', async (salesId: string, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get(`/Orders/${salesId}`));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to fetch sales order ${salesId}`);\r\n }\r\n\r\n return response.value;\r\n});\r\n","import * as React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ninterface IColorLineProps {\r\n variant?: 'warning' | 'danger' | 'success';\r\n}\r\n\r\nconst ColorLineDiv = styled.div<{ variant?: 'warning' | 'danger' | 'success' }>`\r\n background: ${({ variant, theme }) => (variant ? theme.pallette.common[variant] : '#f7f9fa')};\r\n height: 6px;\r\n background-image: ${({ variant, theme }) =>\r\n variant ? '' : `linear-gradient(to right, #545456 30%, ${theme.pallette.brandColors.llc} 100%)`};\r\n background-size: 100% 6px;\r\n background-position: 50% 100%;\r\n background-repeat: no-repeat;\r\n`;\r\n\r\nlet ColorLine: React.ComponentType = ({ variant }) => {\r\n return ;\r\n};\r\n\r\nColorLine = React.memo(ColorLine);\r\nexport { ColorLine };\r\n","import * as React from 'react';\r\nimport classes from './Spinner.module.scss';\r\n\r\ninterface ISpinnerProps {}\r\n\r\nlet Spinner: React.ComponentType = () => {\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nSpinner = React.memo(Spinner);\r\nexport { Spinner };\r\n","export function brandAbbreviationToString(brandAbbreviation: string): string {\r\n switch (brandAbbreviation) {\r\n case 'PDP':\r\n return 'PolyDock Products';\r\n case 'SLI':\r\n return 'Shoreline Industries';\r\n case 'OEM':\r\n return 'OEM Industries';\r\n case 'RHP':\r\n return 'Rhino Marine Systems';\r\n case 'SMR':\r\n return 'ShoreMaster';\r\n case 'HYH':\r\n return 'HydroHoist';\r\n default:\r\n // TODO log to raygun\r\n return 'Unknown';\r\n }\r\n}\r\n\r\nexport function brandIdToString(brandId: number): string {\r\n switch (brandId) {\r\n case 5:\r\n return 'PolyDock Products';\r\n case 2:\r\n return 'Shoreline Industries';\r\n case 3:\r\n return 'OEM Industries';\r\n case 4:\r\n return 'Rhino Marine Systems';\r\n case 1:\r\n return 'ShoreMaster';\r\n case 6:\r\n return 'HydroHoist';\r\n default:\r\n // TODO log to raygun\r\n return 'Unknown';\r\n }\r\n}\r\n\r\nexport function brandAbbreviationToCssTextClass(brandAbbreviation: string): string {\r\n switch (brandAbbreviation) {\r\n case 'PDP':\r\n return 'text-poly';\r\n case 'SLI':\r\n return 'text-shoreline';\r\n case 'OEM':\r\n return '';\r\n case 'RHP':\r\n return 'text-rhino';\r\n case 'SMR':\r\n return 'text-shoremaster';\r\n case 'HYH':\r\n return 'text-hydrohoist';\r\n default:\r\n // TODO log to raygun\r\n return '';\r\n }\r\n}\r\n\r\nexport function brandAbbreviationToPanelHeader(brandAbbreviation: string): string {\r\n switch (brandAbbreviation) {\r\n case 'PDP':\r\n return 'hpoly';\r\n case 'SLI':\r\n return 'hshoreline';\r\n case 'OEM':\r\n return '';\r\n case 'RHP':\r\n return 'hrhino';\r\n case 'SMR':\r\n return 'hshoremaster';\r\n case 'HYH':\r\n return 'hhydrohoist';\r\n default:\r\n // TODO log to raygun\r\n return '';\r\n }\r\n}\r\n\r\nexport function brandIdToCssTextClass(brandId: number): string {\r\n switch (brandId) {\r\n case 5:\r\n return 'text-poly';\r\n case 2:\r\n return 'text-shoreline';\r\n case 3:\r\n return '';\r\n case 4:\r\n return 'text-rhino';\r\n case 1:\r\n return 'text-shoremaster';\r\n case 6:\r\n return 'text-hydrohoist';\r\n default:\r\n // TODO log to raygun\r\n return '';\r\n }\r\n}\r\n\r\nexport function brandAbbreviationToCssBackgroundClass(brandAbbreviation: string): string {\r\n switch (brandAbbreviation) {\r\n case 'PDP':\r\n return 'background-poly';\r\n case 'SLI':\r\n return 'background-shoreline';\r\n case 'OEM':\r\n return '';\r\n case 'RHP':\r\n return 'background-rhino';\r\n case 'SMR':\r\n return 'background-shoremaster';\r\n case 'HYH':\r\n return 'background-hydrohoist';\r\n default:\r\n // TODO log to raygun\r\n return '';\r\n }\r\n}\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { dpProductFamilySelectors } from '../../lookups';\r\nimport { ICatalogFilter, IItem } from '../catalogInterfaces';\r\n\r\nconst pageSize = 10;\r\n\r\nexport const fetchCatalogThunk = createAsyncThunk(\r\n 'fetchCatalog',\r\n async (\r\n { page, searchString, productFamilyId, orderBy, orderByDirection }: ICatalogFilter,\r\n { rejectWithValue, getState }\r\n ) => {\r\n const state = getState() as RootState;\r\n const productFamilies = dpProductFamilySelectors.selectAll(state);\r\n\r\n const skip = (page - 1) * pageSize;\r\n\r\n let url = `/Products/Catalog?skip=${skip}&take=${pageSize}&orderBy=${orderBy}&orderByDirection=${orderByDirection}`;\r\n\r\n if (searchString) {\r\n url += `&searchTerm=${encodeURIComponent(searchString)}`;\r\n }\r\n\r\n if (productFamilyId) {\r\n const ids = productFamilies.find(x => x.id === productFamilyId)?.productFamilyIds ?? [];\r\n\r\n url += `&${ids.map(x => `productFamilies=${x}`).join('&')}`;\r\n }\r\n\r\n const results = await executeApiRequest<{ items: IItem[]; totalItems: number }>(() => httpService.get(url));\r\n\r\n if (results.requestFailed) {\r\n return rejectWithValue('Failed to fetch catalog');\r\n }\r\n\r\n return results.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { RootState } from '../..';\r\nimport { AuthService } from '../../../utils/auth/AuthService';\r\nimport { getIsEmployee } from '../../core';\r\n\r\nexport const fetchCurrentAccessTokenThunk = createAsyncThunk(\r\n 'auth/fetchCurrentAccessToken',\r\n async (_, { rejectWithValue, getState }) => {\r\n const state = getState() as RootState;\r\n try {\r\n const accountNum = getIsEmployee(state) ? state.auth.employeeSelectedDealer.accountNum : undefined;\r\n\r\n const result = await AuthService.fetchCurrentAccessToken(accountNum);\r\n // const selectedDealer = state.auth.employeeSelectedDealer;\r\n return {\r\n accessToken: result?.accessToken,\r\n //accountNum: selectedDealer.accountNum,\r\n decodedToken: result?.decodedToken,\r\n //name: selectedDealer.name,\r\n refreshToken: result?.refreshToken\r\n };\r\n } catch (error) {\r\n return rejectWithValue('Failed to fetch current access token');\r\n }\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { AuthProviders } from '../../../utils/auth/authInterfaces';\r\nimport { AuthService } from '../../../utils/auth/AuthService';\r\nimport { initAppThunk } from '../../core';\r\n\r\nexport type LoginThunkRejection = { serverError?: boolean; rejectedEmail?: string };\r\n\r\nexport const loginThunk = createAsyncThunk(\r\n 'auth/login',\r\n async (provider: AuthProviders, { rejectWithValue, dispatch }) => {\r\n try {\r\n const authCode =\r\n provider === 'google'\r\n ? await AuthService.fetchGoogleAuthorizationCode(provider)\r\n : await AuthService.fetchAuthorizationCode(provider);\r\n console.log('AuthCode', authCode);\r\n const accessTokenResponse =\r\n provider === 'google'\r\n ? await AuthService.fetchGoogleAccessToken(authCode)\r\n : await AuthService.fetchAccessToken(authCode);\r\n console.log('accessTokenResponse', accessTokenResponse);\r\n if (accessTokenResponse.isAuthed) {\r\n dispatch(initAppThunk(true));\r\n } else {\r\n return rejectWithValue({ rejectedEmail: accessTokenResponse.rejectedEmail });\r\n }\r\n } catch (error) {\r\n console.error('loginError', error);\r\n return rejectWithValue({ serverError: true });\r\n }\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { AuthService } from '../../../utils/auth/AuthService';\r\n\r\nexport const logoutThunk = createAsyncThunk('auth/logout', async () => {\r\n AuthService.mostRecentDealer = { accountNum: '', name: '' };\r\n\r\n // remove all local storage values prefixed with dp\r\n // get all the keys\r\n const dpKeys = Object.keys(localStorage).filter(x => x.startsWith('dp'));\r\n dpKeys.forEach(x => localStorage.removeItem(x));\r\n\r\n AuthService.logout();\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { AuthService } from '../../../utils/auth/AuthService';\r\nimport { initAppThunk } from '../../core';\r\n\r\nexport const switchDealerThunk = createAsyncThunk(\r\n 'auth/switchDealer',\r\n async (dealer: { accountNum: string; name: string }, { rejectWithValue, dispatch }) => {\r\n const tokens = AuthService.getAuthTokens();\r\n\r\n if (tokens) {\r\n try {\r\n await AuthService.refreshAccessToken(tokens.refreshToken, dealer.accountNum);\r\n AuthService.mostRecentDealer = dealer;\r\n await dispatch(initAppThunk(false));\r\n\r\n return dealer;\r\n } catch {\r\n return rejectWithValue('Failed to refresh acces token');\r\n }\r\n } else {\r\n return rejectWithValue('No refresh token, rejecting');\r\n }\r\n }\r\n);\r\n","interface IDateRange {\r\n startDate: Date;\r\n endDate: Date;\r\n}\r\n\r\nconst fiscalRange = {\r\n endMonth: 7,\r\n startMonth: 8\r\n};\r\n\r\nexport const getFiscalYearRange = (year: string): IDateRange => {\r\n const yearNum: number = parseInt(year, 10);\r\n\r\n const startDate = new Date(yearNum - 1, 8, 1);\r\n const endDate = new Date(yearNum, 7, 31);\r\n\r\n return { endDate, startDate };\r\n};\r\n\r\nexport function getFiscalYear(date?: Date | string): string {\r\n date = date ? new Date(date) : new Date();\r\n if (date.getMonth() >= fiscalRange.startMonth) {\r\n return (date.getFullYear() + 1).toString();\r\n }\r\n return date.getFullYear().toString();\r\n}\r\n","import { isAsyncThunkAction, unwrapResult } from '@reduxjs/toolkit';\r\nimport React from 'react';\r\nimport { errorLogger } from '..';\r\n\r\nexport interface ILoadingSwitch {\r\n isLoading: boolean;\r\n hasError: boolean;\r\n}\r\n\r\nexport const useLoadingSwitches = (\r\n defaultValues: ILoadingSwitch = { hasError: false, isLoading: false }\r\n): {\r\n execute: (func: () => Promise) => Promise;\r\n switches: ILoadingSwitch;\r\n} => {\r\n const [loading, setLoading] = React.useState(defaultValues);\r\n const executeRef = React.useRef(async (func: () => Promise) => {\r\n setLoading({ hasError: false, isLoading: true });\r\n let hasError = false;\r\n try {\r\n const result = await func();\r\n\r\n // we check if it is a Redux-Toolkit thunk\r\n // according to their page, they don't classify a 'rejectWithValue' to be an\r\n // exception, so we handle it here\r\n if (isAsyncThunkAction(result)) {\r\n try {\r\n // unwrap the result to check for error\r\n unwrapResult(result);\r\n } catch (error) {\r\n errorLogger.sendError(error, { tags: ['useLoadingSwitch'] });\r\n hasError = true;\r\n }\r\n }\r\n } catch (error) {\r\n errorLogger.sendError(error, { tags: ['useLoadingSwitch'] });\r\n console.error(error);\r\n hasError = true;\r\n }\r\n\r\n setLoading({ hasError, isLoading: false });\r\n });\r\n\r\n const value = React.useMemo(\r\n () => ({\r\n execute: executeRef.current,\r\n switches: loading\r\n }),\r\n [loading]\r\n );\r\n\r\n return value;\r\n};\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IColor, IItem } from '.';\r\nimport { IProductPrice } from './catalogInterfaces';\r\n\r\nexport const catalogEntityAdapters = {\r\n colors: createEntityAdapter>({ selectId: x => x.inventColorId }),\r\n items: createEntityAdapter({\r\n selectId: x => x.itemId,\r\n sortComparer: (a, b) => a.itemId.localeCompare(b.itemId)\r\n }),\r\n prices: createEntityAdapter<{ itemId: string; prices: IProductPrice[] }>({ selectId: x => x.itemId })\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from '..';\r\nimport { notUndefined } from '../../utils/objectUtils';\r\nimport { getActiveCartLines } from '../carts';\r\nimport { catalogEntityAdapters } from './catalogEntityAdapters';\r\nimport { ICatalogFilter, IColor, IItem, ISubPartItem } from './catalogInterfaces';\r\n\r\nexport const catalogSelectors = catalogEntityAdapters.items.getSelectors((state: RootState) => state.catalog.items);\r\nexport const priceSelectors = catalogEntityAdapters.prices.getSelectors((state: RootState) => state.catalog.prices);\r\n\r\nexport const getIsCashDiscountDisabled = createSelector(\r\n [(state: RootState) => state.catalog.items, (_: RootState, itemId: string) => itemId],\r\n (itemHash, itemId) => itemHash.entities[itemId]?.cashDiscountDisabled ?? false\r\n);\r\n\r\nexport const getItemColors = createSelector(\r\n [\r\n (state: RootState) => state.catalog.items,\r\n (state: RootState) => state.catalog.colors,\r\n (_: RootState, itemId: string) => itemId\r\n ],\r\n (items, colors, itemId): IColor[] =>\r\n items.entities[itemId]?.colors?.map(x => colors.entities[x]).filter(notUndefined) ?? []\r\n);\r\n\r\nexport const getActiveCartProducts = createSelector(\r\n [getActiveCartLines, (state: RootState) => state.catalog.items.entities],\r\n (cartLines, itemHash) => cartLines.map(x => itemHash[x.itemId]).filter(notUndefined)\r\n);\r\n\r\nexport const getCatalogPage = createSelector(\r\n [\r\n (state: RootState) => state.catalog.pageHash,\r\n (state: RootState) => state.catalog.items.entities,\r\n (_: RootState, filters: ICatalogFilter) => filters\r\n ],\r\n (pageHash, itemHash, filters): IItem[] => {\r\n const key = createCatalogFilterKey(filters);\r\n\r\n return pageHash[key]?.pages[filters.page]?.map(x => itemHash[x]).filter(notUndefined) ?? [];\r\n }\r\n);\r\n\r\nexport const getProducts = createSelector(\r\n [(state: RootState) => state.catalog.items.entities, (_: RootState, itemIds: string[]) => itemIds],\r\n (itemHash, itemIds): IItem[] => itemIds.map(x => itemHash[x]).filter(notUndefined)\r\n);\r\n\r\nexport const getCatalogTotalItems = createSelector(\r\n [(state: RootState) => state.catalog.pageHash, (_: RootState, filters: ICatalogFilter) => filters],\r\n (pageHash, filters): number => {\r\n const key = createCatalogFilterKey(filters);\r\n\r\n return pageHash[key]?.totalItems ?? 0;\r\n }\r\n);\r\n\r\nexport const getItemSubParts = createSelector(\r\n [\r\n (state: RootState) => state.catalog.subPartHash,\r\n (state: RootState) => state.catalog.items.entities,\r\n (_: RootState, itemId: string) => itemId\r\n ],\r\n (subPartHash, items, itemId): ISubPartItem[] => {\r\n const partNumArr = subPartHash[itemId] ?? [];\r\n\r\n return partNumArr\r\n .map(x => {\r\n const item = items[x.itemId];\r\n return item ? { ...item, qtyRequired: x.qtyRequired } : undefined;\r\n })\r\n .filter(notUndefined);\r\n }\r\n);\r\n\r\nexport const createCatalogFilterKey = ({ orderBy, productFamilyId, searchString }: ICatalogFilter): string =>\r\n `orderBy=${orderBy}|productFamilyId=${productFamilyId}|searchString=${searchString}`;\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IItemInstruction } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const fetchInstructionsThunk = createAsyncThunk(\r\n 'catalog/fetchInstructions',\r\n async (itemId: string, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`/Products/${itemId}/Instructions`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to fetch instructions for item ${itemId}`);\r\n }\r\n\r\n return response.value ?? [];\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IItem } from '../catalogInterfaces';\r\n\r\nexport const fetchItemThunk = createAsyncThunk(\r\n 'catalog/fetchItem',\r\n async (\r\n { itemId, includePrices = false }: { itemId: string | string[]; includePrices?: boolean },\r\n { rejectWithValue }\r\n ) => {\r\n const itemIdArr = Array.isArray(itemId) ? itemId : [itemId];\r\n\r\n const result = await executeApiRequest(() =>\r\n httpService.get(`/Products?includePrices=${includePrices}${httpService.createQueryString('itemIds', itemIdArr)}`)\r\n );\r\n\r\n if (result.requestFailed) {\r\n rejectWithValue(`Failed to fetch items ${itemIdArr.join(', ')}`);\r\n }\r\n\r\n return result.value ? result.value : [];\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IProductPrice } from '../catalogInterfaces';\r\n\r\nexport const fetchPricesThunk = createAsyncThunk('catalog/fetchPrices', async (itemId: string, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get(`/Products/${itemId}/Prices`));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to fetch prices for item ${itemId}`);\r\n }\r\n\r\n return response.value ?? [];\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IProductColor } from '../catalogInterfaces';\r\n\r\nexport const fetchProductColorsThunk = createAsyncThunk(\r\n 'catalog/fetchColors',\r\n async (itemId: string, { rejectWithValue }) => {\r\n const results = await executeApiRequest(() => httpService.get(`/Products/${itemId}/Colors`));\r\n\r\n if (results.requestFailed) {\r\n return rejectWithValue(`Failed to fetch colors for item ${itemId}`);\r\n }\r\n\r\n return results.value ? { colors: results.value, itemId } : undefined;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { ISubPartItem } from '../catalogInterfaces';\r\n\r\nexport const fetchSubPartsThunk = createAsyncThunk(\r\n 'catalog/fetchSubParts',\r\n async (itemId: string, { rejectWithValue }) => {\r\n const results = await executeApiRequest(() => httpService.get(`/Products/${itemId}/SubParts`));\r\n\r\n if (results.requestFailed) {\r\n return rejectWithValue(`Failed to fetch sub parts for item ${itemId}`);\r\n }\r\n\r\n return results.value ?? [];\r\n }\r\n);\r\n","import { createSlice, EntityState } from '@reduxjs/toolkit';\r\nimport { IColor, IItem } from '.';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { initAppThunk } from '../core';\r\nimport { fetchCatalogSectionThunk } from '../preSeason';\r\nimport { catalogEntityAdapters } from './catalogEntityAdapters';\r\nimport { IApiItem, IItemInstruction, IProductPrice } from './catalogInterfaces';\r\nimport { createCatalogFilterKey } from './catalogSelectors';\r\nimport {\r\n fetchInstructionsThunk,\r\n fetchItemThunk,\r\n fetchPricesThunk,\r\n fetchProductColorsThunk,\r\n fetchSubPartsThunk\r\n} from './thunks';\r\nimport { fetchCatalogThunk } from './thunks/fetchCatalogThunk';\r\n\r\ninterface ICatalogState {\r\n colors: EntityState>;\r\n items: EntityState;\r\n prices: EntityState<{ itemId: string; prices: IProductPrice[] }>;\r\n pageHash: Record } | undefined>;\r\n subPartHash: Record;\r\n instructions: Record;\r\n}\r\n\r\nconst initialState: ICatalogState = {\r\n colors: catalogEntityAdapters.colors.getInitialState(),\r\n instructions: {},\r\n items: catalogEntityAdapters.items.getInitialState(),\r\n pageHash: {},\r\n prices: catalogEntityAdapters.prices.getInitialState(),\r\n subPartHash: {}\r\n};\r\n\r\nconst processProducts = (products: IApiItem[]): { products: IItem[]; colors: IColor[] } => {\r\n return {\r\n colors: products\r\n .flatMap(x => x.colors ?? [])\r\n .map(x => ({ inventColorId: x.inventColorId, name: x.name })),\r\n products: products.map(x => ({ ...x, colors: x.colors?.map(y => y.inventColorId) }))\r\n };\r\n};\r\n\r\nconst catalogSlice = createSlice({\r\n initialState,\r\n name: 'catalog',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(initAppThunk.fulfilled, (state, action) => {\r\n if (action.payload.activeCart.products) {\r\n const updates = processProducts(action.payload.activeCart.products);\r\n catalogEntityAdapters.colors.upsertMany(state.colors, updates.colors);\r\n catalogEntityAdapters.items.upsertMany(state.items, updates.products);\r\n }\r\n })\r\n .addCase(fetchInstructionsThunk.fulfilled, (state, action) => {\r\n state.instructions = {\r\n ...state.instructions,\r\n ...action.payload.reduce>((hash, item) => {\r\n hash[item.itemId] = hash[item.itemId] ? [...hash[item.itemId], item] : [item];\r\n\r\n return hash;\r\n }, {})\r\n };\r\n })\r\n .addCase(fetchPricesThunk.fulfilled, (state, action) => {\r\n catalogEntityAdapters.prices.upsertOne(state.prices, { itemId: action.meta.arg, prices: action.payload });\r\n })\r\n .addCase(fetchCatalogThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n catalogEntityAdapters.items.upsertMany(state.items, action.payload.items);\r\n const key = createCatalogFilterKey(action.meta.arg);\r\n\r\n state.pageHash = {\r\n ...state.pageHash,\r\n [key]: {\r\n ...(state.pageHash[key] ?? {}),\r\n pages: {\r\n ...(state.pageHash[key]?.pages ?? {}),\r\n [action.meta.arg.page]: action.payload.items.map(x => x.itemId)\r\n },\r\n totalItems: action.payload.totalItems\r\n }\r\n };\r\n }\r\n })\r\n .addCase(fetchSubPartsThunk.fulfilled, (state, action) => {\r\n catalogEntityAdapters.items.upsertMany(state.items, action.payload);\r\n\r\n state.subPartHash = {\r\n ...state.subPartHash,\r\n [action.meta.arg]: action.payload.map<{ itemId: string; qtyRequired: number }>(x => ({\r\n itemId: x.itemId,\r\n qtyRequired: x.qtyRequired\r\n }))\r\n };\r\n })\r\n .addCase(fetchItemThunk.fulfilled, (state, action) => {\r\n catalogEntityAdapters.items.upsertMany(state.items, action.payload);\r\n\r\n const prices = action.payload\r\n .map(x => ({ itemId: x.itemId, prices: x.prices ?? [] }))\r\n .filter(x => x.prices.length > 0);\r\n\r\n if (prices.length > 0) {\r\n catalogEntityAdapters.prices.upsertMany(state.prices, prices);\r\n }\r\n })\r\n .addCase(fetchProductColorsThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n catalogEntityAdapters.colors.upsertMany(state.colors, action.payload.colors);\r\n\r\n const existingItem = state.items.entities[action.payload.itemId];\r\n\r\n if (existingItem) {\r\n catalogEntityAdapters.items.upsertOne(state.items, {\r\n ...existingItem,\r\n colors: action.payload.colors.map(x => x.inventColorId)\r\n });\r\n }\r\n }\r\n })\r\n .addCase(fetchCatalogSectionThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const processed = processProducts(action.payload.items);\r\n\r\n catalogEntityAdapters.items.upsertMany(state.items, processed.products);\r\n catalogEntityAdapters.colors.upsertMany(state.colors, processed.colors);\r\n }\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: catalogActionCreators, reducer: catalogReducer } = catalogSlice;\r\n","import * as React from 'react';\r\nimport { useDialog } from '../../hooks';\r\nimport { ButtonLink } from '../ButtonLink';\r\nimport { TermsAndConditionsDialog } from './TermsAndConditionsDialog';\r\n\r\ninterface ITermsAndConditionsLinkProps {}\r\n\r\nlet TermsAndConditionsLink: React.ComponentType = () => {\r\n const [dialog, openDialog, closeDialog] = useDialog<'terms'>();\r\n\r\n return (\r\n <>\r\n Terms And Conditions\r\n \r\n \r\n );\r\n};\r\n\r\nTermsAndConditionsLink = React.memo(TermsAndConditionsLink);\r\nexport { TermsAndConditionsLink };\r\n","import * as React from 'react';\r\nimport styled, { DefaultTheme, StyledComponentProps } from 'styled-components';\r\n\r\nconst StyledButton = styled.button`\r\n border: none;\r\n color: inherit;\r\n font-size: inherit;\r\n padding: 0;\r\n outline: none !important;\r\n text-decoration: none !important;\r\n`;\r\n\r\ninterface IButtonLinkProps extends StyledComponentProps<'button', DefaultTheme, {}, never> {}\r\n\r\nlet ButtonLink: React.ComponentType = ({ className, ...buttonProps }) => {\r\n return ;\r\n};\r\n\r\nButtonLink = React.memo(ButtonLink);\r\nexport { ButtonLink };\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IExperlogixConfig } from '../configuratorInterfaces';\r\n\r\nexport const createConfigurationThunk = createAsyncThunk(\r\n 'configurator/init',\r\n async (\r\n values: { allDealers: boolean; smRecommended: boolean } | undefined = { allDealers: false, smRecommended: false },\r\n { rejectWithValue }\r\n ) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/Configurations?smCreated=${values.smRecommended}&all=${values.allDealers}`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to initialize a new Experlogix config');\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const deleteConfigurationThunk = createAsyncThunk(\r\n 'configurator/delete',\r\n async (configNumber: string, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() => httpService.delete(`/Configurations/${configNumber}`), false);\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to delete ${configNumber}`);\r\n }\r\n\r\n return configNumber;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { configSelectors, IExperlogixConfig } from '..';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../../';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const fetchConfigurationsThunk = createAsyncThunk(\r\n 'configurator/fetchConfigurations',\r\n async (configNumber: string | undefined, { rejectWithValue, getState }) => {\r\n if (!configNumber || (configNumber && !configSelectors.selectById(getState() as RootState, configNumber))) {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`/Configurations${configNumber ? `/${configNumber}` : ''}`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Fetching Configs failed');\r\n }\r\n\r\n if (response.value) {\r\n return Array.isArray(response.value) ? response.value : [response.value];\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IExperlogixConfig } from '../configuratorInterfaces';\r\n\r\nexport const updateConfigurationThunk = createAsyncThunk(\r\n 'configurator/update',\r\n async (config: IExperlogixConfig, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.put('/Configurations', config));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to updated ${config.configurationNumber}`);\r\n } else if (response.value) {\r\n return response.value;\r\n }\r\n }\r\n);\r\n","import { createEntityAdapter, createSlice, EntityState } from '@reduxjs/toolkit';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { IExperlogixConfig } from './configuratorInterfaces';\r\nimport {\r\n createConfigurationThunk,\r\n deleteConfigurationThunk,\r\n fetchConfigurationsThunk,\r\n updateConfigurationThunk\r\n} from './thunks';\r\n\r\nexport const configAdapter = createEntityAdapter({\r\n selectId: x => x.configurationNumber,\r\n sortComparer: (a, b) => a.configurationNumber.localeCompare(b.configurationNumber)\r\n});\r\n\r\ninterface IConfiguratorState {\r\n configs: EntityState;\r\n}\r\n\r\nconst initialState: IConfiguratorState = {\r\n configs: configAdapter.getInitialState()\r\n};\r\n\r\nconst configuratorSlice = createSlice({\r\n initialState,\r\n name: 'configurator',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchConfigurationsThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n configAdapter.upsertMany(state.configs, action.payload);\r\n }\r\n })\r\n .addCase(updateConfigurationThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n configAdapter.upsertOne(state.configs, action.payload);\r\n }\r\n })\r\n .addCase(deleteConfigurationThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n configAdapter.removeOne(state.configs, action.payload);\r\n }\r\n })\r\n .addCase(createConfigurationThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n configAdapter.upsertOne(state.configs, action.payload);\r\n }\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: configuratorActions, reducer: configuratorReducer } = configuratorSlice;\r\n","import { RootState } from '..';\r\nimport { configAdapter } from './configuratorSlice';\r\n\r\nexport const configSelectors = configAdapter.getSelectors((state: RootState) => state.configurator.configs);\r\n\r\nexport const getExperlogixConfigs = (state: RootState) => configSelectors.selectAll(state);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IProfileApiResponse } from '../profileInterfaces';\r\n\r\nexport const fetchProfileThunk = createAsyncThunk('profile/fetch', async (_, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get(`/Dealers/Profile`));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch dealer profile');\r\n }\r\n\r\n return response.value;\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IProfileContact } from '../profileInterfaces';\r\n\r\nexport const updateContactThunk = createAsyncThunk(\r\n 'profile/updateContact',\r\n async (contact: IProfileContact, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() => httpService.put('/Dealers/Contacts', contact));\r\n\r\n if (result.requestFailed) {\r\n toast('Failed to update contact.', { type: 'error' });\r\n return rejectWithValue('Failed to update contact');\r\n }\r\n\r\n toast('Contact updated successfully', { type: 'success' });\r\n return result.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IProfile, IProfileApiResponse } from '../profileInterfaces';\r\n\r\nexport const updateProfileThunk = createAsyncThunk('profile/update', async (profile: IProfile, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() => httpService.put('/Dealers/Profile', profile));\r\n\r\n if (result.requestFailed) {\r\n toast('There was a problem updating the profile. Please retry', { type: 'error' });\r\n\r\n return rejectWithValue('Failed to update dealer profile');\r\n }\r\n toast('Updated dealer profile', { type: 'success' });\r\n\r\n return result.value;\r\n});\r\n","import { createEntityAdapter, createSlice, EntityState } from '@reduxjs/toolkit';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { IProfile, IProfileContact } from './profileInterfaces';\r\nimport { fetchProfileThunk, updateContactThunk, updateProfileThunk } from './thunks';\r\n\r\nexport const contactsEntityAdapter = createEntityAdapter({\r\n selectId: x => x.contactId,\r\n sortComparer: (a, b) => `${a.lastName}, ${a.firstName}`.localeCompare(`${b.lastName}, ${b.firstName}`)\r\n});\r\ninterface IProfileState {\r\n contacts: EntityState;\r\n profile: IProfile | undefined;\r\n titles: string[];\r\n}\r\n\r\nconst initialState: IProfileState = {\r\n contacts: contactsEntityAdapter.getInitialState(),\r\n profile: undefined,\r\n titles: []\r\n};\r\n\r\nconst profileSlice = createSlice({\r\n initialState,\r\n name: 'profile',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchProfileThunk.fulfilled, (state, action) => {\r\n state.profile = action.payload?.profile;\r\n contactsEntityAdapter.upsertMany(state.contacts, action.payload?.profile.contacts ?? []);\r\n state.titles = action.payload?.titles ?? [];\r\n })\r\n .addCase(updateProfileThunk.fulfilled, (state, action) => {\r\n if (action.payload?.profile) {\r\n state.profile = action.payload.profile;\r\n contactsEntityAdapter.upsertMany(state.contacts, action.payload?.profile.contacts ?? []);\r\n }\r\n })\r\n .addCase(updateContactThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n contactsEntityAdapter.upsertOne(state.contacts, action.payload);\r\n }\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { reducer: profileReducer } = profileSlice;\r\n","import { RootState } from '..';\r\nimport { contactsEntityAdapter } from './profileSlice';\r\n\r\nexport const contactsSelectors = contactsEntityAdapter.getSelectors(state => state.profile.contacts);\r\n","/* eslint-disable sort-keys */\r\nexport const SalesStatus = {\r\n None: 0,\r\n Open_or_Backorder: 1,\r\n Delivered: 2,\r\n Invoiced: 3,\r\n Cancelled: 4\r\n} as const;\r\n","import { createEntityAdapter, createSlice, EntityState } from '@reduxjs/toolkit';\r\nimport { IOrderMin } from '.';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { IOrder } from './ordersInterfaces';\r\nimport { fetchOrdersThunk, fetchOrderThunk } from './thunks';\r\n\r\nexport const ordersAdapter = createEntityAdapter({\r\n selectId: x => x.salesId,\r\n sortComparer: (a, b) => a.salesId.localeCompare(b.salesId)\r\n});\r\n\r\ninterface IOrdersState {\r\n minOrders: {\r\n orders: IOrderMin[];\r\n totalItems: number;\r\n };\r\n orders: EntityState;\r\n}\r\n\r\nconst initialState: IOrdersState = {\r\n minOrders: {\r\n orders: [],\r\n totalItems: 0\r\n },\r\n orders: ordersAdapter.getInitialState()\r\n};\r\n\r\nconst ordersSlice = createSlice({\r\n initialState,\r\n name: 'orders',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n ordersAdapter.upsertOne(state.orders, action.payload);\r\n }\r\n })\r\n .addCase(fetchOrdersThunk.fulfilled, (state, action) => {\r\n state.minOrders.orders = action.payload.items;\r\n state.minOrders.totalItems = action.payload.totalItems;\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: ordersActions, reducer: ordersReducer } = ordersSlice;\r\n","import { RootState } from '..';\r\nimport { ordersAdapter } from './ordersSlice';\r\n\r\nconst ordersSelectors = ordersAdapter.getSelectors((state: RootState) => state.orders.orders);\r\nexport const getOrder = (state: RootState, salesId: string) => ordersSelectors.selectById(state, salesId);\r\n","import { useCallback, useState } from 'react';\r\n\r\n/** A hook to encapsulate the logic for opening and closing a dialog */\r\nexport function useDialog(): [\r\n { type: T; value: V } | undefined,\r\n (type: T) => (value?: V) => void,\r\n () => void\r\n] {\r\n const [dialog, setDialog] = useState<{ type: T; value: V } | undefined>();\r\n\r\n const openDialog = useCallback((type: T) => (value: V = {} as V) => setDialog({ type, value }), []);\r\n const closeDialog = useCallback(() => setDialog(undefined), []);\r\n\r\n return [dialog, openDialog, closeDialog];\r\n}\r\n","import { useEffect } from 'react';\r\nimport { fetchLookupsThunk, getNonLoadedOrLoadingLookups, OnDemandLookupTypes } from '../ducks/lookups';\r\nimport { useAppDispatch, useAppSelector } from './redux';\r\nimport { ILoadingSwitch, useLoadingSwitches } from './useLoadingSwitches';\r\n\r\nexport const useLookups = (types: OnDemandLookupTypes[]): ILoadingSwitch => {\r\n const dispatch = useAppDispatch();\r\n const notLoaded = useAppSelector(state => getNonLoadedOrLoadingLookups(state, types));\r\n const switches = useLoadingSwitches({ hasError: false, isLoading: true });\r\n\r\n useEffect(\r\n () => {\r\n if (notLoaded.length > 0) {\r\n switches.execute(() => dispatch(fetchLookupsThunk(notLoaded)));\r\n } else {\r\n // if there is nothing to load, just resolve the promise\r\n switches.execute(() => new Promise(resolve => resolve()));\r\n }\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n []\r\n );\r\n\r\n return switches.switches;\r\n};\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { INewsFeedPost } from './newsFeedInterfaces';\r\n\r\nexport const newsFeedEntityAdapters = {\r\n posts: createEntityAdapter({\r\n selectId: x => x.dpNewsFeedPostId,\r\n sortComparer: (a, b) => b.startDateUtc.localeCompare(a.startDateUtc)\r\n })\r\n};\r\n","import { RootState } from '..';\r\nimport { newsFeedEntityAdapters } from './newsFeedEntityAdapters';\r\n\r\nexport const newsFeedSelectors = newsFeedEntityAdapters.posts.getSelectors(state => state.newsFeed.posts);\r\n","import { createAction } from '@reduxjs/toolkit';\r\nimport { INewsFeedPost } from '../newsFeedInterfaces';\r\n\r\nexport const updateNewsFeedPostAction = createAction<{ post: INewsFeedPost; access: string[]; accountNum: string }>(\r\n 'UPDATE_NEWS_FEED_POST'\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { INewsFeedPost } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const fetchNewsFeedPostsThunk = createAsyncThunk('fetchNewsFeedPosts', async (_, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get('/NewsFeed?minimum=true'));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch news feed posts');\r\n }\r\n\r\n return response.value ?? [];\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { INewsFeedPost } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const fetchNewsFeedPostThunk = createAsyncThunk(\r\n 'fetchNewsFeedPost',\r\n async (postId: number, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get(`/NewsFeed?postId=${postId}`));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to fetch news feed post ${postId}`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { updateNewsFeedPostAction } from './legacyActions/updateNewsFeedPost';\r\nimport { newsFeedEntityAdapters } from './newsFeedEntityAdapters';\r\nimport { fetchNewsFeedPostsThunk, fetchNewsFeedPostThunk } from './thunks';\r\n\r\nconst initialState = {\r\n posts: newsFeedEntityAdapters.posts.getInitialState()\r\n};\r\n\r\nconst newsFeedSlice = createSlice({\r\n initialState,\r\n name: 'newsFeed',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchNewsFeedPostThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n newsFeedEntityAdapters.posts.upsertOne(state.posts, action.payload);\r\n }\r\n })\r\n .addCase(fetchNewsFeedPostsThunk.fulfilled, (state, action) => {\r\n newsFeedEntityAdapters.posts.upsertMany(state.posts, action.payload);\r\n })\r\n .addCase(updateNewsFeedPostAction, (state, action) => {\r\n if (action.payload.access.includes(action.payload.accountNum)) {\r\n newsFeedEntityAdapters.posts.upsertOne(state.posts, action.payload.post);\r\n } else {\r\n newsFeedEntityAdapters.posts.removeOne(state.posts, action.payload.post.dpNewsFeedPostId);\r\n }\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: newsFeedActions, reducer: newsFeedReducer } = newsFeedSlice;\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { IAddress } from './addressesInterfaces';\r\n\r\nexport const addressesEntityAdapter = createEntityAdapter({ selectId: x => x.addressId });\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from '..';\r\nimport { addressesEntityAdapter } from './addressesEntityAdapters';\r\n\r\nexport const addressesSelectors = addressesEntityAdapter.getSelectors(state => state.addresses);\r\n\r\nexport const getDefaultAddresses = createSelector(addressesSelectors.selectAll, addresses =>\r\n addresses.filter(x => x.axRecId)\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IAddress } from '../addressesInterfaces';\r\n\r\nexport const fetchAddressesThunk = createAsyncThunk('fetchAddresses', async (_, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() => httpService.get('/Addresses'));\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch addresses');\r\n }\r\n\r\n return response.value ?? [];\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IAddressMin, IValidatedAddressResult } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const validateAddressThunk = createAsyncThunk(\r\n 'addresses/validateCart',\r\n async (address: IAddressMin, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() =>\r\n httpService.post('/Addresses/Validate', address)\r\n );\r\n\r\n if (result.requestFailed) {\r\n return rejectWithValue('Failed to validate address');\r\n }\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createSlice } from '@reduxjs/toolkit';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { initAppThunk } from '../core';\r\nimport { addressesEntityAdapter } from './addressesEntityAdapters';\r\nimport { fetchAddressesThunk, validateAddressThunk } from './thunks';\r\n\r\nconst addressesSlice = createSlice({\r\n initialState: addressesEntityAdapter.getInitialState(),\r\n name: 'addresses',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchAddressesThunk.fulfilled, (state, action) => {\r\n addressesEntityAdapter.upsertMany(state, action.payload);\r\n })\r\n .addCase(validateAddressThunk.fulfilled, (state, action) => {\r\n if (action.payload?.isValid) {\r\n addressesEntityAdapter.upsertOne(state, action.payload.address);\r\n }\r\n })\r\n .addCase(initAppThunk.fulfilled, (state, action) => {\r\n const addy = action.payload.activeCart.activeCart?.cart?.address;\r\n\r\n if (addy) {\r\n addressesEntityAdapter.upsertOne(state, {\r\n addressId: addy.addressId,\r\n addressTypeId: addy.addressTypeId,\r\n axRecId: addy.axRecId,\r\n businessEntityId: -1,\r\n city: addy.city,\r\n latitude: -1,\r\n longitude: -1,\r\n primary: false,\r\n state: addy.state.abbreviation,\r\n stateId: addy.stateId,\r\n street: addy.street,\r\n street2: addy.street2,\r\n zipcode: addy.zipcode\r\n });\r\n }\r\n })\r\n .addCase(loginThunk.rejected, () => addressesEntityAdapter.getInitialState())\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => addressesEntityAdapter.getInitialState())\r\n .addCase(switchDealerThunk.rejected, () => addressesEntityAdapter.getInitialState())\r\n .addCase(switchDealerThunk.pending, () => addressesEntityAdapter.getInitialState());\r\n }\r\n});\r\n\r\nexport const { actions: addressesActions, reducer: addressesReducer } = addressesSlice;\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { getFiscalYear } from '../../../utils/fiscalYearUtils';\r\nimport { ICashDiscount } from '../cashDiscountsInterfaces';\r\n\r\nexport const _fetchCashDiscountsThunk = createAsyncThunk(\r\n 'cashDiscounts/fetch',\r\n async (fiscalYear: string, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`CashDiscounts?fiscalYear=${fiscalYear}`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch cash discounts');\r\n }\r\n\r\n return { cashDiscounts: response.value ?? [] };\r\n }\r\n);\r\n\r\nexport const fetchCashDiscountsThunk = (fiscalYear: string = getFiscalYear()) => _fetchCashDiscountsThunk(fiscalYear);\r\n","import { createEntityAdapter, createSlice } from '@reduxjs/toolkit';\r\nimport { getFiscalYear } from '../../utils/fiscalYearUtils';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { initAppThunk } from '../core';\r\nimport { ICashDiscount } from './cashDiscountsInterfaces';\r\nimport { _fetchCashDiscountsThunk } from './thunks';\r\n\r\nexport const cashDiscountsEntityAdapter = createEntityAdapter<{ fiscalYear: string; discounts: ICashDiscount[] }>({\r\n selectId: x => x.fiscalYear\r\n});\r\n\r\nconst slice = createSlice({\r\n initialState: cashDiscountsEntityAdapter.getInitialState(),\r\n name: 'cashDiscounts',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(initAppThunk.fulfilled, (state, action) => {\r\n cashDiscountsEntityAdapter.upsertOne(state, {\r\n discounts: action.payload.cashDiscounts,\r\n fiscalYear: getFiscalYear()\r\n });\r\n })\r\n .addCase(_fetchCashDiscountsThunk.fulfilled, (state, action) => {\r\n cashDiscountsEntityAdapter.upsertOne(state, {\r\n discounts: action.payload.cashDiscounts,\r\n fiscalYear: action.meta.arg\r\n });\r\n })\r\n .addCase(loginThunk.rejected, () => cashDiscountsEntityAdapter.getInitialState())\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => cashDiscountsEntityAdapter.getInitialState())\r\n .addCase(switchDealerThunk.rejected, () => cashDiscountsEntityAdapter.getInitialState())\r\n .addCase(switchDealerThunk.pending, () => cashDiscountsEntityAdapter.getInitialState());\r\n }\r\n});\r\n\r\nexport const { actions: cashDiscountsActions, reducer: cashDiscountsReducer } = slice;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { isWithinInterval } from 'date-fns';\r\nimport { RootState } from '..';\r\nimport { cashDiscountsEntityAdapter } from './cashDiscountsSlice';\r\n\r\nexport const cashDiscountsSelectors = cashDiscountsEntityAdapter.getSelectors(state => state.cashDiscounts);\r\n\r\nexport const getCashDiscount = createSelector(\r\n [\r\n (state: RootState) => Object.values(state.cashDiscounts.entities).flatMap(x => x?.discounts ?? []),\r\n (_: RootState, date: Date | string | undefined) => date\r\n ],\r\n (discounts, date) =>\r\n date\r\n ? discounts.find(x =>\r\n isWithinInterval(new Date(date), { end: new Date(x.endDate), start: new Date(x.startDate) })\r\n )\r\n : undefined\r\n);\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from '..';\r\nimport { IInventory } from './inventoryInterfaces';\r\n\r\nexport const getInventory = createSelector(\r\n [(state: RootState) => state.inventory.itemHash, (_: RootState, itemId: string) => itemId],\r\n (hash, itemId): IInventory[] => Object.values(hash).filter(x => x.itemId === itemId)\r\n);\r\n\r\nexport const getIsInventoryLoading = createSelector(\r\n [(state: RootState) => state.inventory.loading, (_: RootState, itemId: string) => itemId],\r\n (arr, itemId): boolean => arr.includes(itemId)\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IInventory } from '../inventoryInterfaces';\r\n\r\nexport const fetchInventory = createAsyncThunk('inventory/fetch', (itemId: string) =>\r\n executeApiRequest(() => httpService.get(`/Inventory/${itemId}`))\r\n);\r\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { keyBy } from 'lodash';\r\nimport { fetchCurrentAccessTokenThunk, loginThunk, switchDealerThunk } from '../auth';\r\nimport { IInventory } from './inventoryInterfaces';\r\nimport { fetchInventory } from './thunks';\r\n\r\ninterface IInventoryState {\r\n itemHash: Record;\r\n loading: string[];\r\n}\r\n\r\nconst initialState: IInventoryState = {\r\n itemHash: {},\r\n loading: []\r\n};\r\n\r\nconst inventorySlice = createSlice({\r\n initialState,\r\n name: 'inventory',\r\n reducers: {\r\n setInventory: (state, action: PayloadAction) => {\r\n state.itemHash = { ...state.itemHash, ...keyBy(action.payload, x => x.id) };\r\n }\r\n },\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchInventory.pending, (state, action) => {\r\n state.loading = [...state.loading, action.meta.arg];\r\n })\r\n .addCase(fetchInventory.fulfilled, (state, action) => {\r\n if (action.payload.value) {\r\n state.itemHash = { ...state.itemHash, ...keyBy(action.payload.value, x => x.id) };\r\n }\r\n\r\n state.loading = state.loading.filter(x => x !== action.meta.arg);\r\n })\r\n .addCase(fetchInventory.rejected, (state, action) => {\r\n state.loading = state.loading.filter(x => x !== action.meta.arg);\r\n })\r\n .addCase(loginThunk.rejected, () => initialState)\r\n .addCase(fetchCurrentAccessTokenThunk.rejected, () => initialState)\r\n .addCase(switchDealerThunk.rejected, () => initialState);\r\n }\r\n});\r\n\r\nexport const { actions: inventoryActionCreators, reducer: inventoryReducer } = inventorySlice;\r\n","import { AuthProviders, IOauthConfig } from './authInterfaces';\r\n\r\nexport const oauthConfigs: Record = {\r\n adfs: {\r\n authorizationEndpoint: 'https://sts.shoremaster.com/adfs/oauth2/authorize',\r\n clientId: '23b514ef-7266-4ffd-8ee6-d8a6671d3383',\r\n oauthType: '2.0',\r\n popupOptions: { height: 500, width: 400 },\r\n redirectUri: window.location.origin || window.location.protocol + '//' + window.location.host,\r\n resource: 'urn:dealer_portal'\r\n },\r\n google: {\r\n authorizationEndpoint: 'https://accounts.google.com/o/oauth2/auth',\r\n clientId: '408057365987-3ig01pevg414keg3lib61trgdor4i3je.apps.googleusercontent.com',\r\n oauthType: '2.0',\r\n popupOptions: { height: 633, width: 452 },\r\n redirectUri: window.location.origin,\r\n scope: ['profile', 'email']\r\n },\r\n twitter: {\r\n authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate',\r\n oauthType: '1.0',\r\n popupOptions: { height: 645, width: 495 },\r\n redirectUri: window.location.origin\r\n }\r\n};\r\n","import * as msal from 'msal';\r\nconst CLIENT_ID = '3e1c2bb4-6d2f-444e-990f-5e5b4fb4f16c';\r\nconst SCOPES = ['openid', 'user.read'];\r\nexport class EntraService {\r\n static tokenRequest: msal.AuthenticationParameters = {\r\n scopes: SCOPES\r\n };\r\n static logger: msal.Logger = new msal.Logger(\r\n (level: msal.LogLevel, message: string) => {\r\n console.log(message);\r\n },\r\n { level: msal.LogLevel.Warning }\r\n );\r\n static userAppAgent: msal.UserAgentApplication = new msal.UserAgentApplication(\r\n {\r\n auth: {\r\n clientId: CLIENT_ID,\r\n navigateToLoginRequestUrl: false,\r\n redirectUri: `${window.location.origin}/auth.html`\r\n },\r\n cache: { cacheLocation: 'localStorage' },\r\n system: { logger: EntraService.logger }\r\n }\r\n // CLIENT_ID,\r\n // '',\r\n // EntraService.tokenRecievedCallback,\r\n // {\r\n // cacheLocation: 'localStorage',\r\n // logger: EntraService.logger,\r\n // navigateToLoginRequestUrl: false,\r\n // redirectUri: `${window.location.origin}/auth.html`\r\n // }\r\n );\r\n /**\r\n * Opens Popup to instigate authentication flow.\r\n *\r\n * @returns {Promise} IdToken\r\n * @memberof EntraService\r\n */\r\n public static async openLoginPopup(): Promise {\r\n let response: msal.AuthResponse;\r\n try {\r\n EntraService.cleanUpMsal();\r\n response = await EntraService.userAppAgent.loginPopup({\r\n authority: 'https://login.microsoftonline.us/48f9e30e-e044-4f75-aa65-ab3f5f2d8c0c',\r\n prompt: 'select_account',\r\n scopes: ['openid', 'user.read']\r\n });\r\n return response.idToken.rawIdToken;\r\n } catch (e) {\r\n console.error(e);\r\n //\r\n return 'error';\r\n }\r\n }\r\n /**\r\n * Attempt to get the access token either from storage or remotely.\r\n *\r\n * @memberof EntraService\r\n */\r\n public static async getGraphTokenSilent(): Promise {\r\n let accessToken = '';\r\n try {\r\n const response = await EntraService.userAppAgent.acquireTokenSilent(EntraService.tokenRequest);\r\n accessToken = response.accessToken;\r\n } catch (e) {\r\n console.error('entraService.getGraphTokenSilent', e);\r\n //\r\n }\r\n return accessToken;\r\n }\r\n /**\r\n * Attempt to get the access token either from stoage or remotely.\r\n *\r\n * @memberof EntraService\r\n */\r\n static async getAccessTokenSilent(): Promise {\r\n let accessToken = '';\r\n try {\r\n const response = await EntraService.userAppAgent.acquireTokenSilent({ scopes: [CLIENT_ID] });\r\n if (response.accessToken) {\r\n accessToken = response.accessToken;\r\n } else {\r\n return await EntraService.getAccessTokenSilent();\r\n }\r\n } catch (e) {\r\n console.error('EntraService.getAccessTokenSilent', e);\r\n //\r\n }\r\n return accessToken;\r\n }\r\n /**\r\n * Logout and remove all local context\r\n *\r\n * @memberof EntraService\r\n */\r\n logout(): void {\r\n EntraService.userAppAgent.logout();\r\n EntraService.cleanUpMsal();\r\n }\r\n /**\r\n * A method to check whether the user is currently logged in\r\n *\r\n * @returns {Promise}\r\n * @memberof EntraService\r\n */\r\n async isUserLoggedIn(): Promise {\r\n const token = await EntraService.getAccessTokenSilent();\r\n return Boolean(token);\r\n }\r\n static cleanUpMsal(): void {\r\n const keys = Object.keys(localStorage).filter(x => {\r\n const key = x.toLowerCase();\r\n return key.includes('msal') || key.includes('microsoft');\r\n });\r\n keys.forEach(x => localStorage.removeItem(x));\r\n }\r\n}\r\n","import jwtDecode from 'jwt-decode';\r\nimport { oauthConfigs } from './authConfigs';\r\nimport {\r\n AuthProviders,\r\n IAccessTokenResponse,\r\n IAuthorizationCodeResponse,\r\n IDpToken,\r\n IRefreshTokenResponse\r\n} from './authInterfaces';\r\nimport { EntraService } from './EntraService';\r\n\r\nconst storageTypes = {\r\n accessTokenDecoded: 'dp.auth.accessToken.decoded',\r\n accessTokenKey: 'dp.auth.accessToken',\r\n mostRecentDealerKey: 'dp.auth.mostRecentDealer',\r\n refreshTokenKey: 'dp.auth.refreshToken'\r\n} as const;\r\n\r\ntype storageTypeKeys = keyof typeof storageTypes;\r\n\r\nconst storageLocations: Record = {\r\n accessTokenDecoded: 'sessionStorage',\r\n accessTokenKey: 'sessionStorage',\r\n mostRecentDealerKey: 'localStorage',\r\n refreshTokenKey: 'localStorage'\r\n};\r\n\r\nexport class AuthService {\r\n private static readonly authUrl = `${process.env.REACT_APP_AUTH_URL}auth`;\r\n static get mostRecentDealer(): { accountNum: string; name: string } {\r\n const dealerString = this.getStorageValue('mostRecentDealerKey');\r\n return dealerString ? JSON.parse(dealerString) : { accountNum: '', name: '' };\r\n }\r\n\r\n static set mostRecentDealer(dealer: { accountNum: string; name: string }) {\r\n this.setStorageValue('mostRecentDealerKey', JSON.stringify(dealer));\r\n }\r\n\r\n static get accessToken(): string {\r\n const fromStorage = this.getStorageValue('accessTokenKey');\r\n return fromStorage ?? '';\r\n }\r\n\r\n private static clearStorage(full: boolean = false): void {\r\n try {\r\n this.removeStorageValue('accessTokenDecoded');\r\n this.removeStorageValue('accessTokenKey');\r\n this.removeStorageValue('refreshTokenKey');\r\n\r\n if (full) {\r\n this.removeStorageValue('mostRecentDealerKey');\r\n }\r\n } catch {\r\n //\r\n }\r\n }\r\n\r\n private static setAuthTokensInStorage(tokens: IAccessTokenResponse): void {\r\n this.clearStorage();\r\n\r\n this.setStorageValue('refreshTokenKey', tokens.refreshToken);\r\n if (tokens.accessToken) {\r\n this.setStorageValue('accessTokenKey', tokens.accessToken);\r\n }\r\n if (tokens.decodedToken) {\r\n this.setStorageValue('accessTokenDecoded', JSON.stringify(tokens.decodedToken));\r\n }\r\n }\r\n\r\n public static getAuthTokens(): IAccessTokenResponse | undefined {\r\n const accessToken = this.getStorageValue('accessTokenKey') ?? '';\r\n const refreshToken = this.getStorageValue('refreshTokenKey');\r\n const decodedString = this.getStorageValue('accessTokenDecoded');\r\n\r\n if (refreshToken) {\r\n const response: IAccessTokenResponse = { accessToken, refreshToken };\r\n\r\n if (decodedString) {\r\n response.decodedToken = JSON.parse(decodedString);\r\n }\r\n\r\n return response;\r\n }\r\n }\r\n\r\n private static parseQueryString(queryString: string): Record {\r\n queryString = queryString.substring(1).replace(/\\$/, '');\r\n const obj: Record = { code: '' };\r\n let key: string;\r\n let value: string[];\r\n (queryString || '').split('&').forEach(keyValue => {\r\n if (keyValue) {\r\n value = keyValue.split('=');\r\n key = decodeURIComponent(value[0]);\r\n obj[key] = decodeURIComponent(value[1]);\r\n }\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n private static getStorageValue(type: storageTypeKeys): string | null {\r\n return window[storageLocations[type]].getItem(storageTypes[type]);\r\n }\r\n\r\n private static removeStorageValue(type: storageTypeKeys): void {\r\n window[storageLocations[type]].removeItem(storageTypes[type]);\r\n }\r\n\r\n private static setStorageValue(type: storageTypeKeys, value: string): void {\r\n window[storageLocations[type]].setItem(storageTypes[type], value);\r\n }\r\n\r\n private static getQueryResponse(location: Location): { code: string; error?: string } {\r\n const search = this.parseQueryString(location.search);\r\n const hash = this.parseQueryString(location.hash);\r\n\r\n const response: { code: string; error?: string } = {\r\n code: ''\r\n };\r\n\r\n if (search.code) {\r\n response.code = search.code;\r\n }\r\n\r\n if (search.error || hash.error) {\r\n const error = search.error ? search.error : hash.error;\r\n response.error = error;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n public static fetchAuthorizationCode(provider: AuthProviders): Promise {\r\n const { clientId, redirectUri } = oauthConfigs[provider];\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve, reject) => {\r\n const idToken = await EntraService.openLoginPopup();\r\n const accessToken = await EntraService.getAccessTokenSilent();\r\n\r\n if (idToken === 'error') {\r\n reject(new Error('Error Signing In'));\r\n } else {\r\n resolve({ accessToken, clientId: clientId ?? '', code: idToken, provider, redirectUri });\r\n }\r\n });\r\n }\r\n\r\n public static fetchGoogleAuthorizationCode(provider: AuthProviders): Promise {\r\n const {\r\n authorizationEndpoint,\r\n clientId,\r\n redirectUri,\r\n resource,\r\n popupOptions: { height, width },\r\n scope\r\n } = oauthConfigs[provider];\r\n\r\n return new Promise((resolve, reject) => {\r\n const top = window.screenY + (window.outerHeight - height) / 2.5;\r\n const left = window.screenX + (window.outerWidth - width) / 2;\r\n\r\n const oauthUrl = `${authorizationEndpoint}?\\\r\nresponse_type=code\\\r\n${clientId ? `&client_id=${clientId}` : ''}\\\r\n&redirect_uri=${redirectUri}\\\r\n${resource ? `&resource=${resource}` : ''}\\\r\n${scope ? `&scope=${scope.join(' ')}` : ''}`;\r\n\r\n const authPopup = window.open(oauthUrl, '_blank', `height=${height},width=${width},top=${top},left=${left}`);\r\n\r\n // check if popup is blockd\r\n if (!authPopup) {\r\n reject(new Error('Failed to open popup'));\r\n } else {\r\n authPopup.focus();\r\n\r\n const interval = setInterval(() => {\r\n if (!authPopup || authPopup.closed || authPopup.closed === undefined) {\r\n clearInterval(interval);\r\n reject(new Error('Auth window was closed by user'));\r\n }\r\n\r\n try {\r\n const popupOrigin = authPopup.location.origin;\r\n\r\n if (redirectUri === popupOrigin || redirectUri === `${popupOrigin}/`) {\r\n const response = this.getQueryResponse(authPopup.location);\r\n\r\n if (response.error) {\r\n reject(new Error(response.error));\r\n } else {\r\n resolve({ clientId: clientId ?? '', code: response.code, provider, redirectUri });\r\n }\r\n\r\n authPopup.close();\r\n clearInterval(interval);\r\n } else {\r\n console.log('popupOrigin', popupOrigin);\r\n console.log('redirectUri', redirectUri);\r\n }\r\n } catch (error) {\r\n // this catches same-origin security exceptions\r\n // we don't do anything with them, just silently swallow\r\n }\r\n }, 500);\r\n }\r\n });\r\n }\r\n\r\n public static async fetchGoogleAccessToken(\r\n code: IAuthorizationCodeResponse\r\n ): Promise<{ isAuthed: true; tokens: IAccessTokenResponse } | { isAuthed: false; rejectedEmail: string }> {\r\n const url = `${this.authUrl}/${code.provider}`;\r\n const response = await fetch(url, {\r\n body: JSON.stringify(code),\r\n headers: { 'Content-Type': 'application/json' },\r\n method: 'POST'\r\n });\r\n if (response.ok) {\r\n const { refreshToken, token } = (await response.json()) as { token: string; refreshToken: string };\r\n const decoded = jwtDecode(token);\r\n\r\n const tokenResponse: IAccessTokenResponse = {\r\n accessToken: token,\r\n decodedToken: decoded,\r\n refreshToken\r\n };\r\n\r\n this.setAuthTokensInStorage(tokenResponse);\r\n\r\n return { isAuthed: true, tokens: tokenResponse };\r\n }\r\n\r\n const { rejectedEmail } = (await response.json()) as { rejectedEmail: string };\r\n\r\n return { isAuthed: false, rejectedEmail };\r\n }\r\n\r\n public static async fetchAccessToken(\r\n code: IAuthorizationCodeResponse\r\n ): Promise<{ isAuthed: true; tokens: IAccessTokenResponse } | { isAuthed: false; rejectedEmail: string }> {\r\n const accessToken = await EntraService.getAccessTokenSilent();\r\n code.code = accessToken;\r\n const url = `${this.authUrl}/${code.provider}`;\r\n const response = await fetch(url, {\r\n body: JSON.stringify(code),\r\n headers: { 'Content-Type': 'application/json' },\r\n method: 'POST'\r\n });\r\n\r\n if (response.ok) {\r\n const { refreshToken, token } = (await response.json()) as { token: string; refreshToken: string };\r\n const decoded = jwtDecode(token);\r\n\r\n const tokenResponse: IAccessTokenResponse = {\r\n accessToken: token,\r\n decodedToken: decoded,\r\n refreshToken\r\n };\r\n\r\n this.setAuthTokensInStorage(tokenResponse);\r\n\r\n return { isAuthed: true, tokens: tokenResponse };\r\n }\r\n\r\n const { rejectedEmail } = (await response.json()) as { rejectedEmail: string };\r\n\r\n return { isAuthed: false, rejectedEmail };\r\n }\r\n\r\n public static async refreshAccessToken(\r\n refreshToken: string,\r\n accountNum?: string\r\n ): Promise {\r\n let url = `${process.env.REACT_APP_AUTH_URL}dp/oauth2/token`;\r\n if (accountNum) {\r\n url += `?accountNum=${accountNum}`;\r\n }\r\n\r\n const urlEncoded = new URLSearchParams();\r\n urlEncoded.append('client_id', 'dealer_portal');\r\n urlEncoded.append('grant_type', 'refresh_token');\r\n urlEncoded.append('refresh_token', refreshToken);\r\n\r\n const response = await fetch(url, {\r\n body: urlEncoded,\r\n method: 'POST'\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Failed to update refresh token');\r\n }\r\n\r\n const tokens = (await response.json()) as IRefreshTokenResponse;\r\n const responseTokens: IAccessTokenResponse = {\r\n accessToken: tokens.access_token,\r\n decodedToken: jwtDecode(tokens.access_token),\r\n refreshToken: tokens.refresh_token\r\n };\r\n\r\n this.setAuthTokensInStorage(responseTokens);\r\n\r\n return responseTokens;\r\n }\r\n\r\n public static isAccessTokenExpired = (token: IDpToken): boolean => new Date(token.exp * 1000) < new Date();\r\n\r\n public static async fetchCurrentAccessToken(accountNum?: string): Promise {\r\n let tokens = this.getAuthTokens();\r\n if (tokens) {\r\n if (!tokens.decodedToken || this.isAccessTokenExpired(tokens.decodedToken)) {\r\n tokens = await this.refreshAccessToken(tokens.refreshToken, accountNum);\r\n }\r\n }\r\n\r\n return tokens;\r\n }\r\n\r\n public static async logout(): Promise {\r\n const currenTokens = this.getAuthTokens();\r\n const url = `${this.authUrl}/logout`;\r\n\r\n this.clearStorage(true);\r\n\r\n if (currenTokens?.refreshToken) {\r\n await fetch(url, {\r\n body: JSON.stringify({ refreshToken: currenTokens.refreshToken }),\r\n headers: { 'Content-Type': 'application/json' },\r\n method: 'POST'\r\n });\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport styled from 'styled-components';\r\n\r\ninterface ICopyrightTextProps {}\r\n\r\nconst StyledDiv = styled.div`\r\n white-space: nowrap;\r\n`;\r\n\r\nlet CopyrightText: React.ComponentType = () => {\r\n const currentYear = React.useMemo(() => new Date().getFullYear(), []);\r\n return © 2015 - {currentYear} Waterfront Brands, LLC;\r\n};\r\n\r\nCopyrightText = React.memo(CopyrightText);\r\nexport { CopyrightText };\r\n","import * as React from 'react';\r\nimport { Modal } from 'react-bootstrap';\r\nconst TermsBody = React.lazy(() => import(/* webpackChunkName: 'TermsBody' */ './TermsAndConditionsBody'));\r\n\r\ninterface ITermsAndConditionsDialogProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nlet TermsAndConditionsDialog: React.ComponentType = ({ onClose, isOpen }) => {\r\n return (\r\n \r\n \r\n Loading}>\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nTermsAndConditionsDialog = React.memo(TermsAndConditionsDialog);\r\nexport { TermsAndConditionsDialog };\r\n","// extracted by mini-css-extract-plugin\nmodule.exports = {\"btn-social\":\"SocialButtons_btn-social__7G3ny\",\"btn-social-icon\":\"SocialButtons_btn-social-icon__3cuwf\",\"btn-facebook\":\"SocialButtons_btn-facebook__3iwLZ\",\"focus\":\"SocialButtons_focus__3Ty5s\",\"active\":\"SocialButtons_active__1dZQu\",\"open\":\"SocialButtons_open__DY90j\",\"dropdown-toggle\":\"SocialButtons_dropdown-toggle__18iid\",\"disabled\":\"SocialButtons_disabled__3pVOE\",\"badge\":\"SocialButtons_badge__11Vrk\",\"btn-google\":\"SocialButtons_btn-google__1Ipjo\",\"btn-twitter\":\"SocialButtons_btn-twitter__1wrDb\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"margin\":\"LogoutAlert_margin__28zEf\"};","export function notUndefined(x: T | undefined): x is T {\r\n return x !== undefined;\r\n}\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport * as i from './preSeasonInterfaces';\r\n\r\nexport const preSeasonEntityAdapters = {\r\n approvalTypes: createEntityAdapter({ selectId: x => x.preseasonApprovalTypeId }),\r\n catalogSections: createEntityAdapter({ selectId: x => x.preseasonCatalogSectionId }),\r\n programLevels: createEntityAdapter({ selectId: x => x.programLevelId }),\r\n psCarts: createEntityAdapter({ selectId: x => x.brand })\r\n} as const;\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { isWithinInterval } from 'date-fns';\r\nimport orderBy from 'lodash-es/orderBy';\r\nimport { RootState } from '..';\r\nimport { brandAbbreviationToCssBackgroundClass } from '../../utils/brandAbbreviations';\r\nimport { notUndefined } from '../../utils/objectUtils';\r\nimport { getCart } from '../carts';\r\nimport { preSeasonEntityAdapters } from './preSeasonEntityAdapters';\r\nimport {\r\n IPreSeasonCartFull,\r\n IPreseasonCatalogItemGroupWithProducts,\r\n IPreseasonCatalogSection,\r\n IPreseasonWeekOption,\r\n IProductWithColor,\r\n IProgramLevel\r\n} from './preSeasonInterfaces';\r\n\r\nexport const preSeasonCartSelectors = preSeasonEntityAdapters.psCarts.getSelectors(\r\n (state: RootState) => state.preSeason.psCarts\r\n);\r\nexport const preSeasonCatalogSelectors = preSeasonEntityAdapters.catalogSections.getSelectors(\r\n (state: RootState) => state.preSeason.catalogSections\r\n);\r\nexport const preSeasonProgramLevelSelectors = preSeasonEntityAdapters.programLevels.getSelectors(\r\n (state: RootState) => state.preSeason.programLevels\r\n);\r\nexport const preSeasonAprovalTypeSelectors = preSeasonEntityAdapters.approvalTypes.getSelectors(\r\n (state: RootState) => state.preSeason.approvalTypes\r\n);\r\n\r\nexport const getCartApprovals = createSelector(\r\n [(state: RootState) => state.preSeason.approvals, (_: RootState, cartId: number) => cartId],\r\n (approvals, cartId) => approvals.filter(x => x.cartId === cartId)\r\n);\r\n\r\nexport const getActivePreSeasonCart = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.activeCartBrand,\r\n (state: RootState) => state.preSeason.psCarts.entities,\r\n (state: RootState) => state.preSeason.programLevels.entities,\r\n (state: RootState) => state\r\n ],\r\n (activeCartBrand, psCartHash, levelHash, state): IPreSeasonCartFull | undefined => {\r\n if (activeCartBrand) {\r\n const psCart = psCartHash[activeCartBrand];\r\n\r\n if (psCart) {\r\n const cart = getCart(state, psCart.cartId);\r\n\r\n if (cart) {\r\n return {\r\n ...psCart,\r\n cart,\r\n level: psCart.targetProgramLevelId ? levelHash[psCart.targetProgramLevelId] : undefined\r\n };\r\n }\r\n }\r\n }\r\n }\r\n);\r\n\r\nexport const getPreSeasonCarts = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.psCarts.entities,\r\n (state: RootState) => state.preSeason.programLevels.entities,\r\n (state: RootState) => state\r\n ],\r\n (psCartHash, levelHash, state): IPreSeasonCartFull[] => {\r\n const psCarts = Object.values(psCartHash).filter(notUndefined);\r\n\r\n return psCarts.map(x => ({\r\n ...x,\r\n cart: getCart(state, x.cartId),\r\n level: x.targetProgramLevelId ? levelHash[x.targetProgramLevelId] : undefined\r\n }));\r\n }\r\n);\r\n\r\nexport const getAvailableProgramLevels = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.activeCartBrand,\r\n (state: RootState) => state.preSeason.availableLevels,\r\n (state: RootState) => state.preSeason.programLevels.entities\r\n ],\r\n (brand, levelIds, levelHash): IProgramLevel[] => {\r\n if (brand) {\r\n const ids = levelIds[brand];\r\n if (ids) {\r\n return ids.map(x => levelHash[x]).filter(notUndefined);\r\n }\r\n }\r\n return [];\r\n }\r\n);\r\n\r\nexport const getAvailableCatalogSections = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.activeCartBrand,\r\n (state: RootState) => state.preSeason.availableCatalogSections,\r\n (state: RootState) => state.preSeason.catalogSections.entities\r\n ],\r\n (brand, catalogSectionIds, sectionHash): IPreseasonCatalogSection[] => {\r\n if (brand) {\r\n const ids = catalogSectionIds[brand];\r\n if (ids) {\r\n return ids.map(x => sectionHash[x]).filter(notUndefined);\r\n }\r\n }\r\n return [];\r\n }\r\n);\r\n\r\nexport const getSalesHistory = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.salesHistory,\r\n (_: RootState, values: { itemId: string; colorId: string }) => values\r\n ],\r\n (salesHash, { colorId, itemId }): { preseason: number; inSeason: number } => {\r\n const history = salesHash[`${itemId}_${colorId}`];\r\n\r\n return history ? history : { inSeason: 0, preseason: 0 };\r\n }\r\n);\r\n\r\nexport const getCatalogSectionPrimaryBrandColorClass = createSelector(\r\n preSeasonCatalogSelectors.selectById,\r\n (section): string => (section?.brand ? brandAbbreviationToCssBackgroundClass(section.brand) : '')\r\n);\r\n\r\nexport const getFlattenedPreseasonItemGroups = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.catalogItemGroups,\r\n (state: RootState) => state.catalog.items.entities,\r\n (state: RootState) => state.catalog.colors.entities,\r\n (_: RootState, sectionId: number) => sectionId\r\n ],\r\n (itemGroupHash, itemHash, colors, sectionId): IPreseasonCatalogItemGroupWithProducts[] => {\r\n const itemGroups = itemGroupHash[sectionId] ? orderBy(itemGroupHash[sectionId], x => x.order) : [];\r\n\r\n return itemGroups.map(x => {\r\n const orderedProducts = orderBy(x.products, y => y.order);\r\n\r\n return {\r\n ...x,\r\n items: orderedProducts.reduce((arr, i) => {\r\n const p = itemHash[i.itemId];\r\n let newItems: IProductWithColor[] = [];\r\n\r\n if (p) {\r\n newItems = p.colors\r\n ? p.colors.reduce((arr, colorId) => {\r\n const color = colors[colorId];\r\n\r\n if (color) {\r\n arr.push({ ...p, colorId: color.inventColorId, colorName: color.name });\r\n }\r\n\r\n return arr;\r\n }, [])\r\n : [{ ...p, colorId: '', colorName: '' }];\r\n }\r\n\r\n return [...arr, ...newItems];\r\n }, [])\r\n };\r\n });\r\n }\r\n);\r\n\r\nexport const getPaymentTermShippingOptions = createSelector(\r\n [\r\n (state: RootState) => state.preSeason.shippingWeeks,\r\n (state: RootState) => state.preSeason.paymentTermShipRanges,\r\n (_: RootState, paymentTerm: string | undefined) => paymentTerm\r\n ],\r\n (shippingWeeks, paymentTermShipRanges, paymentTerm) => {\r\n if (paymentTerm) {\r\n const ranges = paymentTermShipRanges.reduce>(\r\n (paymTermMap, paymTermObj) => {\r\n const { endDate, startDate } = paymTermObj;\r\n const available =\r\n shippingWeeks.filter(x =>\r\n isWithinInterval(new Date(x.value), { end: new Date(endDate), start: new Date(startDate) })\r\n ) ?? [];\r\n paymTermMap[paymTermObj.paymentTermId] = available;\r\n\r\n return paymTermMap;\r\n },\r\n {}\r\n );\r\n\r\n return ranges[paymentTerm] ? ranges[paymentTerm] : [];\r\n }\r\n\r\n return [];\r\n }\r\n);\r\n\r\n// export function getFlattenedPreseasonItemGroups(\r\n// state: RootState,\r\n// sectionId: number\r\n// ): IPreseasonCatalogItemGroupWithProducts[] {\r\n// const section = state.preseason.catalogSections.sections[sectionId];\r\n// const orderedGroups = section ? orderBy(section.groups, x => x.order) : [];\r\n\r\n// return orderedGroups.map(x => {\r\n// const orderedProducts = sortBy(x.products, y => y.order);\r\n\r\n// return {\r\n// ...x,\r\n// items: orderedProducts.reduce((arr, i) => {\r\n// const p = state.catalog.items[i.itemId];\r\n// let newItems: IProductWithColor[] = [];\r\n\r\n// if (p) {\r\n// newItems = p.hasColors\r\n// ? p.colors.map(z => ({\r\n// ...p,\r\n// colorId: state.catalog.colors[z].inventColorId,\r\n// colorName: state.catalog.colors[z].name\r\n// }))\r\n// : [{ ...p, colorId: '', colorName: '' }];\r\n// }\r\n\r\n// return [...arr, ...newItems];\r\n// }, [])\r\n// };\r\n// });\r\n// }\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest, IEditObject } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const editPreSeasonOrderThunk = createAsyncThunk(\r\n 'preSeason/editOrder',\r\n async ({ brand, year }: { year: string; brand: string }, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n const response = await executeApiRequest>(() =>\r\n httpService.post(`/Preseason/EditOrder?brand=${brand}&year=${year}`)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to enable editing for pre-season order ${brand}, ${year}`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { ICatalogSectionResult } from '../preSeasonInterfaces';\r\n\r\nexport const fetchCatalogSectionThunk = createAsyncThunk(\r\n 'preSeason/fetchCatalogSection',\r\n async (sectionId: number, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() =>\r\n httpService.get(`/Preseason/CatalogSections?sectionId=${sectionId}`)\r\n );\r\n if (result.requestFailed) {\r\n return rejectWithValue(`Failed to fetch pre-season catalog section ${sectionId}`);\r\n }\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IPreseasonApprovalApiResponse } from '../preSeasonInterfaces';\r\n\r\nexport const initPreSeasonApprovalThunk = createAsyncThunk('preSeason/initApproval', async (_, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`/Preseason/InitApproval`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to initialize pre-season approval');\r\n }\r\n\r\n return response.value;\r\n});\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IPreseasonSummaryApiResponse } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const initPreSeasonThunk = createAsyncThunk(\r\n 'preSeason/init',\r\n async (brand: string | undefined = '', { rejectWithValue }) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`/Preseason/Summary?brand=${brand}`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to fetch pre-season summary.`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { ISubmitSummaryApiResponse } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport const initSubmitPreSeasonThunk = createAsyncThunk('preSeason/initSubmit', async (_, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() => httpService.get(`/Preseason/InitSubmit`));\r\n\r\n if (result.requestFailed) {\r\n return rejectWithValue('Failed to initialize pre-season order page');\r\n }\r\n\r\n return result.value;\r\n});\r\n\r\n// function* initSubmitPreseasonSaga(action: InitSubmitPreseason): any {\r\n// const summary: ISagaResponse = yield call(initSubmitPreseasonAsync);\r\n// if (!summary.error) {\r\n// yield put(preseasonActionCreators.initSubmitPreseasonFulfilled(summary.value));\r\n\r\n// if (summary.value.paymentTerms) {\r\n// yield put(paymentTermsActionCreators.set(summary.value.paymentTerms));\r\n// }\r\n// } else {\r\n// console.log(summary.error);\r\n// yield put(preseasonActionCreators.initSubmitPreseasonError(summary.error));\r\n// }\r\n// }\r\n\r\n// async function initSubmitPreseasonAsync(): Promise> {\r\n// let error: Error;\r\n// let value: ISubmitSummaryApiResponse;\r\n\r\n// try {\r\n// const response = await httpService.get(`/Preseason/InitSubmit`);\r\n\r\n// value = await response.json();\r\n// } catch (e) {\r\n// error = e;\r\n// }\r\n\r\n// return { error, value };\r\n// }\r\n\r\n// export function* watchInitSubmitPreseason(): any {\r\n// yield takeLatest(PreseasonActionKeys.INIT_SUBMIT_PRESEASON, initSubmitPreseasonSaga);\r\n// }\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { IPreSeasonCart } from '../preSeasonInterfaces';\r\n\r\nexport const recalcPreSeasonOrderThunk = createAsyncThunk(\r\n 'preSeason/calcOrder',\r\n async (cartId: number, { dispatch, rejectWithValue }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/Preseason/${cartId}/Recalculate`)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to recalculate pre-season order for cart ${cartId}`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\nimport { IPreSeasonCart } from '../preSeasonInterfaces';\r\n\r\nexport const rejectPreSeasonOrderThunk = createAsyncThunk(\r\n 'preSeason/rejectOrder',\r\n async (cartId: number, { dispatch, rejectWithValue }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() => httpService.delete(`/Preseason/${cartId}/Reject`));\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to reject pre-season order for cart ${cartId}`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IPreseasonSubmitResponse } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest, IEditObject } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const submitPreSeasonOrderThunk = createAsyncThunk(\r\n 'preSeason/submitOrder',\r\n async (cartId: number, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest>(() =>\r\n httpService.post(`/Preseason/SubmitOrder`, cartId)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue(`Failed to submit pre-season order for cart ${cartId}`);\r\n }\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { brandAbbreviationToString } from '../../../utils/brandAbbreviations';\r\nimport { coreActions } from '../../core';\r\nimport { ISubmitPreSeasonToAxRequest, ISubmitPreSeasonToAxResponse } from '../preSeasonInterfaces';\r\n\r\nexport const submitPreSeasonToAxThunk = createAsyncThunk(\r\n 'preSeason/submitToAx',\r\n async (request: { brand: string; cart: ISubmitPreSeasonToAxRequest }, { dispatch, rejectWithValue }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/Preseason/SubmitToAx`, request.cart)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (response.requestFailed) {\r\n toast(`Please retry.`, { type: 'error' });\r\n return rejectWithValue(`Failed to submit pre-season cart ${request.cart.cartId}`);\r\n }\r\n\r\n toast(`${brandAbbreviationToString(request.brand)} Pre-Season order submitted.`, { type: 'success' });\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { IPreSeasonWorksheetRequest, IPreseasonWorksheetResult } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest, IEditObject } from '../../../utils/asyncUtils';\r\n\r\nexport const submitPreSeasonWorksheetThunk = createAsyncThunk(\r\n 'preSeason/submitWorksheet',\r\n async (worksheet: IPreSeasonWorksheetRequest, { rejectWithValue }) => {\r\n const result = await executeApiRequest>(() =>\r\n httpService.post(`/Preseason/ProcessWorksheet`, worksheet)\r\n );\r\n\r\n if (result.requestFailed) {\r\n return rejectWithValue('Failed to update pre-season worksheet');\r\n }\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { IPreSeasonApproval } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\n\r\nexport interface IUpdateApprovalRequest {\r\n cartId: number;\r\n approvalTypeId: number;\r\n status: boolean;\r\n}\r\n\r\nexport const updatePreSeasonApprovalThunk = createAsyncThunk(\r\n 'preSeason/updateApproval',\r\n async (request: IUpdateApprovalRequest, { rejectWithValue }) => {\r\n const response = await executeApiRequest(() =>\r\n httpService.post(`/Preseason/UpdateApproval`, request)\r\n );\r\n\r\n if (response.requestFailed) {\r\n toast(`Updating approval status failed. Please retry.`, { type: 'error' });\r\n\r\n return rejectWithValue(\r\n `Failed to update pre-season approval, ${request.cartId} ${request.approvalTypeId} ${request.status}`\r\n );\r\n }\r\n\r\n toast('Approval status updated.', { type: 'success' });\r\n\r\n return response.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { IUpdateCartLineResult } from '../../carts/cartsInterfaces';\r\n\r\nexport interface IAddPreseasonItemRequest {\r\n itemId: string;\r\n inventColorId: string | undefined;\r\n quantity: number;\r\n}\r\n\r\nexport const updatePreSeasonItemThunk = createAsyncThunk(\r\n 'preSeason/updateItem',\r\n async (request: IAddPreseasonItemRequest, { rejectWithValue }) => {\r\n const result = await executeApiRequest(() =>\r\n httpService.post(`/Preseason/UpdateItem`, request)\r\n );\r\n\r\n if (result.requestFailed) {\r\n const message = `Adding item ${request.itemId} failed. Please retry.`;\r\n toast(message, { type: 'error' });\r\n return rejectWithValue(message);\r\n }\r\n\r\n toast(`Item ${request.itemId} updated successfully`, { type: 'success' });\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { toast } from 'react-toastify';\r\nimport { IUpdateTargetObj, IUpdateTargetResponse } from '..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest, IEditObject } from '../../../utils/asyncUtils';\r\nimport { coreActions } from '../../core';\r\n\r\nexport const updateTargetLevelThunk = createAsyncThunk(\r\n 'preSeason/updateTargetLevel',\r\n async (update: IUpdateTargetObj, { rejectWithValue, dispatch }) => {\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n const result = await executeApiRequest>(() =>\r\n httpService.post(`/Preseason/UpdateTarget`, update)\r\n );\r\n dispatch(coreActions.toggleWorkingOnItDialog());\r\n\r\n if (result.requestFailed) {\r\n toast('Updating target level failed. Please retry.', { type: 'error' });\r\n return rejectWithValue('Updating target level failed.');\r\n }\r\n\r\n toast('Target Level Updated', { type: 'success' });\r\n\r\n return result.value;\r\n }\r\n);\r\n","import { createAction, createSlice, EntityState } from '@reduxjs/toolkit';\r\nimport { switchDealerThunk } from '../auth';\r\nimport { IPaymentTerm } from '../core';\r\nimport { preSeasonEntityAdapters } from './preSeasonEntityAdapters';\r\nimport {\r\n IPaymentTermRange,\r\n IPreSeasonApproval,\r\n IPreSeasonApprovalType,\r\n IPreSeasonCart,\r\n IPreSeasonCartNormalized,\r\n IPreseasonCatalogItemGroup,\r\n IPreseasonCatalogSection,\r\n IPreseasonWeekOption,\r\n IPreseasonWorksheetResult,\r\n IProgramLevel\r\n} from './preSeasonInterfaces';\r\nimport {\r\n editPreSeasonOrderThunk,\r\n fetchCatalogSectionThunk,\r\n initPreSeasonApprovalThunk,\r\n initPreSeasonThunk,\r\n initSubmitPreSeasonThunk,\r\n recalcPreSeasonOrderThunk,\r\n rejectPreSeasonOrderThunk,\r\n submitPreSeasonOrderThunk,\r\n submitPreSeasonWorksheetThunk,\r\n updatePreSeasonApprovalThunk,\r\n updateTargetLevelThunk\r\n} from './thunks';\r\n\r\ninterface IPreSeasonState {\r\n activeCartBrand: string | undefined;\r\n approvals: IPreSeasonApproval[];\r\n approvalTypes: EntityState;\r\n availableCatalogSections: Record;\r\n availableLevels: Record;\r\n catalogItemGroups: Record;\r\n catalogSections: EntityState;\r\n currentBrand: string;\r\n floorPlanHash: Record;\r\n isApprovalUser: boolean;\r\n paymentTerms: IPaymentTerm[];\r\n paymentTermShipRanges: IPaymentTermRange[];\r\n psCarts: EntityState;\r\n programLevels: EntityState;\r\n salesHistory: Record;\r\n shippingWeeks: IPreseasonWeekOption[];\r\n worksheets: Record;\r\n}\r\n\r\nconst initialState: IPreSeasonState = {\r\n activeCartBrand: undefined,\r\n approvalTypes: preSeasonEntityAdapters.approvalTypes.getInitialState(),\r\n approvals: [],\r\n availableCatalogSections: {},\r\n availableLevels: {},\r\n catalogItemGroups: {},\r\n catalogSections: preSeasonEntityAdapters.catalogSections.getInitialState(),\r\n currentBrand: '',\r\n floorPlanHash: {},\r\n isApprovalUser: false,\r\n paymentTermShipRanges: [],\r\n paymentTerms: [],\r\n programLevels: preSeasonEntityAdapters.programLevels.getInitialState(),\r\n psCarts: preSeasonEntityAdapters.psCarts.getInitialState(),\r\n salesHistory: {},\r\n shippingWeeks: [],\r\n worksheets: {}\r\n};\r\n\r\nconst PreSeasonApprovalRealtimeUpdate = createAction('preSeason/realtime/psApprovalUpdate');\r\nconst PreSeasonCartRealtimeUpdate = createAction('preSeason/realtime/psCartUpdate');\r\n\r\nconst slice = createSlice({\r\n initialState,\r\n name: 'preseason',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n const noramlizePsCart = (psCart: IPreSeasonCart): IPreSeasonCartNormalized => ({\r\n accountNum: psCart.accountNum,\r\n brand: psCart.brand,\r\n cartId: psCart.cartId,\r\n fiscalYear: psCart.fiscalYear,\r\n imported: psCart.imported,\r\n preseasonGoalTypeId: psCart.preseasonGoalTypeId,\r\n submitted: psCart.submitted,\r\n submittedAtUtc: psCart.submittedAtUtc,\r\n submittedByEmail: psCart.submittedByEmail,\r\n submittedByName: psCart.submittedByName,\r\n targetProgramLevelId: psCart.targetProgramLevelId\r\n });\r\n\r\n builder\r\n .addCase(initPreSeasonThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n preSeasonEntityAdapters.psCarts.upsertMany(state.psCarts, [noramlizePsCart(action.payload.psCart)]);\r\n preSeasonEntityAdapters.catalogSections.upsertMany(state.catalogSections, action.payload.catalogSections);\r\n state.activeCartBrand = action.payload.psCart.brand;\r\n state.availableLevels = {\r\n ...state.availableLevels,\r\n [action.payload.psCart.brand]: action.payload.levels.map(x => x.programLevelId)\r\n };\r\n state.availableCatalogSections = {\r\n ...state.availableCatalogSections,\r\n [action.payload.psCart.brand]: action.payload.catalogSections.map(x => x.preseasonCatalogSectionId)\r\n };\r\n\r\n state.worksheets = { ...state.worksheets, [action.payload.psCart.brand]: action.payload.worksheetResult };\r\n preSeasonEntityAdapters.programLevels.upsertMany(state.programLevels, action.payload.levels);\r\n state.salesHistory = action.payload.salesHash;\r\n }\r\n })\r\n .addCase(initSubmitPreSeasonThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n preSeasonEntityAdapters.psCarts.upsertMany(state.psCarts, action.payload.psCarts.map(noramlizePsCart));\r\n preSeasonEntityAdapters.programLevels.upsertMany(state.programLevels, action.payload.programLevels);\r\n state.paymentTerms = action.payload.paymentTerms;\r\n state.floorPlanHash = action.payload.floorPlanHash;\r\n state.paymentTermShipRanges = action.payload.paymentTermShipRanges;\r\n state.shippingWeeks = action.payload.weeks;\r\n }\r\n })\r\n .addCase(submitPreSeasonWorksheetThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n state.worksheets = { ...state.worksheets, [action.meta.arg.brand]: action.payload.value };\r\n }\r\n })\r\n .addCase(fetchCatalogSectionThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n state.catalogItemGroups = { ...state.catalogItemGroups, [action.meta.arg]: action.payload.groups };\r\n }\r\n })\r\n .addCase(updateTargetLevelThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const applicableCart = Object.values(state.psCarts.entities).find(\r\n x => x?.brand === action.meta.arg.brand && x.fiscalYear === action.meta.arg.year\r\n );\r\n\r\n if (applicableCart) {\r\n applicableCart.targetProgramLevelId = action.payload.value.programTargetLevelId;\r\n applicableCart.preseasonGoalTypeId = action.payload.value.preseasonGoalTypeId;\r\n }\r\n }\r\n })\r\n .addCase(submitPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const cart = state.psCarts.entities[action.payload.value.brand];\r\n\r\n if (cart) {\r\n preSeasonEntityAdapters.psCarts.upsertOne(state.psCarts, {\r\n ...cart,\r\n submitted: true,\r\n submittedAtUtc: action.payload.value.submittedAtUtc,\r\n submittedByName: action.payload.value.submittedBy\r\n });\r\n }\r\n }\r\n })\r\n .addCase(editPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const cart = state.psCarts.entities[action.payload.value];\r\n\r\n if (cart) {\r\n preSeasonEntityAdapters.psCarts.upsertOne(state.psCarts, {\r\n ...cart,\r\n submitted: false,\r\n submittedAtUtc: '',\r\n submittedByName: ''\r\n });\r\n }\r\n }\r\n })\r\n .addCase(initPreSeasonApprovalThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n preSeasonEntityAdapters.approvalTypes.upsertMany(state.approvalTypes, action.payload.approvalTypes);\r\n preSeasonEntityAdapters.psCarts.upsertMany(state.psCarts, action.payload.psCarts.map(noramlizePsCart));\r\n preSeasonEntityAdapters.programLevels.upsertMany(state.programLevels, action.payload.levels);\r\n\r\n state.isApprovalUser = action.payload.isApprovalUser;\r\n state.approvals = action.payload.approvals;\r\n }\r\n })\r\n .addCase(PreSeasonApprovalRealtimeUpdate, (state, action) => {\r\n const newApproval = action.payload;\r\n state.approvals = [\r\n ...state.approvals.filter(\r\n x => `${x.cartId}_${x.approvalTypeId}` !== `${newApproval.cartId}_${newApproval.approvalTypeId}`\r\n ),\r\n action.payload\r\n ];\r\n })\r\n .addCase(updatePreSeasonApprovalThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n const newApproval = action.payload;\r\n\r\n state.approvals = [\r\n ...state.approvals.filter(\r\n x => `${x.cartId}_${x.approvalTypeId}` !== `${newApproval.cartId}_${newApproval.approvalTypeId}`\r\n ),\r\n action.payload\r\n ];\r\n }\r\n })\r\n .addCase(rejectPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n preSeasonEntityAdapters.psCarts.upsertOne(state.psCarts, noramlizePsCart(action.payload));\r\n }\r\n })\r\n .addCase(recalcPreSeasonOrderThunk.fulfilled, (state, action) => {\r\n if (action.payload) {\r\n preSeasonEntityAdapters.psCarts.upsertOne(state.psCarts, noramlizePsCart(action.payload));\r\n }\r\n })\r\n .addCase(PreSeasonCartRealtimeUpdate, (state, action) => {\r\n preSeasonEntityAdapters.psCarts.upsertOne(state.psCarts, noramlizePsCart(action.payload));\r\n })\r\n .addCase(switchDealerThunk.pending, () => initialState);\r\n }\r\n});\r\n\r\nexport const { reducer: preSeasonReducer } = slice;\r\n","import { SyntheticEvent, useCallback, useState } from 'react';\r\n\r\n/** A hook to encapsulate the logic for toggling an anchor element */\r\nexport function useAnchorEl(): [HTMLElement | undefined, (e: SyntheticEvent) => void, () => void] {\r\n const [anchorEl, setAnchorEl] = useState();\r\n\r\n const open = useCallback((e: SyntheticEvent) => setAnchorEl(e.currentTarget), []);\r\n const close = useCallback(() => setAnchorEl(undefined), []);\r\n\r\n return [anchorEl, open, close];\r\n}\r\n","import { useCallback, useState } from 'react';\r\n\r\n/** A hook to simplify using form values */\r\nexport function useForm(value: T): [T, (field: keyof T) => (value: unknown) => void, boolean, (value: T) => void] {\r\n const [val, setVal] = useState(value);\r\n const [hasChanges, setHasChanges] = useState(false);\r\n\r\n const handleUpdate = useCallback(\r\n // TODO: better typing for second parameter (get rid of any)\r\n (field: keyof T) => (newVal: unknown) => {\r\n setVal(current => ({ ...current, [field]: newVal }));\r\n setHasChanges(true);\r\n },\r\n []\r\n );\r\n\r\n return [val, handleUpdate, hasChanges, setVal];\r\n}\r\n","import { useCallback, useMemo, useState } from 'react';\r\n\r\nexport interface ILocalStorageSortObject {\r\n orderBy: keyof T;\r\n orderByDirection: 'asc' | 'desc';\r\n}\r\n\r\nexport function useLocalStorageSort(\r\n key: string,\r\n defaultFilters: ILocalStorageSortObject\r\n): {\r\n filters: ILocalStorageSortObject;\r\n setFilters: (field: keyof T) => () => void;\r\n} {\r\n const [filters, setFilters] = useState>(\r\n localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key) as string) : defaultFilters\r\n );\r\n\r\n const handleSet = useCallback(\r\n (field: keyof T) => () => {\r\n const updated: ILocalStorageSortObject = {\r\n ...filters,\r\n orderBy: field,\r\n orderByDirection: filters.orderBy === field && filters.orderByDirection === 'asc' ? 'desc' : 'asc'\r\n };\r\n localStorage.setItem(key, JSON.stringify(updated));\r\n setFilters(updated);\r\n },\r\n [filters, setFilters, key]\r\n );\r\n\r\n const values = useMemo(() => ({ filters, setFilters: handleSet }), [filters, handleSet]);\r\n\r\n return values;\r\n}\r\n","import { useEffect, useMemo, useState } from 'react';\r\n\r\nexport function useOnScreen(ref: React.RefObject) {\r\n const [isIntersecting, setIntersecting] = useState(false);\r\n\r\n const observer = useMemo(() => new IntersectionObserver(([entry]) => setIntersecting(entry.isIntersecting)), []);\r\n\r\n useEffect(() => {\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [observer, ref]);\r\n\r\n return isIntersecting;\r\n}\r\n","import { Realtime } from 'ably';\r\nimport { useEffect } from 'react';\r\nimport { store } from '../';\r\nimport { useAppSelector } from './redux';\r\n\r\nconst client = new Realtime({ key: process.env.REACT_APP_REALTIME_KEY });\r\n/**\r\n * Uses realtime service to watch messages and send them to redux\r\n */\r\nexport function useRealtime(channelName: string | string[]) {\r\n const accountNum = useAppSelector(state => state.core.me?.accountNum);\r\n\r\n useEffect(() => {\r\n console.info('UPDATING REALTIME', channelName);\r\n const channelNames = Array.isArray(channelName) ? channelName : [channelName];\r\n const channels = channelNames.map(name => client.channels.get(name));\r\n\r\n //const channel = clientRef.current.channels.get(channelName);\r\n\r\n channels.forEach(channel => {\r\n channel.subscribe(message => {\r\n if (message.data && message.data.type) {\r\n store.dispatch({ ...message.data, payload: { ...message.data.payload, accountNum } });\r\n }\r\n });\r\n });\r\n\r\n return () => {\r\n channels.forEach(channel => {\r\n channel.unsubscribe();\r\n });\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [channelCompareFunc(channelName)]);\r\n}\r\n\r\nconst channelCompareFunc = (channelName: string | string[]): string => {\r\n if (Array.isArray(channelName)) {\r\n return [...channelName].sort().join(',');\r\n }\r\n return channelName;\r\n};\r\n","import { createEntityAdapter } from '@reduxjs/toolkit';\r\nimport * as i from './lookupsInterfaces';\r\n\r\nexport const lookupEntityAdapters = {\r\n brands: createEntityAdapter({\r\n selectId: x => x.id,\r\n sortComparer: (a, b) => a.brand.localeCompare(b.brand)\r\n }),\r\n dpNewsFeedTags: createEntityAdapter({\r\n selectId: x => x.dpNewsFeedTagId,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name)\r\n }),\r\n dpProductFamilies: createEntityAdapter({\r\n selectId: x => x.id,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name)\r\n }),\r\n states: createEntityAdapter({\r\n selectId: x => x.id,\r\n sortComparer: (a, b) => a.abbreviation.localeCompare(b.abbreviation)\r\n }),\r\n warehouses: createEntityAdapter({\r\n selectId: x => x.warehouseId,\r\n sortComparer: (a, b) => a.name.localeCompare(b.name)\r\n })\r\n};\r\n","import { createSelector } from '@reduxjs/toolkit';\r\nimport { RootState } from '..';\r\nimport { lookupEntityAdapters } from './lookupsEntityAdapters';\r\nimport { OnDemandLookupTypes } from './lookupsInterfaces';\r\n\r\nexport const brandSelectors = lookupEntityAdapters.brands.getSelectors(state => state.lookups.brands);\r\nexport const stateSelectors = lookupEntityAdapters.states.getSelectors(state => state.lookups.states);\r\nexport const warehouseSelectors = lookupEntityAdapters.warehouses.getSelectors(\r\n state => state.lookups.warehouses\r\n);\r\nexport const dpNewsFeedTagSelectors = lookupEntityAdapters.dpNewsFeedTags.getSelectors(\r\n state => state.lookups.dpNewsFeedTags\r\n);\r\nexport const dpProductFamilySelectors = lookupEntityAdapters.dpProductFamilies.getSelectors(\r\n state => state.lookups.dpProductFamilies\r\n);\r\n\r\nexport const getNonLoadedOrLoadingLookups = createSelector(\r\n [\r\n (state: RootState) => [...state.lookups.loaded, ...state.lookups.loading],\r\n (_: unknown, types: OnDemandLookupTypes[]) => types\r\n ],\r\n (loaded, types) => types.filter(x => !loaded.includes(x))\r\n);\r\n\r\nexport const getIsLookupLoading = createSelector(\r\n [\r\n (state: RootState) => state.lookups.loading,\r\n (_: RootState, type: OnDemandLookupTypes | OnDemandLookupTypes[]) => type\r\n ],\r\n (loadingArr, type) => (Array.isArray(type) ? type.every(x => loadingArr.includes(x)) : loadingArr.includes(type))\r\n);\r\n\r\nexport const getIsLookupLoaded = createSelector(\r\n [\r\n (state: RootState) => state.lookups.loaded,\r\n (_: RootState, type: OnDemandLookupTypes | OnDemandLookupTypes[]) => type\r\n ],\r\n (loadedArr, type) => (Array.isArray(type) ? type.every(x => loadedArr.includes(x)) : loadedArr.includes(type))\r\n);\r\n\r\nexport const getBrandName = createSelector(\r\n [brandSelectors.selectAll, (_: RootState, brandAbbreviation: string) => brandAbbreviation],\r\n (brands, abbreviateion): string => {\r\n const brand = brands.find(x => x.abbreviation === abbreviateion);\r\n return brand?.brand ?? abbreviateion;\r\n }\r\n);\r\n","import { createAsyncThunk } from '@reduxjs/toolkit';\r\nimport { RootState } from '../..';\r\nimport { httpService } from '../../..';\r\nimport { executeApiRequest } from '../../../utils/asyncUtils';\r\nimport { ILookupApiResponse } from '../lookupsInterfaces';\r\n\r\nexport const fetchLookupsThunk = createAsyncThunk(\r\n 'lookups/fetch',\r\n async (types: Array, { rejectWithValue, getState }) => {\r\n const state = getState() as RootState;\r\n\r\n const toLoad = types.filter(x => !state.lookups.loaded.includes(x));\r\n\r\n if (toLoad.length > 0) {\r\n const response = await executeApiRequest(() =>\r\n httpService.get(`/Lookups?${httpService.createQueryString('types', toLoad, false)}`)\r\n );\r\n\r\n if (response.requestFailed) {\r\n return rejectWithValue('Failed to fetch lookups');\r\n }\r\n\r\n return response.value ?? {};\r\n }\r\n\r\n return {};\r\n }\r\n);\r\n","import { createSlice, EntityAdapter, EntityState } from '@reduxjs/toolkit';\r\nimport { uniq } from 'lodash-es';\r\nimport { lookupEntityAdapters } from './lookupsEntityAdapters';\r\nimport * as i from './lookupsInterfaces';\r\nimport { fetchLookupsThunk } from './thunks';\r\n\r\ninterface IEntities {\r\n brands: EntityState;\r\n dpNewsFeedTags: EntityState;\r\n dpProductFamilies: EntityState;\r\n states: EntityState;\r\n warehouses: EntityState;\r\n}\r\n\r\ninterface ILookupsState extends IEntities {\r\n loaded: Array;\r\n loading: Array;\r\n}\r\n\r\nconst initialState: ILookupsState = {\r\n brands: lookupEntityAdapters.brands.getInitialState(),\r\n dpNewsFeedTags: lookupEntityAdapters.dpNewsFeedTags.getInitialState(),\r\n dpProductFamilies: lookupEntityAdapters.dpProductFamilies.getInitialState(),\r\n loaded: [],\r\n loading: [],\r\n states: lookupEntityAdapters.states.getInitialState(),\r\n warehouses: lookupEntityAdapters.warehouses.getInitialState()\r\n};\r\n\r\nconst lookupsSlice = createSlice({\r\n initialState,\r\n name: 'lookups',\r\n reducers: {},\r\n // eslint-disable-next-line sort-keys\r\n extraReducers: builder => {\r\n builder\r\n .addCase(fetchLookupsThunk.pending, (state, action) => {\r\n state.loading = uniq([...state.loading, ...action.meta.arg]);\r\n })\r\n .addCase(fetchLookupsThunk.fulfilled, (state, action) => {\r\n state.loading = state.loading.filter(x => !action.meta.arg.includes(x));\r\n state.loaded = uniq([...state.loaded, ...action.meta.arg]);\r\n\r\n Object.keys(action.payload).forEach(key => {\r\n // cast the string key to an IEntity\r\n const typedKey = key as keyof IEntities;\r\n // get the entity adapter, type it as unknown because we don't know what it is\r\n const adapter = lookupEntityAdapters[typedKey] as EntityAdapter;\r\n\r\n // this is disabled because we are iterating over the object so we know the value exists\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n adapter.upsertMany(state[typedKey], action.payload[typedKey]!);\r\n });\r\n })\r\n .addCase(fetchLookupsThunk.rejected, (state, action) => {\r\n state.loading = state.loading.filter(x => !action.meta.arg.includes(x));\r\n });\r\n }\r\n});\r\n\r\nexport const { reducer: lookupsReducer } = lookupsSlice;\r\n","import { combineReducers } from '@reduxjs/toolkit';\r\nimport { addressesReducer } from './addresses';\r\nimport { authReducer } from './auth';\r\nimport { cartsReducer } from './carts';\r\nimport { cashDiscountsReducer } from './cashDiscounts';\r\nimport { catalogReducer } from './catalog';\r\nimport { configuratorReducer } from './configurator';\r\nimport { coreReducer } from './core';\r\nimport { inventoryReducer } from './inventory';\r\nimport { lookupsReducer } from './lookups';\r\nimport { newsFeedReducer } from './newsFeed';\r\nimport { ordersReducer } from './orders';\r\nimport { preSeasonReducer } from './preSeason';\r\nimport { profileReducer } from './profile';\r\n\r\nexport const rootReducer = combineReducers({\r\n addresses: addressesReducer,\r\n auth: authReducer,\r\n carts: cartsReducer,\r\n cashDiscounts: cashDiscountsReducer,\r\n catalog: catalogReducer,\r\n configurator: configuratorReducer,\r\n core: coreReducer,\r\n inventory: inventoryReducer,\r\n lookups: lookupsReducer,\r\n newsFeed: newsFeedReducer,\r\n orders: ordersReducer,\r\n preSeason: preSeasonReducer,\r\n profile: profileReducer\r\n});\r\n\r\nexport type RootState = ReturnType;\r\n","import * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { Spinner } from '../components/Spinner';\r\n\r\ninterface ISplashPageProps {}\r\n\r\nconst Container = styled.div`\r\n align-items: center;\r\n background-color: ${props => props.theme.pallette.common.white};\r\n display: flex;\r\n height: 100vh;\r\n justify-content: center;\r\n div.content {\r\n max-width: 500px;\r\n padding-left: 20px;\r\n padding-right: 20px;\r\n }\r\n`;\r\n\r\nlet SplashPage: React.ComponentType = () => {\r\n return (\r\n \r\n
\r\n \"\"\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nSplashPage = React.memo(SplashPage);\r\nexport { SplashPage };\r\n","import { IconDefinition } from '@fortawesome/fontawesome-svg-core';\r\nimport { faGoogle, faTwitter } from '@fortawesome/free-brands-svg-icons';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport * as React from 'react';\r\nimport { AuthProviders } from '../utils/auth/authInterfaces';\r\nimport buttonStyle from './SocialButtons.module.scss';\r\n\r\ninterface ILoginButtonProps {\r\n provider: AuthProviders;\r\n onClick: (variant: AuthProviders) => void;\r\n}\r\n\r\nconst labels: Record = {\r\n adfs: { label: 'Employee Login' },\r\n //facebook: { icon: faFacebookF, label: 'Facebook' },\r\n google: { icon: faGoogle, label: 'Google' },\r\n twitter: { icon: faTwitter, label: 'Twitter' }\r\n};\r\n\r\nlet LoginButton: React.ComponentType = ({ provider, onClick }) => {\r\n const handleClick = React.useCallback(() => {\r\n onClick(provider);\r\n }, [provider, onClick]);\r\n const item = React.useMemo(() => labels[provider], [provider]);\r\n\r\n return (\r\n \r\n {item.icon && }\r\n {` ${item.label}`}\r\n \r\n );\r\n};\r\n\r\nLoginButton = React.memo(LoginButton);\r\nexport { LoginButton };\r\n","import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport * as React from 'react';\r\n\r\ninterface ILoginErrorServerErrorBodyProps {}\r\n\r\nlet LoginErrorServerErrorBody: React.ComponentType = () => {\r\n return (\r\n <>\r\n \r\n

\r\n Something went wrong...\r\n

\r\n

There was a problem authenticating you.

\r\n
An attempt has been made to log the error. Sorry for the inconvenience.
\r\n \r\n );\r\n};\r\n\r\nLoginErrorServerErrorBody = React.memo(LoginErrorServerErrorBody);\r\nexport { LoginErrorServerErrorBody };\r\n","import { faBan, faUser } from '@fortawesome/free-solid-svg-icons';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport * as React from 'react';\r\n\r\ninterface ILoginErrorUnauthorizedBodyProps {\r\n email?: string;\r\n}\r\n\r\nlet LoginErrorUnauthorizedBody: React.ComponentType = ({ email }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n

\r\n {email ? (\r\n <>\r\n {email} is{' '}\r\n \r\n ) : (\r\n 'You are'\r\n )}{' '}\r\n not authorized to access this resource.{' '}\r\n

\r\n
Please ensure the e-mail address is correct and try to login again.
\r\n \r\n );\r\n};\r\n\r\nLoginErrorUnauthorizedBody = React.memo(LoginErrorUnauthorizedBody);\r\nexport { LoginErrorUnauthorizedBody };\r\n","import * as React from 'react';\r\nimport { Button, Modal } from 'react-bootstrap';\r\nimport { ColorLine } from '../components/ColorLine';\r\nimport { LoginErrorServerErrorBody } from './LoginErrorServerErrorBody';\r\nimport { LoginErrorUnauthorizedBody } from './LoginErrorUnauthorizedBody';\r\n\r\ninterface ILoginErrorDialogProps {\r\n variant: 'unauthorized' | 'serverError';\r\n email?: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nlet LoginErrorDialog: React.ComponentType = ({ email, isOpen, onClose, variant }) => {\r\n return (\r\n \r\n \r\n \r\n
\r\n {variant === 'unauthorized' && }\r\n {variant === 'serverError' && }\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nLoginErrorDialog = React.memo(LoginErrorDialog);\r\nexport { LoginErrorDialog };\r\n","import { unwrapResult } from '@reduxjs/toolkit';\r\nimport * as React from 'react';\r\nimport { Alert } from 'react-bootstrap';\r\nimport styled from 'styled-components';\r\nimport { Spinner } from '../components/Spinner';\r\nimport { loginThunk, LoginThunkRejection } from '../ducks/auth';\r\nimport { useAppDispatch, useAppSelector, useDialog } from '../hooks';\r\nimport { AuthProviders } from '../utils/auth/authInterfaces';\r\nimport { LoginButton } from './LoginButton';\r\nimport { LoginErrorDialog } from './LoginErrorDialog';\r\n\r\ninterface ILoginButtonPanelProps {}\r\n\r\nconst Container = styled.div`\r\n max-width: 420px;\r\n`;\r\n\r\nlet LoginButtonPanel: React.ComponentType = () => {\r\n const dispatch = useAppDispatch();\r\n const { isLoggingIn, loginError } = useAppSelector(state => state.auth);\r\n const [dialog, openDialog, closeDialog] = useDialog<'error', LoginThunkRejection>();\r\n\r\n const handleClick = React.useCallback(\r\n async (provider: AuthProviders): Promise => {\r\n try {\r\n unwrapResult(await dispatch(loginThunk(provider)));\r\n } catch (e) {\r\n openDialog('error');\r\n }\r\n },\r\n [dispatch, openDialog]\r\n );\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
\r\n
\r\n \"\"\r\n

Dealer Portal Login

\r\n
\r\n
\r\n {loginError && (\r\n \r\n Unable to automatically validate credentials. Please select an authentication provider below to\r\n re-authenticate.\r\n \r\n )}\r\n {!isLoggingIn && (\r\n
\r\n {/* */}\r\n \r\n {/* */}\r\n
\r\n \r\n \r\n )}\r\n {isLoggingIn && (\r\n
\r\n \r\n

Logging In

\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nLoginButtonPanel = React.memo(LoginButtonPanel);\r\nexport { LoginButtonPanel };\r\n","import * as React from 'react';\r\nimport { Alert } from 'react-bootstrap';\r\nimport style from './LogoutAlert.module.scss';\r\n\r\ninterface ILogoutAlertProps {\r\n showLogoutAlert: boolean;\r\n}\r\n\r\nlet LogoutAlert: React.ComponentType = ({ showLogoutAlert }) => {\r\n return showLogoutAlert ? (\r\n \r\n {`You have succesfully logged out of the Waterfront Brands Dealer Portal, however you may still be logged into your\r\n authentication provider. To completely log out you will need to go to `}\r\n \r\n Google\r\n \r\n , or\r\n \r\n Twitter\r\n {' '}\r\n and log out of their service.\r\n \r\n ) : null;\r\n};\r\n\r\nLogoutAlert = React.memo(LogoutAlert);\r\nexport { LogoutAlert };\r\n","import * as React from 'react';\r\nimport styled from 'styled-components';\r\nimport { ColorLine } from '../components/ColorLine';\r\nimport { CopyrightText } from '../components/CopyrightText';\r\nimport { TermsAndConditionsLink } from '../components/TermsAndConditions/TermsAndConditionsLink';\r\nimport { useAppSelector } from '../hooks';\r\nimport { LoginButtonPanel } from './LoginButtonPanel';\r\nimport { LogoutAlert } from './LogoutAlert';\r\n\r\ninterface ILoginPageProps {}\r\n\r\nconst Container = styled.div<{ showAlert: boolean }>`\r\n height: ${props => (props.showAlert ? 'calc(100vh - 74px)' : 'calc(100vh - 6px)')};\r\n overflow: hidden;\r\n`;\r\n\r\nconst FlexColumn = styled.div`\r\n align-items: center;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n justify-content: center;\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n`;\r\n\r\nlet LoginPage: React.ComponentType = () => {\r\n const showLogoutAlert = useAppSelector(state => state.auth.showLogoutAlert);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nLoginPage = React.memo(LoginPage);\r\nexport { LoginPage };\r\n","import 'bootstrap/dist/css/bootstrap.min.css';\r\nimport * as React from 'react';\r\nimport { checkAuthTokensThunk } from './ducks/auth';\r\nimport { useAppDispatch, useAppSelector } from './hooks';\r\nimport { SplashPage } from './layout/SplashPage';\r\nimport { LoginPage } from './login/LoginPage';\r\n\r\nconst MainPage = React.lazy(() => import(/* webpackChunkName: 'MainPage' */ './layout/MainPage'));\r\n\r\ninterface IRootProps {}\r\n\r\nlet Root: React.ComponentType = () => {\r\n const dispatch = useAppDispatch();\r\n const isLoggedIn = useAppSelector(state => state.auth.isLoggedIn);\r\n const { appInitialized, appInitializing } = useAppSelector(state => state.core);\r\n\r\n React.useEffect(() => {\r\n dispatch(checkAuthTokensThunk());\r\n }, [dispatch]);\r\n\r\n if (appInitializing) {\r\n return ;\r\n }\r\n\r\n return appInitialized && isLoggedIn ? (\r\n Loading}>\r\n \r\n \r\n ) : (\r\n \r\n );\r\n};\r\n\r\nRoot = React.memo(Root);\r\nexport { Root };\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\r\n);\r\n\r\ntype Config = {\r\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config): void {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker === null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' }\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType !== null && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister(): void {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import rg4js, { RaygunOptions, RaygunV2UserDetails } from 'raygun4js';\r\n\r\ntype Environment = 'test' | 'development' | 'production';\r\n\r\nexport class ErrorLoggerService {\r\n private _env: Environment;\r\n\r\n constructor(apiKey: string, environment: Environment) {\r\n const options: RaygunOptions = {\r\n excludedHostnames: ['localhost', 'dev01.shoremaster.com']\r\n };\r\n\r\n this._env = environment;\r\n rg4js('apiKey', apiKey);\r\n rg4js('options', options);\r\n rg4js('enableCrashReporting', true);\r\n //rg4js('setVersion', env.REACT_APP_VERSION);\r\n rg4js('withTags', [`env:${this._env}`]);\r\n }\r\n\r\n public setUser(email: string, name: string) {\r\n const userDetails: RaygunV2UserDetails = { email, fullName: name, identifier: email, isAnonymous: false };\r\n rg4js('setUser', userDetails);\r\n }\r\n\r\n public sendError(e: Error, data?: { tags?: string[]; customData?: Record[] }) {\r\n const errorObj: { error: Error; tags?: string[]; customData?: Record[] } = { error: e };\r\n\r\n if (data?.tags) {\r\n errorObj.tags = data.tags;\r\n }\r\n\r\n if (data?.customData) {\r\n errorObj.customData = data.customData;\r\n }\r\n\r\n rg4js('send', errorObj);\r\n }\r\n}\r\n","export class HttpError extends Error {\r\n constructor(status: number, message: string) {\r\n super(message);\r\n\r\n this.status = status;\r\n }\r\n\r\n public status: number;\r\n}\r\n\r\nexport function isHttpError(e: Error): e is HttpError {\r\n return (e as HttpError).status !== undefined;\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\nimport { HttpError, isHttpError } from './customErrors/HttpError';\r\n\r\nexport interface IApiExceptionResponse {\r\n exceptionMessage: string;\r\n exceptionType: string;\r\n message: string;\r\n stackTrace: string;\r\n}\r\n\r\nexport interface IHttpRequest {\r\n type: 'post' | 'get' | 'put' | 'delete';\r\n url: string;\r\n}\r\n\r\nexport class HttpService {\r\n constructor({\r\n baseUrl,\r\n accessTokenFunc,\r\n errorLogFunc,\r\n logoutFunc\r\n }: {\r\n baseUrl: string;\r\n accessTokenFunc: () => Promise;\r\n errorLogFunc: (error: Error, data?: { tags?: string[]; customData?: Record[] }) => void;\r\n logoutFunc: () => void;\r\n }) {\r\n this.url = baseUrl;\r\n this.errorLogFunc = errorLogFunc;\r\n this.fetchAccessTokenFunc = accessTokenFunc;\r\n this.logoutFunc = logoutFunc;\r\n }\r\n\r\n public readonly url: string;\r\n private readonly fetchAccessTokenFunc: () => Promise;\r\n private readonly logoutFunc: () => void;\r\n private readonly errorLogFunc: (\r\n error: Error,\r\n data?: { tags?: string[]; customData?: Record[] }\r\n ) => void;\r\n // private pendingRequests: IHttpRequest[] = [];\r\n // private retryCount: number = 0;\r\n\r\n public createQueryString(key: string, values: Array, includePrefix: boolean = true): string {\r\n if (values.length > 0) {\r\n return `${includePrefix ? '&' : ''}${values.map(x => `${key}=${x}`).join('&')}`;\r\n }\r\n return '';\r\n }\r\n\r\n public async downloadFile(fileUrl: string, fileName: string = 'test'): Promise {\r\n const settings: RequestInit = {\r\n method: 'get'\r\n };\r\n\r\n const response = await this.executeRequest(fileUrl, settings);\r\n\r\n const blob = await response.blob();\r\n\r\n const objectUrl = window.URL.createObjectURL(blob);\r\n const anchor = document.createElement('a');\r\n anchor.href = objectUrl;\r\n anchor.download = fileName;\r\n anchor.click();\r\n window.URL.revokeObjectURL(objectUrl);\r\n }\r\n\r\n public async get(url: string): Promise {\r\n const settings: RequestInit = {\r\n method: 'get'\r\n };\r\n\r\n return this.executeRequest(url, settings);\r\n }\r\n\r\n public async post(url: string, payload: string | object | number = ''): Promise {\r\n if (typeof payload !== 'string') {\r\n payload = JSON.stringify(payload);\r\n }\r\n\r\n const headers: Headers = new Headers();\r\n headers.append('Content-Type', 'Application/json');\r\n\r\n const settings: RequestInit = {\r\n body: payload,\r\n headers,\r\n method: 'post'\r\n };\r\n\r\n return this.executeRequest(url, settings);\r\n }\r\n\r\n public async postFormData(url: string, payload: FormData): Promise {\r\n const settings: RequestInit = {\r\n body: payload,\r\n method: 'post'\r\n };\r\n\r\n return this.executeRequest(url, settings);\r\n }\r\n\r\n public async put(url: string, payload: unknown): Promise {\r\n const stringedPayload = JSON.stringify(payload);\r\n\r\n const headers: Headers = new Headers();\r\n headers.append('Content-Type', 'Application/json');\r\n\r\n const settings: RequestInit = {\r\n body: stringedPayload,\r\n headers,\r\n method: 'put'\r\n };\r\n\r\n return this.executeRequest(url, settings);\r\n }\r\n\r\n public async delete(url: string, payload: string | object = ''): Promise {\r\n if (payload !== '') {\r\n payload = JSON.stringify(payload);\r\n }\r\n\r\n const headers: Headers = new Headers();\r\n headers.append('Content-Type', 'Application/json');\r\n\r\n const settings: RequestInit = {\r\n body: payload,\r\n headers,\r\n method: 'delete'\r\n };\r\n\r\n return this.executeRequest(url, settings);\r\n }\r\n\r\n private async executeRequest(url: string, settings: RequestInit): Promise {\r\n //const accessToken = sessionStorage.getItem(LocalStorgeVars.ACCESS_TOKEN_KEY);\r\n const accessToken = await this.fetchAccessTokenFunc();\r\n if (!accessToken) {\r\n this.logoutFunc();\r\n\r\n throw new Error('Unable to fetch new access token, logging user out');\r\n }\r\n\r\n const fullUrl = `${this.url}${url}`;\r\n\r\n if (!settings.headers) {\r\n settings.headers = new Headers();\r\n }\r\n\r\n (settings.headers as Headers).append('Authorization', `Bearer ${accessToken}`);\r\n\r\n const response = await fetch(fullUrl, settings);\r\n\r\n if (response.ok) {\r\n return response;\r\n }\r\n\r\n try {\r\n throw await this.createHttpError(response);\r\n } catch (e) {\r\n let sendError = true;\r\n const customData: Record[] = [{ apiEndpoint: url }];\r\n\r\n if (e instanceof Error) {\r\n if (isHttpError(e)) {\r\n customData.push({ httpStatus: e.status });\r\n if (e.status === 401) {\r\n sendError = false;\r\n this.logoutFunc();\r\n }\r\n }\r\n if (sendError) {\r\n this.errorLogFunc(e, { customData, tags: ['apiException'] });\r\n }\r\n }\r\n // if the status code if 401 unauthorized log them out\r\n throw e;\r\n }\r\n }\r\n\r\n private async createHttpError(response: Response): Promise {\r\n let message = 'Unknown error';\r\n\r\n try {\r\n const exception = (await response.json()) as IApiExceptionResponse;\r\n\r\n if (exception.exceptionMessage) {\r\n message = exception.exceptionMessage;\r\n } else if (exception.message) {\r\n message = exception.message;\r\n }\r\n } catch (e) {\r\n // grab any errors with desierializing JSON, we don't need to do anything with them\r\n }\r\n\r\n return new HttpError(response.status, message);\r\n }\r\n}\r\n","import { configureStore, DeepPartial } from '@reduxjs/toolkit';\r\nimport { rootReducer, RootState } from './ducks';\r\n\r\nexport const configRedux = (preloadedState?: DeepPartial) => {\r\n return configureStore({\r\n devTools: {\r\n shouldHotReload: true\r\n },\r\n preloadedState,\r\n reducer: rootReducer\r\n });\r\n};\r\n","import { unwrapResult } from '@reduxjs/toolkit';\r\nimport React from 'react';\r\nimport 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport ReactDOM from 'react-dom';\r\nimport { Helmet } from 'react-helmet';\r\nimport { Provider } from 'react-redux';\r\nimport { Slide, ToastContainer } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport { ThemeProvider } from 'styled-components';\r\nimport { configRedux } from './configRedux';\r\nimport { fetchCurrentAccessTokenThunk, logoutThunk } from './ducks/auth';\r\nimport { Root } from './Root';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport './styles/baseStyle.css';\r\nimport './styles/style.css';\r\nimport { styledComponentsTheme } from './styles/styledComponentsTheme';\r\nimport './styles/wfbStyles.scss';\r\nimport { AuthService } from './utils/auth/AuthService';\r\nimport { ErrorLoggerService } from './utils/ErrorLoggerService';\r\nimport { HttpService } from './utils/HttpService';\r\n\r\nexport const store = configRedux();\r\nexport const errorLogger = new ErrorLoggerService('BJhhUr/m4x0RnayywgD+JQ==', process.env.NODE_ENV);\r\n\r\nexport const httpService = new HttpService({\r\n accessTokenFunc: async (): Promise => {\r\n const currentTokens = AuthService.getAuthTokens();\r\n\r\n if (\r\n currentTokens?.accessToken &&\r\n currentTokens?.decodedToken &&\r\n !AuthService.isAccessTokenExpired(currentTokens.decodedToken)\r\n ) {\r\n return currentTokens.accessToken;\r\n } else {\r\n const result = unwrapResult(await store.dispatch(fetchCurrentAccessTokenThunk()));\r\n return result?.accessToken ?? '';\r\n }\r\n },\r\n baseUrl: `${process.env.REACT_APP_SERVICE_URL}api`,\r\n errorLogFunc: errorLogger.sendError,\r\n logoutFunc: () => store.dispatch(logoutThunk())\r\n});\r\n\r\nconst defaultTitle = 'Waterfront Brands, LLC Dealer Portal';\r\nconst titleTemplate = `%s | ${defaultTitle}`;\r\n\r\nReactDOM.render(\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n","import 'styled-components';\r\n\r\nexport const styledComponentsTheme = {\r\n breakpoints: {\r\n mobile: 768\r\n },\r\n pallette: {\r\n brandColors: {\r\n hydrohoist: '#003263',\r\n llc: '#00305B',\r\n poly: '#3a4258',\r\n rhino: '#becd46',\r\n shoreline: '#cf1f2c',\r\n shoremaster: '#0054a6'\r\n },\r\n common: {\r\n danger: '#e74c3c',\r\n info: '#213f9a',\r\n success: '#62cb31',\r\n warning: '#ffb606',\r\n white: 'white'\r\n }\r\n }\r\n} as const;\r\n\r\ntype Theme = typeof styledComponentsTheme;\r\ndeclare module 'styled-components' {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface DefaultTheme extends Theme {}\r\n}\r\n"],"sourceRoot":""}