diff --git a/docker-compose.yml b/docker-compose.yml index 273f48b..027d7b1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,19 +1,22 @@ version: '3.8' services: - prayer-app: + gracious_eldan: image: ghcr.io/nmemmert/prayer-app:latest container_name: prayer-app restart: unless-stopped ports: - - "3000:3000" + - "3050:3000" environment: - NODE_ENV=production - NEXT_PUBLIC_EMAILJS_SERVICE_ID=service_zwpcif9 - NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=template_z50fk3e - NEXT_PUBLIC_EMAILJS_PUBLIC_KEY=W6JhfYIWckVEP2nrm + - FIREBASE_PROJECT_ID=prayer-app-6701f + - FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC55AHf+yi+v5O9\nEV6kfylFqbhI/NJ9ptPV+TeNVBhpgviZxqXVB3TqwyF/opWZa9FsYFyLr2echI65\nUxbCy3oSUMVKMdp5NWVo7PN4JcqrKmemLCEsQ40adMXNVs7K4bEokiN7en4G12sX\n+f8Uj2m+HtogJHU9/xJeqCUV+HxB927CRKsO+G8fPvlsHamJoo9lGNzAiuS8KIKc\noqblNzhit0xUzQgZO8QG6pfoJZ3OjOAeSea9woyqIzL8ANpYmGFsne0n4YnLkJpE\nu0ywEA8PVTCic/GU/Y7cRdtL+qL6WK7sNIFwE+U2tMS18tnGVtpFa46sYH64HTqD\nWY7k0IpFAgMBAAECggEAOP1KBdz+NNyO8pvspAnIIW9S7C12asdGkocBHPb3NQHO\nLXbVSGYs1fxUvMifjJWdcthoBvsTjMym5PIwPDAdkJfqpEB8dkSEfpKGYgNUCv3J\nIQzObr+W9tFuAvHmHBTtNz72WdjH4lkQoB0osqj1BjB3Nvt2ZjdY7mQmWoH/tkkb\nUNk/XTvpTSN51CV2qpI8qsRsUctqGu3yJZpZSoBcgsTdr6G0VUrZxLlg2Jsn2J/G\na9KKsBGWmUnFXNGxHiyxlOST+FGmq6W6TPhSAikhEVr3P47U+MtgoIN/P+veniwJ\nuRwMLUTHaqeYkB0+dkQ/TNVTU2B6UOBKCSZbCMQU0QKBgQDnhhkLOFpWY5hcvV2d\nMnFQbb62WJMdvQ0g7K0Jo5DvLb2qucmVoVoezjj3jPVqOUp3tiJt/bEWNJ4LA7J0\nRJI7k9+JW9wbw8sY40zpiuz6ZJ67iyS9fi9aKIFR09MOZ/TyybCF0SwKq86ABwPM\nXWlOsjyVgNmznjQUNPhsu7l/ywKBgQDNiuevP9HYZq5sRSiX/Fw4Odkq9vsKV9Zc\nSm4CT3Cuytjn1GiQMalKGbe45XUz/lrvN0QVFE+ORjgqE9b2NeSdmHLZDqnbie62\nMo96GVLyfP8GT4yCH0LmHV3lNvsbJVcl0qFFjhMqaa65zk45JQHcSmWOLzLU3o27\nNY3g/Ju8LwKBgQDFuB9rFZUQcb2Mdaucs5dRuGdGEh6RJwIvO/AKa0U6/TUct80P\nm9v6suKzhg2PyZ1u3nxIsn6pGAZgIagk4up/NqmQBILUs0Ce4H6uc5YtwABO6WVW\n7oxB0pWd6+gyRVVKgjPeE+QouNCBRXxY6u0j59MVWhSQ8GpJV3NQaIDiQQKBgBYy\nCsTE6n8oz2sHqNOIv9iefpICK6e5Rn+e1fRP6cYmR3f5WvU/N5212z4PITHlJKKy\nYBq6n8CoWoZIsCzUMwTFoplH2RXI9ksceJvhwjBHSS7ARlcC0zGQOER5RHJw/NEr\nxpiBOBabZO/RlGbdVS8ZpY/ODvonsjxmExUZkiOnAoGASzbkYljSHufy85NEcBL5\n2iP2FR/CgPQjBT99LNZ4VduetPEn76+geoYBY55CTbMgXdbf2R7/MjZfxhJz7ojU\nufivomI8Mzcxz4PCMQxVnsa7jy28u2xAxsapOdg2ftOilzTuLfInXGzLzLPeQAYK\n6VT67TPTfqKVe3bYM2VJXiw=\n-----END PRIVATE KEY-----\n + - FIREBASE_CLIENT_EMAIL=firebase-adminsdk-fbsvc@prayer-app-6701f.iam.gserviceaccount.com networks: - - prayer-network + - gracious_eldan_prayer-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000"] interval: 30s @@ -22,5 +25,20 @@ services: start_period: 40s networks: - prayer-network: - driver: bridge \ No newline at end of file + gracious_eldan_prayer-network: + name: gracious_eldan_prayer-network + driver: bridge + +x-casaos: + author: self + category: self + hostname: "" + icon: https://icon.casaos.io/main/all/prayer-app.png + index: / + is_uncontrolled: false + port_map: "3050" + scheme: http + store_app_id: gracious_eldan + title: + custom: "" + en_us: prayer-app \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index 754ec53..d5a7a78 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1 +1 @@ -if(!self.define){let e,s={};const c=(c,n)=>(c=new URL(c+".js",n).href,s[c]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=s,document.head.appendChild(e)}else e=c,importScripts(c),s()}).then(()=>{let e=s[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e}));self.define=(n,a)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let t={};const r=e=>c(e,i),o={module:{uri:i},exports:t,require:r};s[i]=Promise.all(n.map(e=>o[e]||r(e))).then(e=>(a(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/cZNsOOz6AsqlSRDoNZrT0/_buildManifest.js",revision:"d2b421a3ddcac0c722ca24372451f8ce"},{url:"/_next/static/cZNsOOz6AsqlSRDoNZrT0/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/139.97da462391398dcd.js",revision:"97da462391398dcd"},{url:"/_next/static/chunks/148-615d1fc583e40846.js",revision:"615d1fc583e40846"},{url:"/_next/static/chunks/164f4fb6-17ad80440a3b3920.js",revision:"17ad80440a3b3920"},{url:"/_next/static/chunks/172-1a38936297cc38bc.js",revision:"1a38936297cc38bc"},{url:"/_next/static/chunks/199.cd10280de272c91c.js",revision:"cd10280de272c91c"},{url:"/_next/static/chunks/2f0b94e8-7527bef887b06150.js",revision:"7527bef887b06150"},{url:"/_next/static/chunks/462-8a0461a50c388d15.js",revision:"8a0461a50c388d15"},{url:"/_next/static/chunks/4bd1b696-628cfb3caad2bc1d.js",revision:"628cfb3caad2bc1d"},{url:"/_next/static/chunks/512-8f5e89a9857e3f80.js",revision:"8f5e89a9857e3f80"},{url:"/_next/static/chunks/646.363f2485dd3ba6c3.js",revision:"363f2485dd3ba6c3"},{url:"/_next/static/chunks/7508b87c-410b41f2acbcecc1.js",revision:"410b41f2acbcecc1"},{url:"/_next/static/chunks/931.18379530dad468f9.js",revision:"18379530dad468f9"},{url:"/_next/static/chunks/995.243eda67e2e24a2c.js",revision:"243eda67e2e24a2c"},{url:"/_next/static/chunks/ad2866b8.7839d30dea3f5edd.js",revision:"7839d30dea3f5edd"},{url:"/_next/static/chunks/app/_global-error/page-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/app/_not-found/page-cb3917e7db174c1b.js",revision:"cb3917e7db174c1b"},{url:"/_next/static/chunks/app/admin/page-04bb41370f723a6a.js",revision:"04bb41370f723a6a"},{url:"/_next/static/chunks/app/api/send-email/route-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/app/api/send-scheduled-emails/route-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/app/layout-b2dce4554ba9ca0b.js",revision:"b2dce4554ba9ca0b"},{url:"/_next/static/chunks/app/page-dcf2deebe849ac91.js",revision:"dcf2deebe849ac91"},{url:"/_next/static/chunks/app/profile/page-7e7f10a8be5af96b.js",revision:"7e7f10a8be5af96b"},{url:"/_next/static/chunks/bc98253f.d6fc8a0138855acd.js",revision:"d6fc8a0138855acd"},{url:"/_next/static/chunks/dd8162e8-7de6382133d6a555.js",revision:"7de6382133d6a555"},{url:"/_next/static/chunks/framework-3311683cffde0ebf.js",revision:"3311683cffde0ebf"},{url:"/_next/static/chunks/main-47dd9496debeeb98.js",revision:"47dd9496debeeb98"},{url:"/_next/static/chunks/main-app-c78a9c42a9419335.js",revision:"c78a9c42a9419335"},{url:"/_next/static/chunks/next/dist/client/components/builtin/app-error-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/next/dist/client/components/builtin/forbidden-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/next/dist/client/components/builtin/global-error-b63881b22d0c42fc.js",revision:"b63881b22d0c42fc"},{url:"/_next/static/chunks/next/dist/client/components/builtin/not-found-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/next/dist/client/components/builtin/unauthorized-88bbc163b0c2e76d.js",revision:"88bbc163b0c2e76d"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-9ffa8922fe2c32be.js",revision:"9ffa8922fe2c32be"},{url:"/_next/static/css/6bef0c948e09345f.css",revision:"6bef0c948e09345f"},{url:"/_next/static/media/4cf2300e9c8272f7-s.p.woff2",revision:"18bae71b1e1b2bb25321090a3b563103"},{url:"/_next/static/media/747892c23ea88013-s.woff2",revision:"a0761690ccf4441ace5cec893b82d4ab"},{url:"/_next/static/media/8d697b304b401681-s.woff2",revision:"cc728f6c0adb04da0dfcb0fc436a8ae5"},{url:"/_next/static/media/93f479601ee12b01-s.p.woff2",revision:"da83d5f06d825c5ae65b7cca706cb312"},{url:"/_next/static/media/9610d9e46709d722-s.woff2",revision:"7b7c0ef93df188a852344fc272fc096b"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/firebase-messaging-sw.js",revision:"04d66892653ef67e1151f1ec6c02420b"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192x192.png",revision:"bbbd7efc0e31088ae0a3aeede7608534"},{url:"/icon-512x512.png",revision:"400538d76556a3a8ee4fd3dfda7bc092"},{url:"/locales/en/common.json",revision:"54fe8b7b3b2f39e7604b236e7a480251"},{url:"/manifest.json",revision:"8f6840ae163d807596c5d5736a6300a3"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:c,state:n})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); +if(!self.define){let e,s={};const n=(n,c)=>(n=new URL(n+".js",c).href,s[n]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=s,document.head.appendChild(e)}else e=n,importScripts(n),s()}).then(()=>{let e=s[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(c,i)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(s[a])return;let t={};const r=e=>n(e,a),f={module:{uri:a},exports:t,require:r};s[a]=Promise.all(c.map(e=>f[e]||r(e))).then(e=>(i(...e),t))}}define(["./workbox-4754cb34"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/ZJ1amCf6sWEDnl_cuwfHd/_buildManifest.js",revision:"44608b7d53e1eefcd54452c125d6300e"},{url:"/_next/static/ZJ1amCf6sWEDnl_cuwfHd/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/139.97da462391398dcd.js",revision:"97da462391398dcd"},{url:"/_next/static/chunks/148-615d1fc583e40846.js",revision:"615d1fc583e40846"},{url:"/_next/static/chunks/164f4fb6-17ad80440a3b3920.js",revision:"17ad80440a3b3920"},{url:"/_next/static/chunks/172-1a38936297cc38bc.js",revision:"1a38936297cc38bc"},{url:"/_next/static/chunks/199.cd10280de272c91c.js",revision:"cd10280de272c91c"},{url:"/_next/static/chunks/2f0b94e8-7527bef887b06150.js",revision:"7527bef887b06150"},{url:"/_next/static/chunks/462-3a0dd8f3c0c0a84b.js",revision:"3a0dd8f3c0c0a84b"},{url:"/_next/static/chunks/4bd1b696-628cfb3caad2bc1d.js",revision:"628cfb3caad2bc1d"},{url:"/_next/static/chunks/512-8f5e89a9857e3f80.js",revision:"8f5e89a9857e3f80"},{url:"/_next/static/chunks/646.363f2485dd3ba6c3.js",revision:"363f2485dd3ba6c3"},{url:"/_next/static/chunks/7508b87c-304c1e221a8292f0.js",revision:"304c1e221a8292f0"},{url:"/_next/static/chunks/931.18379530dad468f9.js",revision:"18379530dad468f9"},{url:"/_next/static/chunks/995.243eda67e2e24a2c.js",revision:"243eda67e2e24a2c"},{url:"/_next/static/chunks/ad2866b8.7839d30dea3f5edd.js",revision:"7839d30dea3f5edd"},{url:"/_next/static/chunks/app/_global-error/page-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/app/_not-found/page-cb3917e7db174c1b.js",revision:"cb3917e7db174c1b"},{url:"/_next/static/chunks/app/admin/page-ec37f598b7041c0a.js",revision:"ec37f598b7041c0a"},{url:"/_next/static/chunks/app/api/debug-smtp/route-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/app/api/send-email/route-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/app/api/send-scheduled-emails/route-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/app/layout-b2dce4554ba9ca0b.js",revision:"b2dce4554ba9ca0b"},{url:"/_next/static/chunks/app/page-e27085299217835d.js",revision:"e27085299217835d"},{url:"/_next/static/chunks/app/profile/page-88affc27d21b7c42.js",revision:"88affc27d21b7c42"},{url:"/_next/static/chunks/app/testimonies/page-79be2b9c0d351025.js",revision:"79be2b9c0d351025"},{url:"/_next/static/chunks/bc98253f.d6fc8a0138855acd.js",revision:"d6fc8a0138855acd"},{url:"/_next/static/chunks/dd8162e8-7de6382133d6a555.js",revision:"7de6382133d6a555"},{url:"/_next/static/chunks/framework-3311683cffde0ebf.js",revision:"3311683cffde0ebf"},{url:"/_next/static/chunks/main-47dd9496debeeb98.js",revision:"47dd9496debeeb98"},{url:"/_next/static/chunks/main-app-c78a9c42a9419335.js",revision:"c78a9c42a9419335"},{url:"/_next/static/chunks/next/dist/client/components/builtin/app-error-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/next/dist/client/components/builtin/forbidden-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/next/dist/client/components/builtin/global-error-b63881b22d0c42fc.js",revision:"b63881b22d0c42fc"},{url:"/_next/static/chunks/next/dist/client/components/builtin/not-found-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/next/dist/client/components/builtin/unauthorized-1ce74f8102e311f3.js",revision:"1ce74f8102e311f3"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-9ffa8922fe2c32be.js",revision:"9ffa8922fe2c32be"},{url:"/_next/static/css/56455deeba59cecf.css",revision:"56455deeba59cecf"},{url:"/_next/static/media/4cf2300e9c8272f7-s.p.woff2",revision:"18bae71b1e1b2bb25321090a3b563103"},{url:"/_next/static/media/747892c23ea88013-s.woff2",revision:"a0761690ccf4441ace5cec893b82d4ab"},{url:"/_next/static/media/8d697b304b401681-s.woff2",revision:"cc728f6c0adb04da0dfcb0fc436a8ae5"},{url:"/_next/static/media/93f479601ee12b01-s.p.woff2",revision:"da83d5f06d825c5ae65b7cca706cb312"},{url:"/_next/static/media/9610d9e46709d722-s.woff2",revision:"7b7c0ef93df188a852344fc272fc096b"},{url:"/_next/static/media/ba015fad6dcf6784-s.woff2",revision:"8ea4f719af3312a055caf09f34c89a77"},{url:"/file.svg",revision:"d09f95206c3fa0bb9bd9fefabfd0ea71"},{url:"/firebase-messaging-sw.js",revision:"04d66892653ef67e1151f1ec6c02420b"},{url:"/globe.svg",revision:"2aaafa6a49b6563925fe440891e32717"},{url:"/icon-192x192.png",revision:"bbbd7efc0e31088ae0a3aeede7608534"},{url:"/icon-512x512.png",revision:"400538d76556a3a8ee4fd3dfda7bc092"},{url:"/locales/en/common.json",revision:"54fe8b7b3b2f39e7604b236e7a480251"},{url:"/manifest.json",revision:"8f6840ae163d807596c5d5736a6300a3"},{url:"/next.svg",revision:"8e061864f388b47f33a1c3780831193e"},{url:"/vercel.svg",revision:"c0af2f507b369b085b35ef4bbe3bcf1e"},{url:"/window.svg",revision:"a2760511c65806022ad20adf74370ff3"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:n,state:c})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")},new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")},new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:e})=>!(self.origin===e.origin),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")}); diff --git a/src/app/api/send-scheduled-emails/route.ts b/src/app/api/send-scheduled-emails/route.ts index a52f7f0..c077a61 100644 --- a/src/app/api/send-scheduled-emails/route.ts +++ b/src/app/api/send-scheduled-emails/route.ts @@ -1,5 +1,4 @@ import { NextRequest, NextResponse } from 'next/server'; -import { admin } from '@/lib/firebase-admin'; import nodemailer from 'nodemailer'; function generatePrayerEmailHTML(message: string, subject: string) { @@ -299,9 +298,11 @@ function generatePrayerEmailHTML(message: string, subject: string) { export async function GET() { try { + // Dynamically import Firebase admin to avoid build-time initialization issues + const { admin } = await import('@/lib/firebase-admin'); + console.log('🔄 Checking for scheduled emails...'); - // Get SMTP config using Firebase Admin SDK const configDoc = await admin.firestore().collection('config').doc('smtp').get(); if (!configDoc.exists) { console.log('❌ SMTP configuration not found'); @@ -309,6 +310,10 @@ export async function GET() { } const smtpConfig = configDoc.data(); + if (!smtpConfig) { + console.log('❌ SMTP configuration data is empty'); + return NextResponse.json({ message: 'SMTP configuration data is empty' }, { status: 500 }); + } // Create transporter const transporter = nodemailer.createTransport({ diff --git a/src/app/page.tsx b/src/app/page.tsx index 4400278..9d7d038 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,6 +7,9 @@ import Navbar from '@/components/Navbar'; import LoadingSkeleton from '@/components/LoadingSkeleton'; import PrayerChain from '@/components/PrayerChain'; import SharePrayer from '@/components/SharePrayer'; +import PrayerTemplatesManager from '@/components/PrayerTemplatesManager'; +import PrayerGoalsManager from '@/components/PrayerGoalsManager'; +import EmailTemplatesManager from '@/components/EmailTemplatesManager'; import { db } from '@/lib/firebase'; import { doc, setDoc, collection, addDoc, getDocs, updateDoc, query, where, getDoc } from 'firebase/firestore'; import emailjs from '@emailjs/browser'; diff --git a/src/lib/firebase-admin.ts b/src/lib/firebase-admin.ts index 620865d..9b22ef4 100644 --- a/src/lib/firebase-admin.ts +++ b/src/lib/firebase-admin.ts @@ -1,13 +1,20 @@ import * as admin from 'firebase-admin'; if (!admin.apps.length) { - admin.initializeApp({ - credential: admin.credential.cert({ - projectId: process.env.FIREBASE_PROJECT_ID, - privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'), - clientEmail: process.env.FIREBASE_CLIENT_EMAIL, - }), - }); + // Only initialize if we have the required environment variables + if (process.env.FIREBASE_PROJECT_ID && process.env.FIREBASE_PRIVATE_KEY && process.env.FIREBASE_CLIENT_EMAIL) { + admin.initializeApp({ + credential: admin.credential.cert({ + projectId: process.env.FIREBASE_PROJECT_ID, + privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'), + clientEmail: process.env.FIREBASE_CLIENT_EMAIL, + }), + }); + } else { + // For build time or when env vars are not available, initialize with default credentials + // This will work for client-side operations but may not work for admin operations + admin.initializeApp(); + } } export { admin }; \ No newline at end of file