From fb1e6d974e9249aa7a1f1537093d14c14407b49d Mon Sep 17 00:00:00 2001 From: Hayden Bleasel Date: Thu, 31 Oct 2024 16:07:35 -0400 Subject: [PATCH] Scaffold Knock integration --- .github/workflows/build.yml | 2 + apps/app/.env.example | 4 + apps/app/app/(authenticated)/layout.tsx | 27 +-- packages/design-system/lib/knock.ts | 9 + packages/design-system/package.json | 2 + .../design-system/providers/notifications.tsx | 24 +++ pnpm-lock.yaml | 187 +++++++++++++++++- 7 files changed, 239 insertions(+), 16 deletions(-) create mode 100644 packages/design-system/lib/knock.ts create mode 100644 packages/design-system/providers/notifications.tsx diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 966f0ba0..e6b0a2f6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,8 @@ env: NEXT_PUBLIC_POSTHOG_HOST: "test" BETTERSTACK_API_KEY: "test" BETTERSTACK_URL: "test" + KNOCK_API_KEY: "test" + KNOCK_FEED_CHANNEL_ID: "test" # what the action will do jobs: diff --git a/apps/app/.env.example b/apps/app/.env.example index 77dd4385..5e7b3750 100644 --- a/apps/app/.env.example +++ b/apps/app/.env.example @@ -10,6 +10,10 @@ NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL="/" NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL="/" CLERK_WEBHOOK_SECRET="••••••" +# Knock +KNOCK_API_KEY="••••••" +KNOCK_FEED_CHANNEL_ID="••••••" + # @repo/lib RESEND_AUDIENCE_ID="••••••" RESEND_FROM="••••••" diff --git a/apps/app/app/(authenticated)/layout.tsx b/apps/app/app/(authenticated)/layout.tsx index d40eb20a..642b9a43 100644 --- a/apps/app/app/(authenticated)/layout.tsx +++ b/apps/app/app/(authenticated)/layout.tsx @@ -1,5 +1,6 @@ import { auth, currentUser } from '@clerk/nextjs/server'; import { SidebarProvider } from '@repo/design-system/components/ui/sidebar'; +import { NotificationsProvider } from '@repo/design-system/providers/notifications'; import { showBetaFeature } from '@repo/feature-flags'; import type { ReactElement, ReactNode } from 'react'; import { PostHogIdentifier } from './components/posthog-identifier'; @@ -17,21 +18,23 @@ const AppLayout = async ({ const betaFeature = await showBetaFeature(); if (!user) { - redirectToSignIn(); + return redirectToSignIn(); } return ( - - - {betaFeature && ( -
- Beta feature now available -
- )} - {children} -
- -
+ + + + {betaFeature && ( +
+ Beta feature now available +
+ )} + {children} +
+ +
+
); }; diff --git a/packages/design-system/lib/knock.ts b/packages/design-system/lib/knock.ts new file mode 100644 index 00000000..cc921e11 --- /dev/null +++ b/packages/design-system/lib/knock.ts @@ -0,0 +1,9 @@ +import { Knock } from '@knocklabs/node'; + +const knockApiKey = process.env.KNOCK_API_KEY; + +if (!knockApiKey) { + throw new Error('KNOCK_API_KEY is not set'); +} + +export const knock = new Knock(knockApiKey); diff --git a/packages/design-system/package.json b/packages/design-system/package.json index 2fa16b35..437d8c1b 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -6,6 +6,8 @@ "@clerk/nextjs": "^6.1.0", "@clerk/themes": "^2.1.40", "@hookform/resolvers": "^3.9.1", + "@knocklabs/node": "^0.6.13", + "@knocklabs/react": "^0.2.29", "@logtail/next": "^0.1.5", "@next/third-parties": "^15.0.2", "@radix-ui/react-accordion": "^1.2.1", diff --git a/packages/design-system/providers/notifications.tsx b/packages/design-system/providers/notifications.tsx new file mode 100644 index 00000000..1d3f3f44 --- /dev/null +++ b/packages/design-system/providers/notifications.tsx @@ -0,0 +1,24 @@ +import { KnockFeedProvider, KnockProvider } from '@knocklabs/react'; +import type { ReactNode } from 'react'; + +const knockApiKey = process.env.KNOCK_API_KEY; +const knockFeedChannelId = process.env.KNOCK_FEED_CHANNEL_ID; + +if (!knockApiKey) { + throw new Error('KNOCK_API_KEY is not set'); +} + +if (!knockFeedChannelId) { + throw new Error('KNOCK_FEED_CHANNEL_ID is not set'); +} + +export const NotificationsProvider = ({ + children, + userId, +}: { children: ReactNode; userId: string }) => ( + + + {children} + + +); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 050e7812..694adacc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,7 +122,7 @@ importers: version: link:../../packages/next-config '@sentry/nextjs': specifier: ^8.36.0 - version: 8.36.0(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.0.2(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.13))) + version: 8.36.0(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.0.2(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.13))) next: specifier: 15.0.2 version: 15.0.2(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -174,7 +174,7 @@ importers: version: link:../../packages/next-config '@sentry/nextjs': specifier: ^8.36.0 - version: 8.36.0(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.0.2(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.13))) + version: 8.36.0(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(next@15.0.2(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.91.0(@swc/core@1.3.101(@swc/helpers@0.5.13))) '@vercel/analytics': specifier: ^1.3.2 version: 1.3.2(next@15.0.2(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) @@ -398,6 +398,12 @@ importers: '@hookform/resolvers': specifier: ^3.9.1 version: 3.9.1(react-hook-form@7.53.1(react@18.3.1)) + '@knocklabs/node': + specifier: ^0.6.13 + version: 0.6.13 + '@knocklabs/react': + specifier: ^0.2.29 + version: 0.2.29(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@logtail/next': specifier: ^0.1.5 version: 0.1.5(next@15.0.2(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -965,6 +971,10 @@ packages: resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.24.6': resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} engines: {node: '>=6.9.0'} @@ -1939,6 +1949,27 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@knocklabs/client@0.10.14': + resolution: {integrity: sha512-jbRiOkOtQmNSHkOHTL0DdA6Hk7y26NARmC0YI/AG6+I3+qd8n8brDGkpSB++Lr0SnRXO0Pqku/GOwHTNIfs8VQ==} + + '@knocklabs/node@0.6.13': + resolution: {integrity: sha512-XA6HWxIvLiCpRt5GisTFYDZuTuyrRR34XnFwPFPXPNTO1cKQOHLkQvyy7FzAOTD6/PVj1DM2Ge9HHij+Z64Rtg==} + engines: {node: '>=17.5.0'} + + '@knocklabs/react-core@0.2.26': + resolution: {integrity: sha512-FyH6Mhw8VOS49Qo4RcM3SOIaJie1xPgdZQvY7fJoUjp8wgLwM4gxhINwbYBlq6KZUC9j7in6nueVQ80ELUH3ew==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + + '@knocklabs/react@0.2.29': + resolution: {integrity: sha512-7VNMrpU4rkkGp1pJ7ilxUfLQRTJVdZ8oKwlH/n2HgQM0sDlVUaf7MV6tsg5oiOJj6CsY82sxLnd6/wtwoBVUmA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.11.0 || ^17.0.0 || ^18.0.0 + + '@knocklabs/types@0.1.4': + resolution: {integrity: sha512-KdEESYtIYDaBy9CTNKco7MJ+PcX9wfWt3WVNBKHrrARX++Fa/gn1Zn8WQ5K39hckXm/c2AL6WhNjGv6ovkxwFw==} + '@logtail/next@0.1.5': resolution: {integrity: sha512-J8m9jGdcGjYfKEbB1pdQj9iaBq9eNtHtqNcrHStjGI1LPiGREwk+HnnpM12yS6teiwlQepcXJDtQ8fk1QHg+jw==} engines: {node: '>=15'} @@ -2560,6 +2591,9 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@prisma/adapter-neon@5.21.1': resolution: {integrity: sha512-GZ7YVJN06Z2KG/1Gh/yoLmy4oc/CvXtVxA7rRXl+7T6+7FceF+nxHf48Kd2CqlgPPK+t58L30STMfOz9c6RPNw==} peerDependencies: @@ -3902,6 +3936,9 @@ packages: '@types/pg@8.6.1': resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + '@types/phoenix@1.6.5': + resolution: {integrity: sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -4211,6 +4248,11 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} @@ -5266,6 +5308,9 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} @@ -5957,6 +6002,10 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} @@ -6233,6 +6282,10 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + katex@0.16.11: resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==} hasBin: true @@ -6340,6 +6393,9 @@ packages: lodash.chunk@4.2.0: resolution: {integrity: sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.deburr@4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} @@ -7083,6 +7139,9 @@ packages: resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} engines: {node: '>=10'} + phoenix@1.6.16: + resolution: {integrity: sha512-3vOfu5olbFg6eBNkF4pnwMzNm7unl/4vy24MW+zxKklVgjq1zLnO2EWq9wz6i6r4PbQ0CGxHGtqKJH2VSsnhaA==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -7388,6 +7447,19 @@ packages: peerDependencies: react: '>=16.6.0' + react-popper-tooltip@4.4.2: + resolution: {integrity: sha512-y48r0mpzysRTZAIh8m2kpZ8S1YPNqGtQPDrlXYSGvDS1c1GpG/NUXbsbIdfbhXfmSaRJuTcaT6N1q3CKuHRVbg==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-popper@2.3.0: + resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + react-promise-suspense@0.3.4: resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} @@ -8463,6 +8535,9 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + watchpack@2.4.1: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} @@ -8665,6 +8740,15 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zustand@3.7.2: + resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} + engines: {node: '>=12.7.0'} + peerDependencies: + react: '>=16.8' + peerDependenciesMeta: + react: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -9084,6 +9168,10 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + '@babel/template@7.24.6': dependencies: '@babel/code-frame': 7.24.6 @@ -9981,6 +10069,54 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@knocklabs/client@0.10.14(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@knocklabs/types': 0.1.4 + '@types/phoenix': 1.6.5 + axios: 1.7.7 + axios-retry: 4.5.0(axios@1.7.7) + eventemitter2: 6.4.9 + jwt-decode: 4.0.0 + phoenix: 1.6.16 + zustand: 3.7.2(react@18.3.1) + transitivePeerDependencies: + - debug + - react + + '@knocklabs/node@0.6.13': + dependencies: + jose: 5.2.1 + + '@knocklabs/react-core@0.2.26(react@18.3.1)': + dependencies: + '@knocklabs/client': 0.10.14(react@18.3.1) + date-fns: 4.1.0 + react: 18.3.1 + swr: 2.2.5(react@18.3.1) + zustand: 3.7.2(react@18.3.1) + transitivePeerDependencies: + - debug + + '@knocklabs/react@0.2.29(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@knocklabs/client': 0.10.14(react@18.3.1) + '@knocklabs/react-core': 0.2.26(react@18.3.1) + '@popperjs/core': 2.11.8 + '@radix-ui/react-popover': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lodash.debounce: 4.0.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-popper-tooltip: 4.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - debug + + '@knocklabs/types@0.1.4': {} + '@logtail/next@0.1.5(next@15.0.2(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: next: 15.0.2(@babel/core@7.24.6)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10651,6 +10787,8 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@popperjs/core@2.11.8': {} + '@prisma/adapter-neon@5.21.1(@neondatabase/serverless@0.10.1)': dependencies: '@neondatabase/serverless': 0.10.1 @@ -12264,6 +12402,8 @@ snapshots: pg-protocol: 1.6.1 pg-types: 2.2.0 + '@types/phoenix@1.6.5': {} + '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.1': @@ -12595,6 +12735,11 @@ snapshots: await-to-js@3.0.0: {} + axios-retry@4.5.0(axios@1.7.7): + dependencies: + axios: 1.7.7 + is-retry-allowed: 2.2.0 + axios@1.7.7: dependencies: follow-redirects: 1.15.9 @@ -13392,7 +13537,7 @@ snapshots: didyoumean2@6.0.1: dependencies: - '@babel/runtime': 7.24.6 + '@babel/runtime': 7.26.0 fastest-levenshtein: 1.0.16 lodash.deburr: 4.1.0 @@ -13410,7 +13555,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.24.6 + '@babel/runtime': 7.26.0 csstype: 3.1.3 dom-serializer@2.0.0: @@ -13839,6 +13984,8 @@ snapshots: esutils@2.0.3: {} + eventemitter2@6.4.9: {} + eventemitter3@4.0.7: {} events@3.3.0: {} @@ -14637,6 +14784,8 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-retry-allowed@2.2.0: {} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 @@ -15097,6 +15246,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jwt-decode@4.0.0: {} + katex@0.16.11: dependencies: commander: 8.3.0 @@ -15195,6 +15346,8 @@ snapshots: lodash.chunk@4.2.0: {} + lodash.debounce@4.0.8: {} + lodash.deburr@4.1.0: {} lodash.get@4.4.2: {} @@ -16213,6 +16366,8 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.4 + phoenix@1.6.16: {} + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -16535,6 +16690,22 @@ snapshots: react: 18.3.1 react-fast-compare: 3.2.2 + react-popper-tooltip@4.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@popperjs/core': 2.11.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@popperjs/core': 2.11.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + warning: 4.0.3 + react-promise-suspense@0.3.4: dependencies: fast-deep-equal: 2.0.1 @@ -17923,6 +18094,10 @@ snapshots: dependencies: makeerror: 1.0.12 + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 @@ -18159,4 +18334,8 @@ snapshots: zod@3.23.8: {} + zustand@3.7.2(react@18.3.1): + optionalDependencies: + react: 18.3.1 + zwitch@2.0.4: {}