Your Treehacks ID will be used for check-in and meals! Make sure you
have this QR code available before arriving!
![]()
Date: Wed, 8 Jan 2025 23:56:33 -0800
Subject: [PATCH 05/10] Add Google Wallet integration
---
backend/index.ts | 14 ++++++----
backend/routes/digital_id.ts | 20 ++++++++++++++
src/Id/Id.scss | 13 +++++++--
src/Id/Id.tsx | 46 +++++++++++++++++++++++++++-----
src/art/add_to_google_wallet.svg | 16 +++++++++++
5 files changed, 95 insertions(+), 14 deletions(-)
create mode 100644 src/art/add_to_google_wallet.svg
diff --git a/backend/index.ts b/backend/index.ts
index 2b3b35be..47816d45 100644
--- a/backend/index.ts
+++ b/backend/index.ts
@@ -82,7 +82,7 @@ import {
leaveTeam,
getUserTeamData,
} from "./routes/teams";
-import {getDigitalId} from "./routes/digital_id";
+import {getDigitalId, getDigitalGoogleId} from "./routes/digital_id";
import {
uploadSponsorLogo,
updateSponsor,
@@ -149,10 +149,6 @@ apiRouter.get("/users/:userId/contact", [anonymousRoute], userContact);
apiRouter.get("/leaderboard", [anonymousRoute], leaderboard);
apiRouter.post("/mentor_create", [anonymousRoute], mentorCreate);
apiRouter.post("/sponsor/admin", createAdmin);
-apiRouter.get(
- "/users/:userId/:fullName/getDigitalID",
- getDigitalId
-);
apiRouter.use("/", authenticatedRoute);
@@ -195,6 +191,14 @@ authenticatedRoute.get("/users/:userId/forms/workshop_info", getWorkshopList);
authenticatedRoute.put("/users/:userId/forms/workshop_info", setWorkshopList);
authenticatedRoute.put("/users/:userId/forms/add_teammate", addTeammate);
authenticatedRoute.put("/users/:userId/forms/remove_teammate", removeTeammate);
+authenticatedRoute.get(
+ "/users/:userId/:fullName/getDigitalID",
+ getDigitalId
+);
+authenticatedRoute.get(
+ "/users/:userId/:fullName/getGoogleID",
+ getDigitalGoogleId
+);
// What permission should this one be?
authenticatedRoute.get("/users/:userId/status", getApplicationStatus);
diff --git a/backend/routes/digital_id.ts b/backend/routes/digital_id.ts
index 47c0ac52..bed502ba 100644
--- a/backend/routes/digital_id.ts
+++ b/backend/routes/digital_id.ts
@@ -34,3 +34,23 @@ export async function getDigitalId(req: Request, res: Response) {
content: base64Data,
});
}
+
+export async function getDigitalGoogleId(req: Request, res: Response) {
+ const baseDomain: string = process.env.ID_URL; // TODO: adjust based on env value
+ const token = generateToken(req.params.userId, req.params.fullName);
+ const response = await fetch(baseDomain + "/googlePass/" + token, {
+ method: "GET",
+ });
+
+ if (!response.ok) {
+ return res.status(response.status).json({
+ error: "Failed to generate digital ID",
+ details: await response.text(),
+ });
+ }
+
+ const data = await response.json();
+ return res.status(200).json({
+ content: data.url,
+ });
+}
diff --git a/src/Id/Id.scss b/src/Id/Id.scss
index 27157be4..73f9a055 100644
--- a/src/Id/Id.scss
+++ b/src/Id/Id.scss
@@ -1,7 +1,16 @@
@import "../Global.scss";
-#apple-wallet {
+.wallet-holder {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.wallet-btn {
cursor: pointer;
+ height: 50px;
}
#id-box {
@@ -9,5 +18,5 @@
}
.qr-container {
- padding: 20px;
+ padding: 50px 20px;
}
diff --git a/src/Id/Id.tsx b/src/Id/Id.tsx
index 55847d82..fbfb4068 100644
--- a/src/Id/Id.tsx
+++ b/src/Id/Id.tsx
@@ -8,6 +8,7 @@ import { loadData, getUserProfile } from "../store/form/actions";
import API from "@aws-amplify/api";
const appleWalletButton = require("../art/add_to_apple_wallet.svg") as string;
+const googleWalletButton = require("../art/add_to_google_wallet.svg") as string;
const mapStateToProps = (state) => ({
...state.form,
@@ -24,7 +25,7 @@ export class ID extends React.Component
{
constructor(props) {
super(props);
this.getID = this.getID.bind(this);
- console.log(this.props);
+ this.getGoogleID = this.getGoogleID.bind(this);
}
async getID() {
@@ -57,6 +58,28 @@ export class ID extends React.Component {
URL.revokeObjectURL(url); // Clean up the Object URL
}
+ async getGoogleID() {
+ const res = await API.get(
+ "treehacks",
+ "/users/" +
+ this.props.profile.user.id +
+ "/" +
+ this.props.profile.forms.application_info.full_name +
+ "/getGoogleID",
+ {}
+ );
+
+ // trigger file download
+ const url = res.content;
+ const link = document.createElement("a");
+ link.href = url;
+ link.target = "_blank";
+ document.body.appendChild(link); // Required for Firefox
+ link.click();
+ document.body.removeChild(link);
+ URL.revokeObjectURL(url); // Clean up the Object URL
+ }
+
render(): React.ReactNode {
return (
diff --git a/src/art/add_to_google_wallet.svg b/src/art/add_to_google_wallet.svg
new file mode 100644
index 00000000..9fc86837
--- /dev/null
+++ b/src/art/add_to_google_wallet.svg
@@ -0,0 +1,16 @@
+
From f24de0cc315e773de890c83151a6d3ef3ffa369d Mon Sep 17 00:00:00 2001
From: Sabrina <59457991+syenko@users.noreply.github.com>
Date: Thu, 9 Jan 2025 16:09:18 -0800
Subject: [PATCH 06/10] Add ID to dashboard (Admitted Stanford page)
---
src/Dashboard/AdmittedStanford.tsx | 2 ++
src/Id/Id.scss | 33 +++++++++++++++++--
src/Id/Id.tsx | 51 ++++++++++++++----------------
3 files changed, 57 insertions(+), 29 deletions(-)
diff --git a/src/Dashboard/AdmittedStanford.tsx b/src/Dashboard/AdmittedStanford.tsx
index b046fe87..390c7933 100644
--- a/src/Dashboard/AdmittedStanford.tsx
+++ b/src/Dashboard/AdmittedStanford.tsx
@@ -4,6 +4,7 @@ import { HACKATHON_YEAR, HACKATHON_DATE_RANGE } from "../constants";
import { confirmAdmission, declineAdmission } from "../store/form/actions";
import { Link } from "react-router-dom";
import moment from "moment-timezone";
+import Id from "../Id/Id";
interface IAdmittedScreenProps {
confirmAdmission: () => void;
@@ -20,6 +21,7 @@ export const AdmittedScreen = (props: IAdmittedScreenProps) => (
Keep an eye on your inbox in the coming weeks -- we'll be sending more
details to you shortly!
+