feat: Add prayer chains, social sharing, and testimony wall
- Add PrayerChain component for visualizing linked prayers - Add SharePrayer component with social media integration (Twitter, Facebook, WhatsApp, copy link) - Create /testimonies page for public answered prayer stories - Update Firestore rules for public testimony access - Enhance Organization tab with prayer chains - Add Testimonies navigation tab - Fix Firebase Admin SDK integration for server-side operations - Improve email system with proper server-side authentication - Update prayer form to handle optional fields correctly - Deploy updated Firestore security rules
This commit is contained in:
1 parent
7214fdb89a
commit
d9784738e4
32 files changed
+3146
-3236
No files matched your search
+1
-100
@@ -1,100 +1 @@
|
||||
/**
|
||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// If the loader is already loaded, just stop.
|
||||
if (!self.define) {
|
||||
let registry = {};
|
||||
|
||||
// Used for `eval` and `importScripts` where we can't get script URL by other means.
|
||||
// In both cases, it's safe to use a global var because those functions are synchronous.
|
||||
let nextDefineUri;
|
||||
|
||||
const singleRequire = (uri, parentUri) => {
|
||||
uri = new URL(uri + ".js", parentUri).href;
|
||||
return registry[uri] || (
|
||||
|
||||
new Promise(resolve => {
|
||||
if ("document" in self) {
|
||||
const script = document.createElement("script");
|
||||
script.src = uri;
|
||||
script.onload = resolve;
|
||||
document.head.appendChild(script);
|
||||
} else {
|
||||
nextDefineUri = uri;
|
||||
importScripts(uri);
|
||||
resolve();
|
||||
}
|
||||
})
|
||||
|
||||
.then(() => {
|
||||
let promise = registry[uri];
|
||||
if (!promise) {
|
||||
throw new Error(`Module ${uri} didn’t register its module`);
|
||||
}
|
||||
return promise;
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
self.define = (depsNames, factory) => {
|
||||
const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href;
|
||||
if (registry[uri]) {
|
||||
// Module is already loading or loaded.
|
||||
return;
|
||||
}
|
||||
let exports = {};
|
||||
const require = depUri => singleRequire(depUri, uri);
|
||||
const specialDeps = {
|
||||
module: { uri },
|
||||
exports,
|
||||
require
|
||||
};
|
||||
registry[uri] = Promise.all(depsNames.map(
|
||||
depName => specialDeps[depName] || require(depName)
|
||||
)).then(deps => {
|
||||
factory(...deps);
|
||||
return exports;
|
||||
});
|
||||
};
|
||||
}
|
||||
define(['./workbox-e43f5367'], (function (workbox) { 'use strict';
|
||||
|
||||
importScripts();
|
||||
self.skipWaiting();
|
||||
workbox.clientsClaim();
|
||||
workbox.registerRoute("/", new workbox.NetworkFirst({
|
||||
"cacheName": "start-url",
|
||||
plugins: [{
|
||||
cacheWillUpdate: async ({
|
||||
request,
|
||||
response,
|
||||
event,
|
||||
state
|
||||
}) => {
|
||||
if (response && response.type === 'opaqueredirect') {
|
||||
return new Response(response.body, {
|
||||
status: 200,
|
||||
statusText: 'OK',
|
||||
headers: response.headers
|
||||
});
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}]
|
||||
}), 'GET');
|
||||
workbox.registerRoute(/.*/i, new workbox.NetworkOnly({
|
||||
"cacheName": "dev",
|
||||
plugins: []
|
||||
}), 'GET');
|
||||
|
||||
}));
|
||||
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:"bbbd7efc0e31088ae0a3aeedLine truncated
|
||||
Reference in new issue
Block a user