v1.0.0/release
This commit is contained in:
+3
-2
@@ -1,15 +1,16 @@
|
|||||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
/node_modules
|
*/node_modules
|
||||||
/.pnp
|
/.pnp
|
||||||
.pnp.js
|
.pnp.js
|
||||||
|
.firebase
|
||||||
|
|
||||||
# testing
|
# testing
|
||||||
/coverage
|
/coverage
|
||||||
|
|
||||||
# production
|
# production
|
||||||
/build
|
*/build
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
+7
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"hosting": {
|
"hosting": {
|
||||||
"public": "build",
|
"public": "website/build",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"firebase.json",
|
"firebase.json",
|
||||||
"**/.*",
|
"**/.*",
|
||||||
@@ -12,5 +12,11 @@
|
|||||||
"destination": "/index.html"
|
"destination": "/index.html"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"functions": {
|
||||||
|
"predeploy": [
|
||||||
|
"npm --prefix \"$RESOURCE_DIR\" run lint",
|
||||||
|
"npm --prefix \"$RESOURCE_DIR\" run build"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
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.
|
||||||
|
],
|
||||||
|
plugins: ["@typescript-eslint", "import"],
|
||||||
|
rules: {
|
||||||
|
quotes: ["error", "double"],
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "vaxandme",
|
||||||
|
"private_key_id": "878a8ed429f84ef5fb42555a34bd71d53ba612b2",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnYRdGS8aHi8aY\nDmcIPlPVN0HSDMjg046n1LmR1f1eRS/28m+C94pP6Pn2WvzRJIGK/8XKXARfAiPD\noVfUaXUAPD0DVbgHMn6/1pvCCF0wwlbXZNsIjDg9vLQiGvnsNcgoDXOhfliqw0ca\nTx3oUdgPCzOzkWw4wGMZaJrNK4w0jwuffNgA746jCG3RX9vo/m+aucerYqPPlSfs\nAjJpmpXXCwdHNx0EnEpGQc3bdnbN53hikEJ+J2xCESqaEmTryi1vXDv+i+YCrZn6\nLD+P1etLvtoU0pKMMCcVLk7VmCPMT8F2RB0L21aFmGLuy8fpBDMIYXtjMp+FbKBf\nAne0zKX1AgMBAAECggEAcn4nQ7gsWZdPYp/B2SDqX9fTgKql3iahcSgA2YrPsM3A\nscx+ZIq0TN2GjyKv9pe/aHYvO/azjQXkh6H3cZrrc/3a3SMWCK2ybaA2+9kisAWC\nblwwTHcCP354jmXV5M4qKLObU77PBlTSAtFChdq19J/A6ircJ+r/Pqv16e+SFdD/\n4ie64DR5Uxj9vUN8WFrfDfapwxwnGLgJCOrS7fecC7xDzi5iLR9mZD1ak2a8B+B6\nwNrzGafVz285B0fVtYbXiEGNElbPBd/hvioK0zsHdYxZYmiaZvyWqABejRk6jW6R\n6OTy7fCk6h7LG23+uh9Ruh8jKEE9nX6g/vYaKOqv0wKBgQD6nKvshaCQD4G5s5gK\nwQFYUFJbmMd547BKtzaFXKzUcldZaL9da4AhINoxu70uCl/nDJmTACEcifU/juiO\nM0XsZ0kufoomW2DyxVKBshBoF/OJoEUngDiCDdJFMUsa6zeiZHVi9uFmTY4c4nf8\nozJxxpcbmQRXEdv9kafBEw83DwKBgQDsWpC/t7QCqCytXWqnkVM5QIvrIxXqIHGR\nzHkS6bmUYv2IF6ynzCgAbnRNDh0X2PIvBk6gJDfyC9lN9LvLurn/CVpEK85Q6hRy\nVO4BegYEaFOfDueiAB1RXvGbEvchZp7+DpN2tgi2lRbuEDPWcySFb7YVkyHo/aVO\nfDHjbSmyuwKBgQDB7ORY1Rpm/6jZozB++dTpmtXwDSwmlNsBJf7peco/Zu9Sv2x9\nhMcUW5CcNXNxohON/cEE8G+u3s5JTXOFPgXYpiAJ+185yTIfCjQLKlfpxMbuc3ev\n1ldjxAA3DKrafLODVQtE9ld6y36xuUkx1LMfOZYKhADIw4ghEknmbLI0XwKBgQCJ\njHtI16QPF8hIbGExe8WvP/0trpGGW7M8Yn7jntm9nY5msUBttsZg2ecdIOWVh1AK\nReVkFS/p0TN5xr+z5MtxvQOnQMclF9UmZH7OpTDzR7PCkW4EPYTSYirBUNw5t/s3\nZ0wyfeW8PC/IA+3nE8NhVI3nKGVHrrWRY321GUZ3GQKBgQDzLC96HVGbIQgfGRhW\nu1mcgNKFdQcy8Yu8ffttnuIIPGljwWwLpfbROD+Fe0CtqJ4XXL0Js7XfoPYoxMMH\nc16GysIG9/TYioBhBVfyf94eekylVjdYO0aY7d5Zjw1EuO/LVdPMlSZuosv3q10n\nyB55dJWP6pkR6tLqeNCuJ8+9qQ==\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "firebase-adminsdk-meacv@vaxandme.iam.gserviceaccount.com",
|
||||||
|
"client_id": "110649794888712776390",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-meacv%40vaxandme.iam.gserviceaccount.com"
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
"use strict";
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.getPastResult = exports.saveResult = void 0;
|
||||||
|
const functions = require("firebase-functions");
|
||||||
|
const admin = require("firebase-admin");
|
||||||
|
const firebaseSecret = require("./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 serializeGaId = (_gaid) => {
|
||||||
|
if (_gaid) {
|
||||||
|
return _gaid.split(".").join("|");
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
exports.saveResult = functions.https.onCall((data, context) => {
|
||||||
|
if (!!data && !!context) {
|
||||||
|
const { gid } = data;
|
||||||
|
const docId = serializeGaId(gid);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const docData = Object.assign({}, data);
|
||||||
|
delete docData.gid;
|
||||||
|
admin.firestore().collection("results").doc(docId).set(docData);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
exports.getPastResult = functions.https.onCall(async (data, context) => {
|
||||||
|
if (!!data && !!context) {
|
||||||
|
const { gid } = data;
|
||||||
|
return await admin
|
||||||
|
.firestore()
|
||||||
|
.collection("results")
|
||||||
|
.doc(serializeGaId(gid))
|
||||||
|
.get()
|
||||||
|
.then((doc) => doc.data());
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
});
|
||||||
|
//# sourceMappingURL=index.js.map
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAChD,wCAAwC;AACxC,wDAAwD;AAExD,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,cAAc,CAAC,IAAI;IACzB,SAAS,EAAE,cAAc,CAAC,UAAU;IACpC,YAAY,EAAE,cAAc,CAAC,cAAc;IAC3C,UAAU,EAAE,cAAc,CAAC,WAAW;IACtC,WAAW,EAAE,cAAc,CAAC,YAAY;IACxC,QAAQ,EAAE,cAAc,CAAC,SAAS;IAClC,OAAO,EAAE,cAAc,CAAC,QAAQ;IAChC,QAAQ,EAAE,cAAc,CAAC,SAAS;IAClC,uBAAuB,EAAE,cAAc,CAAC,2BAA2B;IACnE,iBAAiB,EAAE,cAAc,CAAC,oBAAoB;CACvD,CAAC;AAEF,KAAK,CAAC,aAAa,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;CAC1C,CAAC,CAAC;AAaH,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IAC9C,IAAI,KAAK,EAAE;QACT,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACnC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEW,QAAA,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAC5C,CAAC,IAA2B,EAAE,OAAO,EAAE,EAAE;IACvC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;QACvB,MAAM,EAAC,GAAG,EAAC,GAAG,IAAI,CAAC;QACnB,MAAM,KAAK,GAAW,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,8DAA8D;QAC9D,MAAM,OAAO,GAAS,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,GAAG,CAAC;QACnB,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACjE;AACH,CAAC,CACJ,CAAC;AAEW,QAAA,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC1E,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;QACvB,MAAM,EAAC,GAAG,EAAC,GAAG,IAAI,CAAC;QACnB,OAAO,MAAM,KAAK;aACb,SAAS,EAAE;aACX,UAAU,CAAC,SAAS,CAAC;aACrB,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aACvB,GAAG,EAAE;aACL,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;KAChC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC,CAAC"}
|
||||||
Generated
+3243
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "functions",
|
||||||
|
"scripts": {
|
||||||
|
"lint": "eslint --ext .js,.ts .",
|
||||||
|
"build": "tsc",
|
||||||
|
"serve": "npm run build && firebase emulators:start --only functions",
|
||||||
|
"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
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "vaxandme",
|
||||||
|
"private_key_id": "878a8ed429f84ef5fb42555a34bd71d53ba612b2",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnYRdGS8aHi8aY\nDmcIPlPVN0HSDMjg046n1LmR1f1eRS/28m+C94pP6Pn2WvzRJIGK/8XKXARfAiPD\noVfUaXUAPD0DVbgHMn6/1pvCCF0wwlbXZNsIjDg9vLQiGvnsNcgoDXOhfliqw0ca\nTx3oUdgPCzOzkWw4wGMZaJrNK4w0jwuffNgA746jCG3RX9vo/m+aucerYqPPlSfs\nAjJpmpXXCwdHNx0EnEpGQc3bdnbN53hikEJ+J2xCESqaEmTryi1vXDv+i+YCrZn6\nLD+P1etLvtoU0pKMMCcVLk7VmCPMT8F2RB0L21aFmGLuy8fpBDMIYXtjMp+FbKBf\nAne0zKX1AgMBAAECggEAcn4nQ7gsWZdPYp/B2SDqX9fTgKql3iahcSgA2YrPsM3A\nscx+ZIq0TN2GjyKv9pe/aHYvO/azjQXkh6H3cZrrc/3a3SMWCK2ybaA2+9kisAWC\nblwwTHcCP354jmXV5M4qKLObU77PBlTSAtFChdq19J/A6ircJ+r/Pqv16e+SFdD/\n4ie64DR5Uxj9vUN8WFrfDfapwxwnGLgJCOrS7fecC7xDzi5iLR9mZD1ak2a8B+B6\nwNrzGafVz285B0fVtYbXiEGNElbPBd/hvioK0zsHdYxZYmiaZvyWqABejRk6jW6R\n6OTy7fCk6h7LG23+uh9Ruh8jKEE9nX6g/vYaKOqv0wKBgQD6nKvshaCQD4G5s5gK\nwQFYUFJbmMd547BKtzaFXKzUcldZaL9da4AhINoxu70uCl/nDJmTACEcifU/juiO\nM0XsZ0kufoomW2DyxVKBshBoF/OJoEUngDiCDdJFMUsa6zeiZHVi9uFmTY4c4nf8\nozJxxpcbmQRXEdv9kafBEw83DwKBgQDsWpC/t7QCqCytXWqnkVM5QIvrIxXqIHGR\nzHkS6bmUYv2IF6ynzCgAbnRNDh0X2PIvBk6gJDfyC9lN9LvLurn/CVpEK85Q6hRy\nVO4BegYEaFOfDueiAB1RXvGbEvchZp7+DpN2tgi2lRbuEDPWcySFb7YVkyHo/aVO\nfDHjbSmyuwKBgQDB7ORY1Rpm/6jZozB++dTpmtXwDSwmlNsBJf7peco/Zu9Sv2x9\nhMcUW5CcNXNxohON/cEE8G+u3s5JTXOFPgXYpiAJ+185yTIfCjQLKlfpxMbuc3ev\n1ldjxAA3DKrafLODVQtE9ld6y36xuUkx1LMfOZYKhADIw4ghEknmbLI0XwKBgQCJ\njHtI16QPF8hIbGExe8WvP/0trpGGW7M8Yn7jntm9nY5msUBttsZg2ecdIOWVh1AK\nReVkFS/p0TN5xr+z5MtxvQOnQMclF9UmZH7OpTDzR7PCkW4EPYTSYirBUNw5t/s3\nZ0wyfeW8PC/IA+3nE8NhVI3nKGVHrrWRY321GUZ3GQKBgQDzLC96HVGbIQgfGRhW\nu1mcgNKFdQcy8Yu8ffttnuIIPGljwWwLpfbROD+Fe0CtqJ4XXL0Js7XfoPYoxMMH\nc16GysIG9/TYioBhBVfyf94eekylVjdYO0aY7d5Zjw1EuO/LVdPMlSZuosv3q10n\nyB55dJWP6pkR6tLqeNCuJ8+9qQ==\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "firebase-adminsdk-meacv@vaxandme.iam.gserviceaccount.com",
|
||||||
|
"client_id": "110649794888712776390",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-meacv%40vaxandme.iam.gserviceaccount.com"
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
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),
|
||||||
|
});
|
||||||
|
|
||||||
|
interface RequestData {
|
||||||
|
gid: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SaveResultRequestData extends RequestData {
|
||||||
|
name: string;
|
||||||
|
age: string;
|
||||||
|
dose: string;
|
||||||
|
[x: string]: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const serializeGaId = (_gaid: string): string => {
|
||||||
|
if (_gaid) {
|
||||||
|
return _gaid.split(".").join("|");
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
};
|
||||||
|
|
||||||
|
export const saveResult = functions.https.onCall(
|
||||||
|
(data: SaveResultRequestData, context) => {
|
||||||
|
if (!!data && !!context) {
|
||||||
|
const {gid} = data;
|
||||||
|
const docId: string = serializeGaId(gid);
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const docData : any = Object.assign({}, data);
|
||||||
|
delete docData.gid;
|
||||||
|
admin.firestore().collection("results").doc(docId).set(docData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
export const getPastResult = functions.https.onCall(async (data, context) => {
|
||||||
|
if (!!data && !!context) {
|
||||||
|
const {gid} = data;
|
||||||
|
return await admin
|
||||||
|
.firestore()
|
||||||
|
.collection("results")
|
||||||
|
.doc(serializeGaId(gid))
|
||||||
|
.get()
|
||||||
|
.then((doc) => doc.data());
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
});
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"include": [
|
||||||
|
".eslintrc.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Web / API server started at http://localhost:4001
|
||||||
+645
-220
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"firebase": "^8.4.1",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-scripts": "4.0.3",
|
"react-scripts": "4.0.3",
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
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 |
@@ -1,5 +1,25 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import ReactDOM from "react-dom";
|
import ReactDOM from "react-dom";
|
||||||
|
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.startsWith("localhost")) {
|
||||||
|
firebase.functions().useEmulator("localhost", 5001);
|
||||||
|
}
|
||||||
|
const fb_functions = firebase.functions();
|
||||||
|
const saveResult = fb_functions.httpsCallable("saveResult");
|
||||||
|
const getPastResult = fb_functions.httpsCallable("getPastResult");
|
||||||
|
|
||||||
const VAX_NAMES = {
|
const VAX_NAMES = {
|
||||||
PB: "Pfizer-BioNTech",
|
PB: "Pfizer-BioNTech",
|
||||||
@@ -245,6 +265,22 @@ class App extends React.Component {
|
|||||||
if (window.gtag) {
|
if (window.gtag) {
|
||||||
window.gtag("get", "G-7VZCY223NG", "client_id", (client_id) => {
|
window.gtag("get", "G-7VZCY223NG", "client_id", (client_id) => {
|
||||||
this.setState({ gid: client_id });
|
this.setState({ gid: client_id });
|
||||||
|
getPastResult({ gid: client_id }).then((v) => {
|
||||||
|
const { data } = v;
|
||||||
|
if (!!data) {
|
||||||
|
const { name, age, dose } = data;
|
||||||
|
this.setState({ name, age, dose, showInputPopup: true });
|
||||||
|
delete data.name;
|
||||||
|
delete data.age;
|
||||||
|
delete data.dose;
|
||||||
|
this.setState({ answers: data });
|
||||||
|
const inputPopupSubmit = document.querySelector(
|
||||||
|
".input-popup-submit"
|
||||||
|
);
|
||||||
|
inputPopupSubmit.classList.add("submitted");
|
||||||
|
inputPopupSubmit.innerHTML = "UPDATE ANSWER";
|
||||||
|
}
|
||||||
|
}).catch(err => console.error('ERROR Getting Past Answer', err));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -342,15 +378,16 @@ class App extends React.Component {
|
|||||||
age,
|
age,
|
||||||
gid,
|
gid,
|
||||||
});
|
});
|
||||||
setTimeout(() => {
|
saveResult(submitAnswers).then(() => {
|
||||||
document.querySelector(".input-popup-submit").innerHTML = "THANK YOU!";
|
const inputPopupSubmit = document.querySelector(".input-popup-submit");
|
||||||
document.querySelector(".input-popup-submit").classList.add("submitted");
|
if (!inputPopupSubmit.classList.contains("submitted")) {
|
||||||
|
inputPopupSubmit.classList.add("submitted");
|
||||||
|
}
|
||||||
|
inputPopupSubmit.innerHTML = "THANK YOU!";
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
document.querySelector(".input-popup-submit").innerHTML =
|
inputPopupSubmit.innerHTML = "UPDATE ANSWER";
|
||||||
"UPDATE ANSWER";
|
|
||||||
}, 1500);
|
}, 1500);
|
||||||
}, 1500);
|
}).catch(err => console.error('ERROR Saving Answer', err));;
|
||||||
console.log(submitAnswers);
|
|
||||||
};
|
};
|
||||||
render() {
|
render() {
|
||||||
const { name, dose, age, showInputPopup, answers } = this.state;
|
const { name, dose, age, showInputPopup, answers } = this.state;
|
||||||
@@ -393,7 +430,15 @@ class App extends React.Component {
|
|||||||
{Object.values(VAX_NAMES).map((v) => (
|
{Object.values(VAX_NAMES).map((v) => (
|
||||||
<button
|
<button
|
||||||
key={`name-group-${v}`}
|
key={`name-group-${v}`}
|
||||||
onClick={() => this.setState({ name: v, dose: "", age: "" })}
|
onClick={() =>
|
||||||
|
this.setState({
|
||||||
|
name: v,
|
||||||
|
dose: "",
|
||||||
|
age: "",
|
||||||
|
answers: {},
|
||||||
|
showInputPopup: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
data-font="sans-bold"
|
data-font="sans-bold"
|
||||||
className={`vaccine answer${name === v ? " selected" : ""}${
|
className={`vaccine answer${name === v ? " selected" : ""}${
|
||||||
name && name !== v ? " unselected" : ""
|
name && name !== v ? " unselected" : ""
|
||||||
@@ -414,7 +459,14 @@ class App extends React.Component {
|
|||||||
{Object.values(VAX_DOSES).map((v) => (
|
{Object.values(VAX_DOSES).map((v) => (
|
||||||
<button
|
<button
|
||||||
key={`dose-group-${v}`}
|
key={`dose-group-${v}`}
|
||||||
onClick={() => this.setState({ dose: v, age: "" })}
|
onClick={() =>
|
||||||
|
this.setState({
|
||||||
|
dose: v,
|
||||||
|
age: "",
|
||||||
|
answers: {},
|
||||||
|
showInputPopup: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
data-font="sans-bold"
|
data-font="sans-bold"
|
||||||
className={`dose answer${dose === v ? " selected" : ""}${
|
className={`dose answer${dose === v ? " selected" : ""}${
|
||||||
dose && dose !== v ? " unselected" : ""
|
dose && dose !== v ? " unselected" : ""
|
||||||
@@ -436,7 +488,13 @@ class App extends React.Component {
|
|||||||
{Object.values(VAX_AGES[name]).map((v) => (
|
{Object.values(VAX_AGES[name]).map((v) => (
|
||||||
<button
|
<button
|
||||||
key={`age-group-${v}`}
|
key={`age-group-${v}`}
|
||||||
onClick={() => this.setState({ age: v })}
|
onClick={() =>
|
||||||
|
this.setState({
|
||||||
|
age: v,
|
||||||
|
answers: {},
|
||||||
|
showInputPopup: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
data-font="sans-bold"
|
data-font="sans-bold"
|
||||||
className={`age answer${age === v ? " selected" : ""}${
|
className={`age answer${age === v ? " selected" : ""}${
|
||||||
age && age !== v ? " unselected" : ""
|
age && age !== v ? " unselected" : ""
|
||||||
Reference in New Issue
Block a user