From bf043512e966c3a60148aaedbdb410757df21fb5 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Mon, 1 Dec 2025 15:01:18 +0330 Subject: [PATCH] online cart with Optimistic state --- public/sw.js | 2 +- src/app/[name]/(Dialogs)/cart/hook/useCart.ts | 47 +------ .../(Dialogs)/cart/hooks/useCartData.ts | 119 +++++++++++++++++- src/components/listview/MenuItem.tsx | 30 +---- 4 files changed, 125 insertions(+), 73 deletions(-) diff --git a/public/sw.js b/public/sw.js index f703562..d5d8e89 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const a=(a,n)=>(a=new URL(a+".js",n).href,s[a]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()}).then(()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e}));self.define=(n,i)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let t={};const r=e=>a(e,c),f={module:{uri:c},exports:t,require:r};s[c]=Promise.all(n.map(e=>f[e]||r(e))).then(e=>(i(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_favicon.ico",revision:"28202080f3527f526a24b1119885536e"},{url:"/_next/app-build-manifest.json",revision:"dd2212a4ab48490003a67a0cb391b645"},{url:"/_next/static/chunks/1255-26f05d8bf86e016d.js",revision:"26f05d8bf86e016d"},{url:"/_next/static/chunks/1343-55acfdeb869e2fd2.js",revision:"55acfdeb869e2fd2"},{url:"/_next/static/chunks/1531-d03db22bd0d0bdc9.js",revision:"d03db22bd0d0bdc9"},{url:"/_next/static/chunks/1557-fe26fe5d2ea239de.js",revision:"fe26fe5d2ea239de"},{url:"/_next/static/chunks/1903-5b04beed4655180a.js",revision:"5b04beed4655180a"},{url:"/_next/static/chunks/2113.b04962b41bdab753.js",revision:"b04962b41bdab753"},{url:"/_next/static/chunks/2280-16dc502ee34da82b.js",revision:"16dc502ee34da82b"},{url:"/_next/static/chunks/2464-cfb959c6d2113f35.js",revision:"cfb959c6d2113f35"},{url:"/_next/static/chunks/2476-e7648a2df382d65d.js",revision:"e7648a2df382d65d"},{url:"/_next/static/chunks/2617.3abcce7aa75b4649.js",revision:"3abcce7aa75b4649"},{url:"/_next/static/chunks/2619-b8db57ac19da49ac.js",revision:"b8db57ac19da49ac"},{url:"/_next/static/chunks/3181-7e47d9054b14d670.js",revision:"7e47d9054b14d670"},{url:"/_next/static/chunks/3261-4dffc39522b48e56.js",revision:"4dffc39522b48e56"},{url:"/_next/static/chunks/3295-1f84413b9e12359a.js",revision:"1f84413b9e12359a"},{url:"/_next/static/chunks/3329-7c885ea0780102e4.js",revision:"7c885ea0780102e4"},{url:"/_next/static/chunks/3528-102086b60d85226f.js",revision:"102086b60d85226f"},{url:"/_next/static/chunks/3595-55c866809f8672ea.js",revision:"55c866809f8672ea"},{url:"/_next/static/chunks/3686.a95b9fbf57e88095.js",revision:"a95b9fbf57e88095"},{url:"/_next/static/chunks/4211-e78659df2fc5609e.js",revision:"e78659df2fc5609e"},{url:"/_next/static/chunks/4bd1b696-100b9d70ed4e49c1.js",revision:"100b9d70ed4e49c1"},{url:"/_next/static/chunks/5070.ad19d2678fe10023.js",revision:"ad19d2678fe10023"},{url:"/_next/static/chunks/5239-b5d471afce036544.js",revision:"b5d471afce036544"},{url:"/_next/static/chunks/5511-8b8de44a17ff4403.js",revision:"8b8de44a17ff4403"},{url:"/_next/static/chunks/5579.53a6112ed5d4573f.js",revision:"53a6112ed5d4573f"},{url:"/_next/static/chunks/5832-96922143bfae8e2e.js",revision:"96922143bfae8e2e"},{url:"/_next/static/chunks/5889-e987f21560aaf28e.js",revision:"e987f21560aaf28e"},{url:"/_next/static/chunks/6397-0d3ca8868c245452.js",revision:"0d3ca8868c245452"},{url:"/_next/static/chunks/6634-b6b82c56ca8678bb.js",revision:"b6b82c56ca8678bb"},{url:"/_next/static/chunks/6914.a2221be2e59a3d08.js",revision:"a2221be2e59a3d08"},{url:"/_next/static/chunks/7149.48fd0dc7f4d626e5.js",revision:"48fd0dc7f4d626e5"},{url:"/_next/static/chunks/7438.f11db0cbc4b43c8d.js",revision:"f11db0cbc4b43c8d"},{url:"/_next/static/chunks/7493.5508135cff4eb902.js",revision:"5508135cff4eb902"},{url:"/_next/static/chunks/7707-6d95cf9e0a91e34b.js",revision:"6d95cf9e0a91e34b"},{url:"/_next/static/chunks/7840-ec034fa7143f1030.js",revision:"ec034fa7143f1030"},{url:"/_next/static/chunks/7907-aaf732ade4db41cd.js",revision:"aaf732ade4db41cd"},{url:"/_next/static/chunks/7994-fa3d7310dc319744.js",revision:"fa3d7310dc319744"},{url:"/_next/static/chunks/8016.fe6fba52773595d8.js",revision:"fe6fba52773595d8"},{url:"/_next/static/chunks/8268-80f9c3ec864a0098.js",revision:"80f9c3ec864a0098"},{url:"/_next/static/chunks/8360-b41b86f2b19d8f29.js",revision:"b41b86f2b19d8f29"},{url:"/_next/static/chunks/8588.a3b386954bdd8788.js",revision:"a3b386954bdd8788"},{url:"/_next/static/chunks/8595-80c7d64db3a57b4e.js",revision:"80c7d64db3a57b4e"},{url:"/_next/static/chunks/8722.a10f00e99dd3c329.js",revision:"a10f00e99dd3c329"},{url:"/_next/static/chunks/8813-4820ad0de10bdc7b.js",revision:"4820ad0de10bdc7b"},{url:"/_next/static/chunks/9136-555f35534dacc9d2.js",revision:"555f35534dacc9d2"},{url:"/_next/static/chunks/9398-975825d91f2f20cc.js",revision:"975825d91f2f20cc"},{url:"/_next/static/chunks/9920-fbabf4827d971087.js",revision:"fbabf4827d971087"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/cart/page-98df398743197c3c.js",revision:"98df398743197c3c"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/layout-d615f22fd403fc67.js",revision:"d615f22fd403fc67"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/notifications/page-28d4b407399b8d1f.js",revision:"28d4b407399b8d1f"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/order/checkout/%5Bid%5D/page-8f2a1187c9fe8500.js",revision:"8f2a1187c9fe8500"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/order/track/%5Bid%5D/page-a5affc342f37943b.js",revision:"a5affc342f37943b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/report/page-74755de07e0c968f.js",revision:"74755de07e0c968f"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/verify/page-1a5b964adf285d03.js",revision:"1a5b964adf285d03"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/%5Bid%5D/page-3190b06b32cf5a23.js",revision:"3190b06b32cf5a23"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/about/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/about/page-71cbefb0ec3213bd.js",revision:"71cbefb0ec3213bd"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/%5Bid%5D/page-139f2080eabb8174.js",revision:"139f2080eabb8174"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/nearby/page-c6060595b5771f41.js",revision:"c6060595b5771f41"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/page-43539f0a96e4acef.js",revision:"43539f0a96e4acef"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/layout-008a3e6bc0a3258a.js",revision:"008a3e6bc0a3258a"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/loading-5d7f7eb7a6350d78.js",revision:"5d7f7eb7a6350d78"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/history/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/history/page-bc2509a258674324.js",revision:"bc2509a258674324"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/rate/%5BorderId%5D/page-4f1f4530b6b18b13.js",revision:"4f1f4530b6b18b13"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/page-8a0e769beb8c3cf5.js",revision:"8a0e769beb8c3cf5"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/discount/club/page-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/discount/page-9e822e076a573c85.js",revision:"9e822e076a573c85"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/page-148bb4a8f4457050.js",revision:"148bb4a8f4457050"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/layout-b41b623f4e51ef48.js",revision:"b41b623f4e51ef48"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/address/new/page-acaf012d1abf920e.js",revision:"acaf012d1abf920e"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/address/page-eaef23e97cd87880.js",revision:"eaef23e97cd87880"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/edit/page-6ebaa29a4306c828.js",revision:"6ebaa29a4306c828"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/page-5572c4b276501955.js",revision:"5572c4b276501955"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/settings/page-9ed54a1d3eadedd8.js",revision:"9ed54a1d3eadedd8"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/wallet/page-b40e53e545b851db.js",revision:"b40e53e545b851db"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/login/page-2d39681d1dc55716.js",revision:"2d39681d1dc55716"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/page-14976dd4e48c66b0.js",revision:"14976dd4e48c66b0"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/reset-password/page-7714f148ca1d20f8.js",revision:"7714f148ca1d20f8"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/signup/page-0c5f1cb4f864b02d.js",revision:"0c5f1cb4f864b02d"},{url:"/_next/static/chunks/app/%5Bname%5D/layout-c8068b95f3249de2.js",revision:"c8068b95f3249de2"},{url:"/_next/static/chunks/app/_not-found/page-034f1789b0eaeb6b.js",revision:"034f1789b0eaeb6b"},{url:"/_next/static/chunks/app/auth/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/auth/login/page-5fd86bdd0fbccf02.js",revision:"5fd86bdd0fbccf02"},{url:"/_next/static/chunks/app/auth/page-a8e169e3773830f0.js",revision:"a8e169e3773830f0"},{url:"/_next/static/chunks/app/auth/reset-password/page-2ac78444b44fd4c1.js",revision:"2ac78444b44fd4c1"},{url:"/_next/static/chunks/app/auth/signup/page-8c4cc15b59c639db.js",revision:"8c4cc15b59c639db"},{url:"/_next/static/chunks/app/layout-2252fe9890a5894f.js",revision:"2252fe9890a5894f"},{url:"/_next/static/chunks/app/loading-5d7f7eb7a6350d78.js",revision:"5d7f7eb7a6350d78"},{url:"/_next/static/chunks/app/page-99f323bd08352c38.js",revision:"99f323bd08352c38"},{url:"/_next/static/chunks/d0deef33.59194872e4111dca.js",revision:"59194872e4111dca"},{url:"/_next/static/chunks/framework-32492dd9c4fc5870.js",revision:"32492dd9c4fc5870"},{url:"/_next/static/chunks/main-82b194b1f42f50c9.js",revision:"82b194b1f42f50c9"},{url:"/_next/static/chunks/main-app-fb228aef04f005ac.js",revision:"fb228aef04f005ac"},{url:"/_next/static/chunks/pages/_app-4b3fb5e477a0267f.js",revision:"4b3fb5e477a0267f"},{url:"/_next/static/chunks/pages/_error-c970d8b55ace1b48.js",revision:"c970d8b55ace1b48"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-9d33f2742f4fcebe.js",revision:"9d33f2742f4fcebe"},{url:"/_next/static/css/2c2be3c8248b4741.css",revision:"2c2be3c8248b4741"},{url:"/_next/static/css/fb68b8cf93cd51ba.css",revision:"fb68b8cf93cd51ba"},{url:"/_next/static/media/layers-2x.9859cd12.png",revision:"9859cd12"},{url:"/_next/static/media/layers.ef6db872.png",revision:"ef6db872"},{url:"/_next/static/media/marker-icon.d577052a.png",revision:"d577052a"},{url:"/_next/static/nQB_jmqTWcR2s0dbbRgaF/_buildManifest.js",revision:"c43756d170caef601c10adc53bd276cb"},{url:"/_next/static/nQB_jmqTWcR2s0dbbRgaF/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/apple-icon.png",revision:"0c11163d9876662afd598cdb681bb2e4"},{url:"/assets/css/fonts.css",revision:"b23bd571553a35e52be7bdfb8805ba5e"},{url:"/assets/fonts/Irancell_Bold.ttf",revision:"e5160b0c919e044bfbcf18a58dd04ad2"},{url:"/assets/fonts/Irancell_Bold.woff",revision:"ed06d53485fd8044e79894bedc597104"},{url:"/assets/fonts/Irancell_Bold.woff2",revision:"04e0058cbeb4dfe083dbf98370ae885e"},{url:"/assets/fonts/Irancell_ExtraBold.ttf",revision:"aca587f4f429c26e887e102f4d46bd27"},{url:"/assets/fonts/Irancell_ExtraBold.woff",revision:"eb70794e10fd476987930ef523ed8a33"},{url:"/assets/fonts/Irancell_ExtraBold.woff2",revision:"5f66486a89926925c4eabcb76aea6ca1"},{url:"/assets/fonts/Irancell_ExtraLight.ttf",revision:"85dd3b644afbabbea860e70d91adb665"},{url:"/assets/fonts/Irancell_ExtraLight.woff",revision:"7491ed7a70e2b9f8fa19c20eac497c12"},{url:"/assets/fonts/Irancell_ExtraLight.woff2",revision:"807b703a3924972991de43d76764f404"},{url:"/assets/fonts/Irancell_Light.ttf",revision:"911a07e375667ba6feeca9a527bc537d"},{url:"/assets/fonts/Irancell_Light.woff",revision:"9c1e83ee95bb25d5adc97011bbab2ae5"},{url:"/assets/fonts/Irancell_Light.woff2",revision:"34404e8d01d1ee40a5bc00311ae2add4"},{url:"/assets/fonts/Irancell_Medium.ttf",revision:"2b8b7463718f1930afc053208efe986e"},{url:"/assets/fonts/Irancell_Medium.woff",revision:"e952c2a8c784e1b13c606f4b9b300310"},{url:"/assets/fonts/Irancell_Medium.woff2",revision:"1955af7b1d4244b4034b793c4435a7e3"},{url:"/assets/fonts/Irancell_Regular.ttf",revision:"3c29a31eaec7ddd32d41879dfcce95b8"},{url:"/assets/fonts/Irancell_Regular.woff",revision:"c9d7d00bddfd0595b68e750574b28312"},{url:"/assets/fonts/Irancell_Regular.woff2",revision:"89eb5fb2d1409229407d1a75426acda0"},{url:"/assets/images/danak-logo.png",revision:"bfbbcd927b3e359c7ab8047211f7c3a3"},{url:"/assets/images/food-image.png",revision:"34520f66d5224a61eca7e83646bdb31e"},{url:"/assets/images/food-preview-hq.png",revision:"42968e21a3044f80db7399459768a16c"},{url:"/assets/images/food-preview.png",revision:"bfc910395c189bfc145fa950dbcca749"},{url:"/assets/images/login-banner.png",revision:"29a467b532dbf3c6e8bcd45e08ea3cde"},{url:"/assets/images/report-hero.svg",revision:"fe10be00fde304933f91cdedab597494"},{url:"/assets/images/user-avatar.png",revision:"0d4b4612ad00442263d2a41754fcadcc"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon0.svg",revision:"6d2cbb302b9f3ef7f2b43ae7d355f6c9"},{url:"/icon1.png",revision:"14e00a23129ccbbe02a835997ecca6c0"},{url:"/icons/restaurant-marker.svg",revision:"72add246cf474e9b703edd352a50b1c8"},{url:"/icons/web-app-manifest-192x192.png",revision:"2bd31374f516557201d060ad4c5695c4"},{url:"/icons/web-app-manifest-512x512.png",revision:"d0f9aa93e12fc2ed5b220efa3db4e689"},{url:"/manifest.json",revision:"fcaa8d06b59646efa18f5d20d22b5ef9"},{url:"/manifests/zhivan/manifest.json",revision:"d4005805de3b85c31998a3fb4bb1dad3"},{url:"/marker-icon-2x.png",revision:"1c824216f354218b04b25a57e0f7ab1f"},{url:"/marker-icon.png",revision:"1c824216f354218b04b25a57e0f7ab1f"},{url:"/marker-shadow.png",revision:"44014eaa598e7050354603adfb44f812"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:a,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); +if(!self.define){let e,s={};const a=(a,n)=>(a=new URL(a+".js",n).href,s[a]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()}).then(()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e}));self.define=(n,i)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let t={};const r=e=>a(e,c),f={module:{uri:c},exports:t,require:r};s[c]=Promise.all(n.map(e=>f[e]||r(e))).then(e=>(i(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_favicon.ico",revision:"28202080f3527f526a24b1119885536e"},{url:"/_next/app-build-manifest.json",revision:"74dc2b988aa668666b8346ab079b5e95"},{url:"/_next/static/NS7veOCHnd7nLszoo_bip/_buildManifest.js",revision:"c43756d170caef601c10adc53bd276cb"},{url:"/_next/static/NS7veOCHnd7nLszoo_bip/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1255-26f05d8bf86e016d.js",revision:"26f05d8bf86e016d"},{url:"/_next/static/chunks/1382-d47826edc98e87b9.js",revision:"d47826edc98e87b9"},{url:"/_next/static/chunks/1531-d03db22bd0d0bdc9.js",revision:"d03db22bd0d0bdc9"},{url:"/_next/static/chunks/1557-fe26fe5d2ea239de.js",revision:"fe26fe5d2ea239de"},{url:"/_next/static/chunks/1903-5b04beed4655180a.js",revision:"5b04beed4655180a"},{url:"/_next/static/chunks/2113.c4b6dfd5988c4d13.js",revision:"c4b6dfd5988c4d13"},{url:"/_next/static/chunks/2256-e1cde5b3534d3d16.js",revision:"e1cde5b3534d3d16"},{url:"/_next/static/chunks/2280-16dc502ee34da82b.js",revision:"16dc502ee34da82b"},{url:"/_next/static/chunks/2476-e7648a2df382d65d.js",revision:"e7648a2df382d65d"},{url:"/_next/static/chunks/2617.3abcce7aa75b4649.js",revision:"3abcce7aa75b4649"},{url:"/_next/static/chunks/2619-b8db57ac19da49ac.js",revision:"b8db57ac19da49ac"},{url:"/_next/static/chunks/3128-bbf3422742caac41.js",revision:"bbf3422742caac41"},{url:"/_next/static/chunks/3528-102086b60d85226f.js",revision:"102086b60d85226f"},{url:"/_next/static/chunks/3686.a95b9fbf57e88095.js",revision:"a95b9fbf57e88095"},{url:"/_next/static/chunks/4211-e78659df2fc5609e.js",revision:"e78659df2fc5609e"},{url:"/_next/static/chunks/4bd1b696-100b9d70ed4e49c1.js",revision:"100b9d70ed4e49c1"},{url:"/_next/static/chunks/5070.ad19d2678fe10023.js",revision:"ad19d2678fe10023"},{url:"/_next/static/chunks/5239-b5d471afce036544.js",revision:"b5d471afce036544"},{url:"/_next/static/chunks/5511-8b8de44a17ff4403.js",revision:"8b8de44a17ff4403"},{url:"/_next/static/chunks/5579.53a6112ed5d4573f.js",revision:"53a6112ed5d4573f"},{url:"/_next/static/chunks/5764-9314a8fb35c5948e.js",revision:"9314a8fb35c5948e"},{url:"/_next/static/chunks/5832-96922143bfae8e2e.js",revision:"96922143bfae8e2e"},{url:"/_next/static/chunks/5889-e987f21560aaf28e.js",revision:"e987f21560aaf28e"},{url:"/_next/static/chunks/6149-b74a74c5e1e2d2ed.js",revision:"b74a74c5e1e2d2ed"},{url:"/_next/static/chunks/6397-0d3ca8868c245452.js",revision:"0d3ca8868c245452"},{url:"/_next/static/chunks/6634-b6b82c56ca8678bb.js",revision:"b6b82c56ca8678bb"},{url:"/_next/static/chunks/6692-07333fe5040e198f.js",revision:"07333fe5040e198f"},{url:"/_next/static/chunks/6743-172efe5bc3d43a53.js",revision:"172efe5bc3d43a53"},{url:"/_next/static/chunks/6914.a2221be2e59a3d08.js",revision:"a2221be2e59a3d08"},{url:"/_next/static/chunks/7149.48fd0dc7f4d626e5.js",revision:"48fd0dc7f4d626e5"},{url:"/_next/static/chunks/7493.5508135cff4eb902.js",revision:"5508135cff4eb902"},{url:"/_next/static/chunks/7499.1d2445c31dccbe4a.js",revision:"1d2445c31dccbe4a"},{url:"/_next/static/chunks/7707-6d95cf9e0a91e34b.js",revision:"6d95cf9e0a91e34b"},{url:"/_next/static/chunks/7840-ec034fa7143f1030.js",revision:"ec034fa7143f1030"},{url:"/_next/static/chunks/7907-aaf732ade4db41cd.js",revision:"aaf732ade4db41cd"},{url:"/_next/static/chunks/7994-fa3d7310dc319744.js",revision:"fa3d7310dc319744"},{url:"/_next/static/chunks/8016.fe6fba52773595d8.js",revision:"fe6fba52773595d8"},{url:"/_next/static/chunks/8268-80f9c3ec864a0098.js",revision:"80f9c3ec864a0098"},{url:"/_next/static/chunks/8360-b41b86f2b19d8f29.js",revision:"b41b86f2b19d8f29"},{url:"/_next/static/chunks/8579-a18398636671352a.js",revision:"a18398636671352a"},{url:"/_next/static/chunks/8588.a3b386954bdd8788.js",revision:"a3b386954bdd8788"},{url:"/_next/static/chunks/8595-80c7d64db3a57b4e.js",revision:"80c7d64db3a57b4e"},{url:"/_next/static/chunks/8722.a10f00e99dd3c329.js",revision:"a10f00e99dd3c329"},{url:"/_next/static/chunks/8813-a5b8f052ac4643f0.js",revision:"a5b8f052ac4643f0"},{url:"/_next/static/chunks/9398-975825d91f2f20cc.js",revision:"975825d91f2f20cc"},{url:"/_next/static/chunks/9547-6f5a7f318f892db4.js",revision:"6f5a7f318f892db4"},{url:"/_next/static/chunks/9582-5a3f3bc5e8005e3f.js",revision:"5a3f3bc5e8005e3f"},{url:"/_next/static/chunks/9659-9f4c52a181021926.js",revision:"9f4c52a181021926"},{url:"/_next/static/chunks/9872-ed7e689ec4ca96a8.js",revision:"ed7e689ec4ca96a8"},{url:"/_next/static/chunks/9920-fbabf4827d971087.js",revision:"fbabf4827d971087"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/cart/page-18b022cc10ef661d.js",revision:"18b022cc10ef661d"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/layout-d615f22fd403fc67.js",revision:"d615f22fd403fc67"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/notifications/page-28d4b407399b8d1f.js",revision:"28d4b407399b8d1f"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/order/checkout/%5Bid%5D/page-8f2a1187c9fe8500.js",revision:"8f2a1187c9fe8500"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/order/track/%5Bid%5D/page-a5affc342f37943b.js",revision:"a5affc342f37943b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/report/page-74755de07e0c968f.js",revision:"74755de07e0c968f"},{url:"/_next/static/chunks/app/%5Bname%5D/(Dialogs)/verify/page-1a5b964adf285d03.js",revision:"1a5b964adf285d03"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/%5Bid%5D/page-3190b06b32cf5a23.js",revision:"3190b06b32cf5a23"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/about/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/about/page-71cbefb0ec3213bd.js",revision:"71cbefb0ec3213bd"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/%5Bid%5D/page-139f2080eabb8174.js",revision:"139f2080eabb8174"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/nearby/page-c6060595b5771f41.js",revision:"c6060595b5771f41"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/chat/page-43539f0a96e4acef.js",revision:"43539f0a96e4acef"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/layout-400df1f7daa41287.js",revision:"400df1f7daa41287"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/loading-5d7f7eb7a6350d78.js",revision:"5d7f7eb7a6350d78"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/history/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/history/page-bc2509a258674324.js",revision:"bc2509a258674324"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/order/rate/%5BorderId%5D/page-4f1f4530b6b18b13.js",revision:"4f1f4530b6b18b13"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/page-459035c3fcf589b6.js",revision:"459035c3fcf589b6"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/discount/club/page-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/discount/page-9e822e076a573c85.js",revision:"9e822e076a573c85"},{url:"/_next/static/chunks/app/%5Bname%5D/(Main)/transactions/page-148bb4a8f4457050.js",revision:"148bb4a8f4457050"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/layout-b41b623f4e51ef48.js",revision:"b41b623f4e51ef48"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/address/new/page-93f49e36a1a00101.js",revision:"93f49e36a1a00101"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/address/page-4f4d45074077a0f9.js",revision:"4f4d45074077a0f9"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/edit/page-6ebaa29a4306c828.js",revision:"6ebaa29a4306c828"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/page-5572c4b276501955.js",revision:"5572c4b276501955"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/settings/page-2f51a62e4493930d.js",revision:"2f51a62e4493930d"},{url:"/_next/static/chunks/app/%5Bname%5D/(Profile)/profile/wallet/page-b40e53e545b851db.js",revision:"b40e53e545b851db"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/login/page-67e29eed2639f996.js",revision:"67e29eed2639f996"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/page-19c1f993aa20aa8b.js",revision:"19c1f993aa20aa8b"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/reset-password/page-ee73913677871d56.js",revision:"ee73913677871d56"},{url:"/_next/static/chunks/app/%5Bname%5D/(Proxy)/auth/signup/page-95cb6e942c3a503c.js",revision:"95cb6e942c3a503c"},{url:"/_next/static/chunks/app/%5Bname%5D/layout-c8068b95f3249de2.js",revision:"c8068b95f3249de2"},{url:"/_next/static/chunks/app/_not-found/page-034f1789b0eaeb6b.js",revision:"034f1789b0eaeb6b"},{url:"/_next/static/chunks/app/auth/layout-61580b9e8f17d80b.js",revision:"61580b9e8f17d80b"},{url:"/_next/static/chunks/app/auth/login/page-43c6b24830cfcd2a.js",revision:"43c6b24830cfcd2a"},{url:"/_next/static/chunks/app/auth/page-e525d6d92092bc6c.js",revision:"e525d6d92092bc6c"},{url:"/_next/static/chunks/app/auth/reset-password/page-88435ee2afb64198.js",revision:"88435ee2afb64198"},{url:"/_next/static/chunks/app/auth/signup/page-0b87a0fd077973ca.js",revision:"0b87a0fd077973ca"},{url:"/_next/static/chunks/app/layout-d9bd2d894d1c9cb0.js",revision:"d9bd2d894d1c9cb0"},{url:"/_next/static/chunks/app/loading-5d7f7eb7a6350d78.js",revision:"5d7f7eb7a6350d78"},{url:"/_next/static/chunks/app/page-99f323bd08352c38.js",revision:"99f323bd08352c38"},{url:"/_next/static/chunks/d0deef33.59194872e4111dca.js",revision:"59194872e4111dca"},{url:"/_next/static/chunks/framework-32492dd9c4fc5870.js",revision:"32492dd9c4fc5870"},{url:"/_next/static/chunks/main-82b194b1f42f50c9.js",revision:"82b194b1f42f50c9"},{url:"/_next/static/chunks/main-app-fb228aef04f005ac.js",revision:"fb228aef04f005ac"},{url:"/_next/static/chunks/pages/_app-4b3fb5e477a0267f.js",revision:"4b3fb5e477a0267f"},{url:"/_next/static/chunks/pages/_error-c970d8b55ace1b48.js",revision:"c970d8b55ace1b48"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-b1f5f6f37a5b4a1a.js",revision:"b1f5f6f37a5b4a1a"},{url:"/_next/static/css/2c2be3c8248b4741.css",revision:"2c2be3c8248b4741"},{url:"/_next/static/css/76d468949bbb8328.css",revision:"76d468949bbb8328"},{url:"/_next/static/media/layers-2x.9859cd12.png",revision:"9859cd12"},{url:"/_next/static/media/layers.ef6db872.png",revision:"ef6db872"},{url:"/_next/static/media/marker-icon.d577052a.png",revision:"d577052a"},{url:"/apple-icon.png",revision:"0c11163d9876662afd598cdb681bb2e4"},{url:"/assets/css/fonts.css",revision:"b23bd571553a35e52be7bdfb8805ba5e"},{url:"/assets/fonts/Irancell_Bold.ttf",revision:"e5160b0c919e044bfbcf18a58dd04ad2"},{url:"/assets/fonts/Irancell_Bold.woff",revision:"ed06d53485fd8044e79894bedc597104"},{url:"/assets/fonts/Irancell_Bold.woff2",revision:"04e0058cbeb4dfe083dbf98370ae885e"},{url:"/assets/fonts/Irancell_ExtraBold.ttf",revision:"aca587f4f429c26e887e102f4d46bd27"},{url:"/assets/fonts/Irancell_ExtraBold.woff",revision:"eb70794e10fd476987930ef523ed8a33"},{url:"/assets/fonts/Irancell_ExtraBold.woff2",revision:"5f66486a89926925c4eabcb76aea6ca1"},{url:"/assets/fonts/Irancell_ExtraLight.ttf",revision:"85dd3b644afbabbea860e70d91adb665"},{url:"/assets/fonts/Irancell_ExtraLight.woff",revision:"7491ed7a70e2b9f8fa19c20eac497c12"},{url:"/assets/fonts/Irancell_ExtraLight.woff2",revision:"807b703a3924972991de43d76764f404"},{url:"/assets/fonts/Irancell_Light.ttf",revision:"911a07e375667ba6feeca9a527bc537d"},{url:"/assets/fonts/Irancell_Light.woff",revision:"9c1e83ee95bb25d5adc97011bbab2ae5"},{url:"/assets/fonts/Irancell_Light.woff2",revision:"34404e8d01d1ee40a5bc00311ae2add4"},{url:"/assets/fonts/Irancell_Medium.ttf",revision:"2b8b7463718f1930afc053208efe986e"},{url:"/assets/fonts/Irancell_Medium.woff",revision:"e952c2a8c784e1b13c606f4b9b300310"},{url:"/assets/fonts/Irancell_Medium.woff2",revision:"1955af7b1d4244b4034b793c4435a7e3"},{url:"/assets/fonts/Irancell_Regular.ttf",revision:"3c29a31eaec7ddd32d41879dfcce95b8"},{url:"/assets/fonts/Irancell_Regular.woff",revision:"c9d7d00bddfd0595b68e750574b28312"},{url:"/assets/fonts/Irancell_Regular.woff2",revision:"89eb5fb2d1409229407d1a75426acda0"},{url:"/assets/images/avatar.svg",revision:"ce25555161d92f081746041e2815919a"},{url:"/assets/images/danak-logo.png",revision:"bfbbcd927b3e359c7ab8047211f7c3a3"},{url:"/assets/images/food-image.png",revision:"34520f66d5224a61eca7e83646bdb31e"},{url:"/assets/images/food-preview-hq.png",revision:"42968e21a3044f80db7399459768a16c"},{url:"/assets/images/food-preview.png",revision:"bfc910395c189bfc145fa950dbcca749"},{url:"/assets/images/login-banner.png",revision:"29a467b532dbf3c6e8bcd45e08ea3cde"},{url:"/assets/images/report-hero.svg",revision:"fe10be00fde304933f91cdedab597494"},{url:"/assets/images/user-avatar.png",revision:"0d4b4612ad00442263d2a41754fcadcc"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon0.svg",revision:"6d2cbb302b9f3ef7f2b43ae7d355f6c9"},{url:"/icon1.png",revision:"14e00a23129ccbbe02a835997ecca6c0"},{url:"/icons/restaurant-marker.svg",revision:"72add246cf474e9b703edd352a50b1c8"},{url:"/icons/web-app-manifest-192x192.png",revision:"2bd31374f516557201d060ad4c5695c4"},{url:"/icons/web-app-manifest-512x512.png",revision:"d0f9aa93e12fc2ed5b220efa3db4e689"},{url:"/manifest.json",revision:"fcaa8d06b59646efa18f5d20d22b5ef9"},{url:"/manifests/zhivan/manifest.json",revision:"d4005805de3b85c31998a3fb4bb1dad3"},{url:"/marker-icon-2x.png",revision:"1c824216f354218b04b25a57e0f7ab1f"},{url:"/marker-icon.png",revision:"1c824216f354218b04b25a57e0f7ab1f"},{url:"/marker-shadow.png",revision:"44014eaa598e7050354603adfb44f812"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:a,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); diff --git a/src/app/[name]/(Dialogs)/cart/hook/useCart.ts b/src/app/[name]/(Dialogs)/cart/hook/useCart.ts index 453475f..24a7449 100644 --- a/src/app/[name]/(Dialogs)/cart/hook/useCart.ts +++ b/src/app/[name]/(Dialogs)/cart/hook/useCart.ts @@ -1,4 +1,3 @@ -import { useState } from "react"; import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData"; import { useReceiptStore } from "@/zustand/receiptStore"; import { @@ -11,33 +10,14 @@ import { export const useCart = () => { const { isSuccess } = useGetProfile(); const { clear, increment, decrement, items } = useReceiptStore(); - const [loadingItems, setLoadingItems] = useState>( - new Set() - ); const { mutate: mutateIncrementCart } = useIncrementCart(); const { mutate: mutateDecrementCart } = useDecrementCart(); const { mutate: mutateClearCart } = useClearCart(); - const { data: cartItems } = useGetCartItems(); + const { data: cartItems } = useGetCartItems(isSuccess); const addToCart = (id: string | number) => { if (isSuccess) { - setLoadingItems((prev) => new Set(prev).add(id)); - mutateIncrementCart(id, { - onSuccess: () => { - setLoadingItems((prev) => { - const next = new Set(prev); - next.delete(id); - return next; - }); - }, - onError: () => { - setLoadingItems((prev) => { - const next = new Set(prev); - next.delete(id); - return next; - }); - }, - }); + mutateIncrementCart(id); } else { increment(id); } @@ -45,23 +25,7 @@ export const useCart = () => { const removeFromCart = (id: string | number) => { if (isSuccess) { - setLoadingItems((prev) => new Set(prev).add(id)); - mutateDecrementCart(id, { - onSuccess: () => { - setLoadingItems((prev) => { - const next = new Set(prev); - next.delete(id); - return next; - }); - }, - onError: () => { - setLoadingItems((prev) => { - const next = new Set(prev); - next.delete(id); - return next; - }); - }, - }); + mutateDecrementCart(id); } else { decrement(id); } @@ -89,9 +53,8 @@ export const useCart = () => { } }; - const isItemLoading = (id: string | number) => { - if (!isSuccess) return false; - return loadingItems.has(id); + const isItemLoading = () => { + return false; }; return { diff --git a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts index 524a243..8ce8b8c 100644 --- a/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts +++ b/src/app/[name]/(Dialogs)/cart/hooks/useCartData.ts @@ -1,5 +1,6 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as api from "../service/CartService"; +import type { CartResponse } from "../types/Types"; export const useBulkCart = () => { const queryClient = useQueryClient(); @@ -15,7 +16,48 @@ export const useIncrementCart = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: api.increment, - onSuccess: () => { + onMutate: async (id: string | number) => { + await queryClient.cancelQueries({ queryKey: ["cart-items"] }); + + const previousCart = queryClient.getQueryData([ + "cart-items", + ]); + + if (previousCart?.data) { + const existingItem = previousCart.data.items.find( + (item) => item.foodId === String(id) + ); + + if (existingItem) { + const updatedItems = previousCart.data.items.map((item) => { + if (item.foodId === String(id)) { + return { + ...item, + quantity: item.quantity + 1, + }; + } + return item; + }); + + queryClient.setQueryData(["cart-items"], { + ...previousCart, + data: { + ...previousCart.data, + items: updatedItems, + totalItems: previousCart.data.totalItems + 1, + }, + }); + } + } + + return { previousCart }; + }, + onError: (_err, _id, context) => { + if (context?.previousCart) { + queryClient.setQueryData(["cart-items"], context.previousCart); + } + }, + onSettled: () => { queryClient.invalidateQueries({ queryKey: ["cart-items"] }); }, }); @@ -25,7 +67,48 @@ export const useDecrementCart = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: api.decrement, - onSuccess: () => { + onMutate: async (id: string | number) => { + await queryClient.cancelQueries({ queryKey: ["cart-items"] }); + + const previousCart = queryClient.getQueryData([ + "cart-items", + ]); + + if (previousCart?.data) { + const updatedItems = previousCart.data.items + .map((item) => { + if (item.foodId === String(id)) { + const newQuantity = item.quantity - 1; + if (newQuantity <= 0) { + return null; + } + return { + ...item, + quantity: newQuantity, + }; + } + return item; + }) + .filter((item): item is NonNullable => item !== null); + + queryClient.setQueryData(["cart-items"], { + ...previousCart, + data: { + ...previousCart.data, + items: updatedItems, + totalItems: Math.max(0, previousCart.data.totalItems - 1), + }, + }); + } + + return { previousCart }; + }, + onError: (_err, _id, context) => { + if (context?.previousCart) { + queryClient.setQueryData(["cart-items"], context.previousCart); + } + }, + onSettled: () => { queryClient.invalidateQueries({ queryKey: ["cart-items"] }); }, }); @@ -35,15 +118,43 @@ export const useClearCart = () => { const queryClient = useQueryClient(); return useMutation({ mutationFn: api.clear, - onSuccess: () => { + onMutate: async () => { + await queryClient.cancelQueries({ queryKey: ["cart-items"] }); + + const previousCart = queryClient.getQueryData([ + "cart-items", + ]); + + if (previousCart?.data) { + queryClient.setQueryData(["cart-items"], { + ...previousCart, + data: { + ...previousCart.data, + items: [], + totalItems: 0, + subTotal: 0, + total: 0, + }, + }); + } + + return { previousCart }; + }, + onError: (_err, _variables, context) => { + if (context?.previousCart) { + queryClient.setQueryData(["cart-items"], context.previousCart); + } + }, + onSettled: () => { queryClient.invalidateQueries({ queryKey: ["cart-items"] }); }, }); }; -export const useGetCartItems = () => { +export const useGetCartItems = (enabled = true) => { return useQuery({ queryKey: ["cart-items"], queryFn: api.getCartItems, + enabled, }); }; diff --git a/src/components/listview/MenuItem.tsx b/src/components/listview/MenuItem.tsx index 44bb89d..6655120 100644 --- a/src/components/listview/MenuItem.tsx +++ b/src/components/listview/MenuItem.tsx @@ -7,17 +7,13 @@ import MinusIcon from "@/components/icons/MinusIcon"; import { useCart } from "@/app/[name]/(Dialogs)/cart/hook/useCart"; import { motion } from "framer-motion"; import type { Food } from "@/app/[name]/(Main)/types/Types"; -import { Refresh } from "iconsax-react"; -import { useGetProfile } from "@/app/[name]/(Profile)/profile/hooks/userProfileData"; interface MenuItemProps { food: Food; } const MenuItem = ({ food }: MenuItemProps) => { - const { isSuccess } = useGetProfile(); - const { items, addToCart, removeFromCart, isItemLoading } = useCart(); - const isLoading = isItemLoading(food.id); + const { items, addToCart, removeFromCart } = useCart(); const quantity = useMemo(() => { const item = items?.[food.id]; @@ -89,26 +85,10 @@ const MenuItem = ({ food }: MenuItemProps) => { whileTap={{ scale: 1.05 }} className="bg-background active:drop-shadow-xs max-w-[115px] rounded-md w-full h-8 inline-flex p-1 justify-between items-center gap-2 relative overflow-hidden" > - {isSuccess && isLoading && ( - - - - - - )} {quantity <= 0 ? ( @@ -135,8 +114,7 @@ const MenuItem = ({ food }: MenuItemProps) => {