Compare commits

18 Commits
Author SHA1 Message Date
ayushya 329265aabb v1.1.1/release styling fixes, add links 2021-04-22 23:47:22 -04:00
ayushya 87e4916db6 v1.1.1/release
fix stylings
2021-04-22 23:06:11 -04:00
ayushya 21b65cadea v1.1.0/release 2021-04-22 17:04:51 -04:00
ayushya 06b18c14cd v1.1.0/release
-fix dose logic
-fix popup icon style
2021-04-22 12:11:23 -04:00
ayushya 732bd6887c v1.1.0/release functions
(fix lint, build, ignore script)
2021-04-21 23:10:39 -04:00
ayushya abb00ef27b v1.1.0/release 2021-04-21 13:04:00 -04:00
ayushya 36674febe4 V1.1.0/add compat functions, script to update, data source select 2021-04-21 00:00:42 -04:00
ayushya 50f1f53669 v1.1.0/remove lib and secret 2021-04-20 21:31:38 -04:00
ayushya 5c39e8a628 v1.1.0/number values and efficacy 2021-04-20 20:16:21 -04:00
ayushya 2eabb6807f v1.1.0/server side second dose 2021-04-19 22:41:34 -04:00
ayushya 3055bf4521 v1.1.0/setup emulators 2021-04-18 20:52:40 -04:00
ayushya 7b3d288967 v1.0.1/release
Add helper text for updating
2021-04-14 23:15:31 -04:00
ayushya 3040c6f064 v1.0.1/release
copyright & privacy policy. fix update path bug
2021-04-14 21:28:46 -04:00
ayushya eb63c9c48f v1.0.0/release
finalize update and set logic
2021-04-14 11:42:49 -04:00
ayushya 67c0492583 v1.0.0/release
finalize update and set logic
2021-04-14 11:03:06 -04:00
ayushya 6accac1ea4 v1.0.0/release 2021-04-14 01:22:39 -04:00
ayushya f8da0347da V0.0.9 / Styling Done 2021-04-13 21:13:18 -04:00
ayushya ca7ea5fbf3 Start of Vax & Me 2021-04-08 02:00:00 -04:00
39 changed files with 23344 additions and 2217 deletions
Vendored
BIN
View File
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
{
"projects": {
"default": "vaxandme"
}
}
+30
View File
@@ -0,0 +1,30 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
*/node_modules
/.pnp
.pnp.js
.firebase
# testing
/coverage
# production
*/build
*/lib
*/exportDB
firebaseSecret.json
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*.cache
*/*.log*
+75
View File
@@ -0,0 +1,75 @@
{
"hosting": {
"public": "website/build",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "/copyright",
"destination": "/copyright.html"
},
{
"source": "/privacy",
"destination": "/privacy.html"
},
{
"source": "/jj",
"destination": "/index.html"
},
{
"source": "/pb",
"destination": "/index.html"
},
{
"source": "/md",
"destination": "/index.html"
},
{
"source": "/jj/**",
"destination": "/index.html"
},
{
"source": "/pb/**",
"destination": "/index.html"
},
{
"source": "/md/**",
"destination": "/index.html"
},
{
"source": "**",
"destination": "/404.html"
}
]
},
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
],
"source": "functions",
"ignore": [
"functions/scripts"
]
},
"emulators": {
"functions": {
"host": "192.168.86.46",
"port": 5001
},
"firestore": {
"host": "192.168.86.46",
"port": 8080
},
"hosting": {
"host": "192.168.86.46",
"port": 5000
},
"ui": {
"enabled": true
}
}
}
+29
View File
@@ -0,0 +1,29 @@
module.exports = {
root: true,
env: {
es6: true,
node: true,
},
extends: [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings",
"plugin:import/typescript",
"google",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
parserOptions: {
project: ["tsconfig.json", "tsconfig.dev.json"],
sourceType: "module",
tsconfigRootDir: __dirname,
},
ignorePatterns: [
"/lib/**/*", // Ignore built files.
"/scripts/**/*", // Ignore scripts
],
plugins: ["@typescript-eslint", "import"],
rules: {
quotes: ["error", "double"],
},
};
+3243
View File
File diff suppressed because it is too large Load Diff
+30
View File
@@ -0,0 +1,30 @@
{
"name": "vaxandme-api",
"scripts": {
"lint": "eslint --ext .js,.ts .",
"build": "tsc",
"serve": "npm run build && firebase emulators:start --import ./exportDB",
"shell": "npm run build && firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "12"
},
"main": "lib/index.js",
"dependencies": {
"firebase-admin": "^9.2.0",
"firebase-functions": "^3.11.0"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^3.9.1",
"@typescript-eslint/parser": "^3.8.0",
"eslint": "^7.6.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.22.0",
"firebase-functions-test": "^0.2.0",
"typescript": "^3.8.0"
},
"private": true
}
+185
View File
@@ -0,0 +1,185 @@
const admin = require("firebase-admin");
const firebaseSecret = require("../src/firebaseSecret.json");
admin.initializeApp({
credential: admin.credential.cert(firebaseSecret),
});
const VAX_NAMES = {
PB: "Pfizer-BioNTech",
MD: "Moderna",
JJ: "J&J Janssen",
};
const VAX_DOSES = {
ONE: "Dose 1",
TWO: "Dose 2",
};
const VAX_AGES = {
"Pfizer-BioNTech": {
YOUNGER: "18 - 55",
OLDER: "56 & Older",
},
"Moderna": {
YOUNGER: "18 - 64",
OLDER: "65 & Older",
},
"J&J Janssen": {
YOUNGER: "18 - 59",
OLDER: "60 & Older",
},
};
// PFIZER COUNTS
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.PB)
.where("dose", "in", [VAX_DOSES.ONE, VAX_DOSES.TWO])
.where("age", "==", VAX_AGES[VAX_NAMES.PB].YOUNGER)
.get()
.then((docs) => {
console.log("PB_ONE_YOUNGER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.PB)
.update({
[`${VAX_DOSES.ONE}.${VAX_AGES[VAX_NAMES.PB].YOUNGER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.PB)
.where("dose", "==", VAX_DOSES.TWO)
.where("age", "==", VAX_AGES[VAX_NAMES.PB].YOUNGER)
.get()
.then((docs) => {
console.log("PB_TWO_YOUNGER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.PB)
.update({
[`${VAX_DOSES.TWO}.${VAX_AGES[VAX_NAMES.PB].YOUNGER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.PB)
.where("dose", "in", [VAX_DOSES.ONE, VAX_DOSES.TWO])
.where("age", "==", VAX_AGES[VAX_NAMES.PB].OLDER)
.get()
.then((docs) => {
console.log("PB_ONE_OLDER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.PB)
.update({
[`${VAX_DOSES.ONE}.${VAX_AGES[VAX_NAMES.PB].OLDER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.PB)
.where("dose", "==", VAX_DOSES.TWO)
.where("age", "==", VAX_AGES[VAX_NAMES.PB].OLDER)
.get()
.then((docs) => {
console.log("PB_TWO_OLDER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.PB)
.update({
[`${VAX_DOSES.TWO}.${VAX_AGES[VAX_NAMES.PB].OLDER}.count`]:
docs.docs.length,
});
});
// MODERNA COUNTS
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.MD)
.where("dose", "in", [VAX_DOSES.ONE, VAX_DOSES.TWO])
.where("age", "==", VAX_AGES[VAX_NAMES.MD].YOUNGER)
.get()
.then((docs) => {
console.log("MD_ONE_YOUNGER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.MD)
.update({
[`${VAX_DOSES.ONE}.${VAX_AGES[VAX_NAMES.MD].YOUNGER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.MD)
.where("dose", "==", VAX_DOSES.TWO)
.where("age", "==", VAX_AGES[VAX_NAMES.MD].YOUNGER)
.get()
.then((docs) => {
console.log("MD_TWO_YOUNGER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.MD)
.update({
[`${VAX_DOSES.TWO}.${VAX_AGES[VAX_NAMES.MD].YOUNGER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.MD)
.where("dose", "in", [VAX_DOSES.ONE, VAX_DOSES.TWO])
.where("age", "==", VAX_AGES[VAX_NAMES.MD].OLDER)
.get()
.then((docs) => {
console.log("MD_ONE_OLDER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.MD)
.update({
[`${VAX_DOSES.ONE}.${VAX_AGES[VAX_NAMES.MD].OLDER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.MD)
.where("dose", "==", VAX_DOSES.TWO)
.where("age", "==", VAX_AGES[VAX_NAMES.MD].OLDER)
.get()
.then((docs) => {
console.log("MD_TWO_OLDER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.MD)
.update({
[`${VAX_DOSES.TWO}.${VAX_AGES[VAX_NAMES.MD].OLDER}.count`]:
docs.docs.length,
});
});
// J&J COUNTS
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.JJ)
.where("age", "==", VAX_AGES[VAX_NAMES.JJ].YOUNGER)
.get()
.then((docs) => {
console.log("JJ_YOUNGER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.JJ)
.update({
[`${VAX_AGES[VAX_NAMES.JJ].YOUNGER}.count`]:
docs.docs.length,
});
});
admin.firestore().collection("results")
.where("name", "==", VAX_NAMES.JJ)
.where("age", "==", VAX_AGES[VAX_NAMES.JJ].OLDER)
.get()
.then((docs) => {
console.log("JJ_OLDER", docs.docs.length);
admin.firestore()
.collection("stats")
.doc(VAX_NAMES.JJ)
.update({
[`${VAX_AGES[VAX_NAMES.JJ].OLDER}.count`]:
docs.docs.length,
});
});
+509
View File
@@ -0,0 +1,509 @@
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import * as firebaseSecret from "./firebaseSecret.json";
const params = {
type: firebaseSecret.type,
projectId: firebaseSecret.project_id,
privateKeyId: firebaseSecret.private_key_id,
privateKey: firebaseSecret.private_key,
clientEmail: firebaseSecret.client_email,
clientId: firebaseSecret.client_id,
authUri: firebaseSecret.auth_uri,
tokenUri: firebaseSecret.token_uri,
authProviderX509CertUrl: firebaseSecret.auth_provider_x509_cert_url,
clientC509CertUrl: firebaseSecret.client_x509_cert_url,
};
admin.initializeApp({
credential: admin.credential.cert(params),
});
const VAX_NAMES: Record<string, string> = {
PB: "Pfizer-BioNTech",
MD: "Moderna",
JJ: "J&J Janssen",
};
const VAX_DOSES: Record<string, string> = {
ONE: "Dose 1",
TWO: "Dose 2",
};
const VAX_AGES: Record<string, Record<string, string>> = {
"Pfizer-BioNTech": {
YOUNGER: "18 - 55",
OLDER: "56 & Older",
},
"Moderna": {
YOUNGER: "18 - 64",
OLDER: "65 & Older",
},
"J&J Janssen": {
YOUNGER: "18 - 59",
OLDER: "60 & Older",
},
};
type SaveResultRequestData = {
name?: string;
age?: string;
dose?: string;
gid?: string;
} & {
[x: string]: boolean;
} & {
[y: string]: Record<string, boolean>;
};
const serializeGaId = (_gaid: string | undefined): string => {
if (_gaid) {
return _gaid.split(".").join("|");
}
return "";
};
const addResultToStats = async (data: SaveResultRequestData) => {
const cleanData: SaveResultRequestData = Object.assign({}, data);
delete cleanData.name;
delete cleanData.dose;
delete cleanData.age;
delete cleanData.gid;
const updateDoc: Record<string, admin.firestore.FieldValue> = {
count: admin.firestore.FieldValue.increment(1),
};
if (data.name === VAX_NAMES.PB || data.name === VAX_NAMES.MD) {
if (data.dose === VAX_DOSES.ONE) {
updateDoc[
`${VAX_DOSES.ONE}.${data.age}.count`
] = admin.firestore.FieldValue.increment(1);
} else if (data.dose === VAX_DOSES.TWO) {
updateDoc[
`${VAX_DOSES.ONE}.${data.age}.count`
] = admin.firestore.FieldValue.increment(1);
updateDoc[
`${VAX_DOSES.TWO}.${data.age}.count`
] = admin.firestore.FieldValue.increment(1);
}
Object.keys(VAX_DOSES).forEach((doseKey: string) => {
const dose: string = VAX_DOSES[doseKey];
Object.keys(cleanData[dose]).forEach((symptom: string) => {
if (cleanData[dose][symptom]) {
let updateDocSymptom = symptom.replace("/", "OR");
if (symptom === "DIARRHEA") {
updateDocSymptom = "DIRRHEA";
}
updateDoc[
`${dose}.${data.age}.${updateDocSymptom}`
] = admin.firestore.FieldValue.increment(1);
}
});
});
} else {
updateDoc[`${data.age}.count`] = admin.firestore.FieldValue.increment(1);
Object.keys(cleanData).forEach((symptom: string) => {
let updateDocSymptom = symptom.replace("/", "OR");
if (symptom === "DIARRHEA") {
updateDocSymptom = "DIRRHEA";
}
updateDoc[
`${data.age}.${updateDocSymptom}`
] = admin.firestore.FieldValue.increment(1);
});
}
if (data.name) {
admin.firestore().collection("stats").doc(data.name).update(updateDoc);
}
};
const removeResultFromStats = async (data: FirebaseFirestore.DocumentData) => {
const cleanData: SaveResultRequestData = Object.assign({}, data);
delete cleanData.name;
delete cleanData.dose;
delete cleanData.age;
delete cleanData.gid;
const updateDoc: Record<string, admin.firestore.FieldValue> = {
count: admin.firestore.FieldValue.increment(-1),
};
if (data.name === VAX_NAMES.PB || data.name === VAX_NAMES.MD) {
Object.keys(VAX_DOSES).forEach((doseKey: string) => {
const dose: string = VAX_DOSES[doseKey];
Object.keys(cleanData[dose]).forEach((symptom: string) => {
if (cleanData[dose][symptom]) {
let updateDocSymptom = symptom.replace("/", "OR");
if (symptom === "DIARRHEA") {
updateDocSymptom = "DIRRHEA";
}
updateDoc[
`${dose}.${data.age}.${updateDocSymptom}`
] = admin.firestore.FieldValue.increment(-1);
}
});
});
} else {
Object.keys(cleanData).forEach((symptom: string) => {
let updateDocSymptom = symptom.replace("/", "OR");
if (symptom === "DIARRHEA") {
updateDocSymptom = "DIRRHEA";
}
updateDoc[
`${data.age}.${updateDocSymptom}`
] = admin.firestore.FieldValue.increment(-1);
});
}
admin.firestore().collection("stats").doc(data.name).update(updateDoc);
};
/**
* FUNCTIONS FROM V1.1.0 TO CURRENT
*/
export const getStatsV1 = functions.https.onCall(async () => {
const stats = await admin.firestore().collection("stats").get();
const docs = stats.docs.map((docSnap) => ({
name: docSnap.id,
result: docSnap.data(),
}));
const returnData: Record<string, unknown> = {};
docs.forEach((vaxResult) => {
if (vaxResult.name === VAX_NAMES.PB || vaxResult.name === VAX_NAMES.MD) {
Object.keys(VAX_DOSES).forEach((doseKey) => {
const dose: string = VAX_DOSES[doseKey];
Object.keys(VAX_AGES[vaxResult.name]).forEach((ageKey) => {
const age: string = VAX_AGES[vaxResult.name][ageKey];
if (vaxResult.result[dose][age]["NAUSEA / VOMITING"] >= 0) {
if (vaxResult.result[dose][age]["NAUSEA OR VOMITING"] >= 0) {
vaxResult.result[dose][age]["NAUSEA OR VOMITING"] +=
vaxResult.result[dose][age]["NAUSEA / VOMITING"];
} else {
vaxResult.result[dose][age]["NAUSEA OR VOMITING"] =
vaxResult.result[dose][age]["NAUSEA / VOMITING"];
}
}
if (vaxResult.result[dose][age]["DIRRHEA"] >= 0) {
if (vaxResult.result[dose][age]["DIARRHEA"] >= 0) {
vaxResult.result[dose][age]["DIARRHEA"] +=
vaxResult.result[dose][age]["DIRRHEA"];
} else {
vaxResult.result[dose][age]["DIARRHEA"] =
vaxResult.result[dose][age]["DIRRHEA"];
}
}
});
});
} else {
Object.keys(VAX_AGES[vaxResult.name]).forEach((ageKey) => {
const age: string = VAX_AGES[vaxResult.name][ageKey];
if (vaxResult.result[age]["NAUSEA / VOMITING"] >= 0) {
if (vaxResult.result[age]["NAUSEA OR VOMITING"] >= 0) {
vaxResult.result[age]["NAUSEA OR VOMITING"] +=
vaxResult.result[age]["NAUSEA / VOMITING"];
} else {
vaxResult.result[age]["NAUSEA OR VOMITING"] =
vaxResult.result[age]["NAUSEA / VOMITING"];
}
}
if (vaxResult.result[age]["DIRRHEA"] >= 0) {
if (vaxResult.result[age]["DIARRHEA"] >= 0) {
vaxResult.result[age]["DIARRHEA"] +=
vaxResult.result[age]["DIRRHEA"];
} else {
vaxResult.result[age]["DIARRHEA"] =
vaxResult.result[age]["DIRRHEA"];
}
}
});
}
returnData[vaxResult.name] = {};
returnData[vaxResult.name] = vaxResult.result;
});
return returnData;
});
export const saveResultV1 = functions.https.onCall(
async (data: SaveResultRequestData, context) => {
if (!!data && !!context) {
if (!!data.name && !!data.age && !!data.gid) {
const {gid} = data;
// Get existing result
const existingResult = await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.get()
.then((docSnap) => docSnap.data());
// Update user result
const cleanData: SaveResultRequestData = Object.assign({}, data);
delete cleanData.gid;
if (cleanData.dose && cleanData.dose === VAX_DOSES.ONE) {
Object.keys(cleanData[VAX_DOSES.TWO]).forEach((symptom) => {
if (cleanData[VAX_DOSES.TWO][symptom] === true) {
cleanData.dose = VAX_DOSES.TWO;
data.dose = VAX_DOSES.TWO;
}
});
}
await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.set(cleanData);
// No existing result
if (existingResult === undefined) {
await addResultToStats(data);
} else {
await removeResultFromStats(existingResult);
await addResultToStats(data);
}
}
}
}
);
export const getPastResultV1 = functions.https.onCall(
async (data: { gid: string }, context) => {
if (!!data && !!context) {
const {gid} = data;
let hasToUpdateDb = false;
const existingData: admin.firestore.DocumentData | undefined =
await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.get()
.then((doc) => doc.data());
if (existingData) {
const returnData:
| admin.firestore.DocumentData
| undefined = Object.assign({}, existingData);
if (
existingData.name === VAX_NAMES.PB ||
existingData.name === VAX_NAMES.MD
) {
Object.keys(VAX_DOSES).forEach((doseKey: string) => {
const dose: string = VAX_DOSES[doseKey];
if (!existingData[dose]) {
hasToUpdateDb = true;
const temp: Record<string, unknown> = {};
Object.keys(existingData).forEach((symptom) => {
if (
symptom !== "name" &&
symptom !== "age" &&
symptom !== "dose"
) {
if (existingData.dose === dose) {
temp[symptom] = existingData[symptom];
delete returnData[symptom];
} else {
temp[symptom] = false;
}
}
});
returnData[dose] = temp;
}
if (returnData[dose]["NAUSEA / VOMITING"]) {
returnData[dose]["NAUSEA OR VOMITING"] =
returnData[dose]["NAUSEA / VOMITING"];
}
if (returnData[dose]["DIRRHEA"]) {
returnData[dose]["DIARRHEA"] = returnData["DIRRHEA"];
}
});
} else {
if (returnData["NAUSEA / VOMITING"]) {
returnData["NAUSEA OR VOMITING"] =
returnData["NAUSEA / VOMITING"];
}
if (returnData["DIRRHEA"]) {
returnData["DIARRHEA"] = returnData["DIRRHEA"];
}
}
if (hasToUpdateDb) {
await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.set(returnData);
}
return returnData;
}
}
return undefined;
}
);
/**
* FUNCTIONS FROM V1.0.0 TO V1.0.1
*/
export const saveResult = functions.https.onCall(
async (data: SaveResultRequestData, context) => {
if (!!data && !!context) {
const {gid} = data;
const docId: string = serializeGaId(gid);
const docData: Record<string, string | boolean> =
Object.assign({}, data);
delete docData.gid;
const existingData = await admin
.firestore()
.collection("results")
.doc(docId)
.get()
.then((doc) => doc.data());
if (
existingData !== undefined &&
existingData !== docData &&
existingData.name === docData.name
) {
// DATA EXISTS FOR USER
// BUT DIFF DATA SENT FOR UPDATE
await admin.firestore().collection("results").doc(docId).set(docData);
delete docData.age;
delete docData.name;
delete docData.dose;
const updateDoc: Record<string, admin.firestore.FieldValue> = {};
Object.keys(docData).forEach((symptom: string) => {
// IF WAS TRUE, NOW FALSE = -1
// IF WAS TRUE, NOW TRUE = 0
// IF WAS FALSE, NOW TRUE = +1
// IF WAS FALSE, NOW FALSE = 0
let incrementValue = 0;
if (existingData[symptom] === true && docData[symptom] === false) {
incrementValue = -1;
} else if (
existingData[symptom] === false &&
docData[symptom] === true
) {
incrementValue = 1;
}
if (data.dose) {
updateDoc[
`${data.dose}.${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(incrementValue);
} else {
updateDoc[
`${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(incrementValue);
}
});
if (data.name) {
admin
.firestore()
.collection("stats")
.doc(data.name)
.update(updateDoc);
}
} else if (
existingData !== undefined &&
existingData !== docData &&
existingData.name !== docData.name
) {
// UNDO DATA FOR OLD VAX
// DECREMENT VALUES FOR EACH SYMPTOM ON OLD VAX
const undoDoc: Record<string, admin.firestore.FieldValue> = {
count: admin.firestore.FieldValue.increment(-1),
};
Object.keys(existingData).forEach((symptom: string) => {
if (symptom !== "name" && symptom !== "dose" && symptom !== "age") {
if (existingData[symptom] === true) {
if (existingData.dose) {
undoDoc[`${existingData.dose}.${existingData.age}.${
symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(-1);
} else {
undoDoc[
`${existingData.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(-1);
}
}
}
});
admin
.firestore()
.collection("stats")
.doc(existingData.name)
.update(undoDoc);
// PROCESS NEW DATA FOR USE
// SAVE USER DATA
await admin.firestore().collection("results").doc(docId).set(docData);
delete docData.age;
delete docData.name;
delete docData.dose;
// INCREMENT TOTAL RESPONSE COUNT
const updateDoc: Record<string, admin.firestore.FieldValue> = {
count: admin.firestore.FieldValue.increment(1),
};
// INCREMENT VALUES FOR EACH SYMPTOM
Object.keys(docData).forEach((symptom: string) => {
if (docData[symptom] === true) {
if (data.dose) {
updateDoc[
`${data.dose}.${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(1);
} else {
updateDoc[
`${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(1);
}
}
});
if (data.name) {
admin
.firestore()
.collection("stats")
.doc(data.name)
.update(updateDoc);
}
} else if (existingData === undefined) {
// DATA DOESN'T EXIST FOR USER
// SAVE USER DATA
await admin.firestore().collection("results").doc(docId).set(docData);
delete docData.age;
delete docData.name;
delete docData.dose;
// INCREMENT TOTAL RESPONSE COUNT
const updateDoc: Record<string, admin.firestore.FieldValue> = {
count: admin.firestore.FieldValue.increment(1),
};
// INCREMENT VALUES FOR EACH SYMPTOM
Object.keys(docData).forEach((symptom: string) => {
if (docData[symptom] === true) {
if (data.dose) {
updateDoc[
`${data.dose}.${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(1);
} else {
updateDoc[
`${data.age}.${symptom.replace("/", "OR")}`
] = admin.firestore.FieldValue.increment(1);
}
}
});
if (data.name) {
admin
.firestore()
.collection("stats")
.doc(data.name)
.update(updateDoc);
}
}
}
}
);
export const getPastResult = functions.https.onCall(async (data, context) => {
if (!!data && !!context) {
const {gid} = data;
const existingData: admin.firestore.DocumentData | undefined = await admin
.firestore()
.collection("results")
.doc(serializeGaId(gid))
.get()
.then((doc) => doc.data());
if (existingData) {
if (existingData["NAUSEA / VOMITING"]) {
existingData["NAUSEA OR VOMITING"] = existingData["NAUSEA / VOMITING"];
}
return existingData;
}
}
return undefined;
});
+5
View File
@@ -0,0 +1,5 @@
{
"include": [
".eslintrc.js"
]
}
+16
View File
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"module": "commonjs",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2017",
"resolveJsonModule": true
},
"compileOnSave": true,
"include": [
"src"
]
}
+1
View File
@@ -0,0 +1 @@
Web / API server started at http://localhost:4000
-124
View File
@@ -1,124 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="favicon.ico" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Learn about the expected side effects of COVID-19 Vaccines" />
<link rel="apple-touch-icon" href="logo192.png" />
<link rel="manifest" href="manifest.json" />
<style>
@import "styles/variables.css";
@import "styles/variables-dark.css" screen and (prefers-color-scheme: dark);
@import "styles/extrasmall.css";
@import "styles/small.css" only screen and (min-width: 370px) and (max-width: 767px);
@import "styles/smallmedium.css" only screen and (min-width: 768px) and (max-width: 1023px);
@import "styles/medium.css" only screen and (min-width: 1024px);
@import "styles/large.css" only screen and (min-width: 1366px);
@import "styles/extralarge.css" only screen and (min-width: 1921px);
@font-face {
font-family: "GlacialBold";
src: url("fonts/glacialindifference-bold-webfont.woff2") format("woff2"),
url("fonts/glacialindifference-bold-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "GlacialItalic";
src: url("fonts/glacialindifference-italic-webfont.woff2") format("woff2"),
url("fonts/glacialindifference-italic-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Glacial";
src: url("fonts/glacialindifference-regular-webfont.woff2") format("woff2"),
url("fonts/glacialindifference-regular-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
[data-font="sans"] {
font-family: "Glacial", sans-serif;
font-display: swap;
}
[data-font="sans-bold"] {
font-family: "GlacialBold", sans-serif;
font-display: swap;
}
[data-font="sans-italic"] {
font-family: "GlacialItalic", sans-serif;
font-style: italic;
font-display: swap;
}
.logo {
background-image: url("logo512.png");
}
header#archived {
background: rgb(149 40 40 / 48%);
border-radius: 2rem;
position: fixed;
padding: 1rem 2rem;
font-size: 1.5rem;
letter-spacing: 1.5px;
text-transform: uppercase;
z-index: 99;
backdrop-filter: blur(7px);
font-family: "GlacialBold";
left: 15rem;
right: 15rem;
top: 3rem;
}
</style>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7VZCY223NG"></script>
<script>function gtag() { dataLayer.push(arguments) } window.dataLayer = window.dataLayer || [], gtag("js", new Date), gtag("config", "G-7VZCY223NG")</script>
<title>Vax & Me</title>
</head>
<body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-K4XHBR6" height="0" width="0"
style="display:none;visibility:hidden"></iframe></noscript>
<header id="archived">
<div>⚠️ Project has been archived.</div>
</header>
<div id="root"></div>
<footer data-font="sans">
<div class="link-container">
<div id="data-sources">
<h6 class="overline" data-font="sans">FDA Data Sources</h6><a id="fda-pfizer"
href="https://www.fda.gov/media/144416/download">PFizer-BioNTech</a> <a id="fda-moderna"
href="https://www.fda.gov/media/144637/download">Moderna</a> <a id="fda-j&j"
href="https://www.fda.gov/media/146304/download">J&J Janssen</a>
</div>
<div>
<h6 class="overline" data-font="sans">Links</h6><a href="vaxandme_chart.pdf">Download Chart</a> <a
href="index.html">Home</a> <a target="_blank"
href="https://www.gavi.org/vaccineswork/what-difference-between-efficacy-and-effectiveness"
rel="noreferrer">What is efficacy? ↗</a>
</div>
<div>
<h6 class="overline" data-font="sans">Legal</h6><a href="copyright.html">Copyright</a> <a
href="privacy.html">Privacy</a>
</div>
</div>
<div class="overline by" data-font="sans">Designed &amp; Developed with ❤ by Alba Rajanibala and Ayushya Amitabh
</div>
</footer>
<script src="https://unpkg.com/react@18/umd/react.production.min.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel" src="index.js"></script>
</body>
</html>
+16937
View File
File diff suppressed because it is too large Load Diff
+38
View File
@@ -0,0 +1,38 @@
{
"name": "vaxandme",
"version": "1.1.1",
"private": true,
"dependencies": {
"firebase": "^8.4.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-scripts": "4.0.3",
"web-vitals": "^1.1.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"deploy": "firebase deploy --only hosting",
"serve": "firebase serve --only hosting"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
+21 -21
View File
@@ -2,45 +2,45 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="favicon.ico" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Learn about the expected side effects of COVID-19 Vaccines"
/>
<link rel="apple-touch-icon" href="logo192.png" />
<link rel="manifest" href="manifest.json" />
<link rel="apple-touch-icon" href="/logo192.png" />
<link rel="manifest" href="/manifest.json" />
<style>
@import "styles/variables.css";
@import "styles/variables-dark.css" screen and
@import "/styles/variables.css";
@import "/styles/variables-dark.css" screen and
(prefers-color-scheme: dark);
@import "styles/extrasmall.css";
@import "styles/small.css" only screen and (min-width: 370px)
@import "/styles/extrasmall.css";
@import "/styles/small.css" only screen and (min-width: 370px)
and (max-width: 767px);
@import "styles/smallmedium.css" only screen and
@import "/styles/smallmedium.css" only screen and
(min-width: 768px) and (max-width: 1023px);
@import "styles/medium.css" only screen and
@import "/styles/medium.css" only screen and
(min-width: 1024px);
@import "styles/large.css" only screen and
@import "/styles/large.css" only screen and
(min-width: 1366px);
@import "styles/extralarge.css" only screen and
@import "/styles/extralarge.css" only screen and
(min-width: 1921px);
@font-face {
font-family: "GlacialBold";
src: url("fonts/glacialindifference-bold-webfont.woff2")
src: url("/fonts/glacialindifference-bold-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-bold-webfont.woff") format("woff");
url("/fonts/glacialindifference-bold-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "GlacialItalic";
src: url("fonts/glacialindifference-italic-webfont.woff2")
src: url("/fonts/glacialindifference-italic-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-italic-webfont.woff")
url("/fonts/glacialindifference-italic-webfont.woff")
format("woff");
font-weight: normal;
font-style: normal;
@@ -48,9 +48,9 @@
}
@font-face {
font-family: "Glacial";
src: url("fonts/glacialindifference-regular-webfont.woff2")
src: url("/fonts/glacialindifference-regular-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-regular-webfont.woff")
url("/fonts/glacialindifference-regular-webfont.woff")
format("woff");
font-weight: normal;
font-style: normal;
@@ -102,13 +102,13 @@
</div>
<div>
<h6 class="overline" data-font="sans">Links</h6>
<a href="vaxandme_chart.pdf">Download Chart</a>
<a href="index.html">Home</a>
<a href="/vaxandme_chart.pdf">Download Chart</a>
<a href="/">Home</a>
</div>
<div>
<h6 class="overline" data-font="sans">Legal</h6>
<a href="copyright.html">Copyright</a>
<a href="privacy.html">Privacy</a>
<a href="/copyright">Copyright</a>
<a href="/privacy">Privacy</a>
</div>
</div>
<div class="overline by" data-font="sans">
@@ -2,51 +2,51 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="favicon.ico" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Learn about the expected side effects of COVID-19 Vaccines"
/>
<link rel="apple-touch-icon" href="logo192.png" />
<link rel="manifest" href="manifest.json" />
<link rel="apple-touch-icon" href="/logo192.png" />
<link rel="manifest" href="/manifest.json" />
<style>
@import "styles/variables.css";
@import "styles/variables-dark.css" screen and
@import "/styles/variables.css";
@import "/styles/variables-dark.css" screen and
(prefers-color-scheme: dark);
@import "styles/extrasmall.css";
@import "styles/small.css" only screen and (min-width: 370px) and
@import "/styles/extrasmall.css";
@import "/styles/small.css" only screen and (min-width: 370px) and
(max-width: 767px);
@import "styles/smallmedium.css" only screen and (min-width: 768px) and
@import "/styles/smallmedium.css" only screen and (min-width: 768px) and
(max-width: 1023px);
@import "styles/medium.css" only screen and (min-width: 1024px);
@import "styles/large.css" only screen and (min-width: 1366px);
@import "styles/extralarge.css" only screen and (min-width: 1921px);
@import "/styles/medium.css" only screen and (min-width: 1024px);
@import "/styles/large.css" only screen and (min-width: 1366px);
@import "/styles/extralarge.css" only screen and (min-width: 1921px);
@font-face {
font-family: "GlacialBold";
src: url("fonts/glacialindifference-bold-webfont.woff2")
src: url("/fonts/glacialindifference-bold-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-bold-webfont.woff") format("woff");
url("/fonts/glacialindifference-bold-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "GlacialItalic";
src: url("fonts/glacialindifference-italic-webfont.woff2")
src: url("/fonts/glacialindifference-italic-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-italic-webfont.woff") format("woff");
url("/fonts/glacialindifference-italic-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Glacial";
src: url("fonts/glacialindifference-regular-webfont.woff2")
src: url("/fonts/glacialindifference-regular-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-regular-webfont.woff") format("woff");
url("/fonts/glacialindifference-regular-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
@@ -142,13 +142,13 @@
</div>
<div>
<h6 class="overline" data-font="sans">Links</h6>
<a href="vaxandme_chart.pdf">Download Chart</a>
<a href="index.html">Home</a>
<a href="/vaxandme_chart.pdf">Download Chart</a>
<a href="/">Home</a>
</div>
<div>
<h6 class="overline" data-font="sans">Legal</h6>
<a href="copyright.html">Copyright</a>
<a href="privacy.html">Privacy</a>
<a href="/copyright">Copyright</a>
<a href="/privacy">Privacy</a>
</div>
</div>
<div class="overline by" data-font="sans">

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

+149
View File
@@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="en">
<head>
<!-- Google Tag Manager -->
<script>
(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != "dataLayer" ? "&l=" + l : "";
j.async = true;
j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, "script", "dataLayer", "GTM-K4XHBR6");
</script>
<!-- End Google Tag Manager -->
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Learn about the expected side effects of COVID-19 Vaccines"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<style>
@import "%PUBLIC_URL%/styles/variables.css";
@import "%PUBLIC_URL%/styles/variables-dark.css" screen and
(prefers-color-scheme: dark);
@import "%PUBLIC_URL%/styles/extrasmall.css";
@import "%PUBLIC_URL%/styles/small.css" only screen and (min-width: 370px)
and (max-width: 767px);
@import "%PUBLIC_URL%/styles/smallmedium.css" only screen and
(min-width: 768px) and (max-width: 1023px);
@import "%PUBLIC_URL%/styles/medium.css" only screen and
(min-width: 1024px);
@import "%PUBLIC_URL%/styles/large.css" only screen and
(min-width: 1366px);
@import "%PUBLIC_URL%/styles/extralarge.css" only screen and
(min-width: 1921px);
@font-face {
font-family: "GlacialBold";
src: url("%PUBLIC_URL%/fonts/glacialindifference-bold-webfont.woff2")
format("woff2"),
url("/fonts/glacialindifference-bold-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "GlacialItalic";
src: url("%PUBLIC_URL%/fonts/glacialindifference-italic-webfont.woff2")
format("woff2"),
url("%PUBLIC_URL%/fonts/glacialindifference-italic-webfont.woff")
format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Glacial";
src: url("%PUBLIC_URL%/fonts/glacialindifference-regular-webfont.woff2")
format("woff2"),
url("%PUBLIC_URL%/fonts/glacialindifference-regular-webfont.woff")
format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
[data-font="sans"] {
font-family: "Glacial", sans-serif;
font-display: swap;
}
[data-font="sans-bold"] {
font-family: "GlacialBold", sans-serif;
font-display: swap;
}
[data-font="sans-italic"] {
font-family: "GlacialItalic", sans-serif;
font-style: italic;
font-display: swap;
}
.logo {
background-image: url("%PUBLIC_URL%/logo512.png");
}
</style>
<!-- Google Analytics -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-7VZCY223NG"
></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "G-7VZCY223NG");
</script>
<title>Vax & Me</title>
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript>
<iframe
src="https://www.googletagmanager.com/ns.html?id=GTM-K4XHBR6"
height="0"
width="0"
style="display: none; visibility: hidden"
>
</iframe>
</noscript>
<!-- End Google Tag Manager (noscript) -->
<div id="root"></div>
<footer data-font="sans">
<div class="link-container">
<div id="data-sources">
<h6 class="overline" data-font="sans">FDA Data Sources</h6>
<a id="fda-pfizer" href="https://www.fda.gov/media/144416/download">PFizer-BioNTech</a>
<a id="fda-moderna" href="https://www.fda.gov/media/144637/download">Moderna</a>
<a id="fda-j&j" href="https://www.fda.gov/media/146304/download">J&J Janssen</a>
</div>
<div>
<h6 class="overline" data-font="sans">Links</h6>
<a href="%PUBLIC_URL%/vaxandme_chart.pdf">Download Chart</a>
<a href="/">Home</a>
<a
target="_blank"
href="https://www.gavi.org/vaccineswork/what-difference-between-efficacy-and-effectiveness"
rel="noreferrer"
>
What is efficacy? ↗
</a>
</div>
<div>
<h6 class="overline" data-font="sans">Legal</h6>
<a href="/copyright">Copyright</a>
<a href="/privacy">Privacy</a>
</div>
</div>
<div class="overline by" data-font="sans">
Designed &amp; Developed with ❤ by Alba Rajanibala and Ayushya Amitabh
</div>
</footer>
</body>
</html>

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

+21 -21
View File
@@ -2,51 +2,51 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="favicon.ico" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Learn about the expected side effects of COVID-19 Vaccines"
/>
<link rel="apple-touch-icon" href="logo192.png" />
<link rel="manifest" href="manifest.json" />
<link rel="apple-touch-icon" href="/logo192.png" />
<link rel="manifest" href="/manifest.json" />
<style>
@import "styles/variables.css";
@import "styles/variables-dark.css" screen and
@import "/styles/variables.css";
@import "/styles/variables-dark.css" screen and
(prefers-color-scheme: dark);
@import "styles/extrasmall.css";
@import "styles/small.css" only screen and (min-width: 370px) and
@import "/styles/extrasmall.css";
@import "/styles/small.css" only screen and (min-width: 370px) and
(max-width: 767px);
@import "styles/smallmedium.css" only screen and (min-width: 768px) and
@import "/styles/smallmedium.css" only screen and (min-width: 768px) and
(max-width: 1023px);
@import "styles/medium.css" only screen and (min-width: 1024px);
@import "styles/large.css" only screen and (min-width: 1366px);
@import "styles/extralarge.css" only screen and (min-width: 1921px);
@import "/styles/medium.css" only screen and (min-width: 1024px);
@import "/styles/large.css" only screen and (min-width: 1366px);
@import "/styles/extralarge.css" only screen and (min-width: 1921px);
@font-face {
font-family: "GlacialBold";
src: url("fonts/glacialindifference-bold-webfont.woff2")
src: url("/fonts/glacialindifference-bold-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-bold-webfont.woff") format("woff");
url("/fonts/glacialindifference-bold-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "GlacialItalic";
src: url("fonts/glacialindifference-italic-webfont.woff2")
src: url("/fonts/glacialindifference-italic-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-italic-webfont.woff") format("woff");
url("/fonts/glacialindifference-italic-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Glacial";
src: url("fonts/glacialindifference-regular-webfont.woff2")
src: url("/fonts/glacialindifference-regular-webfont.woff2")
format("woff2"),
url("fonts/glacialindifference-regular-webfont.woff") format("woff");
url("/fonts/glacialindifference-regular-webfont.woff") format("woff");
font-weight: normal;
font-style: normal;
font-display: swap;
@@ -130,13 +130,13 @@
</div>
<div>
<h6 class="overline" data-font="sans">Links</h6>
<a href="vaxandme_chart.pdf">Download Chart</a>
<a href="index.html">Home</a>
<a href="/vaxandme_chart.pdf">Download Chart</a>
<a href="/">Home</a>
</div>
<div>
<h6 class="overline" data-font="sans">Legal</h6>
<a href="copyright.html">Copyright</a>
<a href="privacy.html">Privacy</a>
<a href="/copyright">Copyright</a>
<a href="/privacy">Privacy</a>
</div>
</div>
<div class="overline by" data-font="sans">
@@ -48,7 +48,7 @@ header {
width: 5rem;
height: 5rem;
display: inline-block;
background-image: url("../logo512.png");
background-image: url("/logo512.png");
}
.logo-text-container {
justify-content: center;
+29 -30
View File
@@ -1,32 +1,28 @@
'use strict';
import React from "react";
import ReactDOM from "react-dom";
import firebase from "firebase/app";
import "firebase/functions";
//import firebase from "firebase/app";
//import "firebase/functions";
//
//const FIREBASE_CONFIG = {
// apiKey: "AIzaSyDKw8HXWRn3dtkIRETv-BxtwnklZIpIkxU",
// authDomain: "vaxandme.firebaseapp.com",
// projectId: "vaxandme",
// storageBucket: "vaxandme.appspot.com",
// messagingSenderId: "614738281692",
// appId: "1:614738281692:web:7a89e0af76675e4f0ea019",
// measurementId: "G-N016TVJ6JC",
//};
//
//firebase.initializeApp(FIREBASE_CONFIG);
//
//if (window.location.host !== "www.vaxand.me") {
// firebase.functions().useEmulator(window.location.host.split(":")[0], 5001);
//}
//
//const fb_functions = firebase.functions();
//const saveResult = fb_functions.httpsCallable("saveResultV1");
//const getPastResult = fb_functions.httpsCallable("getPastResultV1");
//const getStats = fb_functions.httpsCallable("getStatsV1");
const FIREBASE_CONFIG = {
apiKey: "AIzaSyDKw8HXWRn3dtkIRETv-BxtwnklZIpIkxU",
authDomain: "vaxandme.firebaseapp.com",
projectId: "vaxandme",
storageBucket: "vaxandme.appspot.com",
messagingSenderId: "614738281692",
appId: "1:614738281692:web:7a89e0af76675e4f0ea019",
measurementId: "G-N016TVJ6JC",
};
const saveResult = () => new Promise((resolve, reject) => reject());
const getPastResult = () => new Promise((resolve, reject) => reject());
const getStats = () => new Promise((resolve, reject) => reject());
firebase.initializeApp(FIREBASE_CONFIG);
if (window.location.host !== "www.vaxand.me") {
firebase.functions().useEmulator(window.location.host.split(":")[0], 5001);
}
const fb_functions = firebase.functions();
const saveResult = fb_functions.httpsCallable("saveResultV1");
const getPastResult = fb_functions.httpsCallable("getPastResultV1");
const getStats = fb_functions.httpsCallable("getStatsV1");
const VAX_NAMES = {
PB: "Pfizer-BioNTech",
@@ -984,6 +980,9 @@ class App extends React.Component {
}
}
const domContainer = document.querySelector('#root');
const root = ReactDOM.createRoot(domContainer);
root.render(React.createElement(App));
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.querySelector("#root")
);