@faststore/core 3.98.0-dev.7 → 3.98.0-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +124 -123
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.js +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +158 -165
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/{5796.js → 1027.js} +1 -1
- package/.next/server/chunks/1197.js +1 -0
- package/.next/server/chunks/{3483.js → 1313.js} +1 -1
- package/.next/server/chunks/1419.js +1 -0
- package/.next/server/chunks/1576.js +1 -0
- package/.next/server/chunks/{7275.js → 1588.js} +1 -1
- package/.next/server/chunks/1741.js +3 -0
- package/.next/server/chunks/221.js +1 -0
- package/.next/server/chunks/2259.js +9 -0
- package/.next/server/chunks/2513.js +1 -0
- package/.next/server/chunks/2955.js +1 -0
- package/.next/server/chunks/{4803.js → 3114.js} +1 -1
- package/.next/server/chunks/3327.js +1 -0
- package/.next/server/chunks/3488.js +1 -0
- package/.next/server/chunks/{1917.js → 3513.js} +1 -1
- package/.next/server/chunks/3683.js +1 -0
- package/.next/server/chunks/{8563.js → 3724.js} +1 -1
- package/.next/server/chunks/3977.js +1 -0
- package/.next/server/chunks/426.js +1 -0
- package/.next/server/chunks/4573.js +1 -0
- package/.next/server/chunks/4681.js +1 -0
- package/.next/server/chunks/5133.js +3 -0
- package/.next/server/chunks/5212.js +7 -0
- package/.next/server/chunks/5608.js +1 -0
- package/.next/server/chunks/5628.js +12 -0
- package/.next/server/chunks/{1607.js → 5764.js} +1 -1
- package/.next/server/chunks/{9740.js → 6259.js} +1 -1
- package/.next/server/chunks/6698.js +1 -1
- package/.next/server/chunks/689.js +1 -0
- package/.next/server/chunks/6952.js +1 -0
- package/.next/server/chunks/7121.js +1 -0
- package/.next/server/chunks/7417.js +1 -0
- package/.next/server/chunks/{1280.js → 7722.js} +1 -1
- package/.next/server/chunks/7796.js +1 -0
- package/.next/server/chunks/7956.js +1 -0
- package/.next/server/chunks/{6804.js → 7976.js} +3 -3
- package/.next/server/chunks/{9985.js → 8146.js} +1 -1
- package/.next/server/chunks/8290.js +1 -0
- package/.next/server/chunks/8376.js +13 -0
- package/.next/server/chunks/8466.js +6 -0
- package/.next/server/chunks/8569.js +1 -1
- package/.next/server/chunks/8659.js +1 -0
- package/.next/server/chunks/8741.js +1 -0
- package/.next/server/chunks/8971.js +493 -0
- package/.next/server/chunks/9088.js +1 -1
- package/.next/server/chunks/9237.js +1 -1
- package/.next/server/chunks/9374.js +13 -0
- package/.next/server/chunks/{8068.js → 9425.js} +1 -1
- package/.next/server/chunks/{UINavbarSlider.js → 9984.js} +1 -1
- package/.next/server/chunks/9986.js +1 -0
- package/.next/server/chunks/ButtonSignIn.js +1 -1
- package/.next/server/chunks/FilterSkeleton.js +1 -1
- package/.next/server/chunks/ScrollToTopButton.js +1 -1
- package/.next/server/chunks/UIBannerText.js +1 -1
- package/.next/server/chunks/UISKUMatrixSidebar.js +1 -1
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.js +1 -1
- package/.next/server/pages/404.js.nft.json +1 -1
- package/.next/server/pages/500.js +1 -1
- package/.next/server/pages/500.js.nft.json +1 -1
- package/.next/server/pages/[...slug].js +1 -1
- package/.next/server/pages/[...slug].js.nft.json +1 -1
- package/.next/server/pages/[slug]/p.js +1 -1
- package/.next/server/pages/[slug]/p.js.nft.json +1 -1
- package/.next/server/pages/_app.js +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +1 -1
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/pages/api/fs/logout.js +1 -1
- package/.next/server/pages/api/fs/logout.js.nft.json +1 -1
- package/.next/server/pages/api/graphql.js +2 -2
- package/.next/server/pages/api/graphql.js.nft.json +1 -1
- package/.next/server/pages/api/health/live.js +1 -1
- package/.next/server/pages/api/health/live.js.nft.json +1 -1
- package/.next/server/pages/api/health/ready.js +1 -1
- package/.next/server/pages/api/health/ready.js.nft.json +1 -1
- package/.next/server/pages/api/preview.js +1 -1
- package/.next/server/pages/api/preview.js.nft.json +1 -1
- package/.next/server/pages/checkout.js +1 -1
- package/.next/server/pages/checkout.js.nft.json +1 -1
- package/.next/server/pages/en-US/404.html +2 -2
- package/.next/server/pages/en-US/500.html +2 -2
- package/.next/server/pages/en-US/checkout.html +2 -2
- package/.next/server/pages/en-US/login.html +2 -2
- package/.next/server/pages/en-US/s.html +2 -2
- package/.next/server/pages/en-US.html +2 -2
- package/.next/server/pages/index.js +1 -1
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/login.js +1 -1
- package/.next/server/pages/login.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/403.js +1 -1
- package/.next/server/pages/pvt/account/403.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/404.js +1 -1
- package/.next/server/pages/pvt/account/404.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/[...unknown].js +1 -1
- package/.next/server/pages/pvt/account/[...unknown].js.nft.json +1 -1
- package/.next/server/pages/pvt/account/orders/[id].js +1 -1
- package/.next/server/pages/pvt/account/orders/[id].js.nft.json +1 -1
- package/.next/server/pages/pvt/account/orders.js +1 -1
- package/.next/server/pages/pvt/account/orders.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/profile.js +1 -1
- package/.next/server/pages/pvt/account/profile.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/security.js +1 -1
- package/.next/server/pages/pvt/account/security.js.nft.json +1 -1
- package/.next/server/pages/pvt/account/user-details.js +1 -1
- package/.next/server/pages/pvt/account/user-details.js.nft.json +1 -1
- package/.next/server/pages/pvt/account.js +1 -1
- package/.next/server/pages/pvt/account.js.nft.json +1 -1
- package/.next/server/pages/s.js +1 -1
- package/.next/server/pages/s.js.nft.json +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/chunks/{5796.4351370494d8b8b6.js → 1027.f17a7c96c17ce487.js} +1 -1
- package/.next/static/chunks/1313.bba028de90630608.js +1 -0
- package/.next/static/chunks/1756.89b7f413bb26ba74.js +1 -0
- package/.next/static/chunks/{8325.dabe9aa22eaadeed.js → 1911.fb72de1df3c3715c.js} +1 -1
- package/.next/static/chunks/2221-f8edfdaa4839bdf0.js +2 -0
- package/.next/static/chunks/2564.273fd8b0db75b1c4.js +1 -0
- package/.next/static/chunks/2811.cf089090a8b79215.js +1 -0
- package/.next/static/chunks/346.2840f007e6d1054c.js +1 -0
- package/.next/static/chunks/3496.bcb4d219501a8b6b.js +1 -0
- package/.next/static/chunks/3753-74460a0793c0a75c.js +8 -0
- package/.next/static/chunks/3802.1e0df8a20802da16.js +1 -0
- package/.next/static/chunks/3883-ebdbb60b50a90c59.js +28 -0
- package/.next/static/chunks/4436.9b2b6e1c3f79424d.js +1 -0
- package/.next/static/chunks/4681.318feb830c746e3b.js +1 -0
- package/.next/static/chunks/484.9fdcaa9ffd8dac08.js +1 -0
- package/.next/static/chunks/6218.e8ba8bf8602ec880.js +1 -0
- package/.next/static/chunks/{6393.fc3a7002110b07a9.js → 6393.f5f13a004beeef40.js} +1 -1
- package/.next/static/chunks/6656-efc464f20ffeaa51.js +1 -0
- package/.next/static/chunks/6797-ff5656c8624c4265.js +1 -0
- package/.next/static/chunks/6943.6bc97e925b54493d.js +1 -0
- package/.next/static/chunks/7417.55a6e20779dd3702.js +1 -0
- package/.next/static/chunks/7534.ee76e63d58ddd222.js +1 -0
- package/.next/static/chunks/7796.a30626656a270831.js +1 -0
- package/.next/static/chunks/9105.354374e349da85cb.js +1 -0
- package/.next/static/chunks/9222.04daf7868c957e52.js +1 -0
- package/.next/static/chunks/{9237.7555603703f81bf7.js → 9237.2d7e1a4978875414.js} +1 -1
- package/.next/static/chunks/9399.199f217093e4af1e.js +1 -0
- package/.next/static/chunks/{8068.43663fb64762f7b8.js → 9425.9d8b3da847111f21.js} +1 -1
- package/.next/static/chunks/9701.f9a0bfffba8807dc.js +1 -0
- package/.next/static/chunks/BannerNewsletter.b5770016d20acfd2.js +1 -0
- package/.next/static/chunks/{BannerText.4061ccfc191e6b96.js → BannerText.5ba50fbe683158ec.js} +1 -1
- package/.next/static/chunks/{ButtonSignIn.f6e210eaca873e48.js → ButtonSignIn.639d8dfc65ded368.js} +1 -1
- package/.next/static/chunks/CartItem.3c2ceb3a4ee542bc.js +1 -0
- package/.next/static/chunks/CartSidebar.89b0dd6237c025ec.js +1 -0
- package/.next/static/chunks/{EmptyCart.320e2f94a0d5e6b1.js → EmptyCart.aa60d42ae8eb5264.js} +1 -1
- package/.next/static/chunks/{FilterSkeleton.7ab99e28f92341c9.js → FilterSkeleton.8f1b651c40e06f0b.js} +1 -1
- package/.next/static/chunks/Footer.cd83c4dc0252494a.js +1 -0
- package/.next/static/chunks/Gift.4c97f836f82d5ebe.js +1 -0
- package/.next/static/chunks/Newsletter.bdec43379ca9191a.js +1 -0
- package/.next/static/chunks/OrderSummary.994b7314f2d004af.js +1 -0
- package/.next/static/chunks/PreviewTag.696854f6690e1b9e.js +1 -0
- package/.next/static/chunks/ProductShelf.fe1f19bc68859695.js +1 -0
- package/.next/static/chunks/ProductTiles.2c63ae178a75d5b6.js +1 -0
- package/.next/static/chunks/{RegionModal.a7be32d2d7832ba4.js → RegionModal.fbbdd54ee2422522.js} +1 -1
- package/.next/static/chunks/RegionSlider.49e558b340a5506a.js +1 -0
- package/.next/static/chunks/{ScrollToTopButton.c15431f2e8bb93ef.js → ScrollToTopButton.55e3a1233d04b8eb.js} +1 -1
- package/.next/static/chunks/ShoppingAssistant.8772fe90bd678202.js +1 -0
- package/.next/static/chunks/Toast.f083d9966a9a181e.js +1 -0
- package/.next/static/chunks/UISKUMatrixSidebar.01f8f5222dcdf80f.js +1 -0
- package/.next/static/chunks/main-edeb2c6a5c48bb3f.js +1 -0
- package/.next/static/chunks/pages/404-1e8f91fa1bca3ab8.js +1 -0
- package/.next/static/chunks/pages/500-f21feacbb9810e94.js +1 -0
- package/.next/static/chunks/pages/[...slug]-400781188d59cfd6.js +1 -0
- package/.next/static/chunks/pages/[slug]/p-f324b592d1c566b9.js +1 -0
- package/.next/static/chunks/pages/_app-735c745509e1e8d6.js +1 -0
- package/.next/static/chunks/pages/{_error-2b0148be56a716e9.js → _error-464097ff69347627.js} +1 -1
- package/.next/static/chunks/pages/checkout-6076b4baf0ca1aa6.js +1 -0
- package/.next/static/chunks/pages/index-3266ece2e885bb3a.js +1 -0
- package/.next/static/chunks/pages/login-add3b376f68ce39a.js +1 -0
- package/.next/static/chunks/pages/pvt/account/403-d44b70591d2c86dc.js +1 -0
- package/.next/static/chunks/pages/pvt/account/404-646fb609f579101e.js +1 -0
- package/.next/static/chunks/pages/pvt/account/[...unknown]-3fb3963ca3d77c0b.js +1 -0
- package/.next/static/chunks/pages/pvt/account/orders/[id]-cda2266c9693d552.js +1 -0
- package/.next/static/chunks/pages/pvt/account/orders-ec545a2679db206e.js +1 -0
- package/.next/static/chunks/pages/pvt/account/profile-27164b37098c553f.js +1 -0
- package/.next/static/chunks/pages/pvt/account/security-4bd3e75771a120ec.js +1 -0
- package/.next/static/chunks/pages/pvt/account/user-details-a48a44dfdc07c1e9.js +1 -0
- package/.next/static/chunks/pages/pvt/account-5a6dcae3b380b672.js +1 -0
- package/.next/static/chunks/pages/s-0fe527a651dd5989.js +1 -0
- package/.next/static/chunks/webpack-05d1941e155b909e.js +1 -0
- package/.next/static/css/0c6f09f86cf5e919.css +1 -0
- package/.next/static/css/{b684b347c5cc6514.css → 1154064b68a7f35e.css} +1 -1
- package/.next/static/css/1b7e34d448a42825.css +1 -0
- package/.next/static/css/4e57bdfb48115ce3.css +1 -0
- package/.next/static/css/501e6ed2c71b1fe4.css +1 -0
- package/.next/static/css/{837662922091162f.css → 52ab64b6a2b14e3e.css} +1 -1
- package/.next/static/css/5f2c773b21b68cba.css +1 -0
- package/.next/static/css/8a513f4b536b0ab0.css +1 -0
- package/.next/static/css/9b4c21dcd3bc4a17.css +1 -0
- package/.next/static/css/c9e0745e893e09e1.css +1 -0
- package/.next/static/css/cc2ab6a8cbda0780.css +1 -0
- package/.next/static/css/e68c313e4ce2fd1b.css +1 -0
- package/.next/static/css/{08d03445f1797608.css → e857065b4012f946.css} +1 -1
- package/.next/static/css/ee1b84a920113838.css +1 -0
- package/.next/static/z8AHWODjJNpdcwMdEzCeK/_buildManifest.js +1 -0
- package/.next/trace +142 -141
- package/.turbo/turbo-build.log +45 -65
- package/.turbo/turbo-test.log +6 -6
- package/@generated/gql.ts +10 -10
- package/@generated/graphql.ts +68 -58
- package/@generated/persisted-documents.json +2 -2
- package/CHANGELOG.md +14 -4
- package/cms/faststore/sections.json +471 -0
- package/cypress/tsconfig.json +7 -0
- package/jest.config.js +3 -0
- package/package.json +3 -3
- package/public/icons.svg +62 -0
- package/src/components/search/SearchInput/SearchInput.tsx +490 -5
- package/src/components/sections/Navbar/Navbar.tsx +67 -0
- package/src/components/sections/Navbar/section.module.scss +3 -0
- package/src/components/sections/ProductDetails/ProductDetails.tsx +1 -0
- package/src/sdk/product/convertProductToQuickOrder.ts +85 -0
- package/src/sdk/product/useBulkProductsQuery.ts +128 -0
- package/src/styles/global/index.scss +2 -1
- package/src/utils/utilities.ts +62 -0
- package/test/tsconfig.json +7 -0
- package/.next/server/chunks/1554.js +0 -1
- package/.next/server/chunks/1780.js +0 -1
- package/.next/server/chunks/2249.js +0 -1
- package/.next/server/chunks/2336.js +0 -6
- package/.next/server/chunks/2430.js +0 -1
- package/.next/server/chunks/2445.js +0 -12
- package/.next/server/chunks/2570.js +0 -1
- package/.next/server/chunks/294.js +0 -1
- package/.next/server/chunks/3029.js +0 -1
- package/.next/server/chunks/3836.js +0 -1
- package/.next/server/chunks/3890.js +0 -492
- package/.next/server/chunks/3945.js +0 -1
- package/.next/server/chunks/3951.js +0 -7
- package/.next/server/chunks/4194.js +0 -1
- package/.next/server/chunks/4365.js +0 -1
- package/.next/server/chunks/4913.js +0 -13
- package/.next/server/chunks/5683.js +0 -1
- package/.next/server/chunks/5723.js +0 -13
- package/.next/server/chunks/6789.js +0 -1
- package/.next/server/chunks/6886.js +0 -1
- package/.next/server/chunks/7098.js +0 -9
- package/.next/server/chunks/7692.js +0 -1
- package/.next/server/chunks/7799.js +0 -1
- package/.next/server/chunks/83.js +0 -1
- package/.next/server/chunks/8307.js +0 -1
- package/.next/server/chunks/8482.js +0 -1
- package/.next/server/chunks/8598.js +0 -1
- package/.next/server/chunks/8687.js +0 -1
- package/.next/server/chunks/870.js +0 -1
- package/.next/server/chunks/9117.js +0 -1
- package/.next/server/chunks/948.js +0 -2
- package/.next/server/chunks/9563.js +0 -3
- package/.next/server/chunks/9853.js +0 -1
- package/.next/server/chunks/9990.js +0 -1
- package/.next/static/3YyETsM_ICzJh8iCbl24o/_buildManifest.js +0 -1
- package/.next/static/chunks/1208-9118a8f14ecf05c8.js +0 -8
- package/.next/static/chunks/1841.b3a98a2a1886b09c.js +0 -1
- package/.next/static/chunks/2284.922fe939dafb3b2d.js +0 -1
- package/.next/static/chunks/2500.d6beb5af6ee00a9e.js +0 -1
- package/.next/static/chunks/2851.e68ed3c8d27a032a.js +0 -1
- package/.next/static/chunks/3155.7bc4c730a79d9ecb.js +0 -1
- package/.next/static/chunks/3399.72d28af405858825.js +0 -1
- package/.next/static/chunks/3483.ef53d632a763da3f.js +0 -1
- package/.next/static/chunks/349.235b18ceb82aa256.js +0 -1
- package/.next/static/chunks/3836.612763339fc4c64c.js +0 -1
- package/.next/static/chunks/4803.9822f0b7e469b933.js +0 -1
- package/.next/static/chunks/5859.3bc094416cffd966.js +0 -1
- package/.next/static/chunks/6031-b0b111f48a7d504d.js +0 -28
- package/.next/static/chunks/6700.a72869377e81146c.js +0 -1
- package/.next/static/chunks/6789.960162355435a81d.js +0 -1
- package/.next/static/chunks/7191-91a7e2902cbb78eb.js +0 -1
- package/.next/static/chunks/7522-9010743f5d7e8aca.js +0 -1
- package/.next/static/chunks/7692.8d5bf4560341a2f6.js +0 -1
- package/.next/static/chunks/83.98ce246c274ee7e4.js +0 -1
- package/.next/static/chunks/9173-004874438ae65e64.js +0 -1
- package/.next/static/chunks/9399.eb5fc80e2649be72.js +0 -1
- package/.next/static/chunks/941.3e2782ab9c490eb0.js +0 -1
- package/.next/static/chunks/9465.a1858c778b1083b9.js +0 -1
- package/.next/static/chunks/9701.b0e8741551995fbb.js +0 -1
- package/.next/static/chunks/9909.787576b171184aa5.js +0 -1
- package/.next/static/chunks/BannerNewsletter.90d4a98c15a35cea.js +0 -1
- package/.next/static/chunks/CartItem.092df07db9e8b271.js +0 -1
- package/.next/static/chunks/CartSidebar.f0c16e2bc6f96e9e.js +0 -1
- package/.next/static/chunks/Footer.63a7682a81a96f8e.js +0 -1
- package/.next/static/chunks/Gift.08db4da8c89cacf1.js +0 -1
- package/.next/static/chunks/Newsletter.dbf35a8ea6d2067e.js +0 -1
- package/.next/static/chunks/OrderSummary.f9adad5622605046.js +0 -1
- package/.next/static/chunks/PreviewTag.f4f0c8710a7bcad9.js +0 -1
- package/.next/static/chunks/ProductShelf.7ebce1c763b4508e.js +0 -1
- package/.next/static/chunks/ProductTiles.18f55314e61957f4.js +0 -1
- package/.next/static/chunks/RegionSlider.b4dd4e7c0483966d.js +0 -1
- package/.next/static/chunks/ShoppingAssistant.ba191eb4dbed67e5.js +0 -1
- package/.next/static/chunks/Toast.2e9b26159af29889.js +0 -1
- package/.next/static/chunks/UISKUMatrixSidebar.87ba393b7d738e99.js +0 -1
- package/.next/static/chunks/main-ec03882c4375091d.js +0 -1
- package/.next/static/chunks/pages/404-4b3f1e22c77f849a.js +0 -1
- package/.next/static/chunks/pages/500-bb2de0c11524b2b8.js +0 -1
- package/.next/static/chunks/pages/[...slug]-52db16871a86e9bd.js +0 -1
- package/.next/static/chunks/pages/[slug]/p-15e4c70dcf969e68.js +0 -1
- package/.next/static/chunks/pages/_app-9709623009fd94a5.js +0 -1
- package/.next/static/chunks/pages/checkout-dc07d72b3514c83d.js +0 -1
- package/.next/static/chunks/pages/index-1f8bf0fb351b90f4.js +0 -1
- package/.next/static/chunks/pages/login-e97ef92769456bf6.js +0 -1
- package/.next/static/chunks/pages/pvt/account/403-91597100f8956385.js +0 -1
- package/.next/static/chunks/pages/pvt/account/404-c68124bed7cb7c48.js +0 -1
- package/.next/static/chunks/pages/pvt/account/[...unknown]-f80f645594d2740c.js +0 -1
- package/.next/static/chunks/pages/pvt/account/orders/[id]-46c461739ff3b436.js +0 -1
- package/.next/static/chunks/pages/pvt/account/orders-12a215899ae6f3eb.js +0 -1
- package/.next/static/chunks/pages/pvt/account/profile-b6cdbf02d4682544.js +0 -1
- package/.next/static/chunks/pages/pvt/account/security-e6289a40e745d3c4.js +0 -1
- package/.next/static/chunks/pages/pvt/account/user-details-fba1822e52e7de26.js +0 -1
- package/.next/static/chunks/pages/pvt/account-65fefcc699344bdb.js +0 -1
- package/.next/static/chunks/pages/s-41cffb20de1d2617.js +0 -1
- package/.next/static/chunks/webpack-c56d30359092c45c.js +0 -1
- package/.next/static/css/05c399956ff24b77.css +0 -1
- package/.next/static/css/0f070d03aacd9cc5.css +0 -1
- package/.next/static/css/0fae3d432331aae9.css +0 -1
- package/.next/static/css/0fc6b2ff69142c6a.css +0 -1
- package/.next/static/css/31380ebc6e671486.css +0 -1
- package/.next/static/css/40a294d0a24ad01d.css +0 -1
- package/.next/static/css/47f1b4e8de15d314.css +0 -1
- package/.next/static/css/973dd40d4773e8cd.css +0 -1
- package/.next/static/css/9d403a1bee48c9fc.css +0 -1
- package/.next/static/css/a6a4ebbe01adbbad.css +0 -1
- /package/.next/static/{3YyETsM_ICzJh8iCbl24o → z8AHWODjJNpdcwMdEzCeK}/_ssgManifest.js +0 -0
|
@@ -3,8 +3,11 @@ import {
|
|
|
3
3
|
Suspense,
|
|
4
4
|
forwardRef,
|
|
5
5
|
lazy,
|
|
6
|
+
useCallback,
|
|
6
7
|
useDeferredValue,
|
|
8
|
+
useEffect,
|
|
7
9
|
useImperativeHandle,
|
|
10
|
+
useMemo,
|
|
8
11
|
useRef,
|
|
9
12
|
useState,
|
|
10
13
|
} from 'react'
|
|
@@ -15,15 +18,25 @@ import { useRouter } from 'next/router'
|
|
|
15
18
|
import type { SearchEvent, SearchState } from '@faststore/sdk'
|
|
16
19
|
|
|
17
20
|
import {
|
|
21
|
+
FileUploadCard,
|
|
22
|
+
FileUploadErrorType,
|
|
23
|
+
QuickOrderDrawer,
|
|
24
|
+
QuickOrderDrawerFooter,
|
|
25
|
+
QuickOrderDrawerHeader,
|
|
26
|
+
QuickOrderDrawerProducts,
|
|
18
27
|
Icon as UIIcon,
|
|
19
28
|
IconButton as UIIconButton,
|
|
20
29
|
SearchInput as UISearchInput,
|
|
30
|
+
useCSVParser,
|
|
21
31
|
useOnClickOutside,
|
|
32
|
+
useUI,
|
|
22
33
|
} from '@faststore/ui'
|
|
23
34
|
|
|
24
35
|
import type {
|
|
25
36
|
SearchInputFieldProps as UISearchInputFieldProps,
|
|
26
37
|
SearchInputFieldRef as UISearchInputFieldRef,
|
|
38
|
+
CSVData,
|
|
39
|
+
Product,
|
|
27
40
|
} from '@faststore/ui'
|
|
28
41
|
|
|
29
42
|
import type { SearchProviderContextValue } from '@faststore/ui'
|
|
@@ -32,7 +45,12 @@ import type { NavbarProps } from 'src/components/sections/Navbar'
|
|
|
32
45
|
import useSearchHistory from 'src/sdk/search/useSearchHistory'
|
|
33
46
|
import useSuggestions from 'src/sdk/search/useSuggestions'
|
|
34
47
|
|
|
48
|
+
import { cartStore } from 'src/sdk/cart'
|
|
49
|
+
import { convertProductToQuickOrder } from 'src/sdk/product/convertProductToQuickOrder'
|
|
50
|
+
import { useBulkProductsQuery } from 'src/sdk/product/useBulkProductsQuery'
|
|
51
|
+
import { usePriceFormatter } from 'src/sdk/product/useFormattedPrice'
|
|
35
52
|
import { formatSearchPath } from 'src/sdk/search/formatSearchPath'
|
|
53
|
+
import { formatFileName, formatFileSize } from 'src/utils/utilities'
|
|
36
54
|
|
|
37
55
|
const SearchDropdown = lazy(
|
|
38
56
|
/* webpackChunkName: "SearchDropdown" */
|
|
@@ -43,7 +61,6 @@ const UISearchInputField = dynamic<UISearchInputFieldProps & any>(() =>
|
|
|
43
61
|
/* webpackChunkName: "UISearchInputField" */
|
|
44
62
|
import('@faststore/ui').then((module) => module.SearchInputField)
|
|
45
63
|
)
|
|
46
|
-
|
|
47
64
|
const MAX_SUGGESTIONS = 5
|
|
48
65
|
|
|
49
66
|
export type SearchInputProps = {
|
|
@@ -53,7 +70,12 @@ export type SearchInputProps = {
|
|
|
53
70
|
placeholder?: string
|
|
54
71
|
quickOrderSettings?: NavbarProps['searchInput']['quickOrderSettings']
|
|
55
72
|
sort?: string
|
|
56
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Called when the user clicks Search in the file upload card, with the parsed CSV data.
|
|
75
|
+
* Use this to run bulk search, add to cart, or analytics.
|
|
76
|
+
*/
|
|
77
|
+
onFileSearch?: (data: CSVData) => void
|
|
78
|
+
} & Omit<UISearchInputFieldProps, 'onSubmit' | 'attachmentButtonIcon'>
|
|
57
79
|
|
|
58
80
|
export type SearchInputRef = UISearchInputFieldRef & {
|
|
59
81
|
resetSearchInput: () => void
|
|
@@ -77,6 +99,7 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
77
99
|
sort,
|
|
78
100
|
placeholder,
|
|
79
101
|
quickOrderSettings,
|
|
102
|
+
onFileSearch,
|
|
80
103
|
...otherProps
|
|
81
104
|
},
|
|
82
105
|
ref
|
|
@@ -90,15 +113,62 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
90
113
|
const searchQueryDeferred = useDeferredValue(searchQuery)
|
|
91
114
|
const [searchDropdownVisible, setSearchDropdownVisible] =
|
|
92
115
|
useState<boolean>(false)
|
|
116
|
+
const [fileUploadVisible, setFileUploadVisible] = useState<boolean>(false)
|
|
117
|
+
const [isUploadOpen, setIsUploadOpen] = useState(false)
|
|
118
|
+
const [hasFile, setHasFile] = useState(false)
|
|
119
|
+
const [isQuickOrderDrawerOpen, setIsQuickOrderDrawerOpen] = useState(false)
|
|
120
|
+
const [quickOrderProducts, setQuickOrderProducts] = useState<Product[]>([])
|
|
121
|
+
const [noProductsError, setNoProductsError] = useState<boolean>(false)
|
|
93
122
|
|
|
94
123
|
const searchRef = useRef<HTMLDivElement>(null)
|
|
95
124
|
const { addToSearchHistory } = useSearchHistory()
|
|
96
125
|
const router = useRouter()
|
|
126
|
+
const priceFormatter = usePriceFormatter()
|
|
127
|
+
const { pushToast } = useUI()
|
|
128
|
+
|
|
129
|
+
const [csvData, setCsvData] = useState<CSVData | null>(null)
|
|
130
|
+
const [selectedFile, setSelectedFile] = useState<File | null>(null)
|
|
131
|
+
const [skusToFetch, setSkusToFetch] = useState<string[]>([])
|
|
132
|
+
const [skuQuantityMap, setSkuQuantityMap] = useState<
|
|
133
|
+
Record<string, number>
|
|
134
|
+
>({})
|
|
135
|
+
const [isLoadingWithDelay, setIsLoadingWithDelay] = useState(false)
|
|
136
|
+
|
|
137
|
+
const csvParserOptions = useMemo(
|
|
138
|
+
() => ({ delimiter: ',' as const, skipEmptyLines: true }),
|
|
139
|
+
[]
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
const csvParser = useCSVParser(csvParserOptions)
|
|
143
|
+
const {
|
|
144
|
+
error: csvError,
|
|
145
|
+
isParsing: isCsvProcessing,
|
|
146
|
+
onParseFile,
|
|
147
|
+
onClearError,
|
|
148
|
+
onGenerateTemplate,
|
|
149
|
+
} = csvParser
|
|
150
|
+
|
|
151
|
+
const isQuickOrderEnabled = quickOrderSettings?.quickOrder ?? false
|
|
152
|
+
const attachmentButton = quickOrderSettings?.attachmentButton
|
|
153
|
+
const toastMessages = quickOrderSettings?.toastMessages
|
|
154
|
+
const drawerConfig = quickOrderSettings?.drawer
|
|
155
|
+
const a11yLabels = quickOrderSettings?.accessibilityLabels
|
|
156
|
+
const fileUploadCardConfig = quickOrderSettings?.fileUploadCard
|
|
97
157
|
|
|
98
158
|
useImperativeHandle(ref, () => ({
|
|
99
159
|
resetSearchInput: () => setSearchQuery(''),
|
|
100
160
|
}))
|
|
101
161
|
|
|
162
|
+
// Map CSV parser error types to FileUploadErrorType
|
|
163
|
+
const mapCSVErrorToFileUploadErrorType = (
|
|
164
|
+
csvErrorType?: string
|
|
165
|
+
): FileUploadErrorType => {
|
|
166
|
+
if (csvErrorType === 'FILE_ERROR') {
|
|
167
|
+
return FileUploadErrorType.Unreadable
|
|
168
|
+
}
|
|
169
|
+
return FileUploadErrorType.InvalidStructure
|
|
170
|
+
}
|
|
171
|
+
|
|
102
172
|
const onSearchSelection: SearchProviderContextValue['onSearchSelection'] = (
|
|
103
173
|
term,
|
|
104
174
|
path
|
|
@@ -108,9 +178,256 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
108
178
|
setSearchDropdownVisible(false)
|
|
109
179
|
}
|
|
110
180
|
|
|
111
|
-
|
|
181
|
+
const handleFileSelect = async (files: File[]) => {
|
|
182
|
+
if (files.length === 0) return
|
|
183
|
+
|
|
184
|
+
setHasFile(true)
|
|
185
|
+
setIsUploadOpen(true)
|
|
186
|
+
|
|
187
|
+
const file = files[0]
|
|
188
|
+
setSelectedFile(file)
|
|
189
|
+
|
|
190
|
+
onClearError()
|
|
191
|
+
setCsvData(null)
|
|
192
|
+
setQuickOrderProducts([])
|
|
193
|
+
setSkusToFetch([])
|
|
194
|
+
setSkuQuantityMap({})
|
|
195
|
+
setIsQuickOrderDrawerOpen(false)
|
|
196
|
+
setNoProductsError(false)
|
|
197
|
+
|
|
198
|
+
const result = await onParseFile(file)
|
|
199
|
+
|
|
200
|
+
if (result && result.data && result.data.length > 0) {
|
|
201
|
+
setCsvData(result)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const handleDownloadTemplate = async () => {
|
|
206
|
+
try {
|
|
207
|
+
const csvContent = await onGenerateTemplate()
|
|
208
|
+
|
|
209
|
+
if (csvContent) {
|
|
210
|
+
const blob = new Blob([csvContent], { type: 'text/csv' })
|
|
211
|
+
const url = window.URL.createObjectURL(blob)
|
|
212
|
+
const a = document.createElement('a')
|
|
213
|
+
a.href = url
|
|
214
|
+
a.download = 'template.csv'
|
|
215
|
+
document.body.appendChild(a)
|
|
216
|
+
a.click()
|
|
217
|
+
document.body.removeChild(a)
|
|
218
|
+
window.URL.revokeObjectURL(url)
|
|
219
|
+
}
|
|
220
|
+
} catch (error) {
|
|
221
|
+
console.error('Failed to download template:', error)
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const handleDismiss = () => {
|
|
226
|
+
setCsvData(null)
|
|
227
|
+
setSelectedFile(null)
|
|
228
|
+
setSkusToFetch([])
|
|
229
|
+
setSkuQuantityMap({})
|
|
230
|
+
setQuickOrderProducts([])
|
|
231
|
+
setFileUploadVisible(false)
|
|
232
|
+
setHasFile(false)
|
|
233
|
+
setIsUploadOpen(false)
|
|
234
|
+
setNoProductsError(false)
|
|
235
|
+
onClearError()
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const handleSearch = async (_file?: File) => {
|
|
239
|
+
let dataToUse = csvData
|
|
240
|
+
|
|
241
|
+
if (!dataToUse || !dataToUse.data || dataToUse.data.length === 0) {
|
|
242
|
+
const fileToParse = _file || selectedFile
|
|
243
|
+
|
|
244
|
+
if (!fileToParse) {
|
|
245
|
+
pushToast({
|
|
246
|
+
title: toastMessages?.noFileSelected?.title,
|
|
247
|
+
message: toastMessages?.noFileSelected?.message,
|
|
248
|
+
status: 'ERROR',
|
|
249
|
+
icon: <UIIcon name="CircleWavyWarning" width={30} height={30} />,
|
|
250
|
+
})
|
|
251
|
+
return
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
const parsePromise = onParseFile(fileToParse)
|
|
256
|
+
|
|
257
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
258
|
+
setTimeout(() => {
|
|
259
|
+
reject(new Error(toastMessages?.fileTimeout?.message))
|
|
260
|
+
}, 30000)
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
const result = (await Promise.race([
|
|
264
|
+
parsePromise,
|
|
265
|
+
timeoutPromise,
|
|
266
|
+
])) as Awaited<ReturnType<typeof onParseFile>>
|
|
267
|
+
|
|
268
|
+
if (result && result.data && result.data.length > 0) {
|
|
269
|
+
dataToUse = result
|
|
270
|
+
setCsvData(result)
|
|
271
|
+
} else {
|
|
272
|
+
pushToast({
|
|
273
|
+
title: toastMessages?.noDataFound?.title,
|
|
274
|
+
message: toastMessages?.noDataFound?.message,
|
|
275
|
+
status: 'ERROR',
|
|
276
|
+
icon: <UIIcon name="CircleWavyWarning" width={30} height={30} />,
|
|
277
|
+
})
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
} catch (error) {
|
|
281
|
+
const errorMessage =
|
|
282
|
+
error instanceof Error
|
|
283
|
+
? error.message
|
|
284
|
+
: toastMessages?.fileProcessingError?.defaultMessage
|
|
285
|
+
pushToast({
|
|
286
|
+
title: toastMessages?.fileProcessingError?.title,
|
|
287
|
+
message: errorMessage,
|
|
288
|
+
status: 'ERROR',
|
|
289
|
+
icon: <UIIcon name="CircleWavyWarning" width={30} height={30} />,
|
|
290
|
+
})
|
|
291
|
+
return
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (!dataToUse || !dataToUse.data || dataToUse.data.length === 0) {
|
|
296
|
+
pushToast({
|
|
297
|
+
title: toastMessages?.noDataAvailable?.title,
|
|
298
|
+
message: toastMessages?.noDataAvailable?.message,
|
|
299
|
+
status: 'ERROR',
|
|
300
|
+
icon: <UIIcon name="CircleWavyWarning" width={30} height={30} />,
|
|
301
|
+
})
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const payload = {
|
|
306
|
+
fileName: dataToUse.fileName,
|
|
307
|
+
totalRows: dataToUse.totalRows,
|
|
308
|
+
fileSize: dataToUse.fileSize,
|
|
309
|
+
data: dataToUse.data,
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
window.dispatchEvent(
|
|
313
|
+
new CustomEvent('faststore:file-search', { detail: payload })
|
|
314
|
+
)
|
|
315
|
+
} catch {
|
|
316
|
+
// ignore in envs without window
|
|
317
|
+
}
|
|
318
|
+
onFileSearch?.(dataToUse)
|
|
319
|
+
|
|
320
|
+
const map: Record<string, number> = {}
|
|
321
|
+
for (const item of dataToUse.data) {
|
|
322
|
+
const sku = item.sku?.trim()
|
|
323
|
+
if (!sku) continue
|
|
324
|
+
map[sku] = (map[sku] ?? 0) + (item.quantity ?? 1)
|
|
325
|
+
}
|
|
326
|
+
const uniqueSkus = Object.keys(map)
|
|
327
|
+
|
|
328
|
+
if (uniqueSkus.length === 0) {
|
|
329
|
+
pushToast({
|
|
330
|
+
title: toastMessages?.noValidSkus?.title,
|
|
331
|
+
message: toastMessages?.noValidSkus?.message,
|
|
332
|
+
status: 'ERROR',
|
|
333
|
+
icon: <UIIcon name="CircleWavyWarning" width={30} height={30} />,
|
|
334
|
+
})
|
|
335
|
+
return
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
setQuickOrderProducts([])
|
|
339
|
+
setNoProductsError(false)
|
|
340
|
+
setIsLoadingWithDelay(true)
|
|
341
|
+
setSkuQuantityMap(map)
|
|
342
|
+
// Open drawer immediately to show loading skeleton
|
|
343
|
+
setIsQuickOrderDrawerOpen(true)
|
|
344
|
+
setFileUploadVisible(false)
|
|
345
|
+
setSkusToFetch(uniqueSkus)
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
const { products: fetchedProducts, isLoading: isLoadingProducts } =
|
|
349
|
+
useBulkProductsQuery(skusToFetch)
|
|
350
|
+
|
|
351
|
+
useEffect(() => {
|
|
352
|
+
if (skusToFetch.length > 0 && isLoadingProducts) {
|
|
353
|
+
// Clear products and show loading skeleton
|
|
354
|
+
setQuickOrderProducts([])
|
|
355
|
+
setIsLoadingWithDelay(true)
|
|
356
|
+
// Keep drawer open to show loading skeleton
|
|
357
|
+
setIsQuickOrderDrawerOpen(true)
|
|
358
|
+
setFileUploadVisible(false)
|
|
359
|
+
setNoProductsError(false)
|
|
360
|
+
return
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (
|
|
364
|
+
!isLoadingProducts &&
|
|
365
|
+
skusToFetch.length > 0 &&
|
|
366
|
+
Object.keys(skuQuantityMap).length > 0 &&
|
|
367
|
+
fetchedProducts.length > 0
|
|
368
|
+
) {
|
|
369
|
+
// Add artificial delay to test loading state
|
|
370
|
+
setIsLoadingWithDelay(true)
|
|
371
|
+
|
|
372
|
+
const timeoutId = setTimeout(() => {
|
|
373
|
+
const convertedProducts: Product[] = []
|
|
374
|
+
|
|
375
|
+
fetchedProducts.forEach((productData) => {
|
|
376
|
+
if (productData.product && !productData.error) {
|
|
377
|
+
const requestedQuantity =
|
|
378
|
+
skuQuantityMap[productData.sku ?? ''] ?? 1
|
|
379
|
+
|
|
380
|
+
const convertedProduct = convertProductToQuickOrder(
|
|
381
|
+
productData.product,
|
|
382
|
+
requestedQuantity
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
if (convertedProduct) {
|
|
386
|
+
convertedProducts.push(convertedProduct)
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
setQuickOrderProducts(convertedProducts)
|
|
392
|
+
setIsLoadingWithDelay(false)
|
|
393
|
+
|
|
394
|
+
if (convertedProducts.length > 0) {
|
|
395
|
+
setIsQuickOrderDrawerOpen(true)
|
|
396
|
+
setFileUploadVisible(false)
|
|
397
|
+
setNoProductsError(false)
|
|
398
|
+
} else {
|
|
399
|
+
// Keep drawer open to show empty state message
|
|
400
|
+
setQuickOrderProducts([])
|
|
401
|
+
setIsQuickOrderDrawerOpen(true)
|
|
402
|
+
setFileUploadVisible(false)
|
|
403
|
+
setNoProductsError(true)
|
|
404
|
+
}
|
|
405
|
+
}, 2000) // 2 second delay for testing
|
|
406
|
+
|
|
407
|
+
return () => {
|
|
408
|
+
clearTimeout(timeoutId)
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
if (
|
|
413
|
+
!isLoadingProducts &&
|
|
414
|
+
skusToFetch.length > 0 &&
|
|
415
|
+
Object.keys(skuQuantityMap).length > 0 &&
|
|
416
|
+
fetchedProducts.length === 0
|
|
417
|
+
) {
|
|
418
|
+
// Keep drawer open to show empty state message
|
|
419
|
+
setQuickOrderProducts([])
|
|
420
|
+
setIsQuickOrderDrawerOpen(true)
|
|
421
|
+
setFileUploadVisible(false)
|
|
422
|
+
setNoProductsError(true)
|
|
423
|
+
setIsLoadingWithDelay(false)
|
|
424
|
+
}
|
|
425
|
+
}, [fetchedProducts, skusToFetch, skuQuantityMap, isLoadingProducts])
|
|
426
|
+
|
|
427
|
+
useOnClickOutside(searchRef, () => {
|
|
112
428
|
setSearchDropdownVisible(customSearchDropdownVisibleCondition ?? false)
|
|
113
|
-
|
|
429
|
+
setFileUploadVisible(false)
|
|
430
|
+
})
|
|
114
431
|
|
|
115
432
|
const { data, error } = useSuggestions(searchQueryDeferred)
|
|
116
433
|
const terms = (data?.search.suggestions.terms ?? []).slice(
|
|
@@ -129,12 +446,74 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
129
446
|
testId: buttonTestId,
|
|
130
447
|
}
|
|
131
448
|
|
|
449
|
+
const handleAddToCart = useCallback(
|
|
450
|
+
(productsToAdd: Product[]) => {
|
|
451
|
+
productsToAdd.forEach((product: Product) => {
|
|
452
|
+
if (
|
|
453
|
+
product.selectedCount > 0 &&
|
|
454
|
+
product.availability === 'available'
|
|
455
|
+
) {
|
|
456
|
+
const fetchedProduct = fetchedProducts.find(
|
|
457
|
+
(p) => p.product?.sku === product.id
|
|
458
|
+
)?.product
|
|
459
|
+
|
|
460
|
+
if (fetchedProduct && fetchedProduct.offers?.offers[0]) {
|
|
461
|
+
const offer = fetchedProduct.offers.offers[0]
|
|
462
|
+
|
|
463
|
+
cartStore.addItem({
|
|
464
|
+
itemOffered: {
|
|
465
|
+
sku: fetchedProduct.sku,
|
|
466
|
+
name: fetchedProduct.name,
|
|
467
|
+
unitMultiplier: fetchedProduct.unitMultiplier ?? 1,
|
|
468
|
+
image: fetchedProduct.image,
|
|
469
|
+
brand: fetchedProduct.brand,
|
|
470
|
+
isVariantOf: fetchedProduct.isVariantOf,
|
|
471
|
+
gtin: fetchedProduct.gtin,
|
|
472
|
+
additionalProperty: fetchedProduct.additionalProperty,
|
|
473
|
+
},
|
|
474
|
+
seller: offer.seller,
|
|
475
|
+
quantity: product.selectedCount,
|
|
476
|
+
price: product.price,
|
|
477
|
+
listPrice: offer.listPrice ?? product.price,
|
|
478
|
+
priceWithTaxes: offer.priceWithTaxes ?? product.price,
|
|
479
|
+
listPriceWithTaxes: offer.listPriceWithTaxes ?? product.price,
|
|
480
|
+
})
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
})
|
|
484
|
+
|
|
485
|
+
setIsQuickOrderDrawerOpen(false)
|
|
486
|
+
},
|
|
487
|
+
[fetchedProducts]
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
const getCompletedStatusText = useCallback(
|
|
491
|
+
(fileSize: number) => {
|
|
492
|
+
const template = fileUploadCardConfig?.completedStatusTemplate ?? ''
|
|
493
|
+
return template.replace('{fileSize}', (fileSize / 1024).toFixed(1))
|
|
494
|
+
},
|
|
495
|
+
[fileUploadCardConfig?.completedStatusTemplate]
|
|
496
|
+
)
|
|
497
|
+
|
|
498
|
+
const resolvedErrorMessages = useMemo(() => {
|
|
499
|
+
const msgs = fileUploadCardConfig?.errorMessages ?? {}
|
|
500
|
+
const result: Record<string, { title: string; description: string }> = {}
|
|
501
|
+
|
|
502
|
+
for (const [key, val] of Object.entries(msgs)) {
|
|
503
|
+
if (val?.title && val?.description) {
|
|
504
|
+
result[key] = { title: val.title, description: val.description }
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return result
|
|
509
|
+
}, [fileUploadCardConfig?.errorMessages])
|
|
510
|
+
|
|
132
511
|
return (
|
|
133
512
|
<>
|
|
134
513
|
{hidden ? (
|
|
135
514
|
<UIIconButton
|
|
136
515
|
type="submit"
|
|
137
|
-
aria-label=
|
|
516
|
+
aria-label={a11yLabels?.searchButtonAriaLabel}
|
|
138
517
|
icon={<UIIcon name="MagnifyingGlass" />}
|
|
139
518
|
size="small"
|
|
140
519
|
{...buttonProps}
|
|
@@ -154,6 +533,26 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
154
533
|
ref={ref}
|
|
155
534
|
buttonProps={buttonProps}
|
|
156
535
|
placeholder={placeholder}
|
|
536
|
+
showAttachmentButton={isQuickOrderEnabled}
|
|
537
|
+
attachmentButtonIcon={
|
|
538
|
+
isQuickOrderEnabled && attachmentButton?.icon ? (
|
|
539
|
+
<UIIcon
|
|
540
|
+
name={attachmentButton.icon.icon}
|
|
541
|
+
aria-label={attachmentButton.icon.alt}
|
|
542
|
+
/>
|
|
543
|
+
) : undefined
|
|
544
|
+
}
|
|
545
|
+
attachmentButtonAriaLabel={
|
|
546
|
+
attachmentButton?.ariaLabel ?? a11yLabels?.attachButtonAriaLabel
|
|
547
|
+
}
|
|
548
|
+
attachmentButtonProps={{
|
|
549
|
+
onClick: () => {
|
|
550
|
+
setFileUploadVisible(true)
|
|
551
|
+
},
|
|
552
|
+
'aria-label':
|
|
553
|
+
attachmentButton?.ariaLabel ??
|
|
554
|
+
a11yLabels?.attachButtonAriaLabel,
|
|
555
|
+
}}
|
|
157
556
|
onChange={(e: { target: { value: SetStateAction<string> } }) =>
|
|
158
557
|
setSearchQuery(e.target.value)
|
|
159
558
|
}
|
|
@@ -182,8 +581,94 @@ const SearchInput = forwardRef<SearchInputRef, SearchInputProps>(
|
|
|
182
581
|
/>
|
|
183
582
|
</Suspense>
|
|
184
583
|
)}
|
|
584
|
+
{fileUploadVisible && (
|
|
585
|
+
<FileUploadCard
|
|
586
|
+
title={fileUploadCardConfig?.title}
|
|
587
|
+
fileInputAriaLabel={fileUploadCardConfig?.fileInputAriaLabel}
|
|
588
|
+
dropzoneAriaLabel={fileUploadCardConfig?.dropzoneAriaLabel}
|
|
589
|
+
dropzoneTitle={fileUploadCardConfig?.dropzoneTitle}
|
|
590
|
+
selectFileButtonLabel={
|
|
591
|
+
fileUploadCardConfig?.selectFileButtonLabel
|
|
592
|
+
}
|
|
593
|
+
downloadTemplateButtonLabel={
|
|
594
|
+
fileUploadCardConfig?.downloadTemplateButtonLabel
|
|
595
|
+
}
|
|
596
|
+
removeButtonAriaLabel={
|
|
597
|
+
fileUploadCardConfig?.removeButtonAriaLabel
|
|
598
|
+
}
|
|
599
|
+
searchButtonLabel={fileUploadCardConfig?.searchButtonLabel}
|
|
600
|
+
uploadingStatusText={fileUploadCardConfig?.uploadingStatusText}
|
|
601
|
+
getCompletedStatusText={getCompletedStatusText}
|
|
602
|
+
errorMessages={resolvedErrorMessages}
|
|
603
|
+
accept={fileUploadCardConfig?.acceptedFileTypes}
|
|
604
|
+
isOpen={isUploadOpen || hasFile || fileUploadVisible}
|
|
605
|
+
onDismiss={handleDismiss}
|
|
606
|
+
onFileSelect={handleFileSelect}
|
|
607
|
+
onDownloadTemplate={handleDownloadTemplate}
|
|
608
|
+
formatterFileSize={formatFileSize}
|
|
609
|
+
formatterFileName={formatFileName}
|
|
610
|
+
onSearch={handleSearch}
|
|
611
|
+
isUploading={isCsvProcessing || isLoadingProducts}
|
|
612
|
+
hasError={(!!csvError || noProductsError) && !isLoadingProducts}
|
|
613
|
+
{...((csvError || (noProductsError && !isLoadingProducts)) && {
|
|
614
|
+
errorType: noProductsError
|
|
615
|
+
? FileUploadErrorType.NoProductsFound
|
|
616
|
+
: mapCSVErrorToFileUploadErrorType(csvError.type),
|
|
617
|
+
errorMessage: noProductsError ? undefined : csvError?.message,
|
|
618
|
+
})}
|
|
619
|
+
/>
|
|
620
|
+
)}
|
|
185
621
|
</UISearchInput>
|
|
186
622
|
)}
|
|
623
|
+
<QuickOrderDrawer
|
|
624
|
+
isOpen={isQuickOrderDrawerOpen}
|
|
625
|
+
overlayProps={{
|
|
626
|
+
onClick: () => {
|
|
627
|
+
setIsQuickOrderDrawerOpen(false)
|
|
628
|
+
setQuickOrderProducts([])
|
|
629
|
+
setSkusToFetch([])
|
|
630
|
+
setSkuQuantityMap({})
|
|
631
|
+
},
|
|
632
|
+
}}
|
|
633
|
+
providerProps={{
|
|
634
|
+
initialProducts: quickOrderProducts,
|
|
635
|
+
isLoading: isLoadingProducts || isLoadingWithDelay,
|
|
636
|
+
totalRequestedSkus: Object.keys(skuQuantityMap).length || 0,
|
|
637
|
+
onAddToCart: handleAddToCart,
|
|
638
|
+
alertMessages: drawerConfig?.alertMessages,
|
|
639
|
+
}}
|
|
640
|
+
>
|
|
641
|
+
<QuickOrderDrawerHeader
|
|
642
|
+
title={
|
|
643
|
+
selectedFile
|
|
644
|
+
? formatFileName(selectedFile.name)
|
|
645
|
+
: drawerConfig?.defaultTitle
|
|
646
|
+
}
|
|
647
|
+
onCloseDrawer={() => {
|
|
648
|
+
setIsQuickOrderDrawerOpen(false)
|
|
649
|
+
setQuickOrderProducts([])
|
|
650
|
+
setSkusToFetch([])
|
|
651
|
+
setSkuQuantityMap({})
|
|
652
|
+
}}
|
|
653
|
+
/>
|
|
654
|
+
<QuickOrderDrawerProducts
|
|
655
|
+
columns={{
|
|
656
|
+
name: drawerConfig?.columns?.name,
|
|
657
|
+
availability: {
|
|
658
|
+
label: drawerConfig?.columns?.availabilityLabel,
|
|
659
|
+
stockDisplaySettings: 'showAvailability',
|
|
660
|
+
},
|
|
661
|
+
price: drawerConfig?.columns?.price,
|
|
662
|
+
quantity: drawerConfig?.columns?.quantity,
|
|
663
|
+
}}
|
|
664
|
+
formatter={(price) => priceFormatter(price)}
|
|
665
|
+
messages={drawerConfig?.messages}
|
|
666
|
+
/>
|
|
667
|
+
<QuickOrderDrawerFooter
|
|
668
|
+
formatter={(price) => priceFormatter(price)}
|
|
669
|
+
labels={drawerConfig?.footer}
|
|
670
|
+
/>
|
|
671
|
+
</QuickOrderDrawer>
|
|
187
672
|
</>
|
|
188
673
|
)
|
|
189
674
|
}
|
|
@@ -25,6 +25,13 @@ export interface NavbarProps {
|
|
|
25
25
|
sort: string
|
|
26
26
|
quickOrderSettings?: {
|
|
27
27
|
quickOrder: boolean
|
|
28
|
+
attachmentButton?: {
|
|
29
|
+
icon: {
|
|
30
|
+
icon: string
|
|
31
|
+
alt: string
|
|
32
|
+
}
|
|
33
|
+
ariaLabel: string
|
|
34
|
+
}
|
|
28
35
|
skuMatrix: {
|
|
29
36
|
triggerButtonLabel: string
|
|
30
37
|
columns: {
|
|
@@ -38,6 +45,66 @@ export interface NavbarProps {
|
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
}
|
|
48
|
+
drawer?: {
|
|
49
|
+
defaultTitle?: string
|
|
50
|
+
columns?: {
|
|
51
|
+
name?: string
|
|
52
|
+
availabilityLabel?: string
|
|
53
|
+
price?: string
|
|
54
|
+
quantity?: string
|
|
55
|
+
}
|
|
56
|
+
messages?: {
|
|
57
|
+
alertAriaLabel?: string
|
|
58
|
+
tableAriaLabel?: string
|
|
59
|
+
quantityUpdatedTooltip?: string
|
|
60
|
+
quantityUpdatedAriaLabel?: string
|
|
61
|
+
outOfStockLabel?: string
|
|
62
|
+
availableLabel?: string
|
|
63
|
+
selectQuantityAriaLabel?: string
|
|
64
|
+
removeProductAriaLabel?: string
|
|
65
|
+
invalidQuantityTitle?: string
|
|
66
|
+
emptyStateTitle?: string
|
|
67
|
+
emptyStateMessage?: string
|
|
68
|
+
}
|
|
69
|
+
alertMessages?: {
|
|
70
|
+
notFoundAndOutOfStock?: string
|
|
71
|
+
notFound?: string
|
|
72
|
+
outOfStock?: string
|
|
73
|
+
}
|
|
74
|
+
footer?: {
|
|
75
|
+
itemsLabel?: string
|
|
76
|
+
addToCartLabel?: string
|
|
77
|
+
addToCartAriaLabel?: string
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
toastMessages?: {
|
|
81
|
+
noFileSelected?: { title?: string; message?: string }
|
|
82
|
+
noDataFound?: { title?: string; message?: string }
|
|
83
|
+
fileProcessingError?: { title?: string; defaultMessage?: string }
|
|
84
|
+
fileTimeout?: { message?: string }
|
|
85
|
+
noDataAvailable?: { title?: string; message?: string }
|
|
86
|
+
noValidSkus?: { title?: string; message?: string }
|
|
87
|
+
}
|
|
88
|
+
accessibilityLabels?: {
|
|
89
|
+
attachButtonAriaLabel?: string
|
|
90
|
+
searchButtonAriaLabel?: string
|
|
91
|
+
}
|
|
92
|
+
fileUploadCard?: {
|
|
93
|
+
title?: string
|
|
94
|
+
fileInputAriaLabel?: string
|
|
95
|
+
dropzoneAriaLabel?: string
|
|
96
|
+
dropzoneTitle?: string
|
|
97
|
+
selectFileButtonLabel?: string
|
|
98
|
+
downloadTemplateButtonLabel?: string
|
|
99
|
+
removeButtonAriaLabel?: string
|
|
100
|
+
searchButtonLabel?: string
|
|
101
|
+
uploadingStatusText?: string
|
|
102
|
+
completedStatusTemplate?: string
|
|
103
|
+
acceptedFileTypes?: string
|
|
104
|
+
errorMessages?: Partial<
|
|
105
|
+
Record<string, { title?: string; description?: string }>
|
|
106
|
+
>
|
|
107
|
+
}
|
|
41
108
|
}
|
|
42
109
|
}
|
|
43
110
|
signInButton: {
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
@import "@faststore/ui/src/components/organisms/RegionPopover/styles.scss";
|
|
24
24
|
@import "@faststore/ui/src/components/molecules/SearchAutoComplete/styles.scss";
|
|
25
25
|
@import "@faststore/ui/src/components/molecules/SearchDropdown/styles.scss";
|
|
26
|
+
@import "@faststore/ui/src/components/molecules/FileUploadCard/styles.scss";
|
|
27
|
+
@import "@faststore/ui/src/components/molecules/FileUploadStatus/styles.scss";
|
|
26
28
|
@import "@faststore/ui/src/components/molecules/SearchHistory/styles.scss";
|
|
27
29
|
@import "@faststore/ui/src/components/molecules/SearchInputField/styles.scss";
|
|
28
30
|
@import "@faststore/ui/src/components/molecules/SearchProducts/styles.scss";
|
|
@@ -33,6 +35,7 @@
|
|
|
33
35
|
@import "@faststore/ui/src/components/organisms/Navbar/styles.scss";
|
|
34
36
|
@import "@faststore/ui/src/components/organisms/SlideOver/styles.scss";
|
|
35
37
|
@import "@faststore/ui/src/components/organisms/SKUMatrix/styles.scss";
|
|
38
|
+
@import "@faststore/ui/src/components/organisms/QuickOrderDrawer/styles.scss";
|
|
36
39
|
|
|
37
40
|
// Sets Navbar height on desktop to avoid CLS issue - Cumulative Layout Shift
|
|
38
41
|
--fs-navbar-height-desktop: 4.5rem;
|