From 8c1b3e90ab02b3a75a8e03b1b3e52a7c0c130a21 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 6 Jun 2024 19:32:09 +0100 Subject: [PATCH 001/123] improve the import/export bookmarks UI --- .../SettingsContentLayout.tsx | 10 ++- .../settingsContentLayout.css | 16 +++- .../BookmarkSettings/BookmarkSettings.tsx | 80 ++++++++++--------- .../components/SearchEngineSettings.tsx | 10 ++- .../settings/components/SourceSettings.tsx | 12 +-- 5 files changed, 76 insertions(+), 52 deletions(-) diff --git a/src/components/Layout/SettingsContentLayout/SettingsContentLayout.tsx b/src/components/Layout/SettingsContentLayout/SettingsContentLayout.tsx index fb6b1c31..cd2b596f 100644 --- a/src/components/Layout/SettingsContentLayout/SettingsContentLayout.tsx +++ b/src/components/Layout/SettingsContentLayout/SettingsContentLayout.tsx @@ -4,18 +4,24 @@ type SettingsContentLayoutProps = { title: string description: string children: React.ReactNode + actions?: React.ReactNode } export const SettingsContentLayout = ({ title, description, + actions, children, }: SettingsContentLayoutProps) => { return (
-

{title}

-

{description}

+
+

{title}

+

{description}

+
+ + {actions &&
{actions}
}
{children}
diff --git a/src/components/Layout/SettingsContentLayout/settingsContentLayout.css b/src/components/Layout/SettingsContentLayout/settingsContentLayout.css index 07437110..a79379a8 100644 --- a/src/components/Layout/SettingsContentLayout/settingsContentLayout.css +++ b/src/components/Layout/SettingsContentLayout/settingsContentLayout.css @@ -15,23 +15,33 @@ gap: 16px; } .settingsContent header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.settingsContent .settingsHeader { display: flex; flex-direction: column; row-gap: 8px; } -.settingsContent header .title { +.settingsContent .settingsHeader .title { font-size: 24px; margin: 0; padding: 0; color: var(--primary-text-color); } -.settingsContent header .description { +.settingsContent .settingsHeader .description { font-size: 14px; margin: 0; padding: 0; color: var(--secondary-text-color); } - +.settingsContent .actions { + display: flex; + justify-content: space-between; + align-items: center; +} @media only screen and (max-width: 768px) { .settingsContent { padding: 16px; diff --git a/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx b/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx index 1476eb04..08afe699 100644 --- a/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx +++ b/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx @@ -1,5 +1,6 @@ -import { useRef, useState } from 'react' +import { useRef } from 'react' import { BiBookmarkMinus } from 'react-icons/bi' +import { GrDocumentDownload, GrDocumentUpload } from 'react-icons/gr' import toast from 'react-simple-toasts' import { CardLink } from 'src/components/Elements' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout' @@ -62,7 +63,7 @@ const BookmarkItem = ({ item, appendRef = false }: BookmarkItemProps) => { export const BookmarkSettings = () => { const inputFile = useRef(null) - const {initState, userBookmarks } = useBookmarks() + const { initState, userBookmarks } = useBookmarks() const importBookmarks = () => { inputFile.current?.click() @@ -72,63 +73,66 @@ export const BookmarkSettings = () => { const blob = new Blob([JSON.stringify(userBookmarks, null, 2)], { type: 'application/json', }) - const downloadURL = URL.createObjectURL(blob); - const link = document.createElement("a"); - link.href = downloadURL; - link.download = "hackertabBookmarks"; - link.click(); - toast('Your bookmarks have been successfully exported', { theme: 'defaultToast' }) + const downloadURL = URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = downloadURL + link.download = 'hackertabBookmarks' + link.click() } + const handleFileChange = (event: any) => { - const file = event.target.files?.[0]; + const file = event.target.files?.[0] if (file) { const reader = new FileReader() reader.onload = () => { - const importData: BookmarkedPost[] = JSON.parse(reader.result as string); - const validatedData = importData.filter( - (data: BookmarkedPost) => - data.title && - data.url && - !userBookmarks.some((bm) => bm.title === data.title && bm.url === data.url)) - .map((data) => ({ + const importData: BookmarkedPost[] = JSON.parse(reader.result as string) + const validatedData = importData + .filter( + (data: BookmarkedPost) => + data.title && + data.url && + !userBookmarks.some((bm) => bm.title === data.title && bm.url === data.url) + ) + .map((data) => ({ title: data.title, url: data.url, source: data.source || '', sourceType: data.sourceType || '', - })); + })) initState({ userBookmarks: [...userBookmarks, ...validatedData], - }); + }) toast('Your bookmarks have been successfully imported', { theme: 'defaultToast' }) } reader.readAsText(file) } } - return ( <> -
-
- - -
- -
+ description="Find all your bookmarks here. You can remove a bookmark by clicking on the remove icon." + actions={ + <> + + + + + }>
{userBookmarks.map((bm) => ( diff --git a/src/features/settings/components/SearchEngineSettings.tsx b/src/features/settings/components/SearchEngineSettings.tsx index ebf2d6ee..f3cc2154 100644 --- a/src/features/settings/components/SearchEngineSettings.tsx +++ b/src/features/settings/components/SearchEngineSettings.tsx @@ -49,10 +49,12 @@ export const SearchEngineSettings = () => {
<>
-

Add new Search Engine

-

- Can't find your favorite search engine? Add it here and it. -

+
+

Add new Search Engine

+

+ Can't find your favorite search engine? Add it here and it. +

+
diff --git a/src/features/settings/components/SourceSettings.tsx b/src/features/settings/components/SourceSettings.tsx index a1099179..b9da4deb 100644 --- a/src/features/settings/components/SourceSettings.tsx +++ b/src/features/settings/components/SourceSettings.tsx @@ -69,11 +69,13 @@ export const SourceSettings = () => {
<>
-

Add new Source

-

- Can't find your favorite source? Add its RSS feed URL here and it will be available in - your feed. -

+
+

Add new Source

+

+ Can't find your favorite source? Add its RSS feed URL here and it will be available + in your feed. +

+
From 37f406cd9eadaaa98cfca02d73a72020304a2d3f Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 6 Jun 2024 20:06:03 +0100 Subject: [PATCH 002/123] change the import/export icons --- .../components/BookmarkSettings/BookmarkSettings.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx b/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx index 08afe699..3683e9ed 100644 --- a/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx +++ b/src/features/settings/components/BookmarkSettings/BookmarkSettings.tsx @@ -1,6 +1,6 @@ import { useRef } from 'react' import { BiBookmarkMinus } from 'react-icons/bi' -import { GrDocumentDownload, GrDocumentUpload } from 'react-icons/gr' +import { RiFileDownloadFill, RiFileUploadFill } from 'react-icons/ri' import toast from 'react-simple-toasts' import { CardLink } from 'src/components/Elements' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout' @@ -124,12 +124,11 @@ export const BookmarkSettings = () => { onChange={handleFileChange} /> - }> From b25327a8961376c79e28415e64055168e79081e3 Mon Sep 17 00:00:00 2001 From: zouhir Date: Mon, 27 Jan 2025 23:11:41 +0100 Subject: [PATCH 003/123] feat: Add auth modal ui and show it next to onboarding. --- src/App.tsx | 4 ++ src/assets/App.css | 18 ++++++++ src/features/auth/components/AuthModal.tsx | 48 ++++++++++++++++++++++ src/features/auth/index.ts | 1 + 4 files changed, 71 insertions(+) create mode 100644 src/features/auth/components/AuthModal.tsx create mode 100644 src/features/auth/index.ts diff --git a/src/App.tsx b/src/App.tsx index 788dd432..1ff04131 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,6 +3,7 @@ import { DNDLayout } from 'src/components/Layout' import { setupAnalytics, setupIdentification, trackPageView } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { AppContentLayout } from './components/Layout' +import { AuthModal } from './features/auth' import { isWebOrExtensionVersion } from './utils/Environment' import { lazyImport } from './utils/lazyImport' const { OnboardingModal } = lazyImport(() => import('src/features/onboarding'), 'OnboardingModal') @@ -19,6 +20,7 @@ const intersectionCallback = (entries: IntersectionObserverEntry[]) => { export const App = () => { const [showOnboarding, setShowOnboarding] = useState(true) + const [showAuth, setshowAuth] = useState(true) const { onboardingCompleted, maxVisibleCards, isDNDModeActive, DNDDuration, setDNDDuration } = useUserPreferences() @@ -62,6 +64,8 @@ export const App = () => { )} + {} +
{isDNDModeActive() && } diff --git a/src/assets/App.css b/src/assets/App.css index d460729b..a35166ef 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -162,6 +162,24 @@ a { color: var(--dark-mode-text-color); } +.extraTextWithIconBtn { + background-color: var(--button-background-color); + color: var(--button-text-color); + height: 40px; + width: auto; + padding: 0 16px; + min-width: 40px; + font-weight: bold; + font-size: 18px; + text-align: center; + border: 0; + border-radius: 20px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; +} + .badgeCount { width: 20px; height: 20px; diff --git a/src/features/auth/components/AuthModal.tsx b/src/features/auth/components/AuthModal.tsx new file mode 100644 index 00000000..f5d6c7cd --- /dev/null +++ b/src/features/auth/components/AuthModal.tsx @@ -0,0 +1,48 @@ +import { FaGithub, FaGoogle } from 'react-icons/fa' +import ReactModal from 'react-modal' + +type AuthModalProps = { + showAuth: boolean + setShowAuth: (show: boolean) => void +} + +export const AuthModal = ({ showAuth, setShowAuth }: AuthModalProps) => { + return ( + setShowAuth(false)} + contentLabel="Auth" + className="Modal scrollable" + style={{ + overlay: { + zIndex: 3, + }, + }} + overlayClassName="Overlay"> +
+
+

Welcome to Hackertab

+

+ To enhance your experience and unlock our new rewards system, we’ve introduced a simple + and secure way to sign in. Connect your account with GitHub or Google to start earning + rewards, save your progress, and enjoy personalized features. +

+
+
+ + +
+
+
+ ) +} diff --git a/src/features/auth/index.ts b/src/features/auth/index.ts new file mode 100644 index 00000000..d1a4b0d2 --- /dev/null +++ b/src/features/auth/index.ts @@ -0,0 +1 @@ +export * from './components/AuthModal' From 71cd2e64dc01c561d67b5ac0fcfb06c5a54807b0 Mon Sep 17 00:00:00 2001 From: zouhir Date: Mon, 27 Jan 2025 23:36:19 +0100 Subject: [PATCH 004/123] feat: Add google auth. --- package.json | 1 + src/features/auth/api/Config.ts | 20 + src/features/auth/components/AuthModal.tsx | 23 +- yarn.lock | 650 ++++++++++++++++++++- 4 files changed, 692 insertions(+), 2 deletions(-) create mode 100644 src/features/auth/api/Config.ts diff --git a/package.json b/package.json index bf1e0f6c..35f5d255 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "axios-cache-adapter": "^2.7.3", "country-emoji": "^1.5.4", "dompurify": "^2.2.7", + "firebase": "^11.2.0", "htmlparser2": "^8.0.1", "jsonpath": "^1.1.1", "normalize.css": "^8.0.1", diff --git a/src/features/auth/api/Config.ts b/src/features/auth/api/Config.ts new file mode 100644 index 00000000..960a7a7b --- /dev/null +++ b/src/features/auth/api/Config.ts @@ -0,0 +1,20 @@ +import { initializeApp } from 'firebase/app' +import { getAuth, GoogleAuthProvider } from 'firebase/auth' + +// TODO This is a temporary firebase project config, to be changed later. +const firebaseConfig = { + apiKey: 'AIzaSyCpD2SbQnCCDjmAPasQ8q5jPcxf5lQLwYI', + authDomain: 'hackertab-418813.firebaseapp.com', + projectId: 'hackertab-418813', + storageBucket: 'hackertab-418813.firebasestorage.app', + messagingSenderId: '249160525821', + appId: '1:249160525821:web:e729de3eadc14d2242db94', + measurementId: 'G-NTMXFLMF00', +} + +// Initialize Firebase +const app = initializeApp(firebaseConfig) +const auth = getAuth(app) +const provider = new GoogleAuthProvider() + +export { auth, provider } diff --git a/src/features/auth/components/AuthModal.tsx b/src/features/auth/components/AuthModal.tsx index f5d6c7cd..4ae0179f 100644 --- a/src/features/auth/components/AuthModal.tsx +++ b/src/features/auth/components/AuthModal.tsx @@ -1,5 +1,8 @@ +import { GoogleAuthProvider, signInWithPopup } from 'firebase/auth' import { FaGithub, FaGoogle } from 'react-icons/fa' import ReactModal from 'react-modal' +import toast from 'react-simple-toasts' +import { auth, provider } from '../api/Config' type AuthModalProps = { showAuth: boolean @@ -7,6 +10,20 @@ type AuthModalProps = { } export const AuthModal = ({ showAuth, setShowAuth }: AuthModalProps) => { + const signInWithGoogle = () => { + signInWithPopup(auth, provider) + .then((result) => { + const credential = GoogleAuthProvider.credentialFromResult(result) + // TODO save this token in user settings maybe! + const token = credential.accessToken + // The signed-in user info. + const user = result.user + console.log(user) + }) + .catch((error) => { + toast("We couldn't login to you Google account!!", { theme: 'failure' }) + }) + } return ( { Sign in with Github - diff --git a/yarn.lock b/yarn.lock index b38ede3b..62c049f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1498,6 +1498,396 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== +"@firebase/analytics-compat@0.2.17": + version "0.2.17" + resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.2.17.tgz#c3cfc8ffb863d574ec26d86f9c8344d752832995" + integrity sha512-SJNVOeTvzdqZQvXFzj7yAirXnYcLDxh57wBFROfeowq/kRN1AqOw1tG6U4OiFOEhqi7s3xLze/LMkZatk2IEww== + dependencies: + "@firebase/analytics" "0.10.11" + "@firebase/analytics-types" "0.8.3" + "@firebase/component" "0.6.12" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/analytics-types@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.8.3.tgz#d08cd39a6209693ca2039ba7a81570dfa6c1518f" + integrity sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg== + +"@firebase/analytics@0.10.11": + version "0.10.11" + resolved "https://registry.yarnpkg.com/@firebase/analytics/-/analytics-0.10.11.tgz#6896413e92613573af775c45050af889a43676da" + integrity sha512-zwuPiRE0+hgcS95JZbJ6DFQN4xYFO8IyGxpeePTV51YJMwCf3lkBa6FnZ/iXIqDKcBPMgMuuEZozI0BJWaLEYg== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/installations" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/app-check-compat@0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@firebase/app-check-compat/-/app-check-compat-0.3.18.tgz#abe63858fca86b61ea431e0d9e58ccb8bac1b275" + integrity sha512-qjozwnwYmAIdrsVGrJk+hnF1WBois54IhZR6gO0wtZQoTvWL/GtiA2F31TIgAhF0ayUiZhztOv1RfC7YyrZGDQ== + dependencies: + "@firebase/app-check" "0.8.11" + "@firebase/app-check-types" "0.5.3" + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/app-check-interop-types@0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz#ed9c4a4f48d1395ef378f007476db3940aa5351a" + integrity sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A== + +"@firebase/app-check-types@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@firebase/app-check-types/-/app-check-types-0.5.3.tgz#38ba954acf4bffe451581a32fffa20337f11d8e5" + integrity sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng== + +"@firebase/app-check@0.8.11": + version "0.8.11" + resolved "https://registry.yarnpkg.com/@firebase/app-check/-/app-check-0.8.11.tgz#3c67148046fea0a0a9a1eecf1a17fdc31a76eda7" + integrity sha512-42zIfRI08/7bQqczAy7sY2JqZYEv3a1eNa4fLFdtJ54vNevbBIRSEA3fZgRqWFNHalh5ohsBXdrYgFqaRIuCcQ== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/app-compat@0.2.48": + version "0.2.48" + resolved "https://registry.yarnpkg.com/@firebase/app-compat/-/app-compat-0.2.48.tgz#4cc013dc53b12c9c2ebda6369bbeb99f3cc59975" + integrity sha512-wVNU1foBIaJncUmiALyRxhHHHC3ZPMLIETTAk+2PG87eP9B/IDBsYUiTpHyboDPEI8CgBPat/zN2v+Snkz6lBw== + dependencies: + "@firebase/app" "0.10.18" + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/app-types@0.9.3": + version "0.9.3" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.3.tgz#8408219eae9b1fb74f86c24e7150a148460414ad" + integrity sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw== + +"@firebase/app@0.10.18": + version "0.10.18" + resolved "https://registry.yarnpkg.com/@firebase/app/-/app-0.10.18.tgz#219d897beedcc833ab6d7bdc4ea810ece9e32df6" + integrity sha512-VuqEwD/QRisKd/zsFsqgvSAx34mZ3WEF47i97FD6Vw4GWAhdjepYf0Hmi6K0b4QMSgWcv/x0C30Slm5NjjERXg== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/auth-compat@0.5.17": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@firebase/auth-compat/-/auth-compat-0.5.17.tgz#60d9222dae734fb8740ac565e342dc11f92d2392" + integrity sha512-Shi6rqLqzU9KLXnUCmlLvVByq1kiG3oe7Wpbf5m1CgS7NiRx2pSSn0HLaRRozdkaizNzMGGj+3oHmNYQ7kU6xA== + dependencies: + "@firebase/auth" "1.8.2" + "@firebase/auth-types" "0.12.3" + "@firebase/component" "0.6.12" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/auth-interop-types@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz#176a08686b0685596ff03d7879b7e4115af53de0" + integrity sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA== + +"@firebase/auth-types@0.12.3": + version "0.12.3" + resolved "https://registry.yarnpkg.com/@firebase/auth-types/-/auth-types-0.12.3.tgz#650e54a36060b5ea012075ddbd3cb26566334c41" + integrity sha512-Zq9zI0o5hqXDtKg6yDkSnvMCMuLU6qAVS51PANQx+ZZX5xnzyNLEBO3GZgBUPsV5qIMFhjhqmLDxUqCbnAYy2A== + +"@firebase/auth@1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@firebase/auth/-/auth-1.8.2.tgz#4559dfabe40bc7a0605fb2a73f401d83cb32fe80" + integrity sha512-q+071y2LWe0bVnjqaX3BscqZwzdP0GKN2YBKapLq4bV88MPfCtWwGKmDhNDEDUmioOjudGXkUY5cvvKqk3mlUg== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/component@0.6.12": + version "0.6.12" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.12.tgz#08905a534e9b769164e7e1b1e80f6e7611eb67f3" + integrity sha512-YnxqjtohLbnb7raXt2YuA44cC1wA9GiehM/cmxrsoxKlFxBLy2V0OkRSj9gpngAE0UoJ421Wlav9ycO7lTPAUw== + dependencies: + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/data-connect@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@firebase/data-connect/-/data-connect-0.2.0.tgz#7133cb40096466dc17ad01a50a5f2c383605df20" + integrity sha512-7OrZtQoLSk2fiGijhIdUnTSqEFti3h1EMhw9nNiSZ6jJGduw4Pz6jrVvxjpZJtGH/JiljbMkBnPBS2h8CTRKEw== + dependencies: + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/database-compat@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-2.0.2.tgz#9ddf474b593766a41ea576185cdf115e28f0cb50" + integrity sha512-5zvdnMsfDHvrQAVM6jBS7CkBpu+z3YbpFdhxRsrK1FP45IEfxlzpeuEUb17D/tpM10vfq4Ok0x5akIBaCv7gfA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/database" "1.0.11" + "@firebase/database-types" "1.0.8" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/database-types@1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.8.tgz#eddcce594be118bf9aebb043b5a6d51cfb6de620" + integrity sha512-6lPWIGeufhUq1heofZULyVvWFhD01TUrkkB9vyhmksjZ4XF7NaivQp9rICMk7QNhqwa+uDCaj4j+Q8qqcSVZ9g== + dependencies: + "@firebase/app-types" "0.9.3" + "@firebase/util" "1.10.3" + +"@firebase/database@1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.11.tgz#5b9960a07a0d49361f67fc69affc779cae4e07e3" + integrity sha512-gLrw/XeioswWUXgpVKCPAzzoOuvYNqK5fRUeiJTzO7Mlp9P6ylFEyPJlRBl1djqYye641r3MX6AmIeMXwjgwuQ== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + faye-websocket "0.11.4" + tslib "^2.1.0" + +"@firebase/firestore-compat@0.3.41": + version "0.3.41" + resolved "https://registry.yarnpkg.com/@firebase/firestore-compat/-/firestore-compat-0.3.41.tgz#434d86fd603b5ebcde19b5695b9b2a53bb23be8b" + integrity sha512-J/PgWKEt0yugETOE7lOabT16hsV21cLzSxERD7ZhaiwBQkBTSf0Mx9RhjZRT0Ttqe4weM90HGZFyUBqYA73fVA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/firestore" "4.7.6" + "@firebase/firestore-types" "3.0.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/firestore-types@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-3.0.3.tgz#7d0c3dd8850c0193d8f5ee0cc8f11961407742c1" + integrity sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q== + +"@firebase/firestore@4.7.6": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@firebase/firestore/-/firestore-4.7.6.tgz#877a37b615d86c61ac9ba7ddd0a967feb99380ac" + integrity sha512-aVDboR+upR/44qZDLR4tnZ9pepSOFBbDJnwk7eWzmTyQq2nZAVG+HIhrqpQawmUVcDRkuJv2K2UT2+oqR8F8TA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + "@firebase/webchannel-wrapper" "1.0.3" + "@grpc/grpc-js" "~1.9.0" + "@grpc/proto-loader" "^0.7.8" + tslib "^2.1.0" + +"@firebase/functions-compat@0.3.18": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@firebase/functions-compat/-/functions-compat-0.3.18.tgz#c6a4f6b0762c6990db0aab244420c3e1240fda2b" + integrity sha512-N7+RN5GVus2ORB8cqfSNhfSn4iaYws6F8uCCfn4mtjC7zYS/KH6muzNAhZUdUqlv5YazbVmvxlAoYYF39i8Qzg== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/functions" "0.12.1" + "@firebase/functions-types" "0.6.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/functions-types@0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@firebase/functions-types/-/functions-types-0.6.3.tgz#f5faf770248b13f45d256f614230da6a11bfb654" + integrity sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg== + +"@firebase/functions@0.12.1": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@firebase/functions/-/functions-0.12.1.tgz#09ca7386619b0c50c535f6695e5be0712d3e4730" + integrity sha512-QucRiFrvMMmIGTRhL7ZK2IeBnAWP7lAmfFREMpEtX47GjVqDqGxdFs+Mg7XBzxSc9UjDO4Rxf+aE9xJHU6bGwg== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/auth-interop-types" "0.2.4" + "@firebase/component" "0.6.12" + "@firebase/messaging-interop-types" "0.2.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/installations-compat@0.2.12": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@firebase/installations-compat/-/installations-compat-0.2.12.tgz#ee6396f3cc787c0dd4fc5dd87fec1db9dbb40c97" + integrity sha512-RhcGknkxmFu92F6Jb3rXxv6a4sytPjJGifRZj8MSURPuv2Xu+/AispCXEfY1ZraobhEHTG5HLGsP6R4l9qB5aA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/installations" "0.6.12" + "@firebase/installations-types" "0.5.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/installations-types@0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@firebase/installations-types/-/installations-types-0.5.3.tgz#cac8a14dd49f09174da9df8ae453f9b359c3ef2f" + integrity sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA== + +"@firebase/installations@0.6.12": + version "0.6.12" + resolved "https://registry.yarnpkg.com/@firebase/installations/-/installations-0.6.12.tgz#6d9ad14e60caa8fae4ec0120c0e46ceb9d6fbdae" + integrity sha512-ES/WpuAV2k2YtBTvdaknEo7IY8vaGjIjS3zhnHSAIvY9KwTR8XZFXOJoZ3nSkjN1A5R4MtEh+07drnzPDg9vaw== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/util" "1.10.3" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/logger@0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.4.tgz#29e8379d20fd1149349a195ee6deee4573a86f48" + integrity sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g== + dependencies: + tslib "^2.1.0" + +"@firebase/messaging-compat@0.2.16": + version "0.2.16" + resolved "https://registry.yarnpkg.com/@firebase/messaging-compat/-/messaging-compat-0.2.16.tgz#533af4542a54b932146d175d5687aedd428be972" + integrity sha512-9HZZ88Ig3zQ0ok/Pwt4gQcNsOhoEy8hDHoGsV1am6ulgMuGuDVD2gl11Lere2ksL+msM12Lddi2x/7TCqmODZw== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/messaging" "0.12.16" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/messaging-interop-types@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz#e647c9cd1beecfe6a6e82018a6eec37555e4da3e" + integrity sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q== + +"@firebase/messaging@0.12.16": + version "0.12.16" + resolved "https://registry.yarnpkg.com/@firebase/messaging/-/messaging-0.12.16.tgz#bd8a768274bdc4368396bd9eaa356bffb998bef2" + integrity sha512-VJ8sCEIeP3+XkfbJA7410WhYGHdloYFZXoHe/vt+vNVDGw8JQPTQSVTRvjrUprEf5I4Tbcnpr2H34lS6zhCHSA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/installations" "0.6.12" + "@firebase/messaging-interop-types" "0.2.3" + "@firebase/util" "1.10.3" + idb "7.1.1" + tslib "^2.1.0" + +"@firebase/performance-compat@0.2.12": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@firebase/performance-compat/-/performance-compat-0.2.12.tgz#069284005e3f29339b570ee517b813d9bdbc0a89" + integrity sha512-DyCbDTIwtBTGsEiQxTz/TD23a0na2nrDozceQ5kVkszyFYvliB0YK/9el0wAGIG91SqgTG9pxHtYErzfZc0VWw== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/performance" "0.6.12" + "@firebase/performance-types" "0.2.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/performance-types@0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@firebase/performance-types/-/performance-types-0.2.3.tgz#5ce64e90fa20ab5561f8b62a305010cf9fab86fb" + integrity sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ== + +"@firebase/performance@0.6.12": + version "0.6.12" + resolved "https://registry.yarnpkg.com/@firebase/performance/-/performance-0.6.12.tgz#58763cbbe31673351e1494875a5c10c6b68e1322" + integrity sha512-8mYL4z2jRlKXAi2hjk4G7o2sQLnJCCuTbyvti/xmHf5ZvOIGB01BZec0aDuBIXO+H1MLF62dbye/k91Fr+yc8g== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/installations" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/remote-config-compat@0.2.12": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-compat/-/remote-config-compat-0.2.12.tgz#ae0b597b3228deef0e3c6b2c6e631f19213eca4c" + integrity sha512-91jLWPtubIuPBngg9SzwvNCWzhMLcyBccmt7TNZP+y1cuYFNOWWHKUXQ3IrxCLB7WwLqQaEu7fTDAjHsTyBsSw== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/remote-config" "0.5.0" + "@firebase/remote-config-types" "0.4.0" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/remote-config-types@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@firebase/remote-config-types/-/remote-config-types-0.4.0.tgz#91b9a836d5ca30ced68c1516163b281fbb544537" + integrity sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg== + +"@firebase/remote-config@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@firebase/remote-config/-/remote-config-0.5.0.tgz#30212fa77adba8a62fc6408eb32122147ae80790" + integrity sha512-weiEbpBp5PBJTHUWR4GwI7ZacaAg68BKha5QnZ8Go65W4oQjEWqCW/rfskABI/OkrGijlL3CUmCB/SA6mVo0qA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/installations" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/storage-compat@0.3.15": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@firebase/storage-compat/-/storage-compat-0.3.15.tgz#02a18e0e1866849206dba7b075a4dcd99489aae7" + integrity sha512-Z9afjrK2O9o1ZHWCpprCGZ1BTc3BbvpZvi6tkSteC8H3W/fMM6x+RoSunlzD3hEVV5bkbwdJIqNClLMchvyoPA== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/storage" "0.13.5" + "@firebase/storage-types" "0.8.3" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/storage-types@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@firebase/storage-types/-/storage-types-0.8.3.tgz#2531ef593a3452fc12c59117195d6485c6632d3d" + integrity sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg== + +"@firebase/storage@0.13.5": + version "0.13.5" + resolved "https://registry.yarnpkg.com/@firebase/storage/-/storage-0.13.5.tgz#108c86c9cd359aebd306882eb61ce6a8b1deb417" + integrity sha512-sB/7HNuW0N9tITyD0RxVLNCROuCXkml5i/iPqjwOGKC0xiUfpCOjBE+bb0ABMoN1qYZfqk0y9IuI2TdomjmkNw== + dependencies: + "@firebase/component" "0.6.12" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/util@1.10.3": + version "1.10.3" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.10.3.tgz#63fc5fea7b36236219c4875731597494416678d1" + integrity sha512-wfoF5LTy0m2ufUapV0ZnpcGQvuavTbJ5Qr1Ze9OJGL70cSMvhDyjS4w2121XdA3lGZSTOsDOyGhpoDtYwck85A== + dependencies: + tslib "^2.1.0" + +"@firebase/vertexai@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@firebase/vertexai/-/vertexai-1.0.3.tgz#815efed8c16105676ea090daed963be72a01fb68" + integrity sha512-SQHg/RPb3LwQs/xiLcvAZYz9NXyDSZUIIwvgsKh6e4wdULAfyPCZIu6Y2ZYIhZLfk9Q44cKZ+++7RPTaqQJdYA== + dependencies: + "@firebase/app-check-interop-types" "0.3.3" + "@firebase/component" "0.6.12" + "@firebase/logger" "0.4.4" + "@firebase/util" "1.10.3" + tslib "^2.1.0" + +"@firebase/webchannel-wrapper@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.3.tgz#a73bab8eb491d7b8b7be2f0e6c310647835afe83" + integrity sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ== + "@floating-ui/core@^1.4.2": version "1.5.2" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" @@ -1518,6 +1908,24 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@grpc/grpc-js@~1.9.0": + version "1.9.15" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.9.15.tgz#433d7ac19b1754af690ea650ab72190bd700739b" + integrity sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ== + dependencies: + "@grpc/proto-loader" "^0.7.8" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.7.8": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@jest/expect-utils@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" @@ -1628,6 +2036,59 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@reach/portal@^0.13.0": version "0.13.2" resolved "https://registry.yarnpkg.com/@reach/portal/-/portal-0.13.2.tgz#6f2a6f4afc14894bde9c6435667bb9b660887ed9" @@ -1995,6 +2456,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "22.10.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.10.tgz#85fe89f8bf459dc57dfef1689bd5b52ad1af07e6" + integrity sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww== + dependencies: + undici-types "~6.20.0" + "@types/parse-json@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" @@ -2213,7 +2681,7 @@ acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== -ansi-regex@^5.0.0: +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -2606,6 +3074,15 @@ classnames@^2.2.5, classnames@^2.3.2: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" @@ -2887,6 +3364,11 @@ electron-to-chromium@^1.4.601: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.614.tgz#2fe789d61fa09cb875569f37c309d0c2701f91c0" integrity sha512-X4ze/9Sc3QWs6h92yerwqv7aB/uU8vCjZcrMjA8N9R1pjMFRe44dLsck5FzLilOYvcXuDn93B+bpGYyufc70gQ== +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" @@ -3338,6 +3820,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +faye-websocket@0.11.4: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -3357,6 +3846,40 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +firebase@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/firebase/-/firebase-11.2.0.tgz#843de48382fcaf8050a4a278f35d094fb9960fda" + integrity sha512-ztwPhBLAZMVNZjBeQzzTM4rk2rsRXmdFYcnvjAXh+StbiFVshHKaPO9VRGMUzF48du4Mkz6jN1wkmYCuUJPxLA== + dependencies: + "@firebase/analytics" "0.10.11" + "@firebase/analytics-compat" "0.2.17" + "@firebase/app" "0.10.18" + "@firebase/app-check" "0.8.11" + "@firebase/app-check-compat" "0.3.18" + "@firebase/app-compat" "0.2.48" + "@firebase/app-types" "0.9.3" + "@firebase/auth" "1.8.2" + "@firebase/auth-compat" "0.5.17" + "@firebase/data-connect" "0.2.0" + "@firebase/database" "1.0.11" + "@firebase/database-compat" "2.0.2" + "@firebase/firestore" "4.7.6" + "@firebase/firestore-compat" "0.3.41" + "@firebase/functions" "0.12.1" + "@firebase/functions-compat" "0.3.18" + "@firebase/installations" "0.6.12" + "@firebase/installations-compat" "0.2.12" + "@firebase/messaging" "0.12.16" + "@firebase/messaging-compat" "0.2.16" + "@firebase/performance" "0.6.12" + "@firebase/performance-compat" "0.2.12" + "@firebase/remote-config" "0.5.0" + "@firebase/remote-config-compat" "0.2.12" + "@firebase/storage" "0.13.5" + "@firebase/storage-compat" "0.3.15" + "@firebase/util" "1.10.3" + "@firebase/vertexai" "1.0.3" + focus-trap@^6.2.2: version "6.9.4" resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.9.4.tgz#436da1a1d935c48b97da63cd8f361c6f3aa16444" @@ -3406,6 +3929,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" @@ -3545,6 +4073,16 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.4.0" +http-parser-js@>=0.5.1: + version "0.5.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" + integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== + +idb@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + ignore@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" @@ -3654,6 +4192,11 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + is-generator-function@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -3929,6 +4472,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -3939,6 +4487,11 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +long@^5.0.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" + integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -4497,6 +5050,24 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== +protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + 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" ">=13.7.0" + long "^5.0.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4806,6 +5377,11 @@ remark-rehype@^9.0.0: mdast-util-to-hast "^11.0.0" unified "^10.0.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4865,6 +5441,11 @@ safe-array-concat@^1.0.1: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@>=5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -4982,6 +5563,15 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string.prototype.matchall@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" @@ -5024,6 +5614,13 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5227,6 +5824,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -5419,6 +6021,20 @@ web-vitals@^0.2.4: resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== +websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -5474,11 +6090,25 @@ word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + xstate@^4.15.1: version "4.38.3" resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.38.3.tgz#4e15e7ad3aa0ca1eea2010548a5379966d8f1075" integrity sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -5494,6 +6124,24 @@ yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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.5" + yargs-parser "^21.1.1" + zustand@^4.3.3: version "4.4.7" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" From 6d26d064d0986049a365ea3c2e86118d3625281e Mon Sep 17 00:00:00 2001 From: zouhir Date: Tue, 28 Jan 2025 00:18:28 +0100 Subject: [PATCH 005/123] feat: Show user info in setting. --- .../Layout/SettingsLayout/SettingsLayout.tsx | 15 +++++++++++ .../Layout/SettingsLayout/settings.css | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/components/Layout/SettingsLayout/SettingsLayout.tsx b/src/components/Layout/SettingsLayout/SettingsLayout.tsx index 32d951ee..b8d6bf1a 100644 --- a/src/components/Layout/SettingsLayout/SettingsLayout.tsx +++ b/src/components/Layout/SettingsLayout/SettingsLayout.tsx @@ -1,8 +1,22 @@ import React from 'react' import 'react-contexify/dist/ReactContexify.css' import { NavLink, Outlet } from 'react-router-dom' +import { auth } from '../../../features/auth/api/Config' import './settings.css' +const UserInfo = () => { + const userInfo = auth.currentUser + return ( +
+ {userInfo?.photoURL && } +
+
{userInfo?.displayName}
+
{userInfo?.email}
+
+
+ ) +} + export const SettingsLayout = () => { const navigation = [ { @@ -28,6 +42,7 @@ export const SettingsLayout = () => { ] return (
+
-
) } export const SettingsLayout = () => { + const [user, setUser] = useState(null) + useEffect(() => { + const unsubscribe = auth.onAuthStateChanged((user) => { + setUser(user) + }) + return () => unsubscribe() + }) const navigation = [ { name: 'Topics', @@ -42,7 +67,7 @@ export const SettingsLayout = () => { ] return (
- + {user != null && }
) From d30a6d895e22a19f1d10c655685e33bee2b4cb13 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 15:57:26 +0000 Subject: [PATCH 069/123] feat: Add AuthProvider component for handling user authentication via OAuth tokens --- src/providers/AuthProvider.tsx | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/providers/AuthProvider.tsx diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx new file mode 100644 index 00000000..b64d4f12 --- /dev/null +++ b/src/providers/AuthProvider.tsx @@ -0,0 +1,91 @@ +import { GithubAuthProvider, GoogleAuthProvider, signInWithCredential } from 'firebase/auth' +import { useCallback, useEffect } from 'react' +import { useNavigate, useSearchParams } from 'react-router-dom' +import toast from 'react-simple-toasts' +import { useAuth } from 'src/features/auth' +import { firebaseAuth } from 'src/lib/firebase' + +export const AuthProvider = ({ children }: { children: React.ReactNode }) => { + const navigate = useNavigate() + const [searchParams] = useSearchParams() + const { closeAuthModal, initState, setAuthError } = useAuth() + + const connectTheUser = useCallback((token?: string | null, provider?: string | null) => { + const allowedProviders = ['google', 'github'] + if ((provider && !allowedProviders.includes(provider)) || !token) { + return Promise.resolve() + } + + const authProvider = + provider === 'google' + ? GoogleAuthProvider.credential(null, token) + : GithubAuthProvider.credential(token) + + return signInWithCredential(firebaseAuth, authProvider).then((userCredential) => { + const user = userCredential.user + initState({ + user: { + name: user.displayName || 'Anonymous', + imageURL: user.photoURL || '', + }, + providerId: authProvider.providerId, + }) + closeAuthModal() + navigate(window.location.pathname, { replace: true }) + }) + }, []) + + /** + * This effect is used to connect the user when the token is received from the background script + * on Chrome and Firefox extensions + */ + useEffect(() => { + const messageListener = (message: { + action: string + type?: string + access_token?: string + provider?: string + }) => { + if (message.type === 'TOKEN_RECEIVED') { + const { access_token: token, provider } = message + connectTheUser(token, provider).catch((error) => { + if (error && error.code === 'auth/account-exists-with-different-credential') { + setAuthError({ + message: + 'You have an account with a different provider. Please sign in with that provider to continue.', + }) + } + }) + } + } + + chrome.runtime?.onMessage.addListener(messageListener) + + return () => { + chrome.runtime?.onMessage.removeListener(messageListener) + } + }, []) + + /** + * This effect is used to connect the user when the user when the token is received from the URL + * on the web + */ + useEffect(() => { + const token = searchParams.get('access_token') + const provider = searchParams.get('provider') + connectTheUser(token, provider).catch((error) => { + if (error && error.code === 'auth/account-exists-with-different-credential') { + toast( + 'You have an account with a different provider. Please sign in with that provider to continue.', + { + theme: 'dangerToast', + } + ) + } else { + console.log(error) + toast('Error signing in, Please try again', { theme: 'dangerToast' }) + } + }) + }, [searchParams]) + return <>{children} +} From 8bc9d3e5b4e793dc719ef015f1156b36f7f959a6 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 15:57:32 +0000 Subject: [PATCH 070/123] feat: Add error styling to AuthModal for improved user feedback --- src/features/auth/components/authModal.css | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/features/auth/components/authModal.css b/src/features/auth/components/authModal.css index f355d37c..3007d414 100644 --- a/src/features/auth/components/authModal.css +++ b/src/features/auth/components/authModal.css @@ -22,3 +22,25 @@ text-align: center; font-size: 1em; } +.authModal .errors { + background-color: rgba(255, 0, 0, 0.064); + border: 1px solid rgba(255, 0, 0, 0.363); + border-radius: 6px; + padding: 8px; + display: flex; + flex-direction: row; + p { + padding: 0; + margin: 0; + font-size: 0.8em; + color: red; + } + .cta { + flex: 1; + } +} + +.authModal .footer { + font-size: 0.7em; + text-align: center; +} From 90de2badbc9148fadf9a25a5f56603d1d666864b Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 17:21:16 +0000 Subject: [PATCH 071/123] feat: Change script injection to document.documentElement for improved compatibility --- public/content.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content.js b/public/content.js index ccd4d91e..21e9b99b 100644 --- a/public/content.js +++ b/public/content.js @@ -1,6 +1,6 @@ const script = document.createElement('script') script.src = chrome.runtime.getURL('auth.js') -document.body.appendChild(script) +document.documentElement.appendChild(script) // Listen for messages from the injected script window.addEventListener('message', (event) => { From 2a5597064abd4d958f837c52bdd80875452cbbce Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:48:27 +0000 Subject: [PATCH 072/123] feat: Remove unused GitHub and Google auth providers from Firebase setup --- src/lib/firebase.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/lib/firebase.ts b/src/lib/firebase.ts index b467c258..8417befc 100644 --- a/src/lib/firebase.ts +++ b/src/lib/firebase.ts @@ -1,5 +1,5 @@ import { initializeApp } from 'firebase/app' -import { getAuth, GithubAuthProvider, GoogleAuthProvider } from 'firebase/auth' +import { getAuth } from 'firebase/auth' import { FIREBASE_API_KEY } from 'src/config' const firebaseConfig = { @@ -12,7 +12,4 @@ if (!FIREBASE_API_KEY) { // Initialize Firebase const app = initializeApp(firebaseConfig) const firebaseAuth = getAuth(app) -const googleAuthProvider = new GoogleAuthProvider() -const githubAuthProvider = new GithubAuthProvider() - -export { firebaseAuth, githubAuthProvider, googleAuthProvider } +export { firebaseAuth } From b0f2c7dae31a8c4e9fd8540e22c2c44aab7f9e70 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:49:13 +0000 Subject: [PATCH 073/123] feat: Add Spinner component for loading indicators with customizable sizes --- src/components/Elements/Spinner/Spinner.tsx | 17 +++++++++++++++++ src/components/Elements/Spinner/index.ts | 1 + src/components/Elements/index.ts | 1 + 3 files changed, 19 insertions(+) create mode 100644 src/components/Elements/Spinner/Spinner.tsx create mode 100644 src/components/Elements/Spinner/index.ts diff --git a/src/components/Elements/Spinner/Spinner.tsx b/src/components/Elements/Spinner/Spinner.tsx new file mode 100644 index 00000000..d55133cb --- /dev/null +++ b/src/components/Elements/Spinner/Spinner.tsx @@ -0,0 +1,17 @@ +import clsx from 'clsx' +import './Spinner.css' + +const sizes = { + small: 'small', + medium: 'medium', + large: 'large', +} + +export type SpinnerProps = { + size?: keyof typeof sizes + className?: string +} + +export const Spinner = ({ size = 'medium', className = '' }: SpinnerProps) => { + return
+} diff --git a/src/components/Elements/Spinner/index.ts b/src/components/Elements/Spinner/index.ts new file mode 100644 index 00000000..cf2b71e2 --- /dev/null +++ b/src/components/Elements/Spinner/index.ts @@ -0,0 +1 @@ +export * from './Spinner' diff --git a/src/components/Elements/index.ts b/src/components/Elements/index.ts index 84a35663..14add55f 100644 --- a/src/components/Elements/index.ts +++ b/src/components/Elements/index.ts @@ -12,5 +12,6 @@ export * from './Modal' export * from './Panel' export * from './SearchBar' export * from './SearchBarWithLogo' +export * from './Spinner' export * from './Steps' export * from './UserTags' From b8bd09a2bedcb10051551e60a0b68547ca21a769 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:49:22 +0000 Subject: [PATCH 074/123] feat: Add loading state to Button component with spinner indicator --- src/components/Elements/Button/Button.css | 6 ++++++ src/components/Elements/Button/Button.tsx | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/Elements/Button/Button.css b/src/components/Elements/Button/Button.css index 4a336c1f..ed30b5fe 100644 --- a/src/components/Elements/Button/Button.css +++ b/src/components/Elements/Button/Button.css @@ -32,6 +32,12 @@ padding: 1rem 2rem; font-size: 1.25rem; } + + &.loading { + pointer-events: none; + cursor: not-allowed; + opacity: 0.8; + } } .circle-button { diff --git a/src/components/Elements/Button/Button.tsx b/src/components/Elements/Button/Button.tsx index b84f49cc..bee7e6b4 100644 --- a/src/components/Elements/Button/Button.tsx +++ b/src/components/Elements/Button/Button.tsx @@ -1,7 +1,7 @@ import clsx from 'clsx' import React from 'react' +import { Spinner } from '../Spinner' import './Button.css' - const sizes = { small: 'small', medium: 'medium', @@ -14,6 +14,7 @@ type ButtonProps = { size?: keyof typeof sizes startIcon?: React.ReactNode endIcon?: React.ReactNode + isLoading?: boolean } export const Button = ({ size = 'medium', @@ -22,10 +23,14 @@ export const Button = ({ startIcon, endIcon, children, + isLoading = false, }: ButtonProps) => { return ( - From 8972fc3a60a83d845e65860f52e806a5116bc611 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:49:27 +0000 Subject: [PATCH 075/123] feat: Add CSS styles for Spinner component with customizable sizes --- src/components/Elements/Spinner/Spinner.css | 32 +++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/components/Elements/Spinner/Spinner.css diff --git a/src/components/Elements/Spinner/Spinner.css b/src/components/Elements/Spinner/Spinner.css new file mode 100644 index 00000000..78e63a02 --- /dev/null +++ b/src/components/Elements/Spinner/Spinner.css @@ -0,0 +1,32 @@ +.spinner { + position: relative; + border-radius: 50%; + border: 2px solid transparent; + border-top-color: currentColor; + border-right-color: currentColor; + border-bottom-color: currentColor; + animation: spin 1.5s linear infinite; + &.small { + width: 20px; + height: 20px; + } + + &.medium { + width: 40px; + height: 40px; + } + + &.large { + width: 50px; + height: 50px; + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} From 0d596f23532c6c61041ddbf7367127cd9fc6b194 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:55:12 +0000 Subject: [PATCH 076/123] feat: Update AuthModal to include Google and GitHub auth providers with dynamic links --- src/features/auth/components/AuthModal.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/features/auth/components/AuthModal.tsx b/src/features/auth/components/AuthModal.tsx index 86c8da51..8dcdc954 100644 --- a/src/features/auth/components/AuthModal.tsx +++ b/src/features/auth/components/AuthModal.tsx @@ -1,13 +1,11 @@ -//import { AuthProvider, signInWithPopup } from 'firebase/auth' -import { AuthProvider } from 'firebase/auth' +import { AuthProvider, GithubAuthProvider, GoogleAuthProvider } from 'firebase/auth' import { useCallback, useState } from 'react' import { FaGithub } from 'react-icons/fa' import { FcGoogle } from 'react-icons/fc' import { IoHeartCircle } from 'react-icons/io5' import { Button, Modal } from 'src/components/Elements' -import { BUILD_TARGET } from 'src/config' +import { BUILD_TARGET, privacyPolicyLink, termsAndConditionsLink } from 'src/config' import { useAuth } from 'src/features/auth' -import { githubAuthProvider, googleAuthProvider } from 'src/lib/firebase' import { getBrowserName } from 'src/utils/Environment' import { checkHostPermissions, requestHostPermissions } from 'src/utils/Permissions' import { useGetOauthLink } from '../api/getOauthLink' @@ -17,6 +15,9 @@ type AuthModalProps = { showAuth: boolean } +const googleAuthProvider = new GoogleAuthProvider() +const githubAuthProvider = new GithubAuthProvider() + export const AuthModal = ({ showAuth }: AuthModalProps) => { const { closeAuthModal, authError, setAuthError } = useAuth() const [selectedProvider, setSelectedProvider] = useState(googleAuthProvider) @@ -113,11 +114,11 @@ export const AuthModal = ({ showAuth }: AuthModalProps) => {

By signing in, you agree to our{' '} - + Terms of Service {' '} and{' '} - + Privacy Policy . From 827b755b47766bf1ce4d054d195212309d1c4a96 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 22:56:34 +0000 Subject: [PATCH 077/123] feat: Add success toast notification for user login with dynamic welcome message --- src/assets/App.css | 7 ++++++- src/providers/AuthProvider.tsx | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/assets/App.css b/src/assets/App.css index e0b1f1a2..e287471b 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1333,7 +1333,12 @@ Producthunt item padding: 10px 20px; border-radius: 10px; } - +.successToast { + background-color: #52c41a; + color: white; + padding: 10px 20px; + border-radius: 10px; +} .capitalize { text-transform: capitalize; } diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index b64d4f12..469b6c3b 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -23,6 +23,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { return signInWithCredential(firebaseAuth, authProvider).then((userCredential) => { const user = userCredential.user + initState({ user: { name: user.displayName || 'Anonymous', @@ -30,6 +31,9 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { }, providerId: authProvider.providerId, }) + if (user.displayName) { + toast(`Welcome, ${user.displayName}`, { theme: 'successToast' }) + } closeAuthModal() navigate(window.location.pathname, { replace: true }) }) From e12fd5ec0f03c7b6ab8a4f6dbb7c11a9d4e5220d Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 9 Mar 2025 23:49:32 +0000 Subject: [PATCH 078/123] refactor: replace react-device-detect with responsive breakpoints and update media queries --- package.json | 2 +- src/assets/App.css | 4 +- src/components/Elements/Card/Card.tsx | 6 +-- src/components/Layout/AppContentLayout.tsx | 10 ++-- .../components/MarketingBanner.tsx | 4 +- src/providers/DesktopBreakpoint.tsx | 6 +++ src/providers/MobileBreakpoint.tsx | 6 +++ yarn.lock | 46 +++++++++++++------ 8 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 src/providers/DesktopBreakpoint.tsx create mode 100644 src/providers/MobileBreakpoint.tsx diff --git a/package.json b/package.json index bf1e0f6c..cd4d0caf 100644 --- a/package.json +++ b/package.json @@ -19,13 +19,13 @@ "prop-types": "^15.0.0-0", "react": "^17.0.1", "react-contexify": "^5.0.0", - "react-device-detect": "^1.17.0", "react-dom": "^17.0.1", "react-easy-sort": "^1.5.1", "react-error-boundary": "^3.1.4", "react-icons": "^5.2.1", "react-markdown": "^7.0.1", "react-modal": "^3.12.1", + "react-responsive": "^10.0.1", "react-router-dom": "^6.21.0", "react-select": "^5.0.1", "react-share": "^4.4.1", diff --git a/src/assets/App.css b/src/assets/App.css index d460729b..022f19a1 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1018,7 +1018,7 @@ Producthunt item *** BREAKPOINTS *******************/ /* Extra small devices (phones, 600px and down) */ -@media (max-width: 600px) { +@media (max-width: 768px) { .bottomNavigation { display: flex; } @@ -1176,7 +1176,7 @@ Producthunt item } /* Small devices (portrait tablets and large phones, 600px and up) */ -@media only screen and (min-width: 600px) { +@media only screen and (min-width: 768px) { .floatingFilter { display: none; } diff --git a/src/components/Elements/Card/Card.tsx b/src/components/Elements/Card/Card.tsx index b6c47f0b..973c8792 100644 --- a/src/components/Elements/Card/Card.tsx +++ b/src/components/Elements/Card/Card.tsx @@ -1,11 +1,11 @@ import React, { useEffect, useState } from 'react' -import { isDesktop } from 'react-device-detect' import { SortableKnob } from 'react-easy-sort' import { BsBoxArrowInUpRight } from 'react-icons/bs' import { MdOutlineDragIndicator } from 'react-icons/md' import { ref } from 'src/config' import { AdvBanner } from 'src/features/adv' import { useRemoteConfigStore } from 'src/features/remoteConfig' +import { DesktopBreakpoint } from 'src/providers/DesktopBreakpoint' import { useUserPreferences } from 'src/stores/preferences' import { SupportedCardType } from 'src/types' @@ -59,13 +59,13 @@ export const Card = ({ return (

- {isDesktop && ( + - )} + {icon} {titleComponent || label}{' '} {link && ( diff --git a/src/components/Layout/AppContentLayout.tsx b/src/components/Layout/AppContentLayout.tsx index 5189bccf..03ffbf12 100644 --- a/src/components/Layout/AppContentLayout.tsx +++ b/src/components/Layout/AppContentLayout.tsx @@ -1,5 +1,6 @@ import { useState } from 'react' -import { isDesktop } from 'react-device-detect' +import { DesktopBreakpoint } from 'src/providers/DesktopBreakpoint' +import { MobileBreakpoint } from 'src/providers/MobileBreakpoint' import { useUserPreferences } from 'src/stores/preferences' import { BottomNavigation } from '../Elements' import { ScrollCardsNavigator } from './' @@ -14,13 +15,14 @@ export const AppContentLayout = () => { <>
- {isDesktop ? ( + - ) : ( + +
- )} +
diff --git a/src/features/MarketingBanner/components/MarketingBanner.tsx b/src/features/MarketingBanner/components/MarketingBanner.tsx index 902ff258..4f7d6001 100644 --- a/src/features/MarketingBanner/components/MarketingBanner.tsx +++ b/src/features/MarketingBanner/components/MarketingBanner.tsx @@ -1,7 +1,7 @@ import DOMPurify from 'dompurify' import jsonPath from 'jsonpath' import { useEffect, useMemo, useState } from 'react' -import { isMobile } from 'react-device-detect' +import { useMediaQuery } from 'react-responsive' import { trackMarketingCampaignClose, trackMarketingCampaignOpen, @@ -25,7 +25,7 @@ export const MarketingBanner = () => { cacheTime: 600000, }, }) - + const isMobile = useMediaQuery({ maxWidth: 767 }) const userAtttributes = useMemo(() => { return { platform: isWebOrExtensionVersion(), diff --git a/src/providers/DesktopBreakpoint.tsx b/src/providers/DesktopBreakpoint.tsx new file mode 100644 index 00000000..32b31119 --- /dev/null +++ b/src/providers/DesktopBreakpoint.tsx @@ -0,0 +1,6 @@ +import { useMediaQuery } from 'react-responsive' + +export const DesktopBreakpoint = ({ children }: { children: React.ReactNode }) => { + const isDesktop = useMediaQuery({ minWidth: 768 }) + return isDesktop ? children : null +} diff --git a/src/providers/MobileBreakpoint.tsx b/src/providers/MobileBreakpoint.tsx new file mode 100644 index 00000000..194e3d17 --- /dev/null +++ b/src/providers/MobileBreakpoint.tsx @@ -0,0 +1,6 @@ +import { useMediaQuery } from 'react-responsive' + +export const MobileBreakpoint = ({ children }: { children: React.ReactNode }) => { + const isMobile = useMediaQuery({ maxWidth: 767 }) + return isMobile ? children : null +} diff --git a/yarn.lock b/yarn.lock index b38ede3b..4c818fe4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2719,6 +2719,11 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +css-mediaquery@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/css-mediaquery/-/css-mediaquery-0.1.2.tgz#6a2c37344928618631c54bd33cedd301da18bea0" + integrity sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q== + css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" @@ -3545,6 +3550,11 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.4.0" +hyphenate-style-name@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" + integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== + ignore@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" @@ -3972,6 +3982,13 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +matchmediaquery@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/matchmediaquery/-/matchmediaquery-0.4.2.tgz#22582bd4ae63ad9f54c53001bba80cbed0f7eafa" + integrity sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA== + dependencies: + css-mediaquery "^0.1.2" + md5@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -4483,7 +4500,7 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -prop-types@^15.0.0, prop-types@^15.0.0-0, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.0.0-0, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -4509,13 +4526,6 @@ react-contexify@^5.0.0: dependencies: clsx "^1.1.1" -react-device-detect@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-1.17.0.tgz#a00b4fd6880cebfab3fd8a42a79dc0290cdddca9" - integrity sha512-bBblIStwpHmoS281JFIVqeimcN3LhpoP5YKDWzxQdBIUP8S2xPvHDgizLDhUq2ScguLfVPmwfF5y268EEQR60w== - dependencies: - ua-parser-js "^0.7.24" - react-dom@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" @@ -4605,6 +4615,16 @@ react-refresh@^0.14.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== +react-responsive@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/react-responsive/-/react-responsive-10.0.1.tgz#293d4d2562da93409861216f0110d146c5676eb3" + integrity sha512-OM5/cRvbtUWEX8le8RCT8scA8y2OPtb0Q/IViEyCEM5FBN8lRrkUOZnu87I88A6njxDldvxG+rLBxWiA7/UM9g== + dependencies: + hyphenate-style-name "^1.0.0" + matchmediaquery "^0.4.2" + prop-types "^15.6.1" + shallow-equal "^3.1.0" + react-router-dom@^6.21.0: version "6.21.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.21.0.tgz#aa4c6bc046a8e8723095bc09b3c0ab2254532712" @@ -4913,6 +4933,11 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +shallow-equal@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-3.1.0.tgz#e7a54bac629c7f248eff6c2f5b63122ba4320bec" + integrity sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -5202,11 +5227,6 @@ typescript@^5.1.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -ua-parser-js@^0.7.24: - version "0.7.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" - integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" From 1d7de16cdb1c46b4dadaf166f6c0d8bbfaa55814 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 22 Mar 2025 16:31:15 +0000 Subject: [PATCH 079/123] feat: Refactor OAuth link retrieval to accept dynamic provider strings --- src/features/auth/api/getOauthLink.ts | 4 +--- src/features/auth/components/AuthModal.tsx | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/features/auth/api/getOauthLink.ts b/src/features/auth/api/getOauthLink.ts index 0671ac9e..d2bf764f 100644 --- a/src/features/auth/api/getOauthLink.ts +++ b/src/features/auth/api/getOauthLink.ts @@ -2,11 +2,9 @@ import { useMutation } from '@tanstack/react-query' import { axios } from 'src/lib/axios' import { MutationConfig } from 'src/lib/react-query' -type Provider = 'google.com' | 'github.com' - export type GetOauthLinkDTO = { data: { - provider: Provider + provider: string state: string } } diff --git a/src/features/auth/components/AuthModal.tsx b/src/features/auth/components/AuthModal.tsx index 8dcdc954..e5e2c269 100644 --- a/src/features/auth/components/AuthModal.tsx +++ b/src/features/auth/components/AuthModal.tsx @@ -25,16 +25,16 @@ export const AuthModal = ({ showAuth }: AuthModalProps) => { const requestOauthLink = useCallback( async (provider: AuthProvider) => { - const getOauthLinkResponse = await getOauthLink.mutateAsync({ - data: { - provider: provider.providerId as 'google.com' | 'github.com', - state: BUILD_TARGET === 'web' ? window.location.origin : getBrowserName(), - }, - }) - - if (getOauthLinkResponse.authLink) { - window.open(getOauthLinkResponse.authLink, BUILD_TARGET === 'web' ? '_self' : '_blank') - } + getOauthLink + .mutateAsync({ + data: { + provider: provider.providerId, + state: BUILD_TARGET === 'web' ? window.location.origin : getBrowserName(), + }, + }) + .then(({ authLink }) => { + window.open(authLink, BUILD_TARGET === 'web' ? '_self' : '_blank') + }) }, [getOauthLink] ) From 8c7c9729b7feaf051ea37839efae3c1e6981fcc8 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 22 Mar 2025 17:11:30 +0000 Subject: [PATCH 080/123] feat: Update API endpoint for OAuth link retrieval --- src/features/auth/api/getOauthLink.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/auth/api/getOauthLink.ts b/src/features/auth/api/getOauthLink.ts index d2bf764f..3785f8bb 100644 --- a/src/features/auth/api/getOauthLink.ts +++ b/src/features/auth/api/getOauthLink.ts @@ -9,7 +9,7 @@ export type GetOauthLinkDTO = { } } const getOauthLink = ({ data }: GetOauthLinkDTO): Promise<{ authLink: string }> => { - return axios.post('/engine/auth/auth_link', data) + return axios.post('/engine/auth/oauth-link', data) } type QueryFnType = typeof getOauthLink From 9d2932d7fb2db1e1dab3dc371e5d03f06a49f928 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 22 Mar 2025 17:12:48 +0000 Subject: [PATCH 081/123] feat: Simplify content script matches in base manifest --- public/base.manifest.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/public/base.manifest.json b/public/base.manifest.json index bc9cb09a..6b0abd23 100644 --- a/public/base.manifest.json +++ b/public/base.manifest.json @@ -9,13 +9,7 @@ "host_permissions": ["https://*.hackertab.dev/*"], "content_scripts": [ { - "matches": [ - "http://127.0.0.1:5173/*", - "http://localhost:5173/*", - "https://hackertab.dev/*", - "http://localhost:5173/*", - "https://hackertab-staging.deno.dev/*" - ], + "matches": ["http://127.0.0.1:5173/*", "http://localhost:5173/*", "https://hackertab.dev/*"], "run_at": "document_start", "js": ["content.js"] } From bb81416a3f0b3b7dd6bd9509d2ab45a3e4e47e7f Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 01:06:07 +0000 Subject: [PATCH 082/123] feat: Refactor isConnected function to use direct user check --- src/components/Layout/Header.tsx | 4 ++-- src/features/auth/hooks/useAuth.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index f7b3403a..7f53c028 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -97,13 +97,13 @@ export const Header = () => { { - if (isConnected()) { + if (isConnected) { navigate('/settings/general') } else { openAuthModal() } }}> - {isConnected() ? ( + {isConnected ? ( ) : ( diff --git a/src/features/auth/hooks/useAuth.ts b/src/features/auth/hooks/useAuth.ts index 6485d148..4d808d79 100644 --- a/src/features/auth/hooks/useAuth.ts +++ b/src/features/auth/hooks/useAuth.ts @@ -8,7 +8,7 @@ export const useAuth = () => { const authStore = AuthStore() const { user, providerId, initState, clear } = authStore - const isConnected = () => user != null + const isConnected = user != null const logout = async () => { trackUserDisconnect() From 55894bb94943dccbe038c53e5d03a68b9010089c Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 21:24:59 +0000 Subject: [PATCH 083/123] feat: Update isConnected check to use direct reference --- src/components/Layout/AppLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Layout/AppLayout.tsx b/src/components/Layout/AppLayout.tsx index 6a25b9ec..f8ae0748 100644 --- a/src/components/Layout/AppLayout.tsx +++ b/src/components/Layout/AppLayout.tsx @@ -14,7 +14,7 @@ export const AppLayout = () => { const postStreakMutation = usePostStreak() useEffect(() => { - if (isConnected()) { + if (isConnected) { postStreakMutation.mutateAsync(undefined).then((data) => { setStreak(data.streak) }) From d10274c948fae2363dcca61ac69a436a5dba1565 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 21:28:30 +0000 Subject: [PATCH 084/123] feat: Add pluralization utility and update streak display in user info --- .../settings/components/GeneralSettings/GeneralSettings.tsx | 3 ++- src/utils/String.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/utils/String.ts diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 3253f34d..0aa5977e 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -20,6 +20,7 @@ import { } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { Option } from 'src/types' +import { pluralize } from 'src/utils/String' import { DNDSettings } from './DNDSettings' import './generalSettings.css' @@ -65,7 +66,7 @@ const UserInfo = ({ user }: UserInfoProps) => { You're on{' '} {' '} - {user.streak || 1} days streak + {pluralize(user.streak || 1, 'day')} streak

diff --git a/src/utils/String.ts b/src/utils/String.ts new file mode 100644 index 00000000..8e9eac37 --- /dev/null +++ b/src/utils/String.ts @@ -0,0 +1,2 @@ +export const pluralize = (count: number, noun: string, suffix = 's') => + `${count} ${noun}${count !== 1 ? suffix : ''}` From ae9df23df0ad0ba961627bd0b6a40303c293da20 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 22:28:50 +0000 Subject: [PATCH 085/123] Add ad verification --- src/App.tsx | 13 ++++++++++++- src/features/adv/utils/status.ts | 11 +++++++++++ src/lib/analytics.ts | 9 ++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/features/adv/utils/status.ts diff --git a/src/App.tsx b/src/App.tsx index 788dd432..a14f024b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,14 @@ import { useEffect, useLayoutEffect, useState } from 'react' import { DNDLayout } from 'src/components/Layout' -import { setupAnalytics, setupIdentification, trackPageView } from 'src/lib/analytics' +import { + identifyAdvBlocked, + setupAnalytics, + setupIdentification, + trackPageView, +} from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { AppContentLayout } from './components/Layout' +import { verifyAdvStatus } from './features/adv/utils/status' import { isWebOrExtensionVersion } from './utils/Environment' import { lazyImport } from './utils/lazyImport' const { OnboardingModal } = lazyImport(() => import('src/features/onboarding'), 'OnboardingModal') @@ -30,6 +36,11 @@ export const App = () => { document.body.classList.remove('preload') setupAnalytics() setupIdentification() + const adVerifier = async () => { + const status = await verifyAdvStatus() + identifyAdvBlocked(status) + } + adVerifier() }, []) useEffect(() => { diff --git a/src/features/adv/utils/status.ts b/src/features/adv/utils/status.ts new file mode 100644 index 00000000..4c355fe8 --- /dev/null +++ b/src/features/adv/utils/status.ts @@ -0,0 +1,11 @@ +export const verifyAdvStatus = async () => { + try { + const resp = await fetch('https://srv.buysellads.com', { + mode: 'no-cors', + }) + await resp.text() + return false + } catch (e) { + return true + } +} diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts index c03674e1..f070da5b 100644 --- a/src/lib/analytics.ts +++ b/src/lib/analytics.ts @@ -69,6 +69,7 @@ export enum Attributes { MAX_VISIBLE_CARDS = 'Max Visible Cards', DURATION = 'Duration', PROVIDER = 'Provider', + ADV = 'ADV', } const _SEP_ = ' ' @@ -405,6 +406,9 @@ export const identifyUserOccupation = (occupation: string) => { export const identifyUserMaxVisibleCards = (maxVisibleCards: number) => { identifyUserProperty(Attributes.MAX_VISIBLE_CARDS, maxVisibleCards) } +export const identifyAdvBlocked = (blocked: boolean) => { + identifyUserProperty(Attributes.ADV, blocked) +} // Private functions type trackEventProps = { @@ -452,7 +456,10 @@ const trackEvent = ({ object, verb, attributes }: trackEventProps) => { } } -const identifyUserProperty = (attributes: Attributes, value: string | number | string[]) => { +const identifyUserProperty = ( + attributes: Attributes, + value: string | number | string[] | boolean +) => { try { let formatedValue if (Array.isArray(value)) { From 3fe74b2d911701ffd59e378b03997c7c5035e7c1 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 23:44:54 +0000 Subject: [PATCH 086/123] rename vite config to mjs --- vite.config.ts => vite.config.mjs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename vite.config.ts => vite.config.mjs (100%) diff --git a/vite.config.ts b/vite.config.mjs similarity index 100% rename from vite.config.ts rename to vite.config.mjs From b09464b3afafa5bb0299652c56f3d199220f4b69 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 23:45:08 +0000 Subject: [PATCH 087/123] chore: update dependencies and set Node.js engine version --- .nvmrc | 1 + package.json | 9 +- yarn.lock | 655 +++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 482 insertions(+), 183 deletions(-) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..23cc58a7 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18.20.0 \ No newline at end of file diff --git a/package.json b/package.json index 35f5d255..b4da523a 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,10 @@ "@tanstack/react-query-persist-client": "^5.8.4", "@types/dompurify": "^2.3.4", "@types/jspath": "^0.4.0", - "axios": "^0.21.2", + "axios": "^1.8.4", "axios-cache-adapter": "^2.7.3", "country-emoji": "^1.5.4", - "dompurify": "^2.2.7", + "dompurify": "^3.2.4", "firebase": "^11.2.0", "htmlparser2": "^8.0.1", "jsonpath": "^1.1.1", @@ -41,6 +41,9 @@ "web-vitals": "^0.2.4", "zustand": "^4.3.3" }, + "engines": { + "node": "18" + }, "scripts": { "start": "vite", "preview": "vite preview", @@ -92,7 +95,7 @@ "prettier": "^2.7.1", "terser": "^5.19.2", "typescript": "^5.1.6", - "vite": "^4.4.5", + "vite": "^6.2.3", "vite-plugin-svgr": "^3.2.0", "vite-tsconfig-paths": "^4.2.0" } diff --git a/yarn.lock b/yarn.lock index 62c049f7..86071571 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1376,115 +1376,130 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== +"@esbuild/aix-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz#c33cf6bbee34975626b01b80451cbb72b4c6c91d" + integrity sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ== + +"@esbuild/android-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz#ea766015c7d2655164f22100d33d7f0308a28d6d" + integrity sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA== + +"@esbuild/android-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.1.tgz#e84d2bf2fe2e6177a0facda3a575b2139fd3cb9c" + integrity sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q== + +"@esbuild/android-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.1.tgz#58337bee3bc6d78d10425e5500bd11370cfdfbed" + integrity sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw== + +"@esbuild/darwin-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz#a46805c1c585d451aa83be72500bd6e8495dd591" + integrity sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ== + +"@esbuild/darwin-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz#0643e003bb238c63fc93ddbee7d26a003be3cd98" + integrity sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA== + +"@esbuild/freebsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz#cff18da5469c09986b93e87979de5d6872fe8f8e" + integrity sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A== + +"@esbuild/freebsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz#362fc09c2de14987621c1878af19203c46365dde" + integrity sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww== + +"@esbuild/linux-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz#aa90d5b02efc97a271e124e6d1cea490634f7498" + integrity sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ== + +"@esbuild/linux-arm@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz#dfcefcbac60a20918b19569b4b657844d39db35a" + integrity sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ== + +"@esbuild/linux-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz#6f9527077ccb7953ed2af02e013d4bac69f13754" + integrity sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ== + +"@esbuild/linux-loong64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz#287d2412a5456e5860c2839d42a4b51284d1697c" + integrity sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg== + +"@esbuild/linux-mips64el@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz#530574b9e1bc5d20f7a4f44c5f045e26f3783d57" + integrity sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg== + +"@esbuild/linux-ppc64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz#5d7e6b283a0b321ea42c6bc0abeb9eb99c1f5589" + integrity sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg== + +"@esbuild/linux-riscv64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz#14fa0cd073c26b4ee2465d18cd1e18eea7859fa8" + integrity sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ== + +"@esbuild/linux-s390x@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz#e677b4b9d1b384098752266ccaa0d52a420dc1aa" + integrity sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ== + +"@esbuild/linux-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz#f1c796b78fff5ce393658313e8c58613198d9954" + integrity sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA== + +"@esbuild/netbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz#0d280b7dfe3973f111b02d5fe9f3063b92796d29" + integrity sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g== + +"@esbuild/netbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz#be663893931a4bb3f3a009c5cc24fa9681cc71c0" + integrity sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA== + +"@esbuild/openbsd-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz#d9021b884233673a05dc1cc26de0bf325d824217" + integrity sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg== + +"@esbuild/openbsd-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz#9f1dc1786ed2e2938c404b06bcc48be9a13250de" + integrity sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw== + +"@esbuild/sunos-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz#89aac24a4b4115959b3f790192cf130396696c27" + integrity sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg== + +"@esbuild/win32-arm64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz#354358647a6ea98ea6d243bf48bdd7a434999582" + integrity sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ== + +"@esbuild/win32-ia32@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz#8cea7340f2647eba951a041dc95651e3908cd4cb" + integrity sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A== + +"@esbuild/win32-x64@0.25.1": + version "0.25.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz#7d79922cb2d88f9048f06393dbf62d2e4accb584" + integrity sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -2120,6 +2135,106 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-android-arm-eabi@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz#9bedc746a97fe707154086365f269ced92ff4aa9" + integrity sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ== + +"@rollup/rollup-android-arm64@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz#6edc6ffc8af8773e4bc28c72894dd5e846b8ee6c" + integrity sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA== + +"@rollup/rollup-darwin-arm64@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz#737a7b8be9ff79bd24a7efaae0903e8c66ac0676" + integrity sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA== + +"@rollup/rollup-darwin-x64@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz#a6a697bb685ca9462a7caeea5f22f6a686acff1f" + integrity sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ== + +"@rollup/rollup-freebsd-arm64@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz#18113e8e133ccb6de4b9dc9d3e09f7acff344cb7" + integrity sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA== + +"@rollup/rollup-freebsd-x64@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz#5e56ffd4a0d7ccfcbc86867c40b8f0e6a2c0c81e" + integrity sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA== + +"@rollup/rollup-linux-arm-gnueabihf@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz#5addf1a51e1495ae7ff28d26442a88adf629c980" + integrity sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w== + +"@rollup/rollup-linux-arm-musleabihf@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz#00cddb9ab51086c5f2cd33cd4738259e24be4e73" + integrity sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag== + +"@rollup/rollup-linux-arm64-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz#c3b4324496236b6fd9f31fda5701c6d6060b1512" + integrity sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA== + +"@rollup/rollup-linux-arm64-musl@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz#b5222180bb1a50e6e9bc8263efd771c1ce770b6f" + integrity sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz#5660181c1c1efb7b19c7a531d496e685236c5ce7" + integrity sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz#8273166495d2f5d3fbc556cf42a5a6e24b78bdab" + integrity sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ== + +"@rollup/rollup-linux-riscv64-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz#9677e39288ccc91ebcd707cdd794732d701cd174" + integrity sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw== + +"@rollup/rollup-linux-riscv64-musl@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz#71cc5ca7be1ed263357618bfe4f8f50c09725a7e" + integrity sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA== + +"@rollup/rollup-linux-s390x-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz#6b0b7df33eb32b0ee7423898b183acc1b5fee33e" + integrity sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A== + +"@rollup/rollup-linux-x64-gnu@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz#52c27717d3c4819d13b5ebc2373ddea099d2e71b" + integrity sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ== + +"@rollup/rollup-linux-x64-musl@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz#c134a22d30642345de8b799c816345674bf68019" + integrity sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w== + +"@rollup/rollup-win32-arm64-msvc@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz#8063d5f8195dd1845e056d069366fbe06a424d09" + integrity sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg== + +"@rollup/rollup-win32-ia32-msvc@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz#891d90e3b5517f9d290bb416afdfe2ebfb12139e" + integrity sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA== + +"@rollup/rollup-win32-x64-msvc@4.37.0": + version "4.37.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz#a54d7304c3bd45573d8bcd1270de89771f8195fe" + integrity sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA== + "@rushstack/eslint-patch@^1.1.0": version "1.6.1" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.6.1.tgz#9ab8f811930d7af3e3d549183a50884f9eb83f36" @@ -2356,6 +2471,11 @@ dependencies: "@types/trusted-types" "*" +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" @@ -2532,7 +2652,7 @@ dependencies: "@types/jest" "*" -"@types/trusted-types@*": +"@types/trusted-types@*", "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== @@ -2826,6 +2946,11 @@ asynciterator.prototype@^1.0.0: dependencies: has-symbols "^1.0.3" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -2844,12 +2969,14 @@ axios-cache-adapter@^2.7.3: cache-control-esm "1.0.0" md5 "^2.2.1" -axios@^0.21.2: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.8.4: + version "1.8.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.4.tgz#78990bb4bc63d2cae072952d374835950a82f447" + integrity sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" axobject-query@^3.2.1: version "3.2.1" @@ -3005,6 +3132,14 @@ cache-control-esm@1.0.0: resolved "https://registry.yarnpkg.com/cache-control-esm/-/cache-control-esm-1.0.0.tgz#417647ecf1837a5e74155f55d5a4ae32a84e2581" integrity sha512-Fa3UV4+eIk4EOih8FTV6EEsVKO0W5XWtNs6FC3InTfVz+EjurjPfDXY5wZDo/lxjDxg5RjNcurLyxEJBcEUx9g== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" @@ -3025,9 +3160,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001565: - version "1.0.30001570" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz#b4e5c1fa786f733ab78fc70f592df6b3f23244ca" - integrity sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw== + version "1.0.30001707" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz" + integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw== chalk@^2.4.2: version "2.4.2" @@ -3112,6 +3247,13 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" @@ -3267,6 +3409,11 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -3330,10 +3477,12 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@^2.2.7: - version "2.4.7" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== +dompurify@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.4.tgz#af5a5a11407524431456cf18836c55d13441cd8e" + integrity sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg== + optionalDependencies: + "@types/trusted-types" "^2.0.7" domutils@^3.0.1: version "3.1.0" @@ -3352,6 +3501,15 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ejs@^3.1.9: version "3.1.9" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" @@ -3431,6 +3589,16 @@ es-abstract@^1.22.1: unbox-primitive "^1.0.2" which-typed-array "^1.1.13" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: version "1.0.15" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" @@ -3451,6 +3619,13 @@ es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15: iterator.prototype "^1.1.2" safe-array-concat "^1.0.1" +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" @@ -3460,6 +3635,16 @@ es-set-tostringtag@^2.0.1: has-tostringtag "^1.0.0" hasown "^2.0.0" +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es-shim-unscopables@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" @@ -3476,33 +3661,36 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== +esbuild@^0.25.0: + version "0.25.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.1.tgz#a16b8d070b6ad4871935277bda6ccfe852e3fa2f" + integrity sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ== optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" + "@esbuild/aix-ppc64" "0.25.1" + "@esbuild/android-arm" "0.25.1" + "@esbuild/android-arm64" "0.25.1" + "@esbuild/android-x64" "0.25.1" + "@esbuild/darwin-arm64" "0.25.1" + "@esbuild/darwin-x64" "0.25.1" + "@esbuild/freebsd-arm64" "0.25.1" + "@esbuild/freebsd-x64" "0.25.1" + "@esbuild/linux-arm" "0.25.1" + "@esbuild/linux-arm64" "0.25.1" + "@esbuild/linux-ia32" "0.25.1" + "@esbuild/linux-loong64" "0.25.1" + "@esbuild/linux-mips64el" "0.25.1" + "@esbuild/linux-ppc64" "0.25.1" + "@esbuild/linux-riscv64" "0.25.1" + "@esbuild/linux-s390x" "0.25.1" + "@esbuild/linux-x64" "0.25.1" + "@esbuild/netbsd-arm64" "0.25.1" + "@esbuild/netbsd-x64" "0.25.1" + "@esbuild/openbsd-arm64" "0.25.1" + "@esbuild/openbsd-x64" "0.25.1" + "@esbuild/sunos-x64" "0.25.1" + "@esbuild/win32-arm64" "0.25.1" + "@esbuild/win32-ia32" "0.25.1" + "@esbuild/win32-x64" "0.25.1" escalade@^3.1.1: version "3.1.1" @@ -3887,10 +4075,10 @@ focus-trap@^6.2.2: dependencies: tabbable "^5.3.3" -follow-redirects@^1.14.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -3899,7 +4087,17 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -fsevents@~2.3.2: +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.12" + +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -3944,6 +4142,30 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -3995,6 +4217,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -4037,6 +4264,11 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -4044,6 +4276,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + hasown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" @@ -4051,6 +4290,13 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + hast-util-whitespace@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" @@ -4525,6 +4771,11 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + md5@^2.2.1: version "2.3.0" resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" @@ -4800,6 +5051,18 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -4844,10 +5107,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -4986,19 +5249,24 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -postcss@^8.4.27: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== +postcss@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.0.2" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@~1.1.2: version "1.1.2" @@ -5068,6 +5336,11 @@ protobufjs@^7.2.5: "@types/node" ">=13.7.0" long "^5.0.0" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -5410,11 +5683,33 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== +rollup@^4.30.1: + version "4.37.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.37.0.tgz#e4172f8bdb6ea7df08a1b0acf99abeccb2250378" + integrity sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg== + dependencies: + "@types/estree" "1.0.6" optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.37.0" + "@rollup/rollup-android-arm64" "4.37.0" + "@rollup/rollup-darwin-arm64" "4.37.0" + "@rollup/rollup-darwin-x64" "4.37.0" + "@rollup/rollup-freebsd-arm64" "4.37.0" + "@rollup/rollup-freebsd-x64" "4.37.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.37.0" + "@rollup/rollup-linux-arm-musleabihf" "4.37.0" + "@rollup/rollup-linux-arm64-gnu" "4.37.0" + "@rollup/rollup-linux-arm64-musl" "4.37.0" + "@rollup/rollup-linux-loongarch64-gnu" "4.37.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.37.0" + "@rollup/rollup-linux-riscv64-gnu" "4.37.0" + "@rollup/rollup-linux-riscv64-musl" "4.37.0" + "@rollup/rollup-linux-s390x-gnu" "4.37.0" + "@rollup/rollup-linux-x64-gnu" "4.37.0" + "@rollup/rollup-linux-x64-musl" "4.37.0" + "@rollup/rollup-win32-arm64-msvc" "4.37.0" + "@rollup/rollup-win32-ia32-msvc" "4.37.0" + "@rollup/rollup-win32-x64-msvc" "4.37.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -5516,10 +5811,10 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@~0.5.20: version "0.5.21" @@ -5998,16 +6293,16 @@ vite-tsconfig-paths@^4.2.0: globrex "^0.1.2" tsconfck "^2.1.0" -vite@^4.4.5: - version "4.5.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a" - integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA== +vite@^6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.3.tgz#249e92d32886981ab46bc1f049ac72abc6fa81e2" + integrity sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg== dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" + esbuild "^0.25.0" + postcss "^8.5.3" + rollup "^4.30.1" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.3" warning@^4.0.3: version "4.0.3" From 79183a2d59ec16e052ce374ca08a7c94da019450 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 24 Mar 2025 23:51:31 +0000 Subject: [PATCH 088/123] fix: update request interceptor to use InternalAxiosRequestConfig --- src/lib/interceptors/DefaultRequestInterceptor.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/interceptors/DefaultRequestInterceptor.ts b/src/lib/interceptors/DefaultRequestInterceptor.ts index 174adfb1..8683e376 100644 --- a/src/lib/interceptors/DefaultRequestInterceptor.ts +++ b/src/lib/interceptors/DefaultRequestInterceptor.ts @@ -1,9 +1,9 @@ -import { AxiosRequestConfig } from 'axios' +import { InternalAxiosRequestConfig } from 'axios' import { API_ENDPOINT } from 'src/config' import { getUserToken } from 'src/features/auth' import { isProduction } from 'src/utils/Environment' -export async function DefaultRequestInterceptor(config: AxiosRequestConfig) { +export async function DefaultRequestInterceptor(config: InternalAxiosRequestConfig) { if (config) { config.baseURL = isProduction() ? API_ENDPOINT : '/api' if (config.headers) { From 051e1c59ae79f532d92b6189d3c2a9616123518d Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 26 Mar 2025 00:02:54 +0000 Subject: [PATCH 089/123] chore: update Node.js version in GitHub Actions workflow to 18 --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f99ffb3a..ad534968 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -22,7 +22,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: '16' + node-version: 18 - name: Install dependencies run: yarn From d53d4d87319b1434b5ef76600269b161d661a757 Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 26 Mar 2025 00:12:00 +0000 Subject: [PATCH 090/123] fix: add unique keys to list items in UserInfo component --- .../settings/components/GeneralSettings/GeneralSettings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 0aa5977e..59e8a25b 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -75,7 +75,7 @@ const UserInfo = ({ user }: UserInfoProps) => { const streak = user.streak || 1 if (i < streak) { return ( -
  • +
  • @@ -83,7 +83,7 @@ const UserInfo = ({ user }: UserInfoProps) => { ) } else { return ( -
  • +
  • ) From 67f94aa5e61db1fdfeda85af3faef776120536be Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 26 Mar 2025 00:59:52 +0000 Subject: [PATCH 091/123] fix: update logout modal title and description for clarity --- .../settings/components/GeneralSettings/GeneralSettings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 59e8a25b..0cdc3df6 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -38,8 +38,8 @@ const UserInfo = ({ user }: UserInfoProps) => {
    setShowLogout(false)} onConfirm={logout} /> From 0c70a29fb4d1e155c5757d9d9526f625982af9de Mon Sep 17 00:00:00 2001 From: John Doe Date: Wed, 26 Mar 2025 01:05:30 +0000 Subject: [PATCH 092/123] fix: improve auth error handling and update modal styles for better user experience --- src/features/auth/components/authModal.css | 2 ++ src/providers/AuthProvider.tsx | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/features/auth/components/authModal.css b/src/features/auth/components/authModal.css index 3007d414..9a3ccfb8 100644 --- a/src/features/auth/components/authModal.css +++ b/src/features/auth/components/authModal.css @@ -28,12 +28,14 @@ border-radius: 6px; padding: 8px; display: flex; + justify-content: center; flex-direction: row; p { padding: 0; margin: 0; font-size: 0.8em; color: red; + text-align: center; } .cta { flex: 1; diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index 469b6c3b..6d5c6e16 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -8,7 +8,7 @@ import { firebaseAuth } from 'src/lib/firebase' export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const navigate = useNavigate() const [searchParams] = useSearchParams() - const { closeAuthModal, initState, setAuthError } = useAuth() + const { closeAuthModal, initState, setAuthError, openAuthModal } = useAuth() const connectTheUser = useCallback((token?: string | null, provider?: string | null) => { const allowedProviders = ['google', 'github'] @@ -78,16 +78,16 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const token = searchParams.get('access_token') const provider = searchParams.get('provider') connectTheUser(token, provider).catch((error) => { + openAuthModal() if (error && error.code === 'auth/account-exists-with-different-credential') { - toast( - 'You have an account with a different provider. Please sign in with that provider to continue.', - { - theme: 'dangerToast', - } - ) + setAuthError({ + message: + 'You have an account with a different provider. Please sign in with that provider to continue.', + }) } else { - console.log(error) - toast('Error signing in, Please try again', { theme: 'dangerToast' }) + setAuthError({ + message: 'Error signing in, Please try again', + }) } }) }, [searchParams]) From fa162ac0db366a3cf21b37358200a1a674caaeb1 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 27 Mar 2025 23:29:31 +0000 Subject: [PATCH 093/123] fix: restrict content script matches to production URL only --- public/base.manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/base.manifest.json b/public/base.manifest.json index 6b0abd23..7be1bb4d 100644 --- a/public/base.manifest.json +++ b/public/base.manifest.json @@ -9,7 +9,7 @@ "host_permissions": ["https://*.hackertab.dev/*"], "content_scripts": [ { - "matches": ["http://127.0.0.1:5173/*", "http://localhost:5173/*", "https://hackertab.dev/*"], + "matches": ["https://hackertab.dev/*"], "run_at": "document_start", "js": ["content.js"] } From d1a2770e34430b0a5352e5406c6644d2e6bc3a29 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 27 Mar 2025 23:29:56 +0000 Subject: [PATCH 094/123] feat: enhance streak display with new icon and styling adjustments --- src/assets/App.css | 17 +++++++++------ src/assets/icons/fire_icon.svg | 5 +++++ src/components/Layout/Header.tsx | 6 +++--- .../GeneralSettings/GeneralSettings.tsx | 9 ++++---- .../GeneralSettings/generalSettings.css | 21 ++++++++++++++----- 5 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 src/assets/icons/fire_icon.svg diff --git a/src/assets/App.css b/src/assets/App.css index 8ca49cc5..34e3bf59 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1164,29 +1164,34 @@ Producthunt item width: 40px; height: 40px; border-radius: 50%; - border: 1px solid var(--tooltip-accent-color); + border: 2px solid #ff8f1f; } .streak { position: absolute; display: inline-block; - bottom: -12px; + bottom: -8px; left: 0; right: 0; color: white; .content { - background-color: var(--tooltip-accent-color); - font-size: 10px; + background-color: #995826; + font-size: 11px; border-radius: 12px; font-weight: bold; - padding: 2px 8px; + border: 2px solid black; + padding: 1px 6px 1px 22px; display: inline-flex; align-items: center; justify-content: center; + color: white; } .icon { - font-size: 12px; + width: 2.2em; + position: absolute; + left: 0; + top: -2px; } } } diff --git a/src/assets/icons/fire_icon.svg b/src/assets/icons/fire_icon.svg new file mode 100644 index 00000000..12f8ed21 --- /dev/null +++ b/src/assets/icons/fire_icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index 0a310e52..31eaf7c3 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -3,8 +3,9 @@ import { BsFillBookmarksFill, BsFillGearFill, BsMoonFill } from 'react-icons/bs' import { CgTab } from 'react-icons/cg' import { FaUser } from 'react-icons/fa' import { IoMdSunny } from 'react-icons/io' -import { MdDoDisturbOff, MdFlashOn } from 'react-icons/md' +import { MdDoDisturbOff } from 'react-icons/md' import { Link, useLocation, useNavigate } from 'react-router-dom' +import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { ReactComponent as HackertabLogo } from 'src/assets/logo.svg' import { SearchBar } from 'src/components/Elements/SearchBar' import { UserTags } from 'src/components/Elements/UserTags' @@ -13,7 +14,6 @@ import { Changelog } from 'src/features/changelog' import { identifyUserTheme, trackDNDDisable, trackThemeSelect } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { Button, CircleButton } from '../Elements' - export const Header = () => { const { openAuthModal, user, isConnected } = useAuth() @@ -97,7 +97,7 @@ export const Header = () => {
    - {user?.streak || 1} + {user?.streak || 1}
    diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 0cdc3df6..728ee7e2 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -1,9 +1,10 @@ import React, { useState } from 'react' -import { FaFire, FaGithub } from 'react-icons/fa' +import { FaGithub } from 'react-icons/fa' import { FcGoogle } from 'react-icons/fc' import { IoCheckmarkOutline } from 'react-icons/io5' import Toggle from 'react-toggle' import 'react-toggle/style.css' +import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { Button, ChipsSet, ConfirmModal } from 'src/components/Elements' import { Footer } from 'src/components/Layout' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout' @@ -64,9 +65,9 @@ const UserInfo = ({ user }: UserInfoProps) => {

    You're on{' '} - - {' '} - {pluralize(user.streak || 1, 'day')} streak + + + {pluralize(user.streak || 1, 'day')} streak

    diff --git a/src/features/settings/components/GeneralSettings/generalSettings.css b/src/features/settings/components/GeneralSettings/generalSettings.css index 3253f8e6..b588e31a 100644 --- a/src/features/settings/components/GeneralSettings/generalSettings.css +++ b/src/features/settings/components/GeneralSettings/generalSettings.css @@ -135,11 +135,22 @@ Select styles flex-direction: column; row-gap: 16px; align-self: flex-start; -} -.streaks .title { - margin: 0; - padding: 0; - font-size: 0.9em; + + .title { + margin: 0; + padding: 0; + font-size: 0.9em; + } + .icon { + width: 1.6em; + vertical-align: bottom; + position: relative; + top: 2px; + } + .highlight { + font-weight: 900; + color: #ff8f1f; + } } .streaks ul.streaksWeek::before { From ea20354725ccde9c3a4062b5b31d348f32554bfa Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 27 Mar 2025 23:39:01 +0000 Subject: [PATCH 095/123] fix: update background style for content section with gradient --- src/assets/App.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/App.css b/src/assets/App.css index 34e3bf59..a46ddcfe 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1176,7 +1176,7 @@ Producthunt item color: white; .content { - background-color: #995826; + background: linear-gradient(to right, #59320c 20%, #f88e0c); font-size: 11px; border-radius: 12px; font-weight: bold; From e53dc2c9be9d84fd51ebb2a5159e6e4e2a69597f Mon Sep 17 00:00:00 2001 From: John Doe Date: Fri, 28 Mar 2025 00:39:28 +0000 Subject: [PATCH 096/123] fix: update content background color and adjust border styling for consistency --- src/assets/App.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/assets/App.css b/src/assets/App.css index a46ddcfe..f7feeae6 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1176,11 +1176,11 @@ Producthunt item color: white; .content { - background: linear-gradient(to right, #59320c 20%, #f88e0c); + background: #f88e0c; font-size: 11px; border-radius: 12px; font-weight: bold; - border: 2px solid black; + border: 2px solid var(--background-color); padding: 1px 6px 1px 22px; display: inline-flex; align-items: center; @@ -1192,6 +1192,7 @@ Producthunt item position: absolute; left: 0; top: -2px; + filter: drop-shadow(0 -4px 4px rgb(0 0 0 / 0.4)); } } } From bdd22191c3e6cf31d268e2e468111227225b90c6 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 30 Mar 2025 16:13:06 +0000 Subject: [PATCH 097/123] feat: add new avatar icon and define accent color variables for styling --- src/assets/icons/avatar.svg | 19 +++++++++++++++++++ src/assets/variables.css | 2 ++ src/components/Layout/Header.tsx | 7 ++++--- 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 src/assets/icons/avatar.svg diff --git a/src/assets/icons/avatar.svg b/src/assets/icons/avatar.svg new file mode 100644 index 00000000..91b9bd7a --- /dev/null +++ b/src/assets/icons/avatar.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/variables.css b/src/assets/variables.css index 96541b82..89b7a223 100644 --- a/src/assets/variables.css +++ b/src/assets/variables.css @@ -22,6 +22,7 @@ html.dark { --secondary-text-color: #a2a7ad; --overlay-background-color: #7985958a; --language-dot-background-color: #424d5a; + --icons-accent-color: #ffffff; --dark-mode-background-color: #1c2026; --dark-mode-text-color: #f0c73d; @@ -110,6 +111,7 @@ html.light { --overlay-background-color: #0000005c; --primary-hover-text-color: #495a6b; --language-dot-background-color: #cfddec; + --icons-accent-color: #3c5065; --scrollbar-background-color: #eff6ff; --scrollbar-accent-color: #b9cadc; diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index 31eaf7c3..dae5f3cb 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -1,12 +1,13 @@ import { useEffect, useState } from 'react' import { BsFillBookmarksFill, BsFillGearFill, BsMoonFill } from 'react-icons/bs' import { CgTab } from 'react-icons/cg' -import { FaUser } from 'react-icons/fa' import { IoMdSunny } from 'react-icons/io' import { MdDoDisturbOff } from 'react-icons/md' import { Link, useLocation, useNavigate } from 'react-router-dom' +import { ReactComponent as AvatarPlaceholder } from 'src/assets/icons/avatar.svg' import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { ReactComponent as HackertabLogo } from 'src/assets/logo.svg' + import { SearchBar } from 'src/components/Elements/SearchBar' import { UserTags } from 'src/components/Elements/UserTags' import { useAuth } from 'src/features/auth' @@ -94,7 +95,7 @@ export const Header = () => { }}> {isConnected ? ( <> - +
    {user?.streak || 1} @@ -102,7 +103,7 @@ export const Header = () => {
    ) : ( - + )}
    From dfb6db55e6c670ab7850f47aa2ee40111ebb1a12 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 30 Mar 2025 16:13:15 +0000 Subject: [PATCH 098/123] fix: correct capitalization of terms in AuthModal component --- src/features/auth/components/AuthModal.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/auth/components/AuthModal.tsx b/src/features/auth/components/AuthModal.tsx index e5e2c269..18423fb7 100644 --- a/src/features/auth/components/AuthModal.tsx +++ b/src/features/auth/components/AuthModal.tsx @@ -115,11 +115,11 @@ export const AuthModal = ({ showAuth }: AuthModalProps) => {

    By signing in, you agree to our{' '} - Terms of Service + terms of Service {' '} and{' '} - Privacy Policy + privacy Policy .

    From a796a2aba1fca5638b1270e64ca2306018b286a5 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sun, 30 Mar 2025 16:13:20 +0000 Subject: [PATCH 099/123] feat: refactor user information display into separate UserInfo component --- .../GeneralSettings/GeneralSettings.tsx | 84 +------------------ .../components/UserSettings/UserInfo.tsx | 78 +++++++++++++++++ 2 files changed, 82 insertions(+), 80 deletions(-) create mode 100644 src/features/settings/components/UserSettings/UserInfo.tsx diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 728ee7e2..80c51530 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -1,14 +1,10 @@ -import React, { useState } from 'react' -import { FaGithub } from 'react-icons/fa' -import { FcGoogle } from 'react-icons/fc' -import { IoCheckmarkOutline } from 'react-icons/io5' +import React from 'react' import Toggle from 'react-toggle' import 'react-toggle/style.css' -import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' -import { Button, ChipsSet, ConfirmModal } from 'src/components/Elements' +import { ChipsSet } from 'src/components/Elements' import { Footer } from 'src/components/Layout' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout' -import { useAuth, User } from 'src/features/auth' +import { useAuth } from 'src/features/auth' import { identifyUserLinksInNewTab, identifyUserListingMode, @@ -21,82 +17,10 @@ import { } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { Option } from 'src/types' -import { pluralize } from 'src/utils/String' +import { UserInfo } from '../UserSettings/UserInfo' import { DNDSettings } from './DNDSettings' import './generalSettings.css' -// TODO Maybe we should create a separate folder in components for UserInfo ? -interface UserInfoProps { - user: User -} - -const UserInfo = ({ user }: UserInfoProps) => { - const { logout, providerId } = useAuth() - const providerName = providerId?.split('.')[0] || 'Unknown' - const [showLogout, setShowLogout] = useState(false) - - return ( -
    - setShowLogout(false)} - onConfirm={logout} - /> - {user?.imageURL && } -
    -
    {user.name}
    -
    - {providerId == 'github.com' ? ( - - ) : providerId == 'google.com' ? ( - - ) : null} - Connected with {providerName} -
    -
    - -
    -
    - -
    -

    - You're on{' '} - - - {pluralize(user.streak || 1, 'day')} streak - -

    -
    -
      - {Array.from({ length: 5 }, (_, i) => { - const streak = user.streak || 1 - if (i < streak) { - return ( -
    • - - - -
    • - ) - } else { - return ( -
    • - -
    • - ) - } - })} -
    -
    -
    -
    - ) -} - export const GeneralSettings = () => { const { openLinksNewTab, diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx new file mode 100644 index 00000000..9cc35217 --- /dev/null +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -0,0 +1,78 @@ +import { useState } from 'react' +import { FaGithub } from 'react-icons/fa' +import { FcGoogle } from 'react-icons/fc' +import { IoCheckmarkOutline } from 'react-icons/io5' +import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' +import { Button, ConfirmModal } from 'src/components/Elements' +import { useAuth, User } from 'src/features/auth' +import { pluralize } from 'src/utils/String' + +interface UserInfoProps { + user: User +} + +export const UserInfo = ({ user }: UserInfoProps) => { + const { logout, providerId } = useAuth() + const providerName = providerId?.split('.')[0] || 'Unknown' + const [showLogout, setShowLogout] = useState(false) + + return ( +
    + setShowLogout(false)} + onConfirm={logout} + /> + {user?.imageURL && } +
    +
    {user.name}
    +
    + {providerId == 'github.com' ? ( + + ) : providerId == 'google.com' ? ( + + ) : null} + Connected with {providerName} +
    +
    + +
    +
    + +
    +

    + You're on{' '} + + {pluralize(user.streak || 1, 'day')} streak + +

    +
    +
      + {Array.from({ length: 5 }, (_, i) => { + const streak = user.streak || 1 + if (i < streak) { + return ( +
    • + + + +
    • + ) + } else { + return ( +
    • + +
    • + ) + } + })} +
    +
    +
    +
    + ) +} From 8051228cfbdcc6a17f2bace812bf88ae09b5b478 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 16:12:20 +0000 Subject: [PATCH 100/123] feat: add user ID to User type and initialize user state in AuthProvider --- src/features/auth/types/index.ts | 1 + src/providers/AuthProvider.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/src/features/auth/types/index.ts b/src/features/auth/types/index.ts index b4502dd4..51b82333 100644 --- a/src/features/auth/types/index.ts +++ b/src/features/auth/types/index.ts @@ -1,4 +1,5 @@ export type User = { + id: string name: string imageURL?: string streak?: number diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index 6d5c6e16..ba3c3d61 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -26,6 +26,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { initState({ user: { + id: user.uid, name: user.displayName || 'Anonymous', imageURL: user.photoURL || '', }, From 4b50288ad35fe4837d619cf6bc4f8ab74989bb16 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 16:12:41 +0000 Subject: [PATCH 101/123] feat: implement account deletion functionality and integrate into GeneralSettings --- src/features/auth/api/deleteAccount.ts | 23 ++++++++ .../GeneralSettings/GeneralSettings.tsx | 8 +-- .../components/UserSettings/DeleteAccount.tsx | 57 +++++++++++++++++++ .../components/UserSettings/UserInfo.tsx | 13 +++-- 4 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 src/features/auth/api/deleteAccount.ts create mode 100644 src/features/settings/components/UserSettings/DeleteAccount.tsx diff --git a/src/features/auth/api/deleteAccount.ts b/src/features/auth/api/deleteAccount.ts new file mode 100644 index 00000000..c448ea4c --- /dev/null +++ b/src/features/auth/api/deleteAccount.ts @@ -0,0 +1,23 @@ +import { useMutation } from '@tanstack/react-query' +import { axios } from 'src/lib/axios' +import { MutationConfig } from 'src/lib/react-query' + +type DeleteAccountDTO = { + userId: string +} +const deleteAccount = ({ userId }: DeleteAccountDTO): Promise<{ authLink: string }> => { + return axios.delete(`/engine/user/${userId}`, {}) +} + +type QueryFnType = typeof deleteAccount + +type UseGetArticlesOptions = { + config?: MutationConfig +} + +export const useDeleteAccount = ({ config }: UseGetArticlesOptions = {}) => { + return useMutation({ + ...config, + mutationFn: deleteAccount, + }) +} diff --git a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx index 80c51530..80bbe10f 100644 --- a/src/features/settings/components/GeneralSettings/GeneralSettings.tsx +++ b/src/features/settings/components/GeneralSettings/GeneralSettings.tsx @@ -4,7 +4,6 @@ import 'react-toggle/style.css' import { ChipsSet } from 'src/components/Elements' import { Footer } from 'src/components/Layout' import { SettingsContentLayout } from 'src/components/Layout/SettingsContentLayout' -import { useAuth } from 'src/features/auth' import { identifyUserLinksInNewTab, identifyUserListingMode, @@ -17,6 +16,7 @@ import { } from 'src/lib/analytics' import { useUserPreferences } from 'src/stores/preferences' import { Option } from 'src/types' +import { DeleteAccount } from '../UserSettings/DeleteAccount' import { UserInfo } from '../UserSettings/UserInfo' import { DNDSettings } from './DNDSettings' import './generalSettings.css' @@ -63,8 +63,6 @@ export const GeneralSettings = () => { } } - const { user } = useAuth() - return ( { 'Customize your experience by selecting the number of cards you want to see, the search engine you want to use and more.' }>
    - {user != null && } +

    Max number of cards to display

    @@ -137,6 +135,8 @@ export const GeneralSettings = () => { + +
    diff --git a/src/features/settings/components/UserSettings/DeleteAccount.tsx b/src/features/settings/components/UserSettings/DeleteAccount.tsx new file mode 100644 index 00000000..75943ee6 --- /dev/null +++ b/src/features/settings/components/UserSettings/DeleteAccount.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react' +import toast from 'react-simple-toasts' +import { Button, ConfirmModal } from 'src/components/Elements' +import { useAuth } from 'src/features/auth' +import { useDeleteAccount } from 'src/features/auth/api/deleteAccount' + +export const DeleteAccount = () => { + const deleteAccountMutation = useDeleteAccount() + const { user, logout } = useAuth() + const [confirmDelete, setConfirmDelete] = useState(false) + + if (!user) { + return null + } + + const onDeleteAccount = () => { + deleteAccountMutation + .mutateAsync({ + userId: user.id, + }) + .then(() => { + logout() + toast('Account deleted successfully', { theme: 'successToast' }) + }) + .catch(() => { + toast('Failed to delete account', { theme: 'defaultToast' }) + }) + } + + return ( +
    +

    + Delete account? +
    + + This action is irreversible and will delete all your data. Proceed with caution. + +

    +
    + setConfirmDelete(false)} + onConfirm={onDeleteAccount} + /> + + +
    +
    + ) +} diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx index 9cc35217..575a3b63 100644 --- a/src/features/settings/components/UserSettings/UserInfo.tsx +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -4,18 +4,19 @@ import { FcGoogle } from 'react-icons/fc' import { IoCheckmarkOutline } from 'react-icons/io5' import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { Button, ConfirmModal } from 'src/components/Elements' -import { useAuth, User } from 'src/features/auth' +import { useAuth } from 'src/features/auth' import { pluralize } from 'src/utils/String' -interface UserInfoProps { - user: User -} - -export const UserInfo = ({ user }: UserInfoProps) => { +export const UserInfo = () => { + const { user } = useAuth() const { logout, providerId } = useAuth() const providerName = providerId?.split('.')[0] || 'Unknown' const [showLogout, setShowLogout] = useState(false) + if (!user) { + return null + } + return (
    Date: Mon, 31 Mar 2025 16:42:55 +0000 Subject: [PATCH 102/123] fix: improve error message for account connection in AuthProvider --- src/providers/AuthProvider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index ba3c3d61..694ff0de 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -83,7 +83,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { if (error && error.code === 'auth/account-exists-with-different-credential') { setAuthError({ message: - 'You have an account with a different provider. Please sign in with that provider to continue.', + 'This account is already connected with a different provider. Please sign in with that provider to continue.', }) } else { setAuthError({ From 0024f28bf8f9545c83e4d869ced6310272f751d4 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 16:43:27 +0000 Subject: [PATCH 103/123] feat: enhance UserInfo component with account connection prompt and styling adjustments --- .../GeneralSettings/generalSettings.css | 3 +++ .../components/UserSettings/UserInfo.tsx | 25 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/features/settings/components/GeneralSettings/generalSettings.css b/src/features/settings/components/GeneralSettings/generalSettings.css index b588e31a..aeb01329 100644 --- a/src/features/settings/components/GeneralSettings/generalSettings.css +++ b/src/features/settings/components/GeneralSettings/generalSettings.css @@ -121,6 +121,9 @@ Select styles font-weight: 600; } +.userContent .actions { + margin-top: 6px; +} .userContent .sub { font-size: 0.9em; opacity: 0.9; diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx index 575a3b63..d7697a4d 100644 --- a/src/features/settings/components/UserSettings/UserInfo.tsx +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -2,6 +2,7 @@ import { useState } from 'react' import { FaGithub } from 'react-icons/fa' import { FcGoogle } from 'react-icons/fc' import { IoCheckmarkOutline } from 'react-icons/io5' +import { ReactComponent as AvatarPlaceholder } from 'src/assets/icons/avatar.svg' import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { Button, ConfirmModal } from 'src/components/Elements' import { useAuth } from 'src/features/auth' @@ -9,12 +10,30 @@ import { pluralize } from 'src/utils/String' export const UserInfo = () => { const { user } = useAuth() - const { logout, providerId } = useAuth() + const { logout, providerId, openAuthModal } = useAuth() const providerName = providerId?.split('.')[0] || 'Unknown' const [showLogout, setShowLogout] = useState(false) if (!user) { - return null + return ( +
    + +
    +
    + Join Hackertab +
    +
    + Create a free account on Hackertab to sync, save bookmarks, and earn rewards. + settings. +
    +
    + +
    +
    +
    + ) } return ( @@ -37,7 +56,7 @@ export const UserInfo = () => { ) : null} Connected with {providerName}
    -
    +
    From b71330e1a6d2a764e64abd693c24ca423efe6972 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 16:53:04 +0000 Subject: [PATCH 104/123] fix: remove redundant text from UserInfo component --- src/features/settings/components/UserSettings/UserInfo.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx index d7697a4d..d17430ab 100644 --- a/src/features/settings/components/UserSettings/UserInfo.tsx +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -24,7 +24,6 @@ export const UserInfo = () => {
    Create a free account on Hackertab to sync, save bookmarks, and earn rewards. - settings.
    ) : ( - + )}
    diff --git a/src/features/settings/components/GeneralSettings/generalSettings.css b/src/features/settings/components/GeneralSettings/generalSettings.css index aeb01329..ac030e82 100644 --- a/src/features/settings/components/GeneralSettings/generalSettings.css +++ b/src/features/settings/components/GeneralSettings/generalSettings.css @@ -102,35 +102,35 @@ Select styles display: flex; align-items: center; border-bottom: 1px solid var(--card-content-divider); -} -.userContent .userImage { - width: 50px; - height: 50px; - border-radius: 100%; - align-self: flex-start; -} -.userContent .userInfos { - flex: 1; - display: flex; - flex-direction: column; - gap: 8px; - width: auto; - margin-left: 10px; -} -.userContent .userName { - font-weight: 600; -} -.userContent .actions { - margin-top: 6px; -} -.userContent .sub { - font-size: 0.9em; - opacity: 0.9; - display: flex; - flex-direction: row; - align-items: center; - column-gap: 4px; + .userImage { + width: 50px; + height: 50px; + border-radius: 100%; + align-self: flex-start; + } + .userInfos { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + width: auto; + margin-left: 10px; + } + .userName { + font-weight: 600; + } + .actions { + margin-top: 6px; + } + .sub { + font-size: 0.9em; + opacity: 0.9; + display: flex; + flex-direction: row; + align-items: center; + column-gap: 4px; + } } .streaks { From 068346685023a9a3153e74c5766858a5a06d34c9 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 17:14:18 +0000 Subject: [PATCH 106/123] feat: add loading state to profile image button and apply overflow hidden styling --- src/assets/App.css | 5 +++-- src/components/Layout/Header.tsx | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/assets/App.css b/src/assets/App.css index 375d5c74..bb4551f9 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1162,11 +1162,12 @@ Producthunt item color: white; font-size: 24px; } - +.overflowHidden { + overflow: hidden; +} /* User */ .profileImageContainer { position: relative; - overflow: hidden; img { width: 40px; diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index 33b71c7e..1b2fedbd 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -1,3 +1,4 @@ +import { clsx } from 'clsx' import { useEffect, useState } from 'react' import { BsFillBookmarksFill, BsFillGearFill, BsMoonFill } from 'react-icons/bs' import { CgTab } from 'react-icons/cg' @@ -7,7 +8,6 @@ import { Link, useLocation, useNavigate } from 'react-router-dom' import { ReactComponent as AvatarPlaceholder } from 'src/assets/icons/avatar.svg' import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' import { ReactComponent as HackertabLogo } from 'src/assets/logo.svg' - import { SearchBar } from 'src/components/Elements/SearchBar' import { UserTags } from 'src/components/Elements/UserTags' import { useAuth } from 'src/features/auth' @@ -16,7 +16,7 @@ import { identifyUserTheme, trackDNDDisable, trackThemeSelect } from 'src/lib/an import { useUserPreferences } from 'src/stores/preferences' import { Button, CircleButton } from '../Elements' export const Header = () => { - const { openAuthModal, user, isConnected } = useAuth() + const { openAuthModal, user, isConnected, isConnecting } = useAuth() const [themeIcon, setThemeIcon] = useState() const { theme, setTheme, setDNDDuration, isDNDModeActive } = useUserPreferences() @@ -85,7 +85,8 @@ export const Header = () => { { if (isConnected) { navigate('/settings/general') From 54522d582c4b708f2b45f261e350b3ae344f2e6b Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 17:14:42 +0000 Subject: [PATCH 107/123] feat: add user delete tracking to analytics and update DeleteAccount component --- .../settings/components/UserSettings/DeleteAccount.tsx | 2 ++ src/lib/analytics.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/features/settings/components/UserSettings/DeleteAccount.tsx b/src/features/settings/components/UserSettings/DeleteAccount.tsx index 75943ee6..02183067 100644 --- a/src/features/settings/components/UserSettings/DeleteAccount.tsx +++ b/src/features/settings/components/UserSettings/DeleteAccount.tsx @@ -3,6 +3,7 @@ import toast from 'react-simple-toasts' import { Button, ConfirmModal } from 'src/components/Elements' import { useAuth } from 'src/features/auth' import { useDeleteAccount } from 'src/features/auth/api/deleteAccount' +import { trackUserDelete } from 'src/lib/analytics' export const DeleteAccount = () => { const deleteAccountMutation = useDeleteAccount() @@ -20,6 +21,7 @@ export const DeleteAccount = () => { }) .then(() => { logout() + trackUserDelete() toast('Account deleted successfully', { theme: 'successToast' }) }) .catch(() => { diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts index f3ffeeb9..9d2b8d59 100644 --- a/src/lib/analytics.ts +++ b/src/lib/analytics.ts @@ -46,6 +46,7 @@ enum Verbs { COPY = 'Copy', CONNECT = 'Connect', DISCONNECT = 'Disconnect', + DELETE = 'Delete', } export enum Attributes { @@ -394,6 +395,13 @@ export const trackUserDisconnect = () => { }) } +export const trackUserDelete = () => { + trackEvent({ + object: Objects.USER, + verb: Verbs.DELETE, + }) +} + // Identification export const identifyUserLanguages = (languages: string[]) => { From f349dbaa85cf6ffaa6cf5902d96d1a1479bca54e Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 17:17:50 +0000 Subject: [PATCH 108/123] improve the displaying when the button is disabled --- src/components/Elements/Button/Button.css | 10 ++++++++++ src/components/Elements/Button/Button.tsx | 8 +++++++- src/components/Elements/Button/CircleButton.tsx | 14 ++++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/components/Elements/Button/Button.css b/src/components/Elements/Button/Button.css index ed30b5fe..be5b5d51 100644 --- a/src/components/Elements/Button/Button.css +++ b/src/components/Elements/Button/Button.css @@ -17,6 +17,10 @@ color: var(--button-hover-text-color); } + &.disabled { + cursor: not-allowed; + opacity: 0.8; + } &.small { padding: 0.3rem 0.75rem; font-size: 0.875rem; @@ -51,6 +55,12 @@ padding: 0; padding: 0; font-size: 1.1em; + + &.disabled { + cursor: not-allowed; + opacity: 0.8; + } + &.small { min-width: 30px; height: 30px; diff --git a/src/components/Elements/Button/Button.tsx b/src/components/Elements/Button/Button.tsx index bee7e6b4..1fc82658 100644 --- a/src/components/Elements/Button/Button.tsx +++ b/src/components/Elements/Button/Button.tsx @@ -27,7 +27,13 @@ export const Button = ({ }: ButtonProps) => { return ( ) } From df30b3f5535a368800353e1d1c73256db9d82168 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 17:18:05 +0000 Subject: [PATCH 109/123] add isConnecting status to Auth --- src/features/auth/stores/authModalStore.ts | 4 +++ src/providers/AuthProvider.tsx | 37 ++++++++++++---------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/features/auth/stores/authModalStore.ts b/src/features/auth/stores/authModalStore.ts index d68d5642..0dbd94f3 100644 --- a/src/features/auth/stores/authModalStore.ts +++ b/src/features/auth/stores/authModalStore.ts @@ -8,16 +8,20 @@ type AuthError = { } interface AuthModalState { isAuthModalOpen: boolean + isConnecting: boolean authError: AuthError | null openAuthModal: () => void closeAuthModal: () => void setAuthError: (error: AuthError | null) => void + setConnecting: (isConnecting: boolean) => void } export const AuthModalStore = create((set) => ({ isAuthModalOpen: false, authError: null, + isConnecting: false, setAuthError: (error) => set({ authError: error }), openAuthModal: () => set({ isAuthModalOpen: true }), closeAuthModal: () => set({ isAuthModalOpen: false }), + setConnecting: (isConnecting) => set({ isConnecting }), })) diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index 694ff0de..b0bc75e2 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -8,7 +8,7 @@ import { firebaseAuth } from 'src/lib/firebase' export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const navigate = useNavigate() const [searchParams] = useSearchParams() - const { closeAuthModal, initState, setAuthError, openAuthModal } = useAuth() + const { closeAuthModal, initState, setAuthError, openAuthModal, setConnecting } = useAuth() const connectTheUser = useCallback((token?: string | null, provider?: string | null) => { const allowedProviders = ['google', 'github'] @@ -16,28 +16,33 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { return Promise.resolve() } + setConnecting(true) const authProvider = provider === 'google' ? GoogleAuthProvider.credential(null, token) : GithubAuthProvider.credential(token) - return signInWithCredential(firebaseAuth, authProvider).then((userCredential) => { - const user = userCredential.user + return signInWithCredential(firebaseAuth, authProvider) + .then((userCredential) => { + const user = userCredential.user - initState({ - user: { - id: user.uid, - name: user.displayName || 'Anonymous', - imageURL: user.photoURL || '', - }, - providerId: authProvider.providerId, + initState({ + user: { + id: user.uid, + name: user.displayName || 'Anonymous', + imageURL: user.photoURL || '', + }, + providerId: authProvider.providerId, + }) + if (user.displayName) { + toast(`Welcome, ${user.displayName}`, { theme: 'successToast' }) + } + closeAuthModal() + navigate(window.location.pathname, { replace: true }) + }) + .finally(() => { + setConnecting(false) }) - if (user.displayName) { - toast(`Welcome, ${user.displayName}`, { theme: 'successToast' }) - } - closeAuthModal() - navigate(window.location.pathname, { replace: true }) - }) }, []) /** From 0a104e6d03eafbfc1765573f06a5b9ce904c7e28 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 31 Mar 2025 23:55:10 +0000 Subject: [PATCH 110/123] chore: update GitHub Actions to use latest versions of checkout, cache, and setup-node --- .github/workflows/deploy.yml | 2 +- .github/workflows/distribute.yml | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ad534968..53bddf68 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/distribute.yml b/.github/workflows/distribute.yml index 1effd142..a9316bb0 100644 --- a/.github/workflows/distribute.yml +++ b/.github/workflows/distribute.yml @@ -32,7 +32,7 @@ jobs: tag_version: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 @@ -64,10 +64,10 @@ jobs: needs: tag_version runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: ref: master - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} @@ -91,13 +91,17 @@ jobs: needs: tag_version runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: ref: master - - uses: actions/cache@v2 + - uses: actions/cache@v4 with: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 - name: Install yarn dependencies run: yarn From b6235b24270dd75a72d06ae8356d23c3eedeeca1 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 14:07:16 +0000 Subject: [PATCH 111/123] feat: add Firebase API key to deployment workflows --- .github/workflows/deploy.yml | 1 + .github/workflows/distribute.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 53bddf68..1db42629 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -10,6 +10,7 @@ env: VITE_AMPLITUDE_KEY: ${{ secrets.REACT_APP_AMPLITUDE_KEY }} VITE_AMPLITUDE_URL: ${{ secrets.REACT_APP_AMPLITUDE_URL }} VITE_API_URL: ${{ secrets.API_URL }} + VITE_FIREBASE_API_KEY: ${{ secrets.FIREBASE_API_KEY }} jobs: build_and_deploy: diff --git a/.github/workflows/distribute.yml b/.github/workflows/distribute.yml index a9316bb0..e8c8e252 100644 --- a/.github/workflows/distribute.yml +++ b/.github/workflows/distribute.yml @@ -27,6 +27,7 @@ env: VITE_AMPLITUDE_KEY: ${{ secrets.REACT_APP_AMPLITUDE_KEY }} VITE_AMPLITUDE_URL: ${{ secrets.REACT_APP_AMPLITUDE_URL }} VITE_API_URL: ${{ secrets.API_URL }} + VITE_FIREBASE_API_KEY: ${{ secrets.FIREBASE_API_KEY }} jobs: tag_version: From a5f4b3e9405bc3ff2f8230a9deea1ba99d9291c5 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 14:14:31 +0000 Subject: [PATCH 112/123] fix: update chrome runtime message listener to handle optional chaining correctly --- src/providers/AuthProvider.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index b0bc75e2..cd5cadd0 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -69,10 +69,10 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { } } - chrome.runtime?.onMessage.addListener(messageListener) + chrome?.runtime?.onMessage.addListener(messageListener) return () => { - chrome.runtime?.onMessage.removeListener(messageListener) + chrome?.runtime?.onMessage.removeListener(messageListener) } }, []) From b3bc0c7770068a7e72e2bbff2dd5a1d0adf585b3 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:06 +0000 Subject: [PATCH 113/123] chore: update dependencies to latest versions in package.json --- package.json | 18 ++++----- yarn.lock | 112 +++++++++++++++++++++++---------------------------- 2 files changed, 59 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 157a156c..0658baa2 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,6 @@ "@tanstack/query-async-storage-persister": "^5.8.3", "@tanstack/react-query": "^4.13.0", "@tanstack/react-query-persist-client": "^5.8.4", - "@types/dompurify": "^2.3.4", - "@types/jspath": "^0.4.0", "axios": "^1.8.4", "axios-cache-adapter": "^2.7.3", "country-emoji": "^1.5.4", @@ -18,9 +16,9 @@ "jsonpath": "^1.1.1", "normalize.css": "^8.0.1", "prop-types": "^15.0.0-0", - "react": "^17.0.1", + "react": "^19.1.0", "react-contexify": "^5.0.0", - "react-dom": "^17.0.1", + "react-dom": "^19.1.0", "react-easy-sort": "^1.5.1", "react-error-boundary": "^3.1.4", "react-icons": "^5.2.1", @@ -30,7 +28,7 @@ "react-router-dom": "^6.21.0", "react-select": "^5.0.1", "react-share": "^4.4.1", - "react-simple-toasts": "^5.10.0", + "react-simple-toasts": "^6.1.0", "react-spinners": "^0.10.4", "react-spring-bottom-sheet": "^3.4.1", "react-toggle": "^4.1.1", @@ -38,7 +36,6 @@ "timeago.js": "^4.0.2", "type-fest": "^1.2.0", "vite-plugin-ejs": "^1.6.4", - "web-vitals": "^0.2.4", "zustand": "^4.3.3" }, "engines": { @@ -73,15 +70,16 @@ "@types/chrome": "^0.0.241", "@types/jest": "^29.1.2", "@types/jsonpath": "^0.2.0", + "@types/dompurify": "^2.3.4", + "@types/jspath": "^0.4.0", "@types/node": "^20.4.2", - "@types/react": "^18.0.21", - "@types/react-dom": "^18.0.6", + "@types/react": "^19.0.4", + "@types/react-dom": "^19.0.4", "@types/react-modal": "^3.13.1", "@types/react-toggle": "^4.0.3", "@typescript-eslint/eslint-plugin": "^5.45.0", "@typescript-eslint/parser": "^5.40.1", "@vitejs/plugin-react": "^4.0.3", - "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.5.0", "eslint-config-react": "^1.1.7", @@ -96,7 +94,7 @@ "terser": "^5.19.2", "typescript": "^5.1.6", "vite": "^6.2.3", - "vite-plugin-svgr": "^3.2.0", + "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^4.2.0" } } diff --git a/yarn.lock b/yarn.lock index e76e564d..5dc8fe05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2126,14 +2126,14 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.14.0.tgz#9bc39a5a3a71b81bdb310eba6def5bc3966695b7" integrity sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A== -"@rollup/pluginutils@^5.0.4": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== +"@rollup/pluginutils@^5.1.3": + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" - picomatch "^2.3.1" + picomatch "^4.0.2" "@rollup/rollup-android-arm-eabi@4.37.0": version "4.37.0" @@ -2593,12 +2593,10 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== -"@types/react-dom@^18.0.6": - version "18.2.18" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.18.tgz#16946e6cd43971256d874bc3d0a72074bb8571dd" - integrity sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw== - dependencies: - "@types/react" "*" +"@types/react-dom@^19.0.4": + version "19.0.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.0.4.tgz#bedba97f9346bd4c0fe5d39e689713804ec9ac89" + integrity sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg== "@types/react-modal@^3.13.1": version "3.16.3" @@ -2621,7 +2619,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.21": +"@types/react@*": version "18.2.45" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.45.tgz#253f4fac288e7e751ab3dc542000fb687422c15c" integrity sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg== @@ -2630,6 +2628,13 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^19.0.4": + version "19.0.12" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.12.tgz#338b3f7854adbb784be454b3a83053127af96bd3" + integrity sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA== + dependencies: + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.8" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" @@ -3746,15 +3751,6 @@ eslint-config-airbnb-typescript@^17.0.0: dependencies: eslint-config-airbnb-base "^15.0.0" -eslint-config-airbnb@19.0.4: - version "19.0.4" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz#84d4c3490ad70a0ffa571138ebcdea6ab085fdc3" - integrity sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew== - dependencies: - eslint-config-airbnb-base "^15.0.0" - object.assign "^4.1.2" - object.entries "^1.1.5" - eslint-config-prettier@^8.5.0: version "8.10.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" @@ -4324,15 +4320,16 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.4.0" -hyphenate-style-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" - integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== http-parser-js@>=0.5.1: version "0.5.9" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.9.tgz#b817b3ca0edea6236225000d795378707c169cec" integrity sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw== +hyphenate-style-name@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436" + integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== + idb@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" @@ -4747,7 +4744,7 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.4.tgz#ee651d5c7c25901cfca5e67220ae9911695e99b2" integrity sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -4786,6 +4783,7 @@ matchmediaquery@^0.4.2: integrity sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA== dependencies: css-mediaquery "^0.1.2" + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -5274,6 +5272,11 @@ picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + postcss@^8.5.3: version "8.5.3" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" @@ -5368,14 +5371,12 @@ react-contexify@^5.0.0: dependencies: clsx "^1.1.1" -react-dom@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.26.0" react-easy-sort@^1.5.1: version "1.6.0" @@ -5505,10 +5506,10 @@ react-share@^4.4.1: classnames "^2.3.2" jsonp "^0.2.1" -react-simple-toasts@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/react-simple-toasts/-/react-simple-toasts-5.10.0.tgz#cfa692cd06fe858ea327adf32e72db2199459fa7" - integrity sha512-GIsBaLkZnyqeTzs0fSmXoLr5GtSnHv9C35tEx/2mc8H7/OaTlwXRHjm0ssDP454gvI4rZFS+rnj2HOL5zuiiwA== +react-simple-toasts@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-simple-toasts/-/react-simple-toasts-6.1.0.tgz#2bc68c4127b7b41e0a850f806e4c2dfa6b0f5bd7" + integrity sha512-6XRkaBNfSFr8m2CqKiY6mwDa3qYqWcClQFc5Qbd+ivl/eLrWqfPTrXQ0t7QQFGqn1p9W72KEV1Xj7AEe/48CIA== react-spinners@^0.10.4: version "0.10.6" @@ -5569,13 +5570,10 @@ react-use-gesture@^8.0.1: resolved "https://registry.yarnpkg.com/react-use-gesture/-/react-use-gesture-8.0.1.tgz#4360c0f7c9e26baf9fbe58f63fc9de7ef699c17f" integrity sha512-CXzUNkulUdgouaAlvAsC5ZVo0fi9KGSBSk81WrE4kOIcJccpANe9zZkAYr5YZZhqpicIFxitsrGVS4wmoMun9A== -react@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" +react@^19.1.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== redent@^3.0.0: version "3.0.0" @@ -5768,13 +5766,10 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== semver@^6.3.0, semver@^6.3.1: version "6.3.1" @@ -6293,12 +6288,12 @@ vite-plugin-ejs@^1.6.4: dependencies: ejs "^3.1.9" -vite-plugin-svgr@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-3.3.0.tgz#024f083c0f0831497d8507b82e49a8ee2b29701a" - integrity sha512-vWZMCcGNdPqgziYFKQ3Y95XP0d0YGp28+MM3Dp9cTa/px5CKcHHrIoPl2Jw81rgVm6/ZUNONzjXbZQZ7Kw66og== +vite-plugin-svgr@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz#742f16f11375996306c696ec323e4d23f6005075" + integrity sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w== dependencies: - "@rollup/pluginutils" "^5.0.4" + "@rollup/pluginutils" "^5.1.3" "@svgr/core" "^8.1.0" "@svgr/plugin-jsx" "^8.1.0" @@ -6329,11 +6324,6 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -web-vitals@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-0.2.4.tgz#ec3df43c834a207fd7cdefd732b2987896e08511" - integrity sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg== - websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" From 43548d13ac519dcf3dba45a6f80725667540e69c Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:19 +0000 Subject: [PATCH 114/123] refactor: migrate to React 18's createRoot for rendering --- src/index.tsx | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/index.tsx b/src/index.tsx index 1e597035..63b71adb 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,22 +1,24 @@ import { PersistQueryClientProvider } from '@tanstack/react-query-persist-client' import 'normalize.css' -import React from 'react' -import ReactDOM from 'react-dom' +import 'react-simple-toasts/dist/style.css' import 'src/assets/index.css' import { ConfigurationWrapper } from 'src/features/remoteConfig/' import { persister, queryClient } from 'src/lib/react-query' import { AppErrorBoundary } from 'src/providers/AppErrorBoundary' import { AppRoutes } from './routes/AppRoutes' -ReactDOM.render( - - - - - - - - - , - document.getElementById('root') +import { createRoot } from 'react-dom/client' +const container = document.getElementById('root') +if (!container) { + throw new Error('Failed to find the root element') +} +const root = createRoot(container) +root.render( + + + + + + + ) From cfac663e4c460507f2f9c4eb74f5611d2cb78f66 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:23 +0000 Subject: [PATCH 115/123] fix: remove console log for user not logged in in getUserToken function --- src/features/auth/utils/auth.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/features/auth/utils/auth.ts b/src/features/auth/utils/auth.ts index 35409604..a0680ccf 100644 --- a/src/features/auth/utils/auth.ts +++ b/src/features/auth/utils/auth.ts @@ -7,7 +7,6 @@ export const getUserToken = async () => { const token = await user.getIdToken() resolve(token) } else { - console.log('User not logged in') resolve(null) } unsub() From 532861935d04880a4306be505c84dffa5ce205d9 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:34 +0000 Subject: [PATCH 116/123] refactor: update SVG imports to use new syntax for React components --- src/components/Layout/Header.tsx | 6 +++--- src/features/settings/components/UserSettings/UserInfo.tsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Layout/Header.tsx b/src/components/Layout/Header.tsx index 1b2fedbd..d3d32b5f 100644 --- a/src/components/Layout/Header.tsx +++ b/src/components/Layout/Header.tsx @@ -5,9 +5,9 @@ import { CgTab } from 'react-icons/cg' import { IoMdSunny } from 'react-icons/io' import { MdDoDisturbOff } from 'react-icons/md' import { Link, useLocation, useNavigate } from 'react-router-dom' -import { ReactComponent as AvatarPlaceholder } from 'src/assets/icons/avatar.svg' -import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' -import { ReactComponent as HackertabLogo } from 'src/assets/logo.svg' +import AvatarPlaceholder from 'src/assets/icons/avatar.svg?react' +import StreakIcon from 'src/assets/icons/fire_icon.svg?react' +import HackertabLogo from 'src/assets/logo.svg?react' import { SearchBar } from 'src/components/Elements/SearchBar' import { UserTags } from 'src/components/Elements/UserTags' import { useAuth } from 'src/features/auth' diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx index d17430ab..62eae324 100644 --- a/src/features/settings/components/UserSettings/UserInfo.tsx +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -2,8 +2,8 @@ import { useState } from 'react' import { FaGithub } from 'react-icons/fa' import { FcGoogle } from 'react-icons/fc' import { IoCheckmarkOutline } from 'react-icons/io5' -import { ReactComponent as AvatarPlaceholder } from 'src/assets/icons/avatar.svg' -import { ReactComponent as StreakIcon } from 'src/assets/icons/fire_icon.svg' +import AvatarPlaceholder from 'src/assets/icons/avatar.svg?react' +import StreakIcon from 'src/assets/icons/fire_icon.svg?react' import { Button, ConfirmModal } from 'src/components/Elements' import { useAuth } from 'src/features/auth' import { pluralize } from 'src/utils/String' From 11d723948c4194d0cd574de4813e2f361086dd6d Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:38 +0000 Subject: [PATCH 117/123] fix: ensure chrome runtime message listener is added and removed safely --- src/providers/AuthProvider.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index cd5cadd0..15e10693 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -69,10 +69,14 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { } } - chrome?.runtime?.onMessage.addListener(messageListener) + if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.onMessage) { + chrome.runtime.onMessage.addListener(messageListener) + } return () => { - chrome?.runtime?.onMessage.removeListener(messageListener) + if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.onMessage) { + chrome.runtime.onMessage.removeListener(messageListener) + } } }, []) @@ -85,6 +89,7 @@ export const AuthProvider = ({ children }: { children: React.ReactNode }) => { const provider = searchParams.get('provider') connectTheUser(token, provider).catch((error) => { openAuthModal() + console.log('error', error) if (error && error.code === 'auth/account-exists-with-different-credential') { setAuthError({ message: From d0066f2ea1698ad773ac0f82842a6ce1f3d26388 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 17:16:47 +0000 Subject: [PATCH 118/123] fix: disable CSS code splitting in Vite configuration --- vite.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/vite.config.mjs b/vite.config.mjs index 028da990..a536543b 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -34,6 +34,7 @@ export default defineConfig(({ mode }) => { }, build: { emptyOutDir: true, + cssCodeSplit: false, rollupOptions: { output: { entryFileNames: `assets/[name].js`, From 271a4873938ca55b2c8a4ef0a03c8cd66119a4ca Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 18:18:34 +0000 Subject: [PATCH 119/123] fix: correct capitalization of Authorization header in DefaultRequestInterceptor --- src/lib/interceptors/DefaultRequestInterceptor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/interceptors/DefaultRequestInterceptor.ts b/src/lib/interceptors/DefaultRequestInterceptor.ts index 8683e376..4d8a2ad9 100644 --- a/src/lib/interceptors/DefaultRequestInterceptor.ts +++ b/src/lib/interceptors/DefaultRequestInterceptor.ts @@ -12,7 +12,7 @@ export async function DefaultRequestInterceptor(config: InternalAxiosRequestConf const token = await getUserToken() if (token) { - config.headers.authorization = `Bearer ${token}` + config.headers.Authorization = `Bearer ${token}` } } From 1367661cce2957de7f7e731e73c9876642c498cf Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 23:40:19 +0000 Subject: [PATCH 120/123] fix: hide extras section on mobile view in App.css --- src/assets/App.css | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/assets/App.css b/src/assets/App.css index bb4551f9..82e9e262 100644 --- a/src/assets/App.css +++ b/src/assets/App.css @@ -1488,6 +1488,9 @@ Modal border-color: var(--settings-input-border-focus-color); } @media (max-width: 768px) { + .extras { + display: none; + } .Modal { left: 0; top: 0; @@ -1500,11 +1503,4 @@ Modal box-shadow: none; width: auto; } - .settingContent { - margin-top: 6px; - } - .settingRow { - flex-direction: column; - align-items: flex-start; - } } From 7b672322b052f11e2ba093d96cefd7f39a0685d8 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 23:40:26 +0000 Subject: [PATCH 121/123] fix: prevent text wrapping in navigation links in settings layout --- src/components/Layout/SettingsLayout/settings.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Layout/SettingsLayout/settings.css b/src/components/Layout/SettingsLayout/settings.css index 63f79bc3..d98e4b31 100644 --- a/src/components/Layout/SettingsLayout/settings.css +++ b/src/components/Layout/SettingsLayout/settings.css @@ -33,6 +33,7 @@ font-size: 18px; cursor: pointer; text-decoration: none; + white-space: nowrap; color: var(--horizontal-tabs-layout-text-color); } .horizontalTabsLayout .navigation .link.active { From 69ff88c563816de731783617038d7bdc87e83ce0 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 23:40:34 +0000 Subject: [PATCH 122/123] fix: integrate authentication status into marketing banner component --- src/features/MarketingBanner/components/MarketingBanner.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/features/MarketingBanner/components/MarketingBanner.tsx b/src/features/MarketingBanner/components/MarketingBanner.tsx index 4f7d6001..40ab0aaf 100644 --- a/src/features/MarketingBanner/components/MarketingBanner.tsx +++ b/src/features/MarketingBanner/components/MarketingBanner.tsx @@ -2,6 +2,7 @@ import DOMPurify from 'dompurify' import jsonPath from 'jsonpath' import { useEffect, useMemo, useState } from 'react' import { useMediaQuery } from 'react-responsive' +import { useAuth } from 'src/features/auth' import { trackMarketingCampaignClose, trackMarketingCampaignOpen, @@ -17,6 +18,7 @@ import { Campaign, MarketingConfig } from '../types' export const MarketingBanner = () => { const { setCampaignClosed, closedCampaigns } = useMarketingConfigStore() + const { isConnected } = useAuth() const { userSelectedTags, cards, firstSeenDate } = useUserPreferences() const [availableCampaigns, setAvailableCampaigns] = useState([]) const { data: marketingConfig } = useGetMarketingConfig({ @@ -36,6 +38,7 @@ export const MarketingBanner = () => { userTags: userSelectedTags.map((tag) => tag.label), cards: cards.map((card) => card.name), firstSeenDate, + isConnected, usageInDays: diffBetweenTwoDatesInDays(firstSeenDate, Date.now()), } }, [userSelectedTags, firstSeenDate, cards]) From 1cf1b69c47bac8bd1cd269ab4d23a4ac2fcc9559 Mon Sep 17 00:00:00 2001 From: John Doe Date: Tue, 1 Apr 2025 23:40:46 +0000 Subject: [PATCH 123/123] fix: enhance user info layout with responsive design adjustments --- .../GeneralSettings/generalSettings.css | 26 +++++++++++++++ .../components/UserSettings/UserInfo.tsx | 33 ++++++++++--------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/features/settings/components/GeneralSettings/generalSettings.css b/src/features/settings/components/GeneralSettings/generalSettings.css index ac030e82..4a84d57b 100644 --- a/src/features/settings/components/GeneralSettings/generalSettings.css +++ b/src/features/settings/components/GeneralSettings/generalSettings.css @@ -101,6 +101,7 @@ Select styles padding: 20px 0px; display: flex; align-items: center; + justify-content: space-between; border-bottom: 1px solid var(--card-content-divider); .userImage { @@ -109,6 +110,16 @@ Select styles border-radius: 100%; align-self: flex-start; } + .userDetails { + display: flex; + flex-direction: row; + gap: 8px; + } + .userInfo { + display: flex; + flex-direction: column; + gap: 8px; + } .userInfos { flex: 1; display: flex; @@ -214,3 +225,18 @@ Select styles .streaks .checked:is(:has(+ .checked))::before { background-color: #18bc2d; } + +@media (max-width: 768px) { + .settingContent { + margin-top: 6px; + } + .settingRow { + flex-direction: column; + align-items: flex-start; + } + .userContent { + flex-direction: column; + align-items: flex-start; + gap: 16px; + } +} diff --git a/src/features/settings/components/UserSettings/UserInfo.tsx b/src/features/settings/components/UserSettings/UserInfo.tsx index 62eae324..e004cb1a 100644 --- a/src/features/settings/components/UserSettings/UserInfo.tsx +++ b/src/features/settings/components/UserSettings/UserInfo.tsx @@ -44,21 +44,24 @@ export const UserInfo = () => { onClose={() => setShowLogout(false)} onConfirm={logout} /> - {user?.imageURL && } -
    -
    {user.name}
    -
    - {providerId == 'github.com' ? ( - - ) : providerId == 'google.com' ? ( - - ) : null} - Connected with {providerName} -
    -
    - + +
    + {user?.imageURL && } +
    +
    {user.name}
    +
    + {providerId == 'github.com' ? ( + + ) : providerId == 'google.com' ? ( + + ) : null} + Connected with {providerName} +
    +
    + +