diff --git a/global.d.ts b/global.d.ts index 131286b..86bc4f1 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1 +1,2 @@ declare module 'next-pwa'; +declare module 'jalaali-js'; diff --git a/package-lock.json b/package-lock.json index 694f283..58a09f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "chart.js": "^4.5.0", + "jalaali-js": "^1.2.8", "next": "15.5.4", "next-pwa": "^5.6.0", "react": "19.1.0", @@ -6558,6 +6559,12 @@ "node": ">=10" } }, + "node_modules/jalaali-js": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.8.tgz", + "integrity": "sha512-Jl/EwY84JwjW2wsWqeU4pNd22VNQ7EkjI36bDuLw31wH98WQW4fPjD0+mG7cdCK+Y8D6s9R3zLiQ3LaKu6bD8A==", + "license": "MIT" + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", diff --git a/package.json b/package.json index f77ce69..6c467a2 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "lint": "eslint" }, "dependencies": { - "jalaali-js": "^1.2.6", "chart.js": "^4.5.0", + "jalaali-js": "^1.2.8", "next": "15.5.4", "next-pwa": "^5.6.0", "react": "19.1.0", diff --git a/public/sw.js b/public/sw.js index d811f6c..c034636 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,t)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(s[c])return;let i={};const r=e=>a(e,c),f={module:{uri:c},exports:i,require:r};s[c]=Promise.all(n.map(e=>f[e]||r(e))).then(e=>(t(...e),i))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"2c10175d8792c97b42ca7a60347e10ed"},{url:"/_next/static/chunks/139.7a5a8e93a21948c1.js",revision:"7a5a8e93a21948c1"},{url:"/_next/static/chunks/255-4efeec91c7871d79.js",revision:"4efeec91c7871d79"},{url:"/_next/static/chunks/4bd1b696-c023c6e3521b1417.js",revision:"c023c6e3521b1417"},{url:"/_next/static/chunks/638-35d211edcf8e7b08.js",revision:"35d211edcf8e7b08"},{url:"/_next/static/chunks/646.f342b7cffc01feb0.js",revision:"f342b7cffc01feb0"},{url:"/_next/static/chunks/app/_not-found/page-5191f0f6258b1ec1.js",revision:"5191f0f6258b1ec1"},{url:"/_next/static/chunks/app/calendar/month/page-cb36aa056453e5ce.js",revision:"cb36aa056453e5ce"},{url:"/_next/static/chunks/app/calendar/page-11c4b9df3042f95a.js",revision:"11c4b9df3042f95a"},{url:"/_next/static/chunks/app/day_details/page-27aaa02f5fc3938c.js",revision:"27aaa02f5fc3938c"},{url:"/_next/static/chunks/app/device_settings/page-57385c5b3af4d389.js",revision:"57385c5b3af4d389"},{url:"/_next/static/chunks/app/devices/page-69551ed382ff34f4.js",revision:"69551ed382ff34f4"},{url:"/_next/static/chunks/app/layout-20802b7028a4f9b5.js",revision:"20802b7028a4f9b5"},{url:"/_next/static/chunks/app/month_select/page-20a1b4d2a5859b76.js",revision:"20a1b4d2a5859b76"},{url:"/_next/static/chunks/app/page-f47082ca351a8369.js",revision:"f47082ca351a8369"},{url:"/_next/static/chunks/ca377847-f6e45424dfc78afc.js",revision:"f6e45424dfc78afc"},{url:"/_next/static/chunks/framework-acd67e14855de5a2.js",revision:"acd67e14855de5a2"},{url:"/_next/static/chunks/main-1e4b9f954557e26e.js",revision:"1e4b9f954557e26e"},{url:"/_next/static/chunks/main-app-ccaeafef51f7075b.js",revision:"ccaeafef51f7075b"},{url:"/_next/static/chunks/pages/_app-82835f42865034fa.js",revision:"82835f42865034fa"},{url:"/_next/static/chunks/pages/_error-013f4188946cdd04.js",revision:"013f4188946cdd04"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-a2a7106df7a920d1.js",revision:"a2a7106df7a920d1"},{url:"/_next/static/css/aab922033daa1b61.css",revision:"aab922033daa1b61"},{url:"/_next/static/ytmtrLUqNgiFg4YJjsWVX/_buildManifest.js",revision:"dfa6ee76df81d588cd43a11576b4f2d1"},{url:"/_next/static/ytmtrLUqNgiFg4YJjsWVX/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192.png",revision:"a8f5fbdcdd5ae60dfbf04c412a29366c"},{url:"/icon-512.png",revision:"386b6a1e6cf3e2e5012c72359a20018b"},{url:"/manifest.json",revision:"bb3b5e9c94d68d189f1ad2f0cf8e4c0e"},{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,t)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let c={};const r=e=>a(e,i),f={module:{uri:i},exports:c,require:r};s[i]=Promise.all(n.map(e=>f[e]||r(e))).then(e=>(t(...e),c))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/app-build-manifest.json",revision:"a15966a041cf07b186d84e068867b754"},{url:"/_next/static/X6BpqBqKZqclHqSOt2VZ4/_buildManifest.js",revision:"dfa6ee76df81d588cd43a11576b4f2d1"},{url:"/_next/static/X6BpqBqKZqclHqSOt2VZ4/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/139.7a5a8e93a21948c1.js",revision:"7a5a8e93a21948c1"},{url:"/_next/static/chunks/223-5a7ab5e72b6f383b.js",revision:"5a7ab5e72b6f383b"},{url:"/_next/static/chunks/255-4efeec91c7871d79.js",revision:"4efeec91c7871d79"},{url:"/_next/static/chunks/4bd1b696-c023c6e3521b1417.js",revision:"c023c6e3521b1417"},{url:"/_next/static/chunks/646.f342b7cffc01feb0.js",revision:"f342b7cffc01feb0"},{url:"/_next/static/chunks/app/_not-found/page-5191f0f6258b1ec1.js",revision:"5191f0f6258b1ec1"},{url:"/_next/static/chunks/app/calendar/month/page-0434baa5123a85f1.js",revision:"0434baa5123a85f1"},{url:"/_next/static/chunks/app/calendar/page-99af92619a2ddfec.js",revision:"99af92619a2ddfec"},{url:"/_next/static/chunks/app/day_details/page-5131311f21adb520.js",revision:"5131311f21adb520"},{url:"/_next/static/chunks/app/device_settings/page-6829625d24bec575.js",revision:"6829625d24bec575"},{url:"/_next/static/chunks/app/devices/page-72355d75ab5f2149.js",revision:"72355d75ab5f2149"},{url:"/_next/static/chunks/app/layout-20802b7028a4f9b5.js",revision:"20802b7028a4f9b5"},{url:"/_next/static/chunks/app/month_select/page-8d4c94bee7fd07af.js",revision:"8d4c94bee7fd07af"},{url:"/_next/static/chunks/app/page-f47082ca351a8369.js",revision:"f47082ca351a8369"},{url:"/_next/static/chunks/ca377847-f6e45424dfc78afc.js",revision:"f6e45424dfc78afc"},{url:"/_next/static/chunks/framework-acd67e14855de5a2.js",revision:"acd67e14855de5a2"},{url:"/_next/static/chunks/main-1e4b9f954557e26e.js",revision:"1e4b9f954557e26e"},{url:"/_next/static/chunks/main-app-ccaeafef51f7075b.js",revision:"ccaeafef51f7075b"},{url:"/_next/static/chunks/pages/_app-82835f42865034fa.js",revision:"82835f42865034fa"},{url:"/_next/static/chunks/pages/_error-013f4188946cdd04.js",revision:"013f4188946cdd04"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-a2a7106df7a920d1.js",revision:"a2a7106df7a920d1"},{url:"/_next/static/css/f20cda96e4316492.css",revision:"f20cda96e4316492"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192.png",revision:"a8f5fbdcdd5ae60dfbf04c412a29366c"},{url:"/icon-512.png",revision:"386b6a1e6cf3e2e5012c72359a20018b"},{url:"/manifest.json",revision:"bb3b5e9c94d68d189f1ad2f0cf8e4c0e"},{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/devices/page.tsx b/src/app/devices/page.tsx index 340b3dc..50e1fc4 100644 --- a/src/app/devices/page.tsx +++ b/src/app/devices/page.tsx @@ -70,7 +70,7 @@ export default function DevicesPage() { // فراخوانی API برای بررسی دستگاه const device = await api.CheckDevice(currentDeviceName.trim(), currentPassword.trim()) - if (device) { + if (device !=undefined) { setSelected(device) } else { setError('دستگاه یافت نشد یا رمز عبور نادرست است') diff --git a/src/lib/api.ts b/src/lib/api.ts index 1ea06bb..0bac343 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -58,7 +58,7 @@ async function http(url: string, init?: RequestInit): Promise { } export const api = { - CheckDevice: (deviceName: string, password: string) => http(`${API_BASE}/api/devices/CheckDevice?deviceName=${deviceName}&password=${password}`), + CheckDevice: (deviceName: string, password: string) => http(`${API_BASE}/api/devices/CheckDevice?deviceName=${deviceName}&password=${password}`), listDevices: () => http(`${API_BASE}/api/devices`), createDevice: (dto: DeviceDto) => http(`${API_BASE}/api/devices`, { method: 'POST', body: JSON.stringify(dto) }), listTelemetry: (q: { deviceId?: number; startUtc?: string; endUtc?: string; page?: number; pageSize?: number }) => {