From 8c72c18b9e36b14b8cab9aa75fe21939b957f357 Mon Sep 17 00:00:00 2001 From: AmirAgassi <33383085+AmirAgassi@users.noreply.github.com> Date: Mon, 1 Apr 2024 19:22:35 -0400 Subject: [PATCH 1/8] Implement GA --- src/components/Analytics.tsx | 20 +++++++++ src/components/SocialIcons.tsx | 46 +++++++++++---------- src/components/sections/Contact.section.tsx | 2 + src/pages/Landing.tsx | 26 +++++++++++- 4 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 src/components/Analytics.tsx diff --git a/src/components/Analytics.tsx b/src/components/Analytics.tsx new file mode 100644 index 00000000..cd24c4c5 --- /dev/null +++ b/src/components/Analytics.tsx @@ -0,0 +1,20 @@ +import { initializeApp } from 'firebase/app'; +import { getAnalytics, logEvent } from 'firebase/analytics'; + +const firebaseConfig = { + apiKey: process.env.REACT_APP_FIREBASE_API_KEY, + authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, + databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL, + projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, + storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, + messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, + appId: process.env.REACT_APP_FIREBASE_APP_ID, + measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID + }; + +// Initialize Firebase +const app = initializeApp(firebaseConfig); + +// Initialize Firebase Analytics and export it for use across the application +export const analytics = getAnalytics(app); +export { logEvent }; \ No newline at end of file diff --git a/src/components/SocialIcons.tsx b/src/components/SocialIcons.tsx index c63088b9..ff82ca96 100644 --- a/src/components/SocialIcons.tsx +++ b/src/components/SocialIcons.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from "react"; import { FaEnvelope, FaLinkedin, FaDiscord, FaTiktok } from "react-icons/fa"; import { SiDevpost } from "react-icons/si"; import { RiInstagramFill } from "react-icons/ri"; +import { logEvent, analytics } from '../components/Analytics'; interface SocialIconsProps { color?: string; @@ -21,30 +22,31 @@ const SocialIcons: React.FC = ({ color = "currentColor" }) => return () => window.removeEventListener("resize", handleResize); }, []); - - const SocialIconLink = ({ href, Icon }: { href: string, Icon: React.ElementType }) => { - const [iconColor, setIconColor] = useState(color); - - return ( - setIconColor(hoverColor)} - onMouseLeave={() => setIconColor(color)} - style={{ transition: 'color 0.3s' }} - > - - - ); - }; - + const handleClick = (platform: string) => { + console.log(platform); + logEvent(analytics, 'social_icon_click', { platform }); + }; + return (
- - - - - - + handleClick('email')}> + + + handleClick('linkedin')}> + + + handleClick('discord')}> + + + handleClick('tiktok')}> + + + handleClick('instagram')}> + + + handleClick('devpost')}> + +
); }; diff --git a/src/components/sections/Contact.section.tsx b/src/components/sections/Contact.section.tsx index ab8404f0..629b54c9 100644 --- a/src/components/sections/Contact.section.tsx +++ b/src/components/sections/Contact.section.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { TopBorder, BottomBorder, MiddleBody, Hawk, BirdParts } from '@assets'; import { Button, SocialIcons } from '@components'; +import { logEvent, analytics } from '../../components/Analytics'; const ContactSection: React.FC = () => { const openInNewTab = (url: string) => { @@ -11,6 +12,7 @@ const ContactSection: React.FC = () => { const handleSubmit = (e: React.MouseEvent) => { e.preventDefault(); // Prevent default form submission behavior openInNewTab('http://eepurl.com/hDHf8b'); + logEvent(analytics, 'subscribe_button_click', { section: 'Contact' }); }; return (
diff --git a/src/pages/Landing.tsx b/src/pages/Landing.tsx index 757101dd..e9058130 100644 --- a/src/pages/Landing.tsx +++ b/src/pages/Landing.tsx @@ -10,6 +10,7 @@ import { LoadingAnimation, } from '@components'; import { HeroAboutDesktop } from '@assets'; +import { logEvent, analytics } from '../components/Analytics'; const Landing: React.FC = () => { const [isLoading, setIsLoading] = useState(true); @@ -24,13 +25,36 @@ const Landing: React.FC = () => { setTimeout(() => setTimerFinished(true), 2000); }, []); - // Once the timer and component are finished -> display the page useEffect(() => { if (componentLoaded && timerFinished) { setIsLoading(false); } }, [componentLoaded, timerFinished]); + useEffect(() => { + logEvent(analytics, 'page_view'); + }, []); + + useEffect(() => { + const milestones = Array.from({ length: 20 }, (_, i) => false); // Create an array for each 5% milestone + + const trackScrollPercentage = () => { + const scrolledPercentage = (window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100; + + milestones.forEach((reached, index) => { + const milestone = (index + 1) * 5; + if (scrolledPercentage >= milestone && !reached) { + logEvent(analytics, 'scroll', { percentage: `${milestone}%` }); + milestones[index] = true; // Mark this milestone as reached + } + }); + }; + + window.addEventListener('scroll', trackScrollPercentage); + + return () => window.removeEventListener('scroll', trackScrollPercentage); + }, []); + if (isLoading) { return ; } From 4e7e02eda234fdc9eb2704a71222b9b3b5ea7ffe Mon Sep 17 00:00:00 2001 From: AmirAgassi <33383085+AmirAgassi@users.noreply.github.com> Date: Mon, 1 Apr 2024 19:40:20 -0400 Subject: [PATCH 2/8] Shut up the github code scanner --- src/pages/Landing.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Landing.tsx b/src/pages/Landing.tsx index e9058130..845d8299 100644 --- a/src/pages/Landing.tsx +++ b/src/pages/Landing.tsx @@ -36,7 +36,7 @@ const Landing: React.FC = () => { }, []); useEffect(() => { - const milestones = Array.from({ length: 20 }, (_, i) => false); // Create an array for each 5% milestone + const milestones = Array.from({ length: 20 }, () => false); // Create an array for each 5% milestone const trackScrollPercentage = () => { const scrolledPercentage = (window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100; From 64dea9cae6731078c4a32d8df843801fcd4bcbe4 Mon Sep 17 00:00:00 2001 From: AmirAgassi <33383085+AmirAgassi@users.noreply.github.com> Date: Mon, 1 Apr 2024 20:09:57 -0400 Subject: [PATCH 3/8] Move Analytics.tsx to Utils --- src/components/SocialIcons.tsx | 2 +- src/components/sections/Contact.section.tsx | 2 +- src/pages/Landing.tsx | 2 +- src/{components => utils}/Analytics.tsx | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/{components => utils}/Analytics.tsx (100%) diff --git a/src/components/SocialIcons.tsx b/src/components/SocialIcons.tsx index ff82ca96..3c137d00 100644 --- a/src/components/SocialIcons.tsx +++ b/src/components/SocialIcons.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react"; import { FaEnvelope, FaLinkedin, FaDiscord, FaTiktok } from "react-icons/fa"; import { SiDevpost } from "react-icons/si"; import { RiInstagramFill } from "react-icons/ri"; -import { logEvent, analytics } from '../components/Analytics'; +import { logEvent, analytics } from '../utils/Analytics'; interface SocialIconsProps { color?: string; diff --git a/src/components/sections/Contact.section.tsx b/src/components/sections/Contact.section.tsx index 629b54c9..224072e1 100644 --- a/src/components/sections/Contact.section.tsx +++ b/src/components/sections/Contact.section.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { TopBorder, BottomBorder, MiddleBody, Hawk, BirdParts } from '@assets'; import { Button, SocialIcons } from '@components'; -import { logEvent, analytics } from '../../components/Analytics'; +import { logEvent, analytics } from '../../utils/Analytics'; const ContactSection: React.FC = () => { const openInNewTab = (url: string) => { diff --git a/src/pages/Landing.tsx b/src/pages/Landing.tsx index 845d8299..d1fdecd4 100644 --- a/src/pages/Landing.tsx +++ b/src/pages/Landing.tsx @@ -10,7 +10,7 @@ import { LoadingAnimation, } from '@components'; import { HeroAboutDesktop } from '@assets'; -import { logEvent, analytics } from '../components/Analytics'; +import { logEvent, analytics } from '../utils/Analytics'; const Landing: React.FC = () => { const [isLoading, setIsLoading] = useState(true); diff --git a/src/components/Analytics.tsx b/src/utils/Analytics.tsx similarity index 100% rename from src/components/Analytics.tsx rename to src/utils/Analytics.tsx From d6e6f5573ba7174d877b5dc0d97eba2b242159f2 Mon Sep 17 00:00:00 2001 From: jc <46619361+juancwu@users.noreply.github.com> Date: Tue, 2 Apr 2024 10:05:13 -0400 Subject: [PATCH 4/8] install firebase --- package.json | 1 + pnpm-lock.yaml | 692 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 687 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 53e689fa..5c6b9e7c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@uidotdev/usehooks": "^2.4.1", "axios": "^1.6.8", "class-variance-authority": "^0.7.0", + "firebase": "^10.10.0", "hamburger-react": "^2.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b77dcf96..d44f1569 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: class-variance-authority: specifier: ^0.7.0 version: 0.7.0 + firebase: + specifier: ^10.10.0 + version: 10.10.0 hamburger-react: specifier: ^2.5.0 version: 2.5.0(react@18.2.0) @@ -795,6 +798,473 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: false + + /@firebase/analytics-compat@0.2.8(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-scvzDPIsP9HcLWM77YQD7F3yLQksGvPUzyfqUrPo9XxIx26txJvGMJAS8O8BHa6jIvsjUenaTZ5oXEtKqNZQ9Q==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/analytics': 0.10.2(@firebase/app@0.10.0) + '@firebase/analytics-types': 0.8.1 + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/analytics-types@0.8.1: + resolution: {integrity: sha512-niv/67/EOkTlGUxyiOYfIkysSMGYxkIUHJzT9pNkeIGt6zOz759oCUXOAwwjJzckh11dMBFjIYBmtWrdSgbmJw==} + dev: false + + /@firebase/analytics@0.10.2(@firebase/app@0.10.0): + resolution: {integrity: sha512-6Gv/Fndih+dOEEfsBJEeKlwxw9EvCO9D/y+yJMasblvCmj78wUVtn+T96zguSrbhfZ2yBhLS1vukYiPg6hI49w==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/app-check-compat@0.3.10(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-v+jiLG3rQ1fhpIuNIm3WqrL4dkPUIkgOWoic7QABVsZKSAv2YhOFvAenp7IhSP/pz/aiPniJ8G7el/MWieECTg==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-check': 0.8.3(@firebase/app@0.10.0) + '@firebase/app-check-types': 0.5.1 + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/app-check-interop-types@0.3.1: + resolution: {integrity: sha512-NILZbe6RH3X1pZmJnfOfY2gLIrlKmrkUMMrrK6VSXHcSE0eQv28xFEcw16D198i9JYZpy5Kwq394My62qCMaIw==} + dev: false + + /@firebase/app-check-types@0.5.1: + resolution: {integrity: sha512-NqeIcuGzZjl+khpXV0qsyOoaTqLeiG/K0kIDrebol+gb7xpmfOvXXqPEls+1WFBgHcPGdu+XRLhBA7xLzrVdpA==} + dev: false + + /@firebase/app-check@0.8.3(@firebase/app@0.10.0): + resolution: {integrity: sha512-nvlsj5oZBtYDjFTygQJ6xpyiYj8Jao2bFFyNJkUUPdg/QB8uhqDeG74P+gUH6iY9qzd1g5ZokmmGsoIhv9tdSQ==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/app-compat@0.2.30: + resolution: {integrity: sha512-S3FI3yx36xq5NYWXv/rqZiEnkQ89QwfGdl26iWZ9skuOGM96DYQUxs/zs7NkfAQcfpXC8f5DuUrE0Rz/0XdTEg==} + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/app-types@0.9.1: + resolution: {integrity: sha512-nFGqTYsnDFn1oXf1tCwPAc+hQPxyvBT/QB7qDjwK+IDYThOn63nGhzdUTXxVD9Ca8gUY/e5PQMngeo0ZW/E3uQ==} + dev: false + + /@firebase/app@0.10.0: + resolution: {integrity: sha512-bemcsqQD4teEnCM/+FiK8LFjlfoIFewMY3LOIgxa59ISlkk4zlw4ezz1iLY45yQ6ip6WDwky7cx9UruFBAn6iw==} + dependencies: + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + idb: 7.1.1 + tslib: 2.6.2 + dev: false + + /@firebase/auth-compat@0.5.5(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0): + resolution: {integrity: sha512-iAq/wCCEX4TPhZeCOmLxscHh6oZtvJ4g/FcRLynFntW3WOtrWF9/91jq+FsDSSJo9Av8MpnayCbbx+jpGSv4DQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/auth': 1.7.0(@firebase/app@0.10.0) + '@firebase/auth-types': 0.12.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5) + '@firebase/component': 0.6.6 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + undici: 5.28.3 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + dev: false + + /@firebase/auth-interop-types@0.2.2: + resolution: {integrity: sha512-k3NA28Jfoo0+o391bFjoV9X5QLnUL1WbLhZZRbTQhZdmdGYJfX8ixtNNlHsYQ94bwG0QRbsmvkzDnzuhHrV11w==} + dev: false + + /@firebase/auth-types@0.12.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5): + resolution: {integrity: sha512-B3dhiWRWf/njWosx4zdhSEoD4WHJmr4zbnBw6t20mRG/IZ4u0rWUBlMP1vFjhMstKIow1XmoGhTwD65X5ZXLjw==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.1 + '@firebase/util': 1.9.5 + dev: false + + /@firebase/auth@1.7.0(@firebase/app@0.10.0): + resolution: {integrity: sha512-xvyCR3Ivan74AwT/rQOqrYkyu4Ccz6GOFaohi1Pw3gLOpG2WIdC/phc4zdQkLJjmbGFcYNisHyqII2P/H9ZJow==} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^1.18.1 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + undici: 5.28.3 + dev: false + + /@firebase/component@0.6.6: + resolution: {integrity: sha512-pp7sWqHmAAlA3os6ERgoM3k5Cxff510M9RLXZ9Mc8KFKMBc2ct3RkZTWUF7ixJNvMiK/iNgRLPDrLR2gtRJ9iQ==} + dependencies: + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/database-compat@1.0.4: + resolution: {integrity: sha512-GEEDAvsSMAkqy0BIFSVtFzoOIIcKHFfDM4aXHtWL/JCaNn4OOjH7td73jDfN3ALvpIN4hQki0FcxQ89XjqaTjQ==} + dependencies: + '@firebase/component': 0.6.6 + '@firebase/database': 1.0.4 + '@firebase/database-types': 1.0.2 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/database-types@1.0.2: + resolution: {integrity: sha512-JRigr5JNLEHqOkI99tAGHDZF47469/cJz1tRAgGs8Feh+3ZmQy/vVChSqwMp2DuVUGp9PlmGsNSlpINJ/hDuIA==} + dependencies: + '@firebase/app-types': 0.9.1 + '@firebase/util': 1.9.5 + dev: false + + /@firebase/database@1.0.4: + resolution: {integrity: sha512-k84cXh+dtpzvY6yOhfyr1B+I1vjvSMtmlqotE0lTNVylc8m5nmOohjzpTLEQDrBWvwACX/VP5fEyajAdmnOKqA==} + dependencies: + '@firebase/app-check-interop-types': 0.3.1 + '@firebase/auth-interop-types': 0.2.2 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + faye-websocket: 0.11.4 + tslib: 2.6.2 + dev: false + + /@firebase/firestore-compat@0.3.28(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0): + resolution: {integrity: sha512-qaE9QYrWV0K+nh/HWf2EL/V2fPsuTZJ8K4S4e+xUOIxVulmXXwlKg4vgJgRF6r5AlABcSphKNbz/77fChgNwiQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/firestore': 4.5.1(@firebase/app@0.10.0) + '@firebase/firestore-types': 3.0.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5) + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/firestore-types@3.0.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5): + resolution: {integrity: sha512-mVhPcHr5FICjF67m6JHgj+XRvAz/gZ62xifeGfcm00RFl6tNKfCzCfKeyB2BDIEc9dUnEstkmIXlmLIelOWoaA==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.1 + '@firebase/util': 1.9.5 + dev: false + + /@firebase/firestore@4.5.1(@firebase/app@0.10.0): + resolution: {integrity: sha512-VQsMKJGuqlx8I+n+NhNrdFRBJU/B1O8mpGIAYABBmVxPyJax/ynuBMJkREmqzRWpbBj5IAtHe+vm4EvJlb6RLg==} + engines: {node: '>=10.10.0'} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + '@firebase/webchannel-wrapper': 0.10.6 + '@grpc/grpc-js': 1.9.14 + '@grpc/proto-loader': 0.7.12 + tslib: 2.6.2 + undici: 5.28.3 + dev: false + + /@firebase/functions-compat@0.3.9(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-yVcNBUljBFD6VPeTJcnWBEFZlVICKWuJzJmPuvgKEH++8z/CdgUKw0YslceaPQIWnstdviZDEF1cjJnR/bLvzQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/functions': 0.11.3(@firebase/app@0.10.0) + '@firebase/functions-types': 0.6.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/functions-types@0.6.1: + resolution: {integrity: sha512-DirqgTXSBzyKsQwcKnx/YdGMaRdJhywnThrINP+Iog8QfQnrL7aprTXHDFHlpZEMwykS54YRk53xzz7j396QXQ==} + dev: false + + /@firebase/functions@0.11.3(@firebase/app@0.10.0): + resolution: {integrity: sha512-fpjc3VwxsgFBcR0wmof6kIng7NNvhjqetwWUTMs/ZeOI0QiZoUvSDaudFZvPfvXujSK/sr3tk9G1YzjbwCQkgQ==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/app-check-interop-types': 0.3.1 + '@firebase/auth-interop-types': 0.2.2 + '@firebase/component': 0.6.6 + '@firebase/messaging-interop-types': 0.2.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + undici: 5.28.3 + dev: false + + /@firebase/installations-compat@0.2.6(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0): + resolution: {integrity: sha512-uxBAt2WsuEMT5dalA/1O+Uyi9DS25zKHgIPdrQ7KO1ZUdBURiGScIyjdhIM/7NMSvHGYugK4PUVdK9NFIffeiw==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/installations-types': 0.5.1(@firebase/app-types@0.9.1) + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/installations-types@0.5.1(@firebase/app-types@0.9.1): + resolution: {integrity: sha512-OyREnRTfe2wIWTrzCz65ajyo4lFm6VgbeVqMMP+3GJLfCtNvY9VXkmqs3WFEsyYezzdcRqOt39FynZoLlkO+cQ==} + peerDependencies: + '@firebase/app-types': 0.x + dependencies: + '@firebase/app-types': 0.9.1 + dev: false + + /@firebase/installations@0.6.6(@firebase/app@0.10.0): + resolution: {integrity: sha512-dNGRGoHmstgEJqh9Kzk22fR2ZrVBH1JWliaL6binQ6pIzlWscreHNczzJDgOKoVT0PjWTrAmh/azztiX/e2uTw==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/util': 1.9.5 + idb: 7.1.1 + tslib: 2.6.2 + dev: false + + /@firebase/logger@0.4.1: + resolution: {integrity: sha512-tTIixB5UJbG9ZHSGZSZdX7THr3KWOLrejZ9B7jYsm6fpwgRNngKznQKA2wgYVyvBc1ta7dGFh9NtJ8n7qfiYIw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@firebase/messaging-compat@0.2.7(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-29eeNzkjJPNc1RAVmxocaA8PzkbtuNvabX8jKw3N8VdAmyugx7+dYB+jCnereiWqIwivIZ2xSbCUQ24vC7+HaQ==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/messaging': 0.12.7(@firebase/app@0.10.0) + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/messaging-interop-types@0.2.1: + resolution: {integrity: sha512-jfGJ7Jc32BDHXvXHyXi34mVLzZY8X0t929DTMwz7Tj2Hc40Zuzx8VRCIPLRrRUyvBrJCd5EpIcQgCygXhtaN1A==} + dev: false + + /@firebase/messaging@0.12.7(@firebase/app@0.10.0): + resolution: {integrity: sha512-FNZiGMZWjU2D13U/XpoGDSfqCx2kqJ171P3VjquBJfd8SkYNyJMkKM82QvTjQaDd4nuWzgvTDR81DGJFUO6AOg==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/messaging-interop-types': 0.2.1 + '@firebase/util': 1.9.5 + idb: 7.1.1 + tslib: 2.6.2 + dev: false + + /@firebase/performance-compat@0.2.6(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-JSGdNNHBAMRTocGpN+m+7tk+9rulBcwuG+Ejw/ooDj45FGcON1Eymxh/qbe5M6Dlj5P1ClbkHLj4yf7MiCHOag==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/performance': 0.6.6(@firebase/app@0.10.0) + '@firebase/performance-types': 0.2.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/performance-types@0.2.1: + resolution: {integrity: sha512-kQ8pEr4d6ArhPoYrngcFlEJMNWMdEZTpvMAttWH0C2vegBgj47cm6xXFy9+0j27OBhOIiPn48Z+2WE2XNu33CQ==} + dev: false + + /@firebase/performance@0.6.6(@firebase/app@0.10.0): + resolution: {integrity: sha512-UOUHhvj2GJcjyJewdX1ShnON0/eqTswHvYzzQPC4nrIuMFvHwMGk8NpCaqh7JZmpaxh9AMr6kM+M/p37DrKWXA==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/remote-config-compat@0.2.6(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0): + resolution: {integrity: sha512-cFdpmN/rzDhm4pbk0WpOzK9JQ9I1ZhXzhtYbKRBwUag3pG1odEfIORygMDCGQniPpcae/QGXho4srJHfoijKuw==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/logger': 0.4.1 + '@firebase/remote-config': 0.4.6(@firebase/app@0.10.0) + '@firebase/remote-config-types': 0.3.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + dev: false + + /@firebase/remote-config-types@0.3.1: + resolution: {integrity: sha512-PgmfUugcJAinPLsJlYcBbNZe7KE2omdQw1WCT/z46nKkNVGkuHdVFSq54s3wiFa9BoHmLZ01u4hGXIhm6MdLOw==} + dev: false + + /@firebase/remote-config@0.4.6(@firebase/app@0.10.0): + resolution: {integrity: sha512-qtanFS+AX5k/7e/+Azf27Hq4reX28QsUvRcYWyS5cOaRMS9jtll4MK4winWmzX8MdJY637nFzIx43PlMKVnaKw==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/logger': 0.4.1 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + dev: false + + /@firebase/storage-compat@0.3.6(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0): + resolution: {integrity: sha512-AKv0vwktqdW4SDDDcHSN2ahi1Hpjs8rTM6sE7+yrWpm8cRght/PkqylsFnIe+a/toCNd8WeWaXq/oaXHPvRw1w==} + peerDependencies: + '@firebase/app-compat': 0.x + dependencies: + '@firebase/app-compat': 0.2.30 + '@firebase/component': 0.6.6 + '@firebase/storage': 0.12.3(@firebase/app@0.10.0) + '@firebase/storage-types': 0.8.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5) + '@firebase/util': 1.9.5 + tslib: 2.6.2 + transitivePeerDependencies: + - '@firebase/app' + - '@firebase/app-types' + dev: false + + /@firebase/storage-types@0.8.1(@firebase/app-types@0.9.1)(@firebase/util@1.9.5): + resolution: {integrity: sha512-yj0vypPT9UbbfYYwzpXPYchnjWqCADcTbGNawAIebww8rnQYPGbESYTKQdFRPXiLspYPB7xCHTXThmMJuvDcsQ==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + dependencies: + '@firebase/app-types': 0.9.1 + '@firebase/util': 1.9.5 + dev: false + + /@firebase/storage@0.12.3(@firebase/app@0.10.0): + resolution: {integrity: sha512-JP/rN8fb4CgCo7k/I8OLVgRx5cgExsWOIUQ2O2VQwR6YKItuL375c9v7PDaOfEcFZea/fXtfJJ3Z2NaI9445CQ==} + peerDependencies: + '@firebase/app': 0.x + dependencies: + '@firebase/app': 0.10.0 + '@firebase/component': 0.6.6 + '@firebase/util': 1.9.5 + tslib: 2.6.2 + undici: 5.28.3 + dev: false + + /@firebase/util@1.9.5: + resolution: {integrity: sha512-PP4pAFISDxsf70l3pEy34Mf3GkkUcVQ3MdKp6aSVb7tcpfUQxnsdV7twDd8EkfB6zZylH6wpUAoangQDmCUMqw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@firebase/webchannel-wrapper@0.10.6: + resolution: {integrity: sha512-EnfRJvrnzkHwN3BPMCayCFT5lCqInzg3RdlRsDjDvB1EJli6Usj26T6lJ67BU2UcYXBS5xcp1Wj4+zRzj2NaZg==} + dev: false + + /@grpc/grpc-js@1.9.14: + resolution: {integrity: sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.12 + '@types/node': 20.11.24 + dev: false + + /@grpc/proto-loader@0.7.12: + resolution: {integrity: sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==} + engines: {node: '>=6'} + hasBin: true + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.2.6 + yargs: 17.7.2 + dev: false + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -892,6 +1362,49 @@ packages: fastq: 1.15.0 dev: true + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + /@remix-run/router@1.11.0: resolution: {integrity: sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==} engines: {node: '>=14.0.0'} @@ -1437,7 +1950,6 @@ packages: /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -1451,7 +1963,6 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: true /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} @@ -1677,6 +2188,15 @@ packages: clsx: 2.0.0 dev: false + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -1693,7 +2213,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -1701,7 +2220,6 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} @@ -1877,6 +2395,10 @@ packages: resolution: {integrity: sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==} dev: true + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1972,7 +2494,6 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -2160,6 +2681,13 @@ packages: reusify: 1.0.4 dev: true + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: false + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2182,6 +2710,39 @@ packages: path-exists: 4.0.0 dev: true + /firebase@10.10.0: + resolution: {integrity: sha512-iJxnCKsBTYa4BSv8cscNbwciX42BvwoePTHg7iwWevb+GyVcZFmKi9eSkg/L7Jpu9mvAFv1jdDGbIaG3xRrE+w==} + dependencies: + '@firebase/analytics': 0.10.2(@firebase/app@0.10.0) + '@firebase/analytics-compat': 0.2.8(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/app': 0.10.0 + '@firebase/app-check': 0.8.3(@firebase/app@0.10.0) + '@firebase/app-check-compat': 0.3.10(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/app-compat': 0.2.30 + '@firebase/app-types': 0.9.1 + '@firebase/auth': 1.7.0(@firebase/app@0.10.0) + '@firebase/auth-compat': 0.5.5(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0) + '@firebase/database': 1.0.4 + '@firebase/database-compat': 1.0.4 + '@firebase/firestore': 4.5.1(@firebase/app@0.10.0) + '@firebase/firestore-compat': 0.3.28(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0) + '@firebase/functions': 0.11.3(@firebase/app@0.10.0) + '@firebase/functions-compat': 0.3.9(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/installations': 0.6.6(@firebase/app@0.10.0) + '@firebase/installations-compat': 0.2.6(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0) + '@firebase/messaging': 0.12.7(@firebase/app@0.10.0) + '@firebase/messaging-compat': 0.2.7(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/performance': 0.6.6(@firebase/app@0.10.0) + '@firebase/performance-compat': 0.2.6(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/remote-config': 0.4.6(@firebase/app@0.10.0) + '@firebase/remote-config-compat': 0.2.6(@firebase/app-compat@0.2.30)(@firebase/app@0.10.0) + '@firebase/storage': 0.12.3(@firebase/app@0.10.0) + '@firebase/storage-compat': 0.3.6(@firebase/app-compat@0.2.30)(@firebase/app-types@0.9.1)(@firebase/app@0.10.0) + '@firebase/util': 1.9.5 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + dev: false + /flat-cache@3.1.1: resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} @@ -2248,6 +2809,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -2401,6 +2967,10 @@ packages: whatwg-encoding: 3.1.1 dev: true + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: false + /http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -2433,6 +3003,10 @@ packages: safer-buffer: 2.1.2 dev: true + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -2536,6 +3110,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2798,6 +3377,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -2810,6 +3393,10 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -3281,6 +3868,25 @@ packages: react-is: 16.13.1 dev: false + /protobufjs@7.2.6: + resolution: {integrity: sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.11.24 + long: 5.2.3 + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -3411,6 +4017,11 @@ packages: set-function-name: 2.0.2 dev: true + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true @@ -3482,6 +4093,10 @@ packages: queue-microtask: 1.2.3 dev: true + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true @@ -3596,12 +4211,20 @@ packages: internal-slot: 1.0.7 dev: true + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: true /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} @@ -3773,6 +4396,10 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3803,6 +4430,13 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -3998,6 +4632,20 @@ packages: engines: {node: '>=12'} dev: true + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: false + /whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -4065,6 +4713,15 @@ packages: stackback: 0.0.2 dev: true + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -4091,6 +4748,11 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -4104,6 +4766,24 @@ packages: engines: {node: '>= 14'} dev: true + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} From 7e60a88f769ad337b8125d49476b8a94953e2ea8 Mon Sep 17 00:00:00 2001 From: jc <46619361+juancwu@users.noreply.github.com> Date: Tue, 2 Apr 2024 10:05:33 -0400 Subject: [PATCH 5/8] remove unused constant this prevents build --- src/components/SocialIcons.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/SocialIcons.tsx b/src/components/SocialIcons.tsx index 3c137d00..372b49b5 100644 --- a/src/components/SocialIcons.tsx +++ b/src/components/SocialIcons.tsx @@ -10,7 +10,6 @@ interface SocialIconsProps { const SocialIcons: React.FC = ({ color = "currentColor" }) => { const [iconSize, setIconSize] = useState(40); - const hoverColor = '#0FA3B1'; useEffect(() => { const handleResize = () => { @@ -51,4 +50,4 @@ const SocialIcons: React.FC = ({ color = "currentColor" }) => ); }; -export { SocialIcons }; \ No newline at end of file +export { SocialIcons }; From ff76950892eb5f2f6be4ce344a7b5788268c7342 Mon Sep 17 00:00:00 2001 From: AmirAgassi <33383085+AmirAgassi@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:02:08 -0400 Subject: [PATCH 6/8] Switch to Vite env import --- src/utils/Analytics.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/utils/Analytics.tsx b/src/utils/Analytics.tsx index cd24c4c5..84d94a37 100644 --- a/src/utils/Analytics.tsx +++ b/src/utils/Analytics.tsx @@ -2,15 +2,15 @@ import { initializeApp } from 'firebase/app'; import { getAnalytics, logEvent } from 'firebase/analytics'; const firebaseConfig = { - apiKey: process.env.REACT_APP_FIREBASE_API_KEY, - authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN, - databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL, - projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID, - storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET, - messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID, - appId: process.env.REACT_APP_FIREBASE_APP_ID, - measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID - }; + apiKey: import.meta.env.VITE_FIREBASE_API_KEY, + authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN, + databaseURL: import.meta.env.VITE_FIREBASE_DATABASE_URL, + projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID, + storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET, + messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID, + appId: import.meta.env.VITE_FIREBASE_APP_ID, + measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID +}; // Initialize Firebase const app = initializeApp(firebaseConfig); From d7d42e7711800bb20a41b1e97f32b12d02c4b650 Mon Sep 17 00:00:00 2001 From: AmirAgassi <33383085+AmirAgassi@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:24:40 -0400 Subject: [PATCH 7/8] Add analyticsEvent prop to Button component --- src/components/Button/Button.tsx | 39 +++++++++++++++------ src/components/sections/Contact.section.tsx | 3 +- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/components/Button/Button.tsx b/src/components/Button/Button.tsx index 08d00667..46fc874c 100644 --- a/src/components/Button/Button.tsx +++ b/src/components/Button/Button.tsx @@ -1,19 +1,36 @@ import { getButtonStyles } from "./Button.styles"; - import type { ButtonStylesProps } from "./Button.styles"; +import { logEvent, analytics } from "../../utils/Analytics"; type ButtonProps = ButtonStylesProps & - React.ButtonHTMLAttributes; + React.ButtonHTMLAttributes & { + analyticsEvent?: string; + }; export const Button: React.FC = ({ - children, - intent, - className, - ...props + children, + intent, + className, + analyticsEvent, + ...props }) => { - return ( - - ); + const handleClick = (e: React.MouseEvent) => { + if (analyticsEvent) { + console.log(analyticsEvent); + logEvent(analytics, analyticsEvent); + } + if (props.onClick) { + props.onClick(e); + } + }; + + return ( + + ); }; diff --git a/src/components/sections/Contact.section.tsx b/src/components/sections/Contact.section.tsx index 224072e1..26231417 100644 --- a/src/components/sections/Contact.section.tsx +++ b/src/components/sections/Contact.section.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { TopBorder, BottomBorder, MiddleBody, Hawk, BirdParts } from '@assets'; import { Button, SocialIcons } from '@components'; -import { logEvent, analytics } from '../../utils/Analytics'; const ContactSection: React.FC = () => { const openInNewTab = (url: string) => { @@ -12,7 +11,6 @@ const ContactSection: React.FC = () => { const handleSubmit = (e: React.MouseEvent) => { e.preventDefault(); // Prevent default form submission behavior openInNewTab('http://eepurl.com/hDHf8b'); - logEvent(analytics, 'subscribe_button_click', { section: 'Contact' }); }; return (
@@ -46,6 +44,7 @@ const ContactSection: React.FC = () => {