diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100755 new mode 100644 index 8d56ba1..a771c9f --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -35,7 +35,6 @@ sizes="192x192" href="/images/maskable_icon_x192.png" /> - diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100755 new mode 100644 index 8d56ba1..a771c9f --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -35,7 +35,6 @@ sizes="192x192" href="/images/maskable_icon_x192.png" /> - diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx index 09867dd..7265650 100644 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -46,9 +46,16 @@ localStorage.setItem('Users', JSON.stringify(data.users)) setIsLoading(false) setRemoteHash(data.hash) - // アクセスキーは IndexedDB を primary store として保存する。 - // Cookie は Android ホーム画面 PWA で消えるため使わない。 + // 保存先は IndexedDB を primary とするが、Cookie へも書く。 + // iOS Safari→PWA は A2HS 時に Cookie のみ転送される (IDB は分離) ので、 + // 新規 iOS ユーザーが URL ハッシュ無しで A2HS した場合の bootstrap 救済として + // Safari の Cookie jar に常に最新キーを置いておく。 saveAccessKeyToIDB(newAccessKey) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: newAccessKey }), + }) return data.hash }) .catch(err => { @@ -66,22 +73,33 @@ // 初回読み込み時 useEffect(() => { - // アクセスキーは IndexedDB を primary store として管理する。 - // saveKey は IndexedDB への保存のみ (Cookie へは書かない)。 - const saveKey = (key: string) => saveAccessKeyToIDB(key) + // アクセスキーは IndexedDB を primary store として管理するが、 + // iOS Safari→PWA の A2HS bootstrap 救済のため Cookie へも書く (best-effort)。 + const saveKey = async (key: string) => { + await saveAccessKeyToIDB(key) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: key }), + }) + } const init = async () => { // 1. IndexedDB (primary) からアクセスキーを取得 let idbKey: string | null = await loadAccessKeyFromIDB() // 2. URLハッシュのキーを取得 (deep link / QR / タブ復元で再適用するため URL に残す。 - // キー変更をキャンセルした時のみ後段で消去する)。 + // A2HS の dialog で # が出ないのは PWA install criteria が満たされたときに + // ブラウザが manifest の start_url を採用するから。アドレスバーには # を残す)。 + // キー変更をキャンセルした時のみ後段で消去する。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ移行する。 - // 3a: Cookie (__Host-raikyakun_access) → 移行後は Cookie を破棄 - // 3b: localStorage('AccessKey') + // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ取り込む。 + // 3a: Cookie (__Host-raikyakun_access) 3b: localStorage('AccessKey') + // Cookie は削除しない。iOS Safari→PWA の A2HS 時に Cookie のみが転送される + // ので、Safari の Cookie jar に最新キーを残し続けることが新規 PWA bootstrap + // の救済経路になる。 if (!idbKey && !hashKey) { try { const res = await fetch('/accessKey') @@ -89,7 +107,6 @@ const data: { accessKey: string | null } = await res.json() if (data.accessKey) { await saveAccessKeyToIDB(data.accessKey) - fetch('/accessKey', { method: 'DELETE' }) idbKey = data.accessKey } } diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100755 new mode 100644 index 8d56ba1..a771c9f --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -35,7 +35,6 @@ sizes="192x192" href="/images/maskable_icon_x192.png" /> - diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx index 09867dd..7265650 100644 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -46,9 +46,16 @@ localStorage.setItem('Users', JSON.stringify(data.users)) setIsLoading(false) setRemoteHash(data.hash) - // アクセスキーは IndexedDB を primary store として保存する。 - // Cookie は Android ホーム画面 PWA で消えるため使わない。 + // 保存先は IndexedDB を primary とするが、Cookie へも書く。 + // iOS Safari→PWA は A2HS 時に Cookie のみ転送される (IDB は分離) ので、 + // 新規 iOS ユーザーが URL ハッシュ無しで A2HS した場合の bootstrap 救済として + // Safari の Cookie jar に常に最新キーを置いておく。 saveAccessKeyToIDB(newAccessKey) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: newAccessKey }), + }) return data.hash }) .catch(err => { @@ -66,22 +73,33 @@ // 初回読み込み時 useEffect(() => { - // アクセスキーは IndexedDB を primary store として管理する。 - // saveKey は IndexedDB への保存のみ (Cookie へは書かない)。 - const saveKey = (key: string) => saveAccessKeyToIDB(key) + // アクセスキーは IndexedDB を primary store として管理するが、 + // iOS Safari→PWA の A2HS bootstrap 救済のため Cookie へも書く (best-effort)。 + const saveKey = async (key: string) => { + await saveAccessKeyToIDB(key) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: key }), + }) + } const init = async () => { // 1. IndexedDB (primary) からアクセスキーを取得 let idbKey: string | null = await loadAccessKeyFromIDB() // 2. URLハッシュのキーを取得 (deep link / QR / タブ復元で再適用するため URL に残す。 - // キー変更をキャンセルした時のみ後段で消去する)。 + // A2HS の dialog で # が出ないのは PWA install criteria が満たされたときに + // ブラウザが manifest の start_url を採用するから。アドレスバーには # を残す)。 + // キー変更をキャンセルした時のみ後段で消去する。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ移行する。 - // 3a: Cookie (__Host-raikyakun_access) → 移行後は Cookie を破棄 - // 3b: localStorage('AccessKey') + // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ取り込む。 + // 3a: Cookie (__Host-raikyakun_access) 3b: localStorage('AccessKey') + // Cookie は削除しない。iOS Safari→PWA の A2HS 時に Cookie のみが転送される + // ので、Safari の Cookie jar に最新キーを残し続けることが新規 PWA bootstrap + // の救済経路になる。 if (!idbKey && !hashKey) { try { const res = await fetch('/accessKey') @@ -89,7 +107,6 @@ const data: { accessKey: string | null } = await res.json() if (data.accessKey) { await saveAccessKeyToIDB(data.accessKey) - fetch('/accessKey', { method: 'DELETE' }) idbKey = data.accessKey } } diff --git a/public.tar.gz b/public.tar.gz index b938bce..95500bd 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100755 new mode 100644 index 8d56ba1..a771c9f --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -35,7 +35,6 @@ sizes="192x192" href="/images/maskable_icon_x192.png" /> - diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx index 09867dd..7265650 100644 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -46,9 +46,16 @@ localStorage.setItem('Users', JSON.stringify(data.users)) setIsLoading(false) setRemoteHash(data.hash) - // アクセスキーは IndexedDB を primary store として保存する。 - // Cookie は Android ホーム画面 PWA で消えるため使わない。 + // 保存先は IndexedDB を primary とするが、Cookie へも書く。 + // iOS Safari→PWA は A2HS 時に Cookie のみ転送される (IDB は分離) ので、 + // 新規 iOS ユーザーが URL ハッシュ無しで A2HS した場合の bootstrap 救済として + // Safari の Cookie jar に常に最新キーを置いておく。 saveAccessKeyToIDB(newAccessKey) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: newAccessKey }), + }) return data.hash }) .catch(err => { @@ -66,22 +73,33 @@ // 初回読み込み時 useEffect(() => { - // アクセスキーは IndexedDB を primary store として管理する。 - // saveKey は IndexedDB への保存のみ (Cookie へは書かない)。 - const saveKey = (key: string) => saveAccessKeyToIDB(key) + // アクセスキーは IndexedDB を primary store として管理するが、 + // iOS Safari→PWA の A2HS bootstrap 救済のため Cookie へも書く (best-effort)。 + const saveKey = async (key: string) => { + await saveAccessKeyToIDB(key) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: key }), + }) + } const init = async () => { // 1. IndexedDB (primary) からアクセスキーを取得 let idbKey: string | null = await loadAccessKeyFromIDB() // 2. URLハッシュのキーを取得 (deep link / QR / タブ復元で再適用するため URL に残す。 - // キー変更をキャンセルした時のみ後段で消去する)。 + // A2HS の dialog で # が出ないのは PWA install criteria が満たされたときに + // ブラウザが manifest の start_url を採用するから。アドレスバーには # を残す)。 + // キー変更をキャンセルした時のみ後段で消去する。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ移行する。 - // 3a: Cookie (__Host-raikyakun_access) → 移行後は Cookie を破棄 - // 3b: localStorage('AccessKey') + // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ取り込む。 + // 3a: Cookie (__Host-raikyakun_access) 3b: localStorage('AccessKey') + // Cookie は削除しない。iOS Safari→PWA の A2HS 時に Cookie のみが転送される + // ので、Safari の Cookie jar に最新キーを残し続けることが新規 PWA bootstrap + // の救済経路になる。 if (!idbKey && !hashKey) { try { const res = await fetch('/accessKey') @@ -89,7 +107,6 @@ const data: { accessKey: string | null } = await res.json() if (data.accessKey) { await saveAccessKeyToIDB(data.accessKey) - fetch('/accessKey', { method: 'DELETE' }) idbKey = data.accessKey } } diff --git a/public.tar.gz b/public.tar.gz index b938bce..95500bd 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/standalone.tar.gz b/standalone.tar.gz index 227fa6b..6ff29e2 100644 --- a/standalone.tar.gz +++ b/standalone.tar.gz Binary files differ diff --git a/node/public/sw.js b/node/public/sw.js index fb4daa4..3a61607 100644 --- a/node/public/sw.js +++ b/node/public/sw.js @@ -1 +1 @@ -!function(){"use strict";console.log("WORKER"),[{'revision':'62c272c7bceaf98e1e7cf19f10c2aabe','url':'/_next/app-build-manifest.json'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/actions/page-b2f9cede2932e94f.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/app/page-08eb303ce6f64e15.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'dIV_tNgVQ4foLVBAa3drX','url':'/_next/static/chunks/webpack-daf11a5238b3aae2.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/dIV_tNgVQ4foLVBAa3drX/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file +!function(){"use strict";console.log("WORKER"),[{'revision':'f67105a549d1e746e39b8a06b1e9b5c8','url':'/_next/app-build-manifest.json'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/178-f486c82183c0a700.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/323-83a9c245249d1973.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/357-2d2b29d0e934ef78.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/779-1ccda44af730dfe9.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/891-4a6ec0223a0c9760.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/938-b6fe7d76045b425c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/_not-found/page-cdda61631cd23728.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/actions/page-a309bf3e71691565.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/call/page-82700347f5e4cd14.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/layout-d6e465feefc5e35e.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/app/page-ce333e0f41faa148.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/fd9d1056-a6ea0b22fbc3ba2c.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/framework-aec844d2ccbe7592.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-443475fc6e69d3ba.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/main-app-163f24773b3433a5.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_app-72b849fbd24ac258.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/pages/_error-7ba65e1336b92748.js'},{'revision':'846118c33b2c0e922d7b3a7676f81f6f','url':'/_next/static/chunks/polyfills-42372ed130431b0a.js'},{'revision':'ifUzGFFWOaMGgvJaFVbhl','url':'/_next/static/chunks/webpack-a1a07d2ee7f44621.js'},{'revision':'130cc505dd240a84','url':'/_next/static/css/130cc505dd240a84.css'},{'revision':'2da0ae46fcd526f6','url':'/_next/static/css/2da0ae46fcd526f6.css'},{'revision':'77599c32099fcd80','url':'/_next/static/css/77599c32099fcd80.css'},{'revision':'7e779d9a5c1a15ac','url':'/_next/static/css/7e779d9a5c1a15ac.css'},{'revision':'c155cce658e53418dec34664328b51ac','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_buildManifest.js'},{'revision':'b6652df95db52feb4daf4eca35380933','url':'/_next/static/ifUzGFFWOaMGgvJaFVbhl/_ssgManifest.js'},{'revision':'a0c5b49eea2028b7fd6e3b0d0d1c8a0a','url':'/_next/static/media/001f750b538f7a9e-s.woff2'},{'revision':'9dda5cfc9a46f256d0e131bb535e46f8','url':'/_next/static/media/19cfc7226ec3afaa-s.woff2'},{'revision':'536359ff0fc970eef8be299490b3eaff','url':'/_next/static/media/1a634e73dfeff02c-s.woff2'},{'revision':'b7627e3c9663757d70121f2ad4c8d986','url':'/_next/static/media/1e41be92c43b3255-s.p.woff2'},{'revision':'4e2553027f1d60eff32898367dd4d541','url':'/_next/static/media/21350d82a1f187e9-s.woff2'},{'revision':'1e5f06cab9f9fe1f9df22e2e2aeae2e4','url':'/_next/static/media/4120b0a488381b31-s.woff2'},{'revision':'4409a8110fdf0ba9059a609f00deafbd','url':'/_next/static/media/4f48fe9100901594-s.woff2'},{'revision':'a721fb76b97a8ad2d71e6466a663e7d1','url':'/_next/static/media/5eae37b69937655e-s.woff2'},{'revision':'f852254ed0041481aaac038e94fb24dc','url':'/_next/static/media/80841ae24d03ed90-s.woff2'},{'revision':'01ba6c2a184b8cba08b0d57167664d75','url':'/_next/static/media/8e9860b6e62d6359-s.woff2'},{'revision':'c65df4878c04253139ed838edf774dee','url':'/_next/static/media/970d71e7dcbc144d-s.woff2'},{'revision':'7b8d2e8d1d6863bd8250cdfe9b2a583e','url':'/_next/static/media/b3f718d64f9a6dea-s.woff2'},{'revision':'9e494903d6b0ffec1a1e14d34427d44d','url':'/_next/static/media/ba9851c3c22cd980-s.woff2'},{'revision':'027a89e9ab733a145db70f09b8a18b42','url':'/_next/static/media/c5fe6dc8356a8c31-s.woff2'},{'revision':'d54db44de5ccb18886ece2fda72bdfe0','url':'/_next/static/media/df0a9ae256c0569c-s.woff2'},{'revision':'65850a373e258f1c897a2b3d75eb74de','url':'/_next/static/media/e4af272ccee01ff0-s.p.woff2'},{'revision':'fd0fd1665e816597c3b3b87ac1cd28bc','url':'/images/android-chrome.png'},{'revision':'6f3e3155a3f2321e5f7405f1842faaa7','url':'/images/icon_checkbox_accept.png'},{'revision':'33149b81595b8e5f2f567682590928cf','url':'/images/icon_checkbox_reject.png'},{'revision':'133b7f2dc4ea79de526bbe6a50736e45','url':'/images/install_for_ios.png'},{'revision':'e883b3448099ec5b00b0bd043c5a7430','url':'/images/install_for_ios26.svg'},{'revision':'e19320bec37641bf5b180e1ae046ee78','url':'/images/iphone-bell-icon.png'},{'revision':'88b2400e45bcf521514b7252cbb2d959','url':'/images/iphone-settings-icon.png'},{'revision':'7712da80ea749c4448626fa030a88416','url':'/images/maskable_icon_x128.png'},{'revision':'d17df9b05031ca9232898c1d18c9f800','url':'/images/maskable_icon_x144.png'},{'revision':'97d32f45fa7117f0ef91643cf12b1f2c','url':'/images/maskable_icon_x192.png'},{'revision':'8cc5c97b7006c09dfb4af4e2d9383cee','url':'/images/maskable_icon_x384.png'},{'revision':'3484c469af447168b6f232e40f1ef72e','url':'/images/maskable_icon_x512.png'},{'revision':'752bab2112e77141088d13e6e9dcf6df','url':'/images/らいきゃくんアプリ.png'},{'revision':'758c6c5ac011effba3c9d102f51356a6','url':'/sw.js'},{'revision':'facf02c3cd022e48ee4dcada88dd5d1f','url':'/url.png'}],self.addEventListener("push",function(o){console.log("data",o.data.text());let{message:n,callId:i,createdAt:r,visitor:s,dst:c}=JSON.parse(o.data.text()),a=t().then(t=>{var o;return o={callId:i,createdAt:r,visitor:s,dst:c},new Promise((n,i)=>{let r=t.transaction([e],"readwrite").objectStore(e).put(o);r.onerror=e=>i(e.target.errorCode),r.onsuccess=e=>n(e.target.result)})}),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:r,visitor:s,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});o.waitUntil(Promise.all([a,l]).catch(e=>{console.error("Error in one of the push event processes:",e)}))}),self.addEventListener("notificationclick",function(e){var t;console.log("notificationclick");let o=null==e?void 0:null===(t=e.notification)||void 0===t?void 0:t.data;e.notification.close(),e.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then(function(t){let n="/actions?data=".concat(encodeURIComponent(o),"&action=").concat(e.action);for(let e=0;e{let n=indexedDB.open("pwa-db",1);n.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},n.onerror=e=>o(e.target.errorCode),n.onsuccess=e=>t(e.target.result)})}async function o(e){try{console.log(e);let o=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:e})});if(!o.ok)throw Error("Failed to subscribe to push service.");let n=await o.json(),i=await t();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(e){console.error("Error in subscribePush:",e)}}async function n(e){if(console.log(e),!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:e})})).ok)throw Error("Failed to subscribe to push service.")}}(); \ No newline at end of file diff --git a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js b/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js deleted file mode 100644 index c9ce282..0000000 --- a/node/public/worker-dIV_tNgVQ4foLVBAa3drX.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js new file mode 100644 index 0000000..c9ce282 --- /dev/null +++ b/node/public/worker-ifUzGFFWOaMGgvJaFVbhl.js @@ -0,0 +1 @@ +(()=>{"use strict";console.log("WORKER"),self.__WB_MANIFEST,self.addEventListener("push",(function(t){console.log("data",t.data.text());const{message:n,callId:i,createdAt:s,visitor:r,dst:c}=JSON.parse(t.data.text()),a=o().then((t=>function(t,o){return new Promise(((n,i)=>{const s=t.transaction([e],"readwrite").objectStore(e).put(o);s.onerror=t=>i(t.target.errorCode),s.onsuccess=t=>n(t.target.result)}))}(t,{callId:i,createdAt:s,visitor:r,dst:c}))),l=registration.showNotification(n,{body:"30秒以内に回答してください",icon:"/icons/android-chrome-192x192.png",data:JSON.stringify({callId:i,createdAt:s,visitor:r,dst:c}),actions:[{action:"accept",title:"対応可能"},{action:"reject",title:"対応不可"}]});t.waitUntil(Promise.all([a,l]).catch((t=>{console.error("Error in one of the push event processes:",t)})))})),self.addEventListener("notificationclick",(function(t){var e;console.log("notificationclick");const o=null==t||null===(e=t.notification)||void 0===e?void 0:e.data;t.notification.close(),t.waitUntil(clients.matchAll({type:"window",includeUncontrolled:!0,userVisibleOnly:!0}).then((function(e){let n=`/actions?data=${encodeURIComponent(o)}&action=${t.action}`;for(let t=0;t{const i=indexedDB.open(t,1);i.onupgradeneeded=t=>{t.target.result.createObjectStore(e,{keyPath:"id"})},i.onerror=t=>n(t.target.errorCode),i.onsuccess=t=>o(t.target.result)}))}async function n(t){try{console.log(t);const e=await fetch("/api/mobile",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({registration:t})});if(!e.ok)throw new Error("Failed to subscribe to push service.");const n=await e.json(),i=await o();await storeIdentifier(i,n.identifier),console.log("Identifier stored in IndexedDB:",n.identifier)}catch(t){console.error("Error in subscribePush:",t)}}async function i(t){console.log(t);if(!(await fetch("/api/mobile",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({oldSubscription:t})})).ok)throw new Error("Failed to subscribe to push service.")}})(); \ No newline at end of file diff --git a/node/src/app/actions/page.tsx b/node/src/app/actions/page.tsx index d9384cb..77f6aee 100644 --- a/node/src/app/actions/page.tsx +++ b/node/src/app/actions/page.tsx @@ -82,7 +82,8 @@ if(messages.length > 0) setTemplateMessage(messages[0]) } // アクセスキーは IndexedDB が primary store。無ければ旧保存先 (Cookie / localStorage) - // から IndexedDB へ移行する。 + // から IndexedDB へ取り込む。Cookie は削除しない (iOS Safari→PWA の A2HS で Cookie + // だけが転送されるため、新規 PWA bootstrap 救済経路として常時残しておく)。 loadAccessKeyFromIDB() .then(async (idbKey): Promise => { if (idbKey) return idbKey @@ -92,7 +93,6 @@ const { accessKey: cookieKey }: { accessKey: string | null } = await res.json() if (cookieKey) { await saveAccessKeyToIDB(cookieKey) - fetch('/accessKey', { method: 'DELETE' }) return cookieKey } } diff --git a/node/src/app/layout.tsx b/node/src/app/layout.tsx old mode 100755 new mode 100644 index 8d56ba1..a771c9f --- a/node/src/app/layout.tsx +++ b/node/src/app/layout.tsx @@ -35,7 +35,6 @@ sizes="192x192" href="/images/maskable_icon_x192.png" /> - diff --git a/node/src/app/useWebpush.tsx b/node/src/app/useWebpush.tsx index 09867dd..7265650 100644 --- a/node/src/app/useWebpush.tsx +++ b/node/src/app/useWebpush.tsx @@ -46,9 +46,16 @@ localStorage.setItem('Users', JSON.stringify(data.users)) setIsLoading(false) setRemoteHash(data.hash) - // アクセスキーは IndexedDB を primary store として保存する。 - // Cookie は Android ホーム画面 PWA で消えるため使わない。 + // 保存先は IndexedDB を primary とするが、Cookie へも書く。 + // iOS Safari→PWA は A2HS 時に Cookie のみ転送される (IDB は分離) ので、 + // 新規 iOS ユーザーが URL ハッシュ無しで A2HS した場合の bootstrap 救済として + // Safari の Cookie jar に常に最新キーを置いておく。 saveAccessKeyToIDB(newAccessKey) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: newAccessKey }), + }) return data.hash }) .catch(err => { @@ -66,22 +73,33 @@ // 初回読み込み時 useEffect(() => { - // アクセスキーは IndexedDB を primary store として管理する。 - // saveKey は IndexedDB への保存のみ (Cookie へは書かない)。 - const saveKey = (key: string) => saveAccessKeyToIDB(key) + // アクセスキーは IndexedDB を primary store として管理するが、 + // iOS Safari→PWA の A2HS bootstrap 救済のため Cookie へも書く (best-effort)。 + const saveKey = async (key: string) => { + await saveAccessKeyToIDB(key) + fetch('/accessKey', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ accessKey: key }), + }) + } const init = async () => { // 1. IndexedDB (primary) からアクセスキーを取得 let idbKey: string | null = await loadAccessKeyFromIDB() // 2. URLハッシュのキーを取得 (deep link / QR / タブ復元で再適用するため URL に残す。 - // キー変更をキャンセルした時のみ後段で消去する)。 + // A2HS の dialog で # が出ないのは PWA install criteria が満たされたときに + // ブラウザが manifest の start_url を採用するから。アドレスバーには # を残す)。 + // キー変更をキャンセルした時のみ後段で消去する。 const hashMatch = window.location.hash.match(/[#&]accessKey=([^&]+)/) const hashKey = hashMatch ? decodeURIComponent(hashMatch[1]) : null - // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ移行する。 - // 3a: Cookie (__Host-raikyakun_access) → 移行後は Cookie を破棄 - // 3b: localStorage('AccessKey') + // 3. IndexedDB にもハッシュにも無ければ、旧保存先から IndexedDB へ取り込む。 + // 3a: Cookie (__Host-raikyakun_access) 3b: localStorage('AccessKey') + // Cookie は削除しない。iOS Safari→PWA の A2HS 時に Cookie のみが転送される + // ので、Safari の Cookie jar に最新キーを残し続けることが新規 PWA bootstrap + // の救済経路になる。 if (!idbKey && !hashKey) { try { const res = await fetch('/accessKey') @@ -89,7 +107,6 @@ const data: { accessKey: string | null } = await res.json() if (data.accessKey) { await saveAccessKeyToIDB(data.accessKey) - fetch('/accessKey', { method: 'DELETE' }) idbKey = data.accessKey } } diff --git a/public.tar.gz b/public.tar.gz index b938bce..95500bd 100644 --- a/public.tar.gz +++ b/public.tar.gz Binary files differ diff --git a/standalone.tar.gz b/standalone.tar.gz index 227fa6b..6ff29e2 100644 --- a/standalone.tar.gz +++ b/standalone.tar.gz Binary files differ diff --git a/static.tar.gz b/static.tar.gz index 80fdc08..5a59d94 100644 --- a/static.tar.gz +++ b/static.tar.gz Binary files differ