From 00f00d374e6132b69b5941b00501b725e21317c4 Mon Sep 17 00:00:00 2001 From: SourC Date: Wed, 25 Sep 2024 13:16:50 -0700 Subject: [PATCH 01/89] fix auth login --- .vscode/extensions.json | 3 + .vscode/settings.json | 14 +- app/components/forms/input.tsx | 1 + app/pages/LoginPage.js | 1 + app/pages/LoginPage.tsx | 95 + pnpm-lock.yaml | 1748 +++++++++++++++++ supabase/.gitignore | 4 + supabase/config.toml | 239 +++ .../20240925185813_remote_schema.sql | 0 supabase/seed.sql | 0 10 files changed, 2102 insertions(+), 3 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 app/components/forms/input.tsx create mode 100644 app/pages/LoginPage.js create mode 100644 app/pages/LoginPage.tsx create mode 100644 pnpm-lock.yaml create mode 100644 supabase/.gitignore create mode 100644 supabase/config.toml create mode 100644 supabase/migrations/20240925185813_remote_schema.sql create mode 100644 supabase/seed.sql diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..74baffcc --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["denoland.vscode-deno"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index d3fdae9a..ed663598 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,12 @@ { - "typescript.tsdk": "../../node_modules/typescript/lib", - "typescript.enablePromptUseWorkspaceTsdk": true -} \ No newline at end of file + "[typescript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "deno.enablePaths": [ + "supabase/functions" + ], + "deno.lint": true, + "deno.unstable": true, + "typescript.enablePromptUseWorkspaceTsdk": true, + "typescript.tsdk": "../../node_modules/typescript/lib" +} diff --git a/app/components/forms/input.tsx b/app/components/forms/input.tsx new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/app/components/forms/input.tsx @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/pages/LoginPage.js b/app/pages/LoginPage.js new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/app/pages/LoginPage.js @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/pages/LoginPage.tsx b/app/pages/LoginPage.tsx new file mode 100644 index 00000000..8a23c55e --- /dev/null +++ b/app/pages/LoginPage.tsx @@ -0,0 +1,95 @@ +import { useEffect, useState } from 'react'; +import { createClient } from '@supabase/supabase-js'; + +// Initialize Supabase client +const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!; +const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!; +const supabase = createClient(supabaseUrl, supabaseAnonKey); + +function LoginPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const [isClient, setIsClient] = useState(false); + + useEffect(() => { + setIsClient(true); + }, []); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + setError(null); // Reset error state before submission + + try { + const { error } = await supabase.auth.signIn({ + email, + password, + }); + + if (error) throw error; // Throw error if login fails + + // Handle successful login (e.g., redirect or show a success message) + console.log('User logged in successfully'); + } catch (err) { + // Log the full error object for debugging + console.error('Login error:', err); + if (err instanceof Error) { + setError(err.message || 'Failed to log in. Please try again.'); + } else { + setError('Invalid API key or server error.'); + } + } + }; + + const handleGoogleSignIn = async () => { + const { error } = await supabase.auth.signInWithOAuth({ + provider: 'google', + options: { + redirectTo: 'http://localhost:3000/auth/v1/callback', // Update this to your actual callback URL + }, + }); + + if (error) { + console.error('Google sign-in error:', error); + setError(error.message || 'Failed to sign in with Google.'); + } + }; + + return ( +
+

Sign in to your account

+
+
+ {/* Render the form fields only on the client */} + {isClient && ( +
+ setEmail(e.target.value)} + placeholder="Email" + required + /> + setPassword(e.target.value)} + placeholder="Password" + required + /> + +
+ )} +
+ {error &&
{error}
} +
+
+

Or continue with:

+ +
+

Don't have an account? Sign up

+
+ ); +} + +export default LoginPage; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..a05687b8 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1748 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hookform/resolvers': + specifier: ^3.9.0 + version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) + '@reduxjs/toolkit': + specifier: ^2.2.7 + version: 2.2.7(react-redux@9.1.2(@types/react@18.2.48)(react@18.3.1)(redux@5.0.1))(react@18.3.1) + '@supabase/auth-helpers-nextjs': + specifier: ^0.10.0 + version: 0.10.0(@supabase/supabase-js@2.45.4) + '@supabase/ssr': + specifier: latest + version: 0.5.1(@supabase/supabase-js@2.45.4) + '@supabase/supabase-js': + specifier: latest + version: 2.45.4 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + geist: + specifier: ^1.2.1 + version: 1.3.1(next@14.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next: + specifier: ^14.2.6 + version: 14.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + postcss: + specifier: ^8.4.41 + version: 8.4.47 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-beautiful-dnd: + specifier: ^13.1.1 + version: 13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-hook-form: + specifier: ^7.53.0 + version: 7.53.0(react@18.3.1) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-redux: + specifier: ^9.1.2 + version: 9.1.2(@types/react@18.2.48)(react@18.3.1)(redux@5.0.1) + redux: + specifier: ^5.0.1 + version: 5.0.1 + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.2 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.13 + typescript: + specifier: 5.3.3 + version: 5.3.3 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: 20.11.5 + version: 20.11.5 + '@types/react': + specifier: 18.2.48 + version: 18.2.48 + '@types/react-beautiful-dnd': + specifier: ^13.1.8 + version: 13.1.8 + '@types/react-dom': + specifier: 18.2.18 + version: 18.2.18 + encoding: + specifier: ^0.1.13 + version: 0.1.13 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/runtime@7.25.6': + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + + '@hookform/resolvers@3.9.0': + resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@next/env@14.2.13': + resolution: {integrity: sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==} + + '@next/swc-darwin-arm64@14.2.13': + resolution: {integrity: sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.13': + resolution: {integrity: sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.13': + resolution: {integrity: sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.13': + resolution: {integrity: sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.13': + resolution: {integrity: sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.13': + resolution: {integrity: sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.13': + resolution: {integrity: sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.13': + resolution: {integrity: sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.13': + resolution: {integrity: sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@reduxjs/toolkit@2.2.7': + resolution: {integrity: sha512-faI3cZbSdFb8yv9dhDTmGwclW0vk0z5o1cia+kf7gCbaCwHI5e+7tP57mJUv22pNcNbeA62GSrPpfrUfdXcQ6g==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@supabase/auth-helpers-nextjs@0.10.0': + resolution: {integrity: sha512-2dfOGsM4yZt0oS4TPiE7bD4vf7EVz7NRz/IJrV6vLg0GP7sMUx8wndv2euLGq4BjN9lUCpu6DG/uCC8j+ylwPg==} + peerDependencies: + '@supabase/supabase-js': ^2.39.8 + + '@supabase/auth-helpers-shared@0.7.0': + resolution: {integrity: sha512-FBFf2ei2R7QC+B/5wWkthMha8Ca2bWHAndN+syfuEUUfufv4mLcAgBCcgNg5nJR8L0gZfyuaxgubtOc9aW3Cpg==} + peerDependencies: + '@supabase/supabase-js': ^2.39.8 + + '@supabase/auth-js@2.65.0': + resolution: {integrity: sha512-+wboHfZufAE2Y612OsKeVP4rVOeGZzzMLD/Ac3HrTQkkY4qXNjI6Af9gtmxwccE5nFvTiF114FEbIQ1hRq5uUw==} + + '@supabase/functions-js@2.4.1': + resolution: {integrity: sha512-8sZ2ibwHlf+WkHDUZJUXqqmPvWQ3UHN0W30behOJngVh/qHHekhJLCFbh0AjkE9/FqqXtf9eoVvmYgfCLk5tNA==} + + '@supabase/node-fetch@2.6.15': + resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==} + engines: {node: 4.x || >=6.0.0} + + '@supabase/postgrest-js@1.16.1': + resolution: {integrity: sha512-EOSEZFm5pPuCPGCmLF1VOCS78DfkSz600PBuvBND/IZmMciJ1pmsS3ss6TkB6UkuvTybYiBh7gKOYyxoEO3USA==} + + '@supabase/realtime-js@2.10.2': + resolution: {integrity: sha512-qyCQaNg90HmJstsvr2aJNxK2zgoKh9ZZA8oqb7UT2LCh3mj9zpa3Iwu167AuyNxsxrUE8eEJ2yH6wLCij4EApA==} + + '@supabase/ssr@0.5.1': + resolution: {integrity: sha512-+G94H/GZG0nErZ3FQV9yJmsC5Rj7dmcfCAwOt37hxeR1La+QTl8cE9whzYwPUrTJjMLGNXoO+1BMvVxwBAbz4g==} + peerDependencies: + '@supabase/supabase-js': ^2.43.4 + + '@supabase/storage-js@2.7.0': + resolution: {integrity: sha512-iZenEdO6Mx9iTR6T7wC7sk6KKsoDPLq8rdu5VRy7+JiT1i8fnqfcOr6mfF2Eaqky9VQzhP8zZKQYjzozB65Rig==} + + '@supabase/supabase-js@2.45.4': + resolution: {integrity: sha512-E5p8/zOLaQ3a462MZnmnz03CrduA5ySH9hZyL03Y+QZLIOO4/Gs8Rdy4ZCKDHsN7x0xdanVEWWFN3pJFQr9/hg==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/node@20.11.5': + resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} + + '@types/phoenix@1.6.5': + resolution: {integrity: sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-beautiful-dnd@13.1.8': + resolution: {integrity: sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==} + + '@types/react-dom@18.2.18': + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + + '@types/react-redux@7.1.34': + resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} + + '@types/react@18.2.48': + resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} + + '@types/scheduler@0.23.0': + resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.0: + resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001663: + resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.28: + resolution: {integrity: sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + geist@1.3.1: + resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==} + peerDependencies: + next: '>=13.2.0' + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + goober@2.1.14: + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + memoize-one@5.2.1: + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next@14.2.13: + resolution: {integrity: sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + raf-schd@4.0.3: + resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + + react-beautiful-dnd@13.1.1: + resolution: {integrity: sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==} + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-hook-form@7.53.0: + resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-hot-toast@2.4.1: + resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-redux@7.2.9: + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-redux@9.1.2: + resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.5.2: + resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} + + tailwindcss@3.4.13: + resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-memo-one@1.1.3: + resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/runtime@7.25.6': + dependencies: + regenerator-runtime: 0.14.1 + + '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': + dependencies: + react-hook-form: 7.53.0(react@18.3.1) + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@next/env@14.2.13': {} + + '@next/swc-darwin-arm64@14.2.13': + optional: true + + '@next/swc-darwin-x64@14.2.13': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.13': + optional: true + + '@next/swc-linux-arm64-musl@14.2.13': + optional: true + + '@next/swc-linux-x64-gnu@14.2.13': + optional: true + + '@next/swc-linux-x64-musl@14.2.13': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.13': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.13': + optional: true + + '@next/swc-win32-x64-msvc@14.2.13': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@reduxjs/toolkit@2.2.7(react-redux@9.1.2(@types/react@18.2.48)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': + dependencies: + immer: 10.1.1 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.1 + optionalDependencies: + react: 18.3.1 + react-redux: 9.1.2(@types/react@18.2.48)(react@18.3.1)(redux@5.0.1) + + '@supabase/auth-helpers-nextjs@0.10.0(@supabase/supabase-js@2.45.4)': + dependencies: + '@supabase/auth-helpers-shared': 0.7.0(@supabase/supabase-js@2.45.4) + '@supabase/supabase-js': 2.45.4 + set-cookie-parser: 2.7.0 + + '@supabase/auth-helpers-shared@0.7.0(@supabase/supabase-js@2.45.4)': + dependencies: + '@supabase/supabase-js': 2.45.4 + jose: 4.15.9 + + '@supabase/auth-js@2.65.0': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/functions-js@2.4.1': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/node-fetch@2.6.15': + dependencies: + whatwg-url: 5.0.0 + + '@supabase/postgrest-js@1.16.1': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/realtime-js@2.10.2': + dependencies: + '@supabase/node-fetch': 2.6.15 + '@types/phoenix': 1.6.5 + '@types/ws': 8.5.12 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@supabase/ssr@0.5.1(@supabase/supabase-js@2.45.4)': + dependencies: + '@supabase/supabase-js': 2.45.4 + cookie: 0.6.0 + + '@supabase/storage-js@2.7.0': + dependencies: + '@supabase/node-fetch': 2.6.15 + + '@supabase/supabase-js@2.45.4': + dependencies: + '@supabase/auth-js': 2.65.0 + '@supabase/functions-js': 2.4.1 + '@supabase/node-fetch': 2.6.15 + '@supabase/postgrest-js': 1.16.1 + '@supabase/realtime-js': 2.10.2 + '@supabase/storage-js': 2.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.7.0 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.2.48 + hoist-non-react-statics: 3.3.2 + + '@types/node@20.11.5': + dependencies: + undici-types: 5.26.5 + + '@types/phoenix@1.6.5': {} + + '@types/prop-types@15.7.13': {} + + '@types/react-beautiful-dnd@13.1.8': + dependencies: + '@types/react': 18.2.48 + + '@types/react-dom@18.2.18': + dependencies: + '@types/react': 18.2.48 + + '@types/react-redux@7.1.34': + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.2.48 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + + '@types/react@18.2.48': + dependencies: + '@types/prop-types': 15.7.13 + '@types/scheduler': 0.23.0 + csstype: 3.1.3 + + '@types/scheduler@0.23.0': {} + + '@types/use-sync-external-store@0.0.3': {} + + '@types/ws@8.5.12': + dependencies: + '@types/node': 20.11.5 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + autoprefixer@10.4.20(postcss@8.4.47): + dependencies: + browserslist: 4.24.0 + caniuse-lite: 1.0.30001663 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.0: + dependencies: + caniuse-lite: 1.0.30001663 + electron-to-chromium: 1.5.28 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.24.0) + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001663: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + client-only@0.0.1: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@4.1.1: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-box-model@1.2.1: + dependencies: + tiny-invariant: 1.3.3 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + didyoumean@1.2.2: {} + + dlv@1.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.28: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + + escalade@3.2.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + geist@1.3.1(next@14.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + next: 14.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + goober@2.1.14(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + + graceful-fs@4.2.11: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + immer@10.1.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + jose@4.15.9: {} + + js-tokens@4.0.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + memoize-one@5.2.1: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + next@14.2.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.13 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001663 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.13 + '@next/swc-darwin-x64': 14.2.13 + '@next/swc-linux-arm64-gnu': 14.2.13 + '@next/swc-linux-arm64-musl': 14.2.13 + '@next/swc-linux-x64-gnu': 14.2.13 + '@next/swc-linux-x64-musl': 14.2.13 + '@next/swc-win32-arm64-msvc': 14.2.13 + '@next/swc-win32-ia32-msvc': 14.2.13 + '@next/swc-win32-x64-msvc': 14.2.13 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + package-json-from-dist@1.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.47): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@4.0.2(postcss@8.4.47): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.1 + optionalDependencies: + postcss: 8.4.47 + + postcss-nested@6.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.1 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + queue-microtask@1.2.3: {} + + raf-schd@4.0.3: {} + + react-beautiful-dnd@13.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.6 + css-box-model: 1.2.1 + memoize-one: 5.2.1 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: 4.2.1 + use-memo-one: 1.1.3(react@18.3.1) + transitivePeerDependencies: + - react-native + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-hook-form@7.53.0(react@18.3.1): + dependencies: + react: 18.3.1 + + react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + goober: 2.1.14(csstype@3.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - csstype + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.6 + '@types/react-redux': 7.1.34 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 17.0.2 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-redux@9.1.2(@types/react@18.2.48)(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.3 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + '@types/react': 18.2.48 + redux: 5.0.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.25.6 + + redux@5.0.1: {} + + regenerator-runtime@0.14.1: {} + + reselect@5.1.1: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + set-cookie-parser@2.7.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + streamsearch@1.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + styled-jsx@5.1.1(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.5.2: {} + + tailwindcss@3.4.13: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.0 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-invariant@1.3.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.7.0: {} + + typescript@5.3.3: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.1.0(browserslist@4.24.0): + dependencies: + browserslist: 4.24.0 + escalade: 3.2.0 + picocolors: 1.1.0 + + use-memo-one@1.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + ws@8.18.0: {} + + yaml@2.5.1: {} + + zod@3.23.8: {} diff --git a/supabase/.gitignore b/supabase/.gitignore new file mode 100644 index 00000000..a3ad8805 --- /dev/null +++ b/supabase/.gitignore @@ -0,0 +1,4 @@ +# Supabase +.branches +.temp +.env diff --git a/supabase/config.toml b/supabase/config.toml new file mode 100644 index 00000000..066f3b9c --- /dev/null +++ b/supabase/config.toml @@ -0,0 +1,239 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "the-front" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. `public` is always included. +schemas = ["public", "graphql_public"] +# Extra schemas to add to the search_path of every request. `public` is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[api.tls] +enabled = false + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv4) +# ip_version = "IPv6" +# The maximum length in bytes of HTTP request headers. (default: 4096) +# max_header_length = 4096 + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" +# OpenAI API Key to use for Supabase AI in the Supabase Studio. +openai_api_key = "env(OPENAI_API_KEY)" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[storage.image_transformation] +enabled = true + +# Uncomment to configure local storage buckets +# [storage.buckets.images] +# public = false +# file_size_limit = "50MiB" +# allowed_mime_types = ["image/png", "image/jpeg"] +# objects_path = "./images" + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true +# Allow/disallow anonymous sign-ins to your project. +enable_anonymous_sign_ins = false +# Allow/disallow testing manual linking of accounts +enable_manual_linking = false + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false +# If enabled, users will need to reauthenticate or have logged in recently to change their password. +secure_password_change = false +# Controls the minimum amount of time that must pass before sending another signup confirmation or password reset email. +max_frequency = "1s" + +# Use a production-ready SMTP server +# [auth.email.smtp] +# host = "smtp.sendgrid.net" +# port = 587 +# user = "apikey" +# pass = "env(SENDGRID_API_KEY)" +# admin_email = "admin@email.com" +# sender_name = "Admin" + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." +# Controls the minimum amount of time that must pass before sending another sms otp. +max_frequency = "5s" + +# Use pre-defined map of phone number to OTP for testing. +# [auth.sms.test_otp] +# 4152127777 = "123456" + +# Configure logged in session timeouts. +# [auth.sessions] +# Force log out after the specified duration. +# timebox = "24h" +# Force log out if the user has been inactive longer than the specified duration. +# inactivity_timeout = "8h" + +# This hook runs before a token is issued and allows you to add additional claims based on the authentication method used. +# [auth.hook.custom_access_token] +# enabled = true +# uri = "pg-functions:////" + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +[auth.mfa] +# Control how many MFA factors can be enrolled at once per user. +max_enrolled_factors = 10 + +# Control use of MFA via App Authenticator (TOTP) +[auth.mfa.totp] +enroll_enabled = true +verify_enabled = true + +# Configure Multi-factor-authentication via Phone Messaging +# [auth.mfa.phone] +# enroll_enabled = true +# verify_enabled = true +# otp_length = 6 +# template = "Your code is {{ .Code }} ." +# max_frequency = "10s" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin_oidc`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" +# If enabled, the nonce check will be skipped. Required for local sign in with Google auth. +skip_nonce_check = false + +# Use Firebase Auth as a third-party provider alongside Supabase Auth. +[auth.third_party.firebase] +enabled = false +# project_id = "my-firebase-project" + +# Use Auth0 as a third-party provider alongside Supabase Auth. +[auth.third_party.auth0] +enabled = false +# tenant = "my-auth0-tenant" +# tenant_region = "us" + +# Use AWS Cognito (Amplify) as a third-party provider alongside Supabase Auth. +[auth.third_party.aws_cognito] +enabled = false +# user_pool_id = "my-user-pool-id" +# user_pool_region = "us-east-1" + +[edge_runtime] +enabled = true +# Configure one of the supported request policies: `oneshot`, `per_worker`. +# Use `oneshot` for hot reload, or `per_worker` for load testing. +policy = "oneshot" +inspector_port = 8083 + +[analytics] +enabled = true +port = 54327 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" +# Configures S3 bucket URL, eg. .s3-.amazonaws.com +s3_host = "env(S3_HOST)" +# Configures S3 bucket region, eg. us-east-1 +s3_region = "env(S3_REGION)" +# Configures AWS_ACCESS_KEY_ID for S3 bucket +s3_access_key = "env(S3_ACCESS_KEY)" +# Configures AWS_SECRET_ACCESS_KEY for S3 bucket +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/supabase/migrations/20240925185813_remote_schema.sql b/supabase/migrations/20240925185813_remote_schema.sql new file mode 100644 index 00000000..e69de29b diff --git a/supabase/seed.sql b/supabase/seed.sql new file mode 100644 index 00000000..e69de29b From 76173a2939d148f87ccf73ec08571a3035a733b9 Mon Sep 17 00:00:00 2001 From: SourC Date: Wed, 25 Sep 2024 18:22:33 -0700 Subject: [PATCH 02/89] project board --- app/components/AuthenticatedLayout.tsx | 57 +-- app/components/TaskBoard.tsx | 595 ++++++------------------- app/components/ui/badge.tsx | 13 + app/components/ui/button.tsx | 14 + app/components/ui/card.tsx | 23 + app/components/ui/input.tsx | 13 + app/components/ui/scroll-area.tsx | 11 + app/taskboard/page.tsx | 7 +- package.json | 3 + pnpm-lock.yaml | 82 ++++ 10 files changed, 310 insertions(+), 508 deletions(-) create mode 100644 app/components/ui/badge.tsx create mode 100644 app/components/ui/button.tsx create mode 100644 app/components/ui/card.tsx create mode 100644 app/components/ui/input.tsx create mode 100644 app/components/ui/scroll-area.tsx diff --git a/app/components/AuthenticatedLayout.tsx b/app/components/AuthenticatedLayout.tsx index ab9406e1..f54b7209 100644 --- a/app/components/AuthenticatedLayout.tsx +++ b/app/components/AuthenticatedLayout.tsx @@ -1,54 +1,17 @@ 'use client'; -import { useEffect, useState } from 'react'; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; -import Header from './Header'; -import { useRouter } from 'next/navigation'; - -interface AuthenticatedLayoutProps { - children: React.ReactNode; -} - -const AuthenticatedLayout: React.FC = ({ children }) => { - const [isAuthenticated, setIsAuthenticated] = useState(false); - const supabase = createClientComponentClient(); - const router = useRouter(); - - useEffect(() => { - const checkAuth = async () => { - const { data: { session } } = await supabase.auth.getSession(); - if (session) { - setIsAuthenticated(true); - } else { - router.push('/'); - } - }; - - checkAuth(); - - const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => { - if (event === 'SIGNED_OUT') { - setIsAuthenticated(false); - router.push('/'); - } else if (event === 'SIGNED_IN' && session) { - setIsAuthenticated(true); - } - }); - - return () => { - authListener.subscription.unsubscribe(); - }; - }, [supabase, router]); - - if (!isAuthenticated) { - return null; // or a loading spinner - } +import React from 'react'; +const AuthenticatedLayout: React.FC<{ children: React.ReactNode }> = ({ children }) => { return ( - <> -
- {children} - +
+
+
+

My Application

+
+
+
{children}
+
); }; diff --git a/app/components/TaskBoard.tsx b/app/components/TaskBoard.tsx index 02a30195..beda2652 100644 --- a/app/components/TaskBoard.tsx +++ b/app/components/TaskBoard.tsx @@ -1,486 +1,165 @@ 'use client'; -import React, { useState, useEffect } from 'react'; -import { createClientComponentClient } from '@supabase/auth-helpers-nextjs' -import InviteUserModal from './InviteUserModal'; -import { useTheme } from '../contexts/ThemeContext'; +import React, { useState } from 'react'; +import { DndProvider, useDrag, useDrop } from 'react-dnd'; +import { HTML5Backend } from 'react-dnd-html5-backend'; +import { Card, CardContent, CardHeader, CardTitle } from "@/app/components/ui/card"; +import { Button } from "@/app/components/ui/button"; +import { Input } from "@/app/components/ui/input"; +import { Badge } from "@/app/components/ui/badge"; +import { ScrollArea } from "@/app/components/ui/scroll-area"; +import { PlusCircle, MoreHorizontal, Calendar, MessageSquare } from 'lucide-react'; interface Task { id: string; title: string; description: string; - status: string; - position: number; - board_id: string; + priority: 'low' | 'medium' | 'high'; + dueDate?: string; + comments: number; } interface Column { id: string; - name: string; - position: number; - board_id: string; -} - -interface Board { - id: string; - name: string; + title: string; + tasks: Task[]; } -const TaskBoard: React.FC = () => { - const [board, setBoard] = useState(null); - const [boardName, setBoardName] = useState(''); - const [isEditingBoardName, setIsEditingBoardName] = useState(false); - const [tasks, setTasks] = useState([]); - const [columns, setColumns] = useState([]); - const [newTaskTitle, setNewTaskTitle] = useState(''); - const [newTaskDescription, setNewTaskDescription] = useState(''); - const [newColumnName, setNewColumnName] = useState(''); - const [error, setError] = useState(null); - const [editingTasks, setEditingTasks] = useState<{ [key: string]: Task }>({}); - const [saveMessage, setSaveMessage] = useState<{ [key: string]: string }>({}); - const [saveFeedback, setSaveFeedback] = useState<{ [key: string]: string }>({}); - const [openMenu, setOpenMenu] = useState(null); - const [isAddingColumn, setIsAddingColumn] = useState(false); - const [isInviteModalOpen, setIsInviteModalOpen] = useState(false); - const supabase = createClientComponentClient(); - const { theme } = useTheme(); - - useEffect(() => { - fetchOrCreateBoard(); - }, []); - - const fetchOrCreateBoard = async () => { - try { - let { data: boards, error } = await supabase - .from('boards') - .select('*') - .limit(1); - - if (error) throw error; - - if (boards && boards.length > 0) { - setBoard(boards[0]); - setBoardName(boards[0].name); - await fetchColumns(boards[0].id); - await fetchTasks(boards[0].id); - } else { - const { data, error } = await supabase - .from('boards') - .insert({ name: 'New Board' }) - .select() - .single(); +const initialColumns: Column[] = [ + { + id: 'todo', + title: 'To Do', + tasks: [ + { id: '1', title: 'Research competitors', description: 'Analyze top 5 competitors', priority: 'high', dueDate: '2023-06-30', comments: 2 }, + { id: '2', title: 'Design mockups', description: 'Create initial design concepts', priority: 'medium', dueDate: '2023-07-15', comments: 0 }, + ], + }, + { + id: 'inprogress', + title: 'In Progress', + tasks: [ + { id: '3', title: 'Develop MVP', description: 'Build core features of the product', priority: 'high', dueDate: '2023-08-01', comments: 5 }, + ], + }, + { + id: 'done', + title: 'Done', + tasks: [ + { id: '4', title: 'Project kickoff', description: 'Initial team meeting and project setup', priority: 'low', dueDate: '2023-06-01', comments: 1 }, + ], + }, +]; + +const TaskCard: React.FC<{ task: Task; columnId: string }> = ({ task, columnId }) => { + const [{ isDragging }, drag] = useDrag({ + type: 'TASK', + item: { id: task.id, columnId }, + collect: (monitor) => ({ + isDragging: !!monitor.isDragging(), + }), + }); - if (error) throw error; + return ( +
+ + + {task.title} + + +

{task.description}

+
+ + {task.priority} + +
+ {task.dueDate && ( +
+ + {task.dueDate} +
+ )} + {task.comments > 0 && ( +
+ + {task.comments} +
+ )} +
+
+
+
+
+ ); +}; - setBoard(data); - setBoardName(data.name); - await fetchColumns(data.id); +const Column: React.FC<{ column: Column; moveTask: (taskId: string, sourceColumnId: string, targetColumnId: string) => void }> = ({ column, moveTask }) => { + const [, drop] = useDrop({ + accept: 'TASK', + drop: (item: { id: string; columnId: string }) => { + if (item.columnId !== column.id) { + moveTask(item.id, item.columnId, column.id); } - } catch (error) { - console.error('Error fetching or creating board:', error); - setError('Failed to fetch or create board. Please try again.'); - } - }; - - const fetchColumns = async (boardId: string) => { - try { - const { data, error } = await supabase - .from('columns') - .select('*') - .eq('board_id', boardId) - .order('position'); - if (error) throw error; - console.log('Fetched columns:', data); // Debug log - setColumns(data || []); - } catch (error) { - console.error('Error fetching columns:', error); - setError('Failed to fetch columns. Please try again.'); - } - }; - - const fetchTasks = async (boardId: string) => { - try { - const { data, error } = await supabase - .from('tasks') - .select('*') - .eq('board_id', boardId) - .order('position'); - if (error) throw error; - setTasks(data || []); - } catch (error) { - console.error('Error fetching tasks:', error); - setError('Failed to fetch tasks. Please try again.'); - } - }; - - const addColumn = async (e: React.FormEvent) => { - e.preventDefault(); - if (!newColumnName.trim() || !board) return; - - const newColumn = { - name: newColumnName, - position: columns.length, - board_id: board.id, - }; - - try { - const { data, error } = await supabase - .from('columns') - .insert(newColumn) - .select() - .single(); - - if (error) throw error; - - setColumns([...columns, data]); - setNewColumnName(''); - setIsAddingColumn(false); // Hide the input field after adding - fetchTasks(board.id); - } catch (error) { - console.error('Error adding column:', error); - setError('Failed to add column. Please try again.'); - } - }; - - const addTask = async (columnName: string) => { - if (!board) return; - - const newTask = { - title: "New Task", - description: "", - status: columnName, - position: tasks.filter(t => t.status === columnName).length, - board_id: board.id, - }; - - const { data, error } = await supabase - .from('tasks') - .insert(newTask) - .select() - .single(); - - if (error) { - console.error('Error adding task:', error); - } else if (data) { - setTasks([...tasks, data]); - } - }; - - const updateTask = async (taskId: string) => { - const updatedTask = editingTasks[taskId]; - if (!updatedTask) return; - - try { - const { error } = await supabase - .from('tasks') - .update(updatedTask) - .eq('id', taskId); - - if (error) throw error; - - setTasks(tasks.map(t => t.id === taskId ? updatedTask : t)); - setEditingTasks(prev => { - const newState = { ...prev }; - delete newState[taskId]; - return newState; - }); + }, + }); - // Set success message - setSaveMessage(prev => ({ ...prev, [taskId]: 'Saved successfully!' })); - setSaveFeedback(prev => ({ ...prev, [taskId]: 'Saved successfully!' })); - - // Clear success message after 3 seconds - setTimeout(() => { - setSaveMessage(prev => { - const newState = { ...prev }; - delete newState[taskId]; - return newState; - }); - }, 3000); - - } catch (error) { - console.error('Error updating task:', error); - setSaveMessage(prev => ({ ...prev, [taskId]: 'Error saving. Please try again.' })); - } - }; - - const deleteTask = async (id: string) => { - const { error } = await supabase - .from('tasks') - .delete() - .eq('id', id); - - if (error) { - console.error('Error deleting task:', error); - } else { - setTasks(tasks.filter(t => t.id !== id)); - } - }; - - const handleInputChange = (task: Task, field: keyof Task, value: string) => { - setEditingTasks(prev => ({ - ...prev, - [task.id]: { ...task, [field]: value } - })); - }; - - const deleteColumn = async (columnId: string) => { - if (!board) return; + return ( +
+

+ {column.title} + +

+ + {column.tasks.map((task) => ( + + ))} + + +
+ ); +}; - try { - const { error } = await supabase - .from('columns') - .delete() - .eq('id', columnId); +export default function TaskBoard() { + const [columns, setColumns] = useState(initialColumns); - if (error) throw error; + const moveTask = (taskId: string, sourceColumnId: string, targetColumnId: string) => { + setColumns((prevColumns) => { + const newColumns = prevColumns.map((column) => ({ ...column, tasks: [...column.tasks] })); + const sourceColumn = newColumns.find((col) => col.id === sourceColumnId); + const targetColumn = newColumns.find((col) => col.id === targetColumnId); + const taskToMove = sourceColumn?.tasks.find((task) => task.id === taskId); - setColumns(columns.filter(c => c.id !== columnId)); - // Move tasks from deleted column to the first available column - const firstColumn = columns.find(c => c.id !== columnId); - if (firstColumn) { - const updatedTasks = tasks.map(task => - task.status === columns.find(c => c.id === columnId)?.name - ? { ...task, status: firstColumn.name } - : task - ); - setTasks(updatedTasks); - // Update tasks in the database - await Promise.all(updatedTasks.map(task => - supabase.from('tasks').update({ status: task.status }).eq('id', task.id) - )); + if (sourceColumn && targetColumn && taskToMove) { + sourceColumn.tasks = sourceColumn.tasks.filter((task) => task.id !== taskId); + targetColumn.tasks.push(taskToMove); } - } catch (error) { - console.error('Error deleting column:', error); - setError('Failed to delete column. Please try again.'); - } - }; - - const handleInviteUser = async (email: string) => { - if (!board) return; - - try { - const { data, error } = await supabase - .from('board_invitations') - .insert({ board_id: board.id, invited_email: email, status: 'pending' }) - .select() - .single(); - - if (error) throw error; - - // Here you would typically send an email to the invited user - // For now, we'll just log the invitation - console.log(`Invitation sent to ${email}`); - setIsInviteModalOpen(false); - } catch (error) { - console.error('Error inviting user:', error); - setError('Failed to invite user. Please try again.'); - } - }; - - const saveBoardName = async () => { - if (!board) return; - try { - const { error } = await supabase - .from('boards') - .update({ name: boardName }) - .eq('id', board.id); - - if (error) throw error; - - setBoard({ ...board, name: boardName }); - setIsEditingBoardName(false); - } catch (error) { - console.error('Error saving board name:', error); - setError('Failed to save board name. Please try again.'); - } - }; + return newColumns; + }); + } return ( -
- {error &&

{error}

} - -
-
- {isEditingBoardName ? ( - setBoardName(e.target.value)} - onBlur={saveBoardName} - onKeyPress={(e) => e.key === 'Enter' && saveBoardName()} - className="text-2xl font-bold bg-transparent border-b border-gray-300 focus:outline-none focus:border-blue-500 mr-2" - autoFocus - /> - ) : ( - <> -

- {board?.name || 'Unnamed Board'} -

- - - )} -
- -
- -
- {columns.length === 0 ? ( -

No columns available. Add a column to get started.

- ) : ( - columns.map((column, index) => ( -
-
-
-

{column.name}

-
- - {openMenu === column.id && ( -
- -
- )} -
-
-
- {tasks - .filter((task) => task.status === column.name) - .map((task) => ( -
- handleInputChange(task, 'title', e.target.value)} - className={`w-full mb-2 p-1 border-b border-transparent hover:border-gray-300 focus:border-blue-500 font-semibold focus:outline-none ${theme === 'dark' ? 'bg-gray-700 text-gray-200' : ''}`} - /> - +
+ ); +}; + +export default CodeEditor; \ No newline at end of file diff --git a/app/favicon.ico b/app/favicon.ico index 718d6fea4835ec2d246af9800eddb7ffb276240c..01137982e9221848964c6065be5938d4610c99e4 100644 GIT binary patch literal 222750 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

`j_~d8%Aw4hCxj-gi{&adbqmpi@DH?*Bi% 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νNOSqFn!}(LDk|$WNH%G5t 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

Wp#NSA3p{sP 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 LrJugUA?W`A8`#=m diff --git a/app/forgot-password/page.tsx b/app/forgot-password/page.tsx index 3f187f3d..a666344f 100644 --- a/app/forgot-password/page.tsx +++ b/app/forgot-password/page.tsx @@ -1,23 +1,72 @@ 'use client'; -import dynamic from 'next/dynamic'; -import Link from "next/link"; +import { useState } from 'react' +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" +import { AlertCircle, ArrowLeft } from "lucide-react" +import Link from "next/link" -// Create a client-side only version of the ForgotPassword component -const ForgotPasswordForm = dynamic(() => import('@/components/forgot-password-form'), { - ssr: false, -}); +export default function ForgotPassword() { + const [email, setEmail] = useState('') + const [isSubmitting, setIsSubmitting] = useState(false) + const [isSubmitted, setIsSubmitted] = useState(false) + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setIsSubmitting(true) + // TODO: Implement actual password reset logic here + await new Promise(resolve => setTimeout(resolve, 1500)) // Simulating API call + setIsSubmitting(false) + setIsSubmitted(true) + } -export default function ForgotPasswordPage() { return ( -

-

- Forgot Password -

- - - Back to Login - +
+ + + Forgot Password + Enter your email to reset your password + + + {!isSubmitted ? ( +
+
+
+ + setEmail(e.target.value)} + required + disabled={isSubmitting} + /> +
+ +
+
+ ) : ( +
+ +

Check your email

+

+ We've sent a password reset link to {email} +

+
+ )} +
+ + + + Back to login + + +
- ); + ) } diff --git a/app/globals.css b/app/globals.css index d98a7a92..91ec90d2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -124,3 +124,76 @@ body { background-color: white; border-bottom: none; } + +/* Add this to the end of your globals.css file */ + +.atom-spinner { + position: relative; + width: var(--size); + height: var(--size); + overflow: hidden; +} + +.spinner-inner { + position: relative; + display: block; + height: 100%; + width: 100%; +} + +.spinner-circle { + display: block; + position: absolute; + color: var(--color); + font-size: calc(var(--size) * 0.24); + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.spinner-line { + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + animation-duration: 1s; + border-left-width: calc(var(--size) / 25); + border-top-width: calc(var(--size) / 25); + border-left-color: var(--color); + border-left-style: solid; + border-top-style: solid; + border-top-color: transparent; +} + +.spinner-line:nth-child(1) { + animation: atom-spinner-animation-1 1s linear infinite; + transform: rotateZ(120deg) rotateX(66deg) rotateZ(0deg); +} + +.spinner-line:nth-child(2) { + animation: atom-spinner-animation-2 1s linear infinite; + transform: rotateZ(240deg) rotateX(66deg) rotateZ(0deg); +} + +.spinner-line:nth-child(3) { + animation: atom-spinner-animation-3 1s linear infinite; + transform: rotateZ(360deg) rotateX(66deg) rotateZ(0deg); +} + +@keyframes atom-spinner-animation-1 { + 100% { + transform: rotateZ(120deg) rotateX(66deg) rotateZ(360deg); + } +} + +@keyframes atom-spinner-animation-2 { + 100% { + transform: rotateZ(240deg) rotateX(66deg) rotateZ(360deg); + } +} + +@keyframes atom-spinner-animation-3 { + 100% { + transform: rotateZ(360deg) rotateX(66deg) rotateZ(360deg); + } +} diff --git a/app/header.tsx b/app/header.tsx index e13cb886..61807abc 100644 --- a/app/header.tsx +++ b/app/header.tsx @@ -4,93 +4,82 @@ import React from 'react'; import Link from 'next/link'; import { useTheme } from './contexts/ThemeContext'; import { useRouter, usePathname } from 'next/navigation'; +import { Button } from "@/components/ui/button"; +import { Settings } from 'lucide-react'; -// This is a placeholder. Replace with your actual auth check const isUserLoggedIn = () => { - // Implement your auth check logic here return true; // Change this to false to test logged-out state }; -// This is a placeholder. Replace with your actual sign-out logic const signOut = async () => { - // Implement your sign-out logic here console.log('User signed out'); }; -export const Header: React.FC = () => { - const { theme, toggleTheme } = useTheme(); - const router = useRouter(); - const pathname = usePathname(); +export function Header() { + const { theme, toggleTheme } = useTheme(); + const router = useRouter(); + const pathname = usePathname(); - const handleSignOut = async () => { - await signOut(); - router.push('/login'); - }; + const handleSignOut = async () => { + await signOut(); + router.push('/login'); + }; - const isAuthPage = pathname === '/login' || pathname === '/signup'; + const isAuthPage = pathname === '/login' || pathname === '/signup'; - const getHeaderClasses = () => { - return theme === 'light' ? 'bg-gray-100 text-gray-900' : 'bg-gray-900 text-gray-100'; - }; - - return ( -
-
-
-
- QuantumLabs -
- {!isAuthPage && ( - - )} -
-
-
- ); -}; + return ( +
+
+ + QuantumLabs Logo + + {!isAuthPage && ( + + )} +
+
+ ); +} \ No newline at end of file diff --git a/app/landing/Typescript-task.code-workspace b/app/landing/Typescript-task.code-workspace new file mode 100644 index 00000000..da543664 --- /dev/null +++ b/app/landing/Typescript-task.code-workspace @@ -0,0 +1,12 @@ +{ + "folders": [ + { + "path": "../.." + } + ], + "settings": { + "cSpell.words": [ + "taskboard" + ] + } +} \ No newline at end of file diff --git a/app/landing/layout.tsx b/app/landing/layout.tsx new file mode 100644 index 00000000..44738c0f --- /dev/null +++ b/app/landing/layout.tsx @@ -0,0 +1,54 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { ThemeProvider } from '@/app/contexts/ThemeContext'; +import '../globals.css'; +import ChatbotModal from "@/components/ChatbotModal"; // Corrected import path + +export default function LandingLayout({ + children, + }: { + children: React.ReactNode; +}) { + return ( + + + + + {children} + + + + + ); +} + +function LayoutContent({ children }: { children: React.ReactNode }) { + const [isChatbotOpen, setIsChatbotOpen] = useState(false); + const [lastShiftPress, setLastShiftPress] = useState(0); + + useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Shift') { + const now = Date.now(); + if (now - lastShiftPress < 500) { // 500ms threshold for double press + setIsChatbotOpen(true); + } + setLastShiftPress(now); + } + }; + + window.addEventListener('keydown', handleKeyDown); + + return () => { + window.removeEventListener('keydown', handleKeyDown); + }; + }, [lastShiftPress]); + + return ( + <> + {children} + setIsChatbotOpen(false)} /> + + ); +} diff --git a/app/landing/page.tsx b/app/landing/page.tsx index 4aed3ffb..1f0ec7dc 100644 --- a/app/landing/page.tsx +++ b/app/landing/page.tsx @@ -1,73 +1,191 @@ -import Link from 'next/link' -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { CheckCircle, Users, Folder, List } from 'lucide-react' +'use client'; + +import React from 'react'; +import { motion } from 'framer-motion'; +import Link from 'next/link'; +import { Button } from "@/components/ui/button"; +import { Users, Folder, List, Calendar, BarChart2, CheckCircle, Star, MessageSquare, Database, Bot } from 'lucide-react'; +import { useTheme } from '@/app/contexts/ThemeContext'; export default function LandingPage() { + const { theme } = useTheme(); + + const features = [ + { icon: , title: "Team Collaboration", description: "Work seamlessly with your team members, assign tasks, and track progress together." }, + { icon: , title: "Project Management", description: "Organize your work into projects, set milestones, and manage resources effectively." }, + { icon: , title: "Task Tracking", description: "Create, assign, and monitor tasks with ease. Set priorities and deadlines to stay on top of your work." }, + { icon: , title: "Scheduling", description: "Plan your work with an intuitive calendar view. Never miss a deadline again." }, + { icon: , title: "Analytics", description: "Gain insights into your team's performance with detailed reports and analytics." }, + { icon: , title: "Goal Tracking", description: "Set and track goals for your team. Celebrate achievements and identify areas for improvement." }, + { icon: , title: "AI Chatbot Assistant", description: "Get instant help and automate tasks with our intelligent chatbot." }, + { icon: , title: "Blockchain Integration", description: "Secure and transparent task management with blockchain technology." }, + { icon: , title: "Agent Automation", description: "Leverage AI agents to automate repetitive tasks and enhance productivity." }, + ]; + + const testimonials = [ + { name: "John Doe", role: "CEO, TechCorp", quote: "TaskMaster has revolutionized our workflow. The AI chatbot and blockchain features are game-changers!" }, + { name: "Jane Smith", role: "Project Manager, InnovateCo", quote: "The best task management tool I've used. The chatbot assistant saves us hours every week." }, + { name: "Mike Johnson", role: "Team Lead, CreativeSolutions", quote: "TaskMaster's blockchain integration gives us unparalleled security and transparency." }, + ]; + return ( -
-
-
-
- TaskMaster -
- Log in - -
+
+
+ {/* Hero Section */} +
+ + AI-Powered Task Management + + + TaskMaster: Revolutionizing team collaboration with AI chatbots and blockchain technology. + + + + + +
+ + {/* Features Section */} +
+

Cutting-Edge Features for Modern Teams

+
+ {features.map((feature, index) => ( + +
{feature.icon}
+

{feature.title}

+

{feature.description}

+
+ ))}
-
-
+ -
-
+ {/* AI Chatbot Section */} +
-

Manage Your Tasks with Ease

-

Streamline your workflow, collaborate with your team, and boost productivity.

- +

AI-Powered Chatbot Assistant

+

Our intelligent chatbot helps you manage tasks, answer questions, and automate workflows.

+
    +
  • ✓ Instant task creation and assignment
  • +
  • ✓ Quick access to project information
  • +
  • ✓ Automated reminders and notifications
  • +
  • ✓ Natural language processing for ease of use
  • +
+
+
+ + {/* Blockchain Integration Section */} +
+

Blockchain-Powered Security

+
+
+

Unparalleled Security and Transparency

+
    +
  • Immutable task records
  • +
  • Transparent project history
  • +
  • Secure data storage
  • +
  • Decentralized access control
  • +
+
+
+

+ Our blockchain integration ensures that your project data is secure, transparent, and tamper-proof. + Every action is recorded on the blockchain, providing an auditable trail of all project activities. +

+
-
-
-

Key Features

-
- {[ - { icon: , title: "Team Collaboration", description: "Work seamlessly with your team members, assign tasks, and track progress together." }, - { icon: , title: "Project Management", description: "Organize your work into projects, set milestones, and manage resources effectively." }, - { icon: , title: "Task Tracking", description: "Create, assign, and monitor tasks with ease. Set priorities and deadlines to stay on top of your work." }, - ].map((feature, index) => ( - - ))} + {/* Agent Automation Section */} +
+

AI-Powered Agent Automation

+
+
+

Supercharge Your Workflow with AI Agents

+
    +
  • Automate repetitive tasks
  • +
  • Intelligent task assignment and prioritization
  • +
  • 24/7 productivity with always-on AI agents
  • +
  • Customizable automation workflows
  • +
+
+
+

+ Our AI agents work tirelessly to optimize your workflow, automating routine tasks and + providing intelligent suggestions to boost your team's productivity. +

+ + {/* Testimonials Section */} +
+

What Our Users Say

+
+ {testimonials.map((testimonial, index) => ( + +

"{testimonial.quote}"

+
+
+ +
+
+

{testimonial.name}

+

{testimonial.role}

+
+
+
+ ))} +
+
+ + {/* CTA Section */} +
+
+

Ready to revolutionize your team's productivity?

+

Join thousands of teams already using TaskMaster's AI and blockchain-powered platform.

+ +
+
-
+
-

© {new Date().getFullYear()} TaskMaster. All rights reserved.

+

© 2023 TaskMaster. All rights reserved.

- ) + ); } - -function FeatureCard({ icon, title, description }: { icon: React.ReactNode, title: string, description: string }) { - return ( - - - -
{icon}
- {title} -
-
- -

{description}

-
-
- ) -} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 33ac79fd..cc9d26d6 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,61 +1,53 @@ -'use client'; // Ensure this is a Client Component +'use client'; -import React, { useState } from 'react'; // Import React -import '../styles/globals.css'; // Adjust this path if your global styles are located elsewhere -import { Header } from './header'; -import { ThemeProvider, useTheme } from './contexts/ThemeContext'; -import ChatIcon from '../components/chat-icon'; -import { ChatBotModal } from '@/components/chat-bot-modal'; -import CodeEditorIcon from '../components/code-editor-icon'; -import { MoncacoEditor } from '@/components/moncaco-editor'; -import { Button } from '@/components/ui/button'; -import { X } from 'lucide-react'; -import Footer from "@/components/footer"; +import { useState, useEffect } from 'react'; +import { Inter } from 'next/font/google'; +import './globals.css'; +import TopBar from '@/components/TopBar'; // Import TopBar +import ChatbotModal from '@/components/ChatbotModal'; // Updated import path +import { ThemeProvider } from '@/app/contexts/ThemeContext'; +import Loading from './loading'; +import { GeistProvider } from '@geist-ui/react'; +import ToastContainer from '@/components/ToastContainer'; // Import ToastContainer +import NavBar from '@/components/NavBar'; // Import NavBar -const ThemedLayout = ({ children }: { children: React.ReactNode }) => { - const { getThemeClasses } = useTheme(); - const [isChatOpen, setIsChatOpen] = useState(false); - const [isEditorOpen, setIsEditorOpen] = useState(false); +const inter = Inter({ subsets: ['latin'] }); - return ( -
-
-
{children}
-
- setIsChatOpen(true)} /> - setIsEditorOpen(true)} /> - setIsChatOpen(false)} /> - {isEditorOpen && ( -
-
- - { - console.log('Saved:', value); - setIsEditorOpen(false); - }} - /> -
-
- )} -
- ); -}; +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + const [isChatbotOpen, setIsChatbotOpen] = useState(false); + const [isLoading, setIsLoading] = useState(true); -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - - {children} - - - - ); -} + useEffect(() => { + // Simulate initial loading + setTimeout(() => setIsLoading(false), 1000); + }, []); + + return ( + + + QuantumLabs + + + + + {isLoading ? ( + + ) : ( + <> + setIsChatbotOpen(true)} /> {/* Pass the function to open the chat */} + {/* Removed the extra NavBar here */} + {children} + setIsChatbotOpen(false)} /> + {/* Add the ToastContainer here */} + + )} + + + + + ); +} \ No newline at end of file diff --git a/app/loading.tsx b/app/loading.tsx new file mode 100644 index 00000000..b83ed902 --- /dev/null +++ b/app/loading.tsx @@ -0,0 +1,10 @@ +import Spinner from '@/components/ui/spinner'; +import React from 'react'; + +export default function Loading() { + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/app/members/page.tsx b/app/members/page.tsx index 8f4cddc8..8c145164 100644 --- a/app/members/page.tsx +++ b/app/members/page.tsx @@ -1,91 +1,38 @@ 'use client'; -import { useState, useEffect } from 'react'; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; -import Layout from "@/app/layout"; - -const MembersPage = () => { - const [members, setMembers] = useState([]); - const [newMemberEmail, setNewMemberEmail] = useState(''); - const supabase = createClientComponentClient(); - - useEffect(() => { - fetchMembers(); - }, []); - - const fetchMembers = async () => { - const { data, error } = await supabase.from('users').select('*'); - if (error) { - console.error('Error fetching members:', error); - } else { - setMembers(data || []); - } - }; - - const inviteMember = async (e: React.FormEvent) => { - e.preventDefault(); - if (!newMemberEmail.trim()) return; - - // Here you would typically send an invitation email - // For now, we'll just add the email to the members list - const { data, error } = await supabase - .from('users') - .insert({ email: newMemberEmail }) - .select() - .single(); - - if (error) { - console.error('Error inviting member:', error); - } else { - setMembers([...members, data]); - setNewMemberEmail(''); - } - }; - - const removeMember = async (memberId: string) => { - const { error } = await supabase - .from('users') - .delete() - .eq('id', memberId); - - if (error) { - console.error('Error removing member:', error); - } else { - setMembers(members.filter(member => member.id !== memberId)); - } - }; - +import React from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { PlusCircle } from 'lucide-react'; + +// Static in-memory data for members +const members = [ + { id: '1', name: 'John Doe', email: 'john@example.com', role: 'Admin' }, + { id: '2', name: 'Jane Smith', email: 'jane@example.com', role: 'Editor' }, + { id: '3', name: 'Bob Johnson', email: 'bob@example.com', role: 'Viewer' }, +]; + +const MembersPage: React.FC = () => { return ( - -
-

Team Members

-
- setNewMemberEmail(e.target.value)} - placeholder="New member email" - className="mr-2 p-2 border rounded" - /> - -
-
    - {members.map((member) => ( -
  • - {member.email} {member.full_name ? `(${member.full_name})` : ''} - -
  • - ))} -
+
+

Team Members

+ +
+ {members.map((member) => ( + + + {member.name} + + +

Email: {member.email}

+

Role: {member.role}

+
+
+ ))}
- +
); }; diff --git a/app/metadata.ts b/app/metadata.ts new file mode 100644 index 00000000..425ce37c --- /dev/null +++ b/app/metadata.ts @@ -0,0 +1,6 @@ +import { Metadata } from 'next' + +export const metadata: Metadata = { + title: 'QuantumLabs', + description: 'Manage your tasks and projects efficiently with QuantumLabs', +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index f4920269..ac1a4787 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,20 @@ -import { createClient } from '@/utils/supabase/server'; -import DashboardPage from "@/app/dashboard/page"; +'use client'; +import React from 'react'; +import Dropdown from '../components/Dropdown'; // Adjust the import path as necessary -export default async function Page() { +const options = [ + { label: 'Option 1', onClick: () => console.log('Option 1 selected') }, + { label: 'Option 2', onClick: () => console.log('Option 2 selected') }, +]; + +const Page = () => { return (
- +

Welcome to the Home Page

+
); -} +}; + +export default Page; \ No newline at end of file diff --git a/app/profile/page.tsx b/app/profile/page.tsx index 67abc5f9..7fecfd9a 100644 --- a/app/profile/page.tsx +++ b/app/profile/page.tsx @@ -1,109 +1,29 @@ 'use client'; -import { useState } from 'react' -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { CalendarDays, GitCommit, MessageSquare } from "lucide-react" +import React, { useState, useEffect } from 'react'; +import CenteredAtomSpinner from "@/components/CenteredAtomSpinner"; // Import the spinner -export default function ProfilePage() { - const [name, setName] = useState('John Doe') - const [email, setEmail] = useState('john.doe@example.com') +const Profile: React.FC = () => { + const [loading, setLoading] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setLoading(false); + }, 2000); // Simulate loading for 2 seconds + + return () => clearTimeout(timer); + }, []); + + if (loading) { + return ; + } return (
-

Profile

-
- - -
- - - JD - -
- {name} - {email} -
-
-
- -
-
- - Joined March 2023 -
-
-
-
- - 34 tasks completed -
-
-
-
- - 248 comments -
-
-
-
- - - Account - Password - - - - - Account - - Make changes to your account here. Click save when you're done. - - - -
- - setName(e.target.value)} /> -
-
- - setEmail(e.target.value)} /> -
-
- - - -
-
- - - - Password - - Change your password here. After saving, you'll be logged out. - - - -
- - -
-
- - -
-
- - - -
-
-
-
+

Profile

+ {/* Profile content goes here */}
- ) -} + ); +}; + +export default Profile; \ No newline at end of file diff --git a/app/progress/page.tsx b/app/progress/page.tsx index 0a3f08c7..62bee25e 100644 --- a/app/progress/page.tsx +++ b/app/progress/page.tsx @@ -1,11 +1,17 @@ 'use client' import { useState } from 'react' -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { ScrollArea } from "@/components/ui/scroll-area" import { Badge } from "@/components/ui/badge" import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts' +import Link from 'next/link' +import { Button } from "@/components/ui/button" +import { CheckCircle, Users, Folder, List } from 'lucide-react' +import { Card } from '@/components/ui/card' +import { CardContent } from '@/components/ui/card-content' +import { CardHeader } from '@/components/ui/card-header' +import { CardTitle } from '@/components/ui/card-title' interface Project { id: string @@ -30,49 +36,69 @@ export default function ProgressPage() { })) return ( -
-

Project Progress Overview

- - - - Overall Progress - - - - - - - - - - - - - +
+
+
+
+ TaskMaster +
+ Log in + +
+
+
+
- - - Project Details - - - - {projects.map((project) => ( -
-
-

{project.name}

- - {project.progress}% - -
- -

- Tasks completed: {project.tasksCompleted} / {project.totalTasks} -

-
- ))} -
-
-
+
+
+
+

Track Your Progress

+

Monitor your tasks and projects in real-time.

+ +
+
+ +
+
+

Key Features

+
+ {[ + { icon: , title: "Team Collaboration", description: "Work seamlessly with your team members, assign tasks, and track progress together." }, + { icon: , title: "Project Management", description: "Organize your work into projects, set milestones, and manage resources effectively." }, + { icon: , title: "Task Tracking", description: "Create, assign, and monitor tasks with ease. Set priorities and deadlines to stay on top of your work." }, + ].map((feature, index) => ( + + ))} +
+
+
+
+ +
+
+

© {new Date().getFullYear()} TaskMaster. All rights reserved.

+
+
) +} + +function FeatureCard({ icon, title, description }: { icon: React.ReactNode, title: string, description: string }) { + return ( + + + +
{icon}
+ {title} +
+
+ +

{description}

+
+
+ ) } \ No newline at end of file diff --git a/app/projects/page.tsx b/app/projects/page.tsx new file mode 100644 index 00000000..54c874c7 --- /dev/null +++ b/app/projects/page.tsx @@ -0,0 +1,188 @@ +'use client' + +import { useState, useEffect } from 'react' +import CenteredAtomSpinner from '@/components/CenteredAtomSpinner' +import { mockClient } from '@/lib/dataProvider' +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" +import { ScrollArea } from "@/components/ui/scroll-area" +import { PlusCircle, Search, Calendar, Users, BarChart } from 'lucide-react' +import { toast } from "react-hot-toast" +import { Label } from '@/components/forms/label' +import { Spinner } from '@geist-ui/react' + +interface Project { + id: string + name: string + description: string + progress: number + startDate: string + endDate: string + teamId: string +} + +const getProgressColor = (progress: number) => { + if (progress < 30) return 'bg-red-500'; + if (progress < 70) return 'bg-yellow-500'; + return 'bg-green-500'; +}; + +const ProjectCard: React.FC<{ project: Project; isLoading: boolean }> = ({ project, isLoading }) => { + if (isLoading) { + return ( + + + + ); + } + + return ( + + + {project.name} + + +

{project.description}

+
+
+ + {project.startDate} - {project.endDate} +
+
+ + Team {project.teamId} +
+
+
+ +
+
+
+ {project.progress}% +
+
+
+ ); +}; + +const ProjectsPage: React.FC = () => { + const [projects, setProjects] = useState([]) + const [searchTerm, setSearchTerm] = useState('') + const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) + const [isLoading, setIsLoading] = useState(true) + + useEffect(() => { + const fetchProjects = async () => { + setIsLoading(true) + try { + const fetchedProjects = await mockClient.fetchProjects() + setProjects(fetchedProjects) + } catch (error) { + console.error('Failed to fetch projects:', error) + toast.error("Failed to load projects. Please try again.") + } finally { + setIsLoading(false) + } + } + + fetchProjects() + }, []) + + const handleCreateProject = (event: React.FormEvent) => { + event.preventDefault() + const formData = new FormData(event.currentTarget) + const newProject: Project = { + id: Date.now().toString(), + name: formData.get('name') as string, + description: formData.get('description') as string, + progress: 0, + startDate: formData.get('startDate') as string, + endDate: formData.get('endDate') as string, + teamId: formData.get('teamId') as string, + } + setProjects([...projects, newProject]) + setIsCreateDialogOpen(false) + toast.success("Project created successfully.") + } + + const filteredProjects = projects.filter(project => + project.name.toLowerCase().includes(searchTerm.toLowerCase()) || + project.description.toLowerCase().includes(searchTerm.toLowerCase()) + ) + + if (isLoading) return + + return ( +
+
+

Projects

+ +
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + +
+ {filteredProjects.map((project) => ( + + ))} +
+
+ + + + + Create New Project + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+ ) +} + +export default ProjectsPage \ No newline at end of file diff --git a/app/search/page.tsx b/app/search/page.tsx index 9ace467a..5d505dcb 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -3,51 +3,18 @@ import { useState, useEffect } from 'react' import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Badge } from "@/components/ui/badge" import { ScrollArea } from "@/components/ui/scroll-area" import { Search } from 'lucide-react' - -interface Task { - id: string - title: string - status: 'todo' | 'inprogress' | 'done' - project: string -} - -interface Project { - id: string - name: string - description: string -} - -interface TeamMember { - id: string - name: string - role: string - avatar: string -} - -// Mock data -const mockTasks: Task[] = [ - { id: '1', title: 'Task 1', status: 'todo', project: 'Project A' }, - { id: '2', title: 'Task 2', status: 'inprogress', project: 'Project B' }, - { id: '3', title: 'Task 3', status: 'done', project: 'Project C' }, -] - -const mockProjects: Project[] = [ - { id: '1', name: 'Project A', description: 'Description of Project A' }, - { id: '2', name: 'Project B', description: 'Description of Project B' }, - { id: '3', name: 'Project C', description: 'Description of Project C' }, -] - -const mockTeamMembers: TeamMember[] = [ - { id: '1', name: 'John Doe', role: 'Developer', avatar: '/avatars/john.jpg' }, - { id: '2', name: 'Jane Smith', role: 'Designer', avatar: '/avatars/jane.jpg' }, - { id: '3', name: 'Bob Johnson', role: 'Manager', avatar: '/avatars/bob.jpg' }, -] +import supabase from '@/utils/supabaseDbClient' +import { Task, Project } from '@/lib/task' +import { Card } from '@/components/ui/card' +import { CardContent } from '@/components/ui/card-content' +import { CardHeader } from '@/components/ui/card-header' +import { CardTitle } from '@/components/ui/card-title' +import { TeamMember } from '@/lib/teamMember' export default function SearchPage() { const [searchTerm, setSearchTerm] = useState('') @@ -62,18 +29,25 @@ export default function SearchPage() { async function fetchData() { setIsLoading(true) - // Simulate API call - setTimeout(() => { - setTasks(mockTasks) - setProjects(mockProjects) - setTeamMembers(mockTeamMembers) + try { + const [{ data: tasksData }, { data: projectsData }, { data: teamMembersData }] = await Promise.all([ + supabase.from('tasks').select('*'), + supabase.from('projects').select('*'), + supabase.from('team_members').select('*') + ]) + + if (tasksData) setTasks(tasksData) + if (projectsData) setProjects(projectsData) + if (teamMembersData) setTeamMembers(teamMembersData) + } catch (error) { + console.error('Error fetching data:', error) + } finally { setIsLoading(false) - }, 500) + } } const filteredTasks = tasks.filter(task => - task.title.toLowerCase().includes(searchTerm.toLowerCase()) || - task.project.toLowerCase().includes(searchTerm.toLowerCase()) + task.title.toLowerCase().includes(searchTerm.toLowerCase()) ) const filteredProjects = projects.filter(project => @@ -121,7 +95,7 @@ export default function SearchPage() {

{task.title}

-

Project: {task.project}

+

Project ID: {task.project_id}

- {member.name.split(' ').map(n => n[0]).join('')} + {member.name.split(' ').map((n: string) => n[0]).join('')}

{member.name}

diff --git a/app/settings/page.tsx b/app/settings/page.tsx index e3bce8b1..47d98ff3 100644 --- a/app/settings/page.tsx +++ b/app/settings/page.tsx @@ -8,164 +8,164 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import toast from "react-hot-toast"; -import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select"; -import {Switch} from "@/components/ui/switch"; +import { toast } from "react-hot-toast"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Switch } from "@/components/ui/switch"; export default function SettingsPage() { - const router = useRouter() - const supabase = createClientComponentClient() - const [settings, setSettings] = useState({ - theme: 'light', - language: 'en', - notifications_enabled: true - }) + const router = useRouter() + const supabase = createClientComponentClient() + const [settings, setSettings] = useState({ + theme: 'light', + language: 'en', + notifications_enabled: true + }) - useEffect(() => { - const fetchSettings = async () => { - const { data: { user } } = await supabase.auth.getUser() - if (user) { - const { data } = await supabase - .from('user_settings') - .select('*') - .eq('user_id', user.id) - .single() - if (data) { - setSettings(data) + useEffect(() => { + const fetchSettings = async () => { + const { data: { user } } = await supabase.auth.getUser() + if (user) { + const { data } = await supabase + .from('user_settings') + .select('*') + .eq('user_id', user.id) + .single() + if (data) { + setSettings(data) + } + } } - } - } - fetchSettings() - }, [supabase]) + fetchSettings() + }, [supabase]) - const handleSaveGeneral = async () => { - const { data: { user } } = await supabase.auth.getUser() - if (user) { - const { error } = await supabase - .from('user_settings') - .upsert({ user_id: user.id, ...settings }) + const handleSaveGeneral = async () => { + const { data: { user } } = await supabase.auth.getUser() + if (user) { + const { error } = await supabase + .from('user_settings') + .upsert({ user_id: user.id, ...settings }) - if (error) { - console.error('Error updating settings:', error) - toast.error("Failed to update settings. Please try again.") - } else { - toast.success("Your general settings have been updated.") - } + if (error) { + console.error('Error updating settings:', error) + toast.error("Failed to update settings. Please try again.") + } else { + toast.success("Your general settings have been updated.") + } + } } - } - const handleSavePassword = (e: React.FormEvent) => { - e.preventDefault() - // Here you would typically handle password change - console.log('Changing password') - toast.success("Your password has been successfully updated.") - } + const handleSavePassword = (e: React.FormEvent) => { + e.preventDefault() + // Here you would typically handle password change + console.log('Changing password') + toast.success("Your password has been successfully updated.") + } - const handleDeleteAccount = () => { - // Here you would typically handle account deletion - console.log('Deleting account') - toast.error("Your account has been successfully deleted.") - router.push('/login') - } + const handleDeleteAccount = () => { + // Here you would typically handle account deletion + console.log('Deleting account') + toast.error("Your account has been successfully deleted.") + router.push('/login') + } - return ( -
-

Settings

- - - General - Security - Advanced - - - - - General Settings - Manage your account settings and preferences. - - -
- - -
-
- - -
-
- setSettings({ ...settings, notifications_enabled: checked })} - /> - -
-
- - - -
-
- - - - Security Settings - Manage your password and account security. - - -
-
- - -
-
- - -
-
- - -
- -
-
-
-
- - - - Advanced Settings - Manage advanced settings for your account. - - -
-

Delete Account

-

- Once you delete your account, there is no going back. Please be certain. -

-
- -
-
-
-
-
- ) + return ( +
+

Settings

+ + + General + Security + Advanced + + + + + General Settings + Manage your account settings and preferences. + + +
+ + +
+
+ + +
+
+ setSettings({ ...settings, notifications_enabled: checked })} + /> + +
+
+ + + +
+
+ + + + Security Settings + Manage your password and account security. + + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ + + + Advanced Settings + Manage advanced settings for your account. + + +
+

Delete Account

+

+ Once you delete your account, there is no going back. Please be certain. +

+
+ +
+
+
+
+
+ ) } diff --git a/app/signup/page.tsx b/app/signup/page.tsx index 77ae8ea4..f090b3ca 100644 --- a/app/signup/page.tsx +++ b/app/signup/page.tsx @@ -1,61 +1,67 @@ 'use client'; import React, { useState } from 'react'; -import { useRouter } from "next/navigation"; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; +import { useRouter } from 'next/navigation'; +import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; import Link from 'next/link'; -import { useTheme } from '../contexts/ThemeContext'; import Image from 'next/image'; -import { toast } from 'react-hot-toast'; +import { useTheme } from '../contexts/ThemeContext'; +import toast from "react-hot-toast"; import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; +import logger from '@/lib/logger'; // Import the logger -export default function SignUpPage() { - const { isDark } = useTheme(); +export default function SignupPage() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); const router = useRouter(); const supabase = createClientComponentClient(); - const { theme } = useTheme(); + const themeContext = useTheme(); + const theme = themeContext?.theme ?? 'light'; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - setIsLoading(true); + setError(null); try { - const { error } = await supabase.auth.signUp({ - email, - password, - options: { - emailRedirectTo: `${window.location.origin}/auth/callback`, - }, - }); + const { error } = await supabase.auth.signUp({ email, password }); if (error) throw error; - toast.success('Signup successful! Please check your email for confirmation.'); - router.push('/login?message=Please check your email to confirm your account'); - } catch (error: any) { - toast.error(error.message); - } finally { - setIsLoading(false); + toast.success('Account created successfully'); + router.push('/login'); // Redirect to login after signup + } catch (error: unknown) { + if (error instanceof Error) { + setError(error.message); + toast.error(error.message); + logger.error('Signup error'); // Use logger instead of console + } else { + setError('An unknown error occurred'); + toast.error('An unknown error occurred'); + logger.error('Signup error: An unknown error occurred'); // Use logger instead of console + } } }; - const handleGoogleSignUp = async () => { + const handleGoogleSignIn = async () => { try { const { error } = await supabase.auth.signInWithOAuth({ provider: 'google', options: { - redirectTo: `${window.location.origin}/auth/callback`, + redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`, }, }); if (error) throw error; - } catch (error: any) { - toast.error(error.message); + } catch (error: unknown) { + if (error instanceof Error) { + toast.error(error.message); + logger.error('Google sign-in error'); // Use logger instead of console + } else { + toast.error('An unknown error occurred'); + logger.error('Google sign-in error: An unknown error occurred'); // Use logger instead of console + } } }; return ( -
+

@@ -63,7 +69,8 @@ export default function SignUpPage() {

-
+ +
+ {error &&
{error}
} +
@@ -128,8 +130,8 @@ export default function SignUpPage() {
-
- - {filteredFAQs.map((faq, index) => ( - - {faq.question} - {faq.answer} - - ))} - - - - - - - - Contact Support - - -
-
- - -
-
- - -
-
- - +
+ ); +}; - steps: - - uses: actions/checkout@v3 +export default CodeEditor; - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: '18' +================ +File: app/forgot-password/page.tsx +================ +'use client'; - - name: Install pnpm - uses: pnpm/action-setup@v2 - with: - version: 8 +import { useState } from 'react' +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" +import { AlertCircle, ArrowLeft } from "lucide-react" +import Link from "next/link" - - name: Install dependencies - run: pnpm install +export default function ForgotPassword() { + const [email, setEmail] = useState('') + const [isSubmitting, setIsSubmitting] = useState(false) + const [isSubmitted, setIsSubmitted] = useState(false) - - name: Run tests - run: pnpm test + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setIsSubmitting(true) + // TODO: Implement actual password reset logic here + await new Promise(resolve => setTimeout(resolve, 1500)) // Simulating API call + setIsSubmitting(false) + setIsSubmitted(true) + } - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + return ( +
+ + + Forgot Password + Enter your email to reset your password + + + {!isSubmitted ? ( + +
+
+ + setEmail(e.target.value)} + required + disabled={isSubmitting} + /> +
+ +
+ + ) : ( +
+ +

Check your email

+

+ We've sent a password reset link to {email} +

+
+ )} +
+ + + + Back to login + + +
+
+ ) +} ================ -File: app/about/page.tsx +File: app/home/page.tsx ================ +'use client'; + import React from 'react'; +import Link from 'next/link'; +import SharedLayout from '../../components/SharedLayout'; -export default function AboutPage() { +const HomePage: React.FC = () => { return ( -
-

About Us

-

Welcome to our about page. We are a company dedicated to creating amazing products.

-
+ +

Welcome to Our App

+ +
); -} +}; + +export default HomePage; ================ -File: app/api/auth/session.ts +File: app/landing/layout.tsx ================ -import { NextApiRequest, NextApiResponse } from 'next'; -import { createClient } from '@supabase/supabase-js'; - -export default async function handler(req: NextApiRequest, res: NextApiResponse) { - const supabase = createClient( - process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! - ); - - const { data: { session }, error } = await supabase.auth.getSession(); +'use client'; - if (error) { - return res.status(401).json({ error: 'Unauthorized' }); - } +import React, { useState } from 'react'; +import { ThemeProvider } from '@/app/contexts/ThemeContext'; +import '@/styles/globals.css'; +import ChatbotModal from "@/components/ChatbotModal"; +import RobotTransformerWallpaper from '@/components/RobotTransformerWallpaper'; - if (!session) { - return res.status(401).json({ error: 'No active session' }); - } +export default function LandingLayout({ + children, +}: { + children: React.ReactNode; +}) { + const [isChatbotOpen, setIsChatbotOpen] = useState(false); - return res.status(200).json({ user: session.user }); + return ( + + + + +
+ {children} + + setIsChatbotOpen(false)} /> +
+
+ + + ); } ================ -File: app/api/notifications/index.ts +File: app/landing/page.tsx ================ -import { NextApiRequest, NextApiResponse } from 'next'; +'use client'; -// Mock data for notifications -const mockNotifications = [ - { id: '1', message: 'New task assigned to you', createdAt: new Date().toISOString() }, - { id: '2', message: 'Project deadline approaching', createdAt: new Date(Date.now() - 86400000).toISOString() }, - { id: '3', message: 'Team meeting scheduled for tomorrow', createdAt: new Date(Date.now() - 172800000).toISOString() }, -]; +import React from 'react'; +import { motion } from 'framer-motion'; +import Link from 'next/link'; +import { Button } from "@/components/ui/button"; +import { Users, Folder, List, Calendar, BarChart2, CheckCircle, Star, MessageSquare, Database, Bot } from 'lucide-react'; +import { useTheme } from '@/app/contexts/ThemeContext'; +import SharedLayout from '@/components/SharedLayout'; -export default async function getNotifications(req: NextApiRequest, res: NextApiResponse) { - // Simulate a delay to mimic API call - await new Promise(resolve => setTimeout(resolve, 500)); +export default function LandingPage() { + const { theme } = useTheme(); + + const features = [ + { icon: , title: "Team Collaboration", description: "Work seamlessly with your team members, assign tasks, and track progress together." }, + { icon: , title: "Project Management", description: "Organize your work into projects, set milestones, and manage resources effectively." }, + { icon: , title: "Task Tracking", description: "Create, assign, and monitor tasks with ease. Set priorities and deadlines to stay on top of your work." }, + { icon: , title: "Scheduling", description: "Plan your work with an intuitive calendar view. Never miss a deadline again." }, + { icon: , title: "Analytics", description: "Gain insights into your team's performance with detailed reports and analytics." }, + { icon: , title: "Goal Tracking", description: "Set and track goals for your team. Celebrate achievements and identify areas for improvement." }, + { icon: , title: "AI Chatbot Assistant", description: "Get instant help and automate tasks with our intelligent chatbot." }, + { icon: , title: "Blockchain Integration", description: "Secure and transparent task management with blockchain technology." }, + { icon: , title: "Agent Automation", description: "Leverage AI agents to automate repetitive tasks and enhance productivity." }, + ]; - // Return mock notifications - res.status(200).json({ notifications: mockNotifications }); -} + const testimonials = [ + { name: "John Doe", role: "CEO, TechCorp", quote: "QuantumLabs has revolutionized our workflow. The AI chatbot and blockchain features are game-changers!" }, + { name: "Jane Smith", role: "Project Manager, InnovateCo", quote: "The best task management tool I've used. The chatbot assistant saves us hours every week." }, + { name: "Mike Johnson", role: "Team Lead, CreativeSolutions", quote: "QuantumLabs's blockchain integration gives us unparalleled security and transparency." }, + ]; -================ -File: app/api/user.ts -================ -import { NextApiRequest, NextApiResponse } from 'next'; + return ( + +
+ {/* Hero Section */} +
+ + AI-Powered Task Management + + + TaskFlow: Revolutionizing team collaboration with AI chatbots and blockchain technology. + + + + + +
-export default async function handler(req: NextApiRequest, res: NextApiResponse) { - if (req.method === 'GET') { - // Simulate fetching user data - const user = { id: 1, name: 'John Doe', email: 'john@example.com' }; - return res.status(200).json(user); - } + {/* Features Section */} +
+

Cutting-Edge Features for Modern Teams

+
+ {features.map((feature, index) => ( + +
{feature.icon}
+

{feature.title}

+

{feature.description}

+
+ ))} +
+
- if (req.method === 'POST') { - // Simulate creating a user - const { name, email } = req.body; - return res.status(201).json({ id: 2, name, email }); - } + {/* AI Chatbot Section */} +
+
+

AI-Powered Chatbot Assistant

+

Our intelligent chatbot helps you manage tasks, answer questions, and automate workflows.

+
    +
  • ✓ Instant task creation and assignment
  • +
  • ✓ Quick access to project information
  • +
  • ✓ Automated reminders and notifications
  • +
  • ✓ Natural language processing for ease of use
  • +
+
+
- return res.status(405).end(); // Method Not Allowed + {/* Blockchain Integration Section */} +
+

Blockchain-Powered Security

+
+
+

Unparalleled Security and Transparency

+
    +
  • Immutable task records
  • +
  • Transparent project history
  • +
  • Secure data storage
  • +
  • Decentralized access control
  • +
+
+
+

+ Our blockchain integration ensures that your project data is secure, transparent, and tamper-proof. + Every action is recorded on the blockchain, providing an auditable trail of all project activities. +

+
+
+
+ + {/* Agent Automation Section */} +
+

AI-Powered Agent Automation

+
+
+

Supercharge Your Workflow with AI Agents

+
    +
  • Automate repetitive tasks
  • +
  • Intelligent task assignment and prioritization
  • +
  • 24/7 productivity with always-on AI agents
  • +
  • Customizable automation workflows
  • +
+
+
+

+ Our AI agents work tirelessly to optimize your workflow, automating routine tasks and + providing intelligent suggestions to boost your team's productivity. +

+
+
+
+ + {/* Testimonials Section */} +
+

What Our Users Say

+
+ {testimonials.map((testimonial, index) => ( + +

"{testimonial.quote}"

+
+
+ +
+
+

{testimonial.name}

+

{testimonial.role}

+
+
+
+ ))} +
+
+ + {/* CTA Section */} +
+
+

Ready to revolutionize your team's productivity?

+

Join thousands of teams already using QuantumLabs's AI and blockchain-powered platform.

+ +
+
+
+ +
+
+

© 2023 QuantumLabs. All rights reserved.

+
+
+
+ ); } ================ -File: app/auth/callback/route.ts +File: app/layouts/CustomLayout.tsx ================ -import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs'; -import { cookies } from 'next/headers'; -import { NextResponse } from 'next/server'; +import React, { ReactNode } from 'react'; +import { ThemeProvider } from '@/app/contexts/ThemeContext'; +import RobotTransformerWallpaper from '@/components/RobotTransformerWallpaper'; // Ensure this path is correct -export async function GET(request: Request) { - const requestUrl = new URL(request.url); - const code = requestUrl.searchParams.get('code'); +interface CustomLayoutProps { + children: ReactNode; +} - if (code) { - const supabase = createRouteHandlerClient({ cookies }); - await supabase.auth.exchangeCodeForSession(code); - } +const CustomLayout: React.FC = ({ children }) => { + return ( + + {/* Add the wallpaper component */} +
+ {/* Custom layout structure */} + {children} +
+
+ ); +}; - // URL to redirect to after sign in process completes - return NextResponse.redirect(requestUrl.origin); -} +export default CustomLayout; ================ -File: app/contexts/ThemeContext.tsx +File: app/login/page.tsx ================ 'use client'; -import React, { createContext, useContext, useState, useEffect } from 'react'; +import React, { useState } from 'react'; +import { useRouter } from 'next/navigation'; +import Link from 'next/link'; +import Image from 'next/image'; +import { Button } from "@/components/ui/button"; +import SharedLayout from '../../components/SharedLayout'; -type Theme = 'light' | 'dark' | 'darker'; +export default function LoginPage() { + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [error, setError] = useState(null); + const router = useRouter(); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(null); + // Implement login logic here + }; -interface ThemeContextType { - theme: Theme; - toggleTheme: () => void; - getThemeClasses: () => string; - isDark: boolean; + return ( + +
+
+

+ Log in to your account +

+
+
+ +
+
+ + setEmail(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+ + {error &&
{error}
} + +
+ +
+
+
+
+
+
+
+
+ + Or continue with + +
+
+ +
+ +
+
+ +
+

+ Don't have an account?{' '} + + Sign up + +

+
+
+
+ ); } -const ThemeContext = createContext(undefined); +================ +File: app/members/page.tsx +================ +'use client'; -export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { - const initialTheme = typeof window !== 'undefined' ? localStorage.getItem('theme') as Theme | null : 'light'; - const [theme, setTheme] = useState(initialTheme || 'light'); +import { useState } from 'react'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { Badge } from "@/components/ui/badge"; +import { Plus, Search, Mail, MoreHorizontal } from 'lucide-react'; + +const initialMembers = [ + { id: 1, name: 'John Doe', email: 'john@example.com', role: 'Developer', team: 'Development', avatar: 'JD' }, + { id: 2, name: 'Jane Smith', email: 'jane@example.com', role: 'Designer', team: 'Design', avatar: 'JS' }, + { id: 3, name: 'Bob Johnson', email: 'bob@example.com', role: 'Product Manager', team: 'Product', avatar: 'BJ' }, + { id: 4, name: 'Alice Brown', email: 'alice@example.com', role: 'Marketing Specialist', team: 'Marketing', avatar: 'AB' }, + { id: 5, name: 'Charlie Wilson', email: 'charlie@example.com', role: 'Developer', team: 'Development', avatar: 'CW' }, +]; - useEffect(() => { - const savedTheme = localStorage.getItem('theme') as Theme | null; - if (savedTheme) { - setTheme(savedTheme); - } - }, []); +export default function MembersPage() { + const [members, setMembers] = useState(initialMembers); + const [searchQuery, setSearchQuery] = useState(''); + const [newMember, setNewMember] = useState({ name: '', email: '', role: '', team: '' }); - const toggleTheme = () => { - const newTheme = theme === 'light' ? 'dark' : theme === 'dark' ? 'darker' : 'light'; - setTheme(newTheme); - localStorage.setItem('theme', newTheme); - }; + const filteredMembers = members.filter(member => + member.name.toLowerCase().includes(searchQuery.toLowerCase()) || + member.email.toLowerCase().includes(searchQuery.toLowerCase()) || + member.role.toLowerCase().includes(searchQuery.toLowerCase()) || + member.team.toLowerCase().includes(searchQuery.toLowerCase()) + ); - const getThemeClasses = () => { - switch (theme) { - case 'light': - return 'bg-white text-gray-900'; - case 'dark': - return 'bg-gray-800 text-gray-100'; - case 'darker': - return 'bg-gray-900 text-gray-50'; - default: - return 'bg-white text-gray-900'; + const addMember = () => { + if (newMember.name && newMember.email && newMember.role && newMember.team) { + setMembers([...members, { ...newMember, id: members.length + 1, avatar: newMember.name.split(' ').map(n => n[0]).join('') }]); + setNewMember({ name: '', email: '', role: '', team: '' }); } }; - const value = { - theme, - toggleTheme, - getThemeClasses, - isDark: theme === 'dark' || theme === 'darker' - }; - return ( - - {children} - +
+ + +
+
+ Members + Manage all members across teams +
+
+
+ + setSearchQuery(e.target.value)} + className="pl-8 w-64" + /> +
+ + + + + + + Add New Member + Add a new member to your organization. + +
+
+ + setNewMember({ ...newMember, name: e.target.value })} + className="col-span-3" + /> +
+
+ + setNewMember({ ...newMember, email: e.target.value })} + className="col-span-3" + /> +
+
+ + setNewMember({ ...newMember, role: e.target.value })} + className="col-span-3" + /> +
+
+ + +
+
+ + + +
+
+
+
+
+ + + + + Name + Email + Role + Team + Actions + + + + {filteredMembers.map((member) => ( + + +
+ + + {member.avatar} + + {member.name} +
+
+ {member.email} + {member.role} + + {member.team} + + +
+ + +
+
+
+ ))} +
+
+
+
+
); -}; - -export const useTheme = () => { - const context = useContext(ThemeContext); - if (context === undefined) { - throw new Error('useTheme must be used within a ThemeProvider'); - } - return context; -}; +} ================ -File: app/dashboard/page.tsx +File: app/not-found/page.tsx ================ -'use client'; // Ensure this is a Client Component +'use client'; -import { useRouter } from 'next/navigation'; -import { Button } from "@/components/ui/button"; -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; -import { PlusCircle, ListTodo, Settings } from 'lucide-react'; +import React from 'react'; -export default function DashboardPage() { - return ( -
-

Dashboard

-
- - - My Tasks - View and manage your current tasks - - - -

You have 5 tasks in progress

-
+const NotFoundPage = () => { + return ( +
+

404 - Page Not Found

+

Sorry, the page you are looking for does not exist.

+
+ ); +}; -
- - - New Project - Start a new project board - - - -

Create a new project to organize your tasks

-
- - - -
- - - Settings - Manage your account settings - - - -

Update your profile and preferences

-
- - - -
-
-
- ); -} +export default NotFoundPage; ================ -File: app/forgot-password/page.tsx +File: app/notifications/page.tsx ================ 'use client'; -import dynamic from 'next/dynamic'; -import Link from "next/link"; +import { useState } from 'react'; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Avatar, AvatarFallback } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Bell, MessageSquare, CheckCircle } from 'lucide-react'; -// Create a client-side only version of the ForgotPassword component -const ForgotPasswordForm = dynamic(() => import('@/components/forgot-password-form'), { - ssr: false, -}); +interface Notification { + id: string; + type: 'assignment' | 'comment' | 'update'; + content: string; + project: string; + timestamp: string; + read: boolean; +} + +export default function NotificationsPage() { + const [notifications, setNotifications] = useState([ + { + id: '1', + type: 'assignment', + content: 'You have been assigned to the task "Design new logo"', + project: 'Branding Refresh', + timestamp: '2023-07-15T10:30:00Z', + read: false, + }, + { + id: '2', + type: 'comment', + content: 'Alice commented on your task "Implement login functionality"', + project: 'User Authentication', + timestamp: '2023-07-14T15:45:00Z', + read: true, + }, + { + id: '3', + type: 'update', + content: 'The project "Backend Development" has been marked as complete', + project: 'Backend Development', + timestamp: '2023-07-13T09:15:00Z', + read: false, + }, + ]); + + const markAsRead = (id: string) => { + setNotifications(notifications.map(notification => + notification.id === id ? { ...notification, read: true } : notification + )); + }; + + const getIcon = (type: Notification['type']) => { + switch (type) { + case 'assignment': + return ; + case 'comment': + return ; + case 'update': + return ; + } + }; -export default function ForgotPasswordPage() { return ( -
-

- Forgot Password -

- - - Back to Login - +
+

Notifications

+ + + Recent Notifications + + + + {notifications.map((notification) => ( +
markAsRead(notification.id)} + > + + {getIcon(notification.type)} + +
+

{notification.content}

+

Project: {notification.project}

+

{new Date(notification.timestamp).toLocaleString()}

+
+ {!notification.read && ( + New + )} +
+ ))} +
+
+
); } ================ -File: app/landing/page.tsx +File: app/profile/page.tsx ================ -import Link from 'next/link' -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { CheckCircle, Users, Folder, List } from 'lucide-react' +'use client'; + +import React, { useState, useEffect } from 'react'; +import CenteredAtomSpinner from "@/components/CenteredAtomSpinner"; // Import the spinner + +const Profile: React.FC = () => { + const [loading, setLoading] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setLoading(false); + }, 2000); // Simulate loading for 2 seconds + + return () => clearTimeout(timer); + }, []); + + if (loading) { + return ; + } + + return ( +
+

Profile

+ {/* Profile content goes here */} +
+ ); +}; + +export default Profile; + +================ +File: app/progress/page.tsx +================ +'use client' + +import { useState } from 'react' +import { Progress } from "@/components/ui/progress" +import { ScrollArea } from "@/components/ui/scroll-area" +import { Badge } from "@/components/ui/badge" +import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts' +import Link from 'next/link' +import { Button } from "@/components/ui/button" +import { CheckCircle, Users, Folder, List } from 'lucide-react' +import { Card } from '@/components/ui/card' +import { CardContent } from '@/components/ui/card-content' +import { CardHeader } from '@/components/ui/card-header' +import { CardTitle } from '@/components/ui/card-title' + +interface Project { + id: string + name: string + progress: number + tasksCompleted: number + totalTasks: number +} + +export default function ProgressPage() { + const [projects] = useState([ + { id: '1', name: 'Project Alpha', progress: 65, tasksCompleted: 13, totalTasks: 20 }, + { id: '2', name: 'Project Beta', progress: 30, tasksCompleted: 6, totalTasks: 20 }, + { id: '3', name: 'Project Gamma', progress: 90, tasksCompleted: 18, totalTasks: 20 }, + { id: '4', name: 'Project Delta', progress: 45, tasksCompleted: 9, totalTasks: 20 }, + { id: '5', name: 'Project Epsilon', progress: 10, tasksCompleted: 2, totalTasks: 20 }, + ]) + + const chartData = projects.map(project => ({ + name: project.name, + progress: project.progress, + })) -export default function LandingPage() { return (
@@ -1679,8 +2618,8 @@ export default function LandingPage() {
-

Manage Your Tasks with Ease

-

Streamline your workflow, collaborate with your team, and boost productivity.

+

Track Your Progress

+

Monitor your tasks and projects in real-time.

@@ -1705,7 +2644,7 @@ export default function LandingPage() {
-

© {new Date().getFullYear()} TaskMaster. All rights reserved.

+

© {new Date().getFullYear()} QuantumLabs. All rights reserved.

@@ -1729,476 +2668,147 @@ function FeatureCard({ icon, title, description }: { icon: React.ReactNode, titl } ================ -File: app/landing/Typescript-task.code-workspace -================ -{ - "folders": [ - { - "path": "../.." - } - ], - "settings": { - "typescript.enablePromptUseWorkspaceTsdk": true, - "typescript.tsdk": "../../node_modules/typescript/lib" - } -} - -================ -File: app/login/page.tsx +File: app/project-board/page.tsx ================ 'use client'; -import React, { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; -import Link from 'next/link'; -import Image from 'next/image'; // Add this import -import { useTheme } from '../contexts/ThemeContext'; -import toast from "react-hot-toast"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; - -export default function LoginPage() { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [error, setError] = useState(null); - const router = useRouter(); - const supabase = createClientComponentClient(); - const { theme, toggleTheme } = useTheme(); - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setError(null); - try { - const { error } = await supabase.auth.signInWithPassword({ email, password }); - if (error) throw error; - toast.success('Logged in successfully'); - router.push('/taskboard'); - } catch (error: any) { - setError(error.message); - toast.error(error.message); - } - }; - - const handleGoogleSignIn = async () => { - try { - const { error } = await supabase.auth.signInWithOAuth({ - provider: 'google', - options: { - redirectTo: `${window.location.origin}/auth/callback`, - }, - }); - if (error) throw error; - } catch (error: any) { - toast.error(error.message); - } - }; - - return ( -
-
-
-

- Sign in to your account -

-
-
- -
-
- - setEmail(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
-
- - {error &&
{error}
} - -
- -
-
-
-
-
-
-
-
- - Or continue with - -
-
+import React from 'react'; -
- -
-
+const ProjectBoardPage: React.FC = () => { + return ( +
+

Project Board

+ {/* Your project board content */} +
+ ); +}; -
-

- Don't have an account?{' '} - - Sign up - -

-
-
-
- ); -} +export default ProjectBoardPage; ================ -File: app/members/page.tsx +File: app/projects/[ProjectId]/board/page.tsx ================ -'use client'; +'use client' -import { useState, useEffect } from 'react'; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; -import Layout from "@/app/layout"; +import { useParams } from 'next/navigation' +import { useState, useEffect } from 'react' +import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd' +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Badge } from "@/components/ui/badge" -const MembersPage = () => { - const [members, setMembers] = useState([]); - const [newMemberEmail, setNewMemberEmail] = useState(''); - const supabase = createClientComponentClient(); +interface Task { + id: string + content: string + status: 'To Do' | 'In Progress' | 'Done' + priority: 'Low' | 'Medium' | 'High' +} - useEffect(() => { - fetchMembers(); - }, []); +const initialTasks: Task[] = [ + { id: 'task-1', content: 'Design user interface', status: 'To Do', priority: 'High' }, + { id: 'task-2', content: 'Implement authentication', status: 'In Progress', priority: 'Medium' }, + { id: 'task-3', content: 'Set up database', status: 'Done', priority: 'High' }, + { id: 'task-4', content: 'Create API endpoints', status: 'To Do', priority: 'Medium' }, + { id: 'task-5', content: 'Write unit tests', status: 'In Progress', priority: 'Low' }, +] - const fetchMembers = async () => { - const { data, error } = await supabase.from('users').select('*'); - if (error) { - console.error('Error fetching members:', error); - } else { - setMembers(data || []); - } - }; +const getStatusColor = (status: string) => { + switch (status) { + case 'To Do': + return 'bg-blue-100 border-blue-300'; + case 'In Progress': + return 'bg-yellow-100 border-yellow-300'; + case 'Done': + return 'bg-green-100 border-green-300'; + default: + return 'bg-gray-100 border-gray-300'; + } +}; - const inviteMember = async (e: React.FormEvent) => { - e.preventDefault(); - if (!newMemberEmail.trim()) return; +const getPriorityColor = (priority: string) => { + switch (priority) { + case 'Low': + return 'bg-green-200 text-green-800'; + case 'Medium': + return 'bg-yellow-200 text-yellow-800'; + case 'High': + return 'bg-red-200 text-red-800'; + default: + return 'bg-gray-200 text-gray-800'; + } +}; - // Here you would typically send an invitation email - // For now, we'll just add the email to the members list - const { data, error } = await supabase - .from('users') - .insert({ email: newMemberEmail }) - .select() - .single(); +export default function ProjectBoard() { + const params = useParams() + const projectId = params.projectId + const [tasks, setTasks] = useState(initialTasks) - if (error) { - console.error('Error inviting member:', error); - } else { - setMembers([...members, data]); - setNewMemberEmail(''); - } - }; + const onDragEnd = (result: any) => { + if (!result.destination) return - const removeMember = async (memberId: string) => { - const { error } = await supabase - .from('users') - .delete() - .eq('id', memberId); + const newTasks = Array.from(tasks) + const [reorderedItem] = newTasks.splice(result.source.index, 1) + reorderedItem.status = result.destination.droppableId as 'To Do' | 'In Progress' | 'Done' + newTasks.splice(result.destination.index, 0, reorderedItem) - if (error) { - console.error('Error removing member:', error); - } else { - setMembers(members.filter(member => member.id !== memberId)); - } - }; + setTasks(newTasks) + } return ( - -
-

Team Members

-
- setNewMemberEmail(e.target.value)} - placeholder="New member email" - className="mr-2 p-2 border rounded" - /> - -
-
    - {members.map((member) => ( -
  • - {member.email} {member.full_name ? `(${member.full_name})` : ''} - -
  • +
    +

    Project Board

    +

    Project ID: {projectId}

    + + +
    + {['To Do', 'In Progress', 'Done'].map((status) => ( + + + {status} + + + + {(provided) => ( +
      + {tasks.filter(task => task.status === status).map((task, index) => ( + + {(provided) => ( +
    • +
      + {task.content} + + {task.priority} + +
      +
    • + )} +
      + ))} + {provided.placeholder} +
    + )} +
    +
    +
    ))} -
-
-
- ); -}; - -export default MembersPage; +
+ +
+ ) +} ================ -File: app/profile/page.tsx +File: app/projects/[ProjectId]/tasks/page.tsx ================ -'use client'; +'use client' -import { useState } from 'react' -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import { Input } from "@/components/ui/input" -import { Label } from "@/components/ui/label" -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { CalendarDays, GitCommit, MessageSquare } from "lucide-react" - -export default function ProfilePage() { - const [name, setName] = useState('John Doe') - const [email, setEmail] = useState('john.doe@example.com') - - return ( -
-

Profile

-
- - -
- - - JD - -
- {name} - {email} -
-
-
- -
-
- - Joined March 2023 -
-
-
-
- - 34 tasks completed -
-
-
-
- - 248 comments -
-
-
-
- - - Account - Password - - - - - Account - - Make changes to your account here. Click save when you're done. - - - -
- - setName(e.target.value)} /> -
-
- - setEmail(e.target.value)} /> -
-
- - - -
-
- - - - Password - - Change your password here. After saving, you'll be logged out. - - - -
- - -
-
- - -
-
- - - -
-
-
-
-
- ) -} - -================ -File: app/progress/page.tsx -================ -'use client' - -import { useState } from 'react' -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { Progress } from "@/components/ui/progress" -import { ScrollArea } from "@/components/ui/scroll-area" -import { Badge } from "@/components/ui/badge" -import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts' - -interface Project { - id: string - name: string - progress: number - tasksCompleted: number - totalTasks: number -} - -export default function ProgressPage() { - const [projects] = useState([ - { id: '1', name: 'Project Alpha', progress: 65, tasksCompleted: 13, totalTasks: 20 }, - { id: '2', name: 'Project Beta', progress: 30, tasksCompleted: 6, totalTasks: 20 }, - { id: '3', name: 'Project Gamma', progress: 90, tasksCompleted: 18, totalTasks: 20 }, - { id: '4', name: 'Project Delta', progress: 45, tasksCompleted: 9, totalTasks: 20 }, - { id: '5', name: 'Project Epsilon', progress: 10, tasksCompleted: 2, totalTasks: 20 }, - ]) - - const chartData = projects.map(project => ({ - name: project.name, - progress: project.progress, - })) - - return ( -
-

Project Progress Overview

- - - - Overall Progress - - - - - - - - - - - - - - - - - Project Details - - - - {projects.map((project) => ( -
-
-

{project.name}

- - {project.progress}% - -
- -

- Tasks completed: {project.tasksCompleted} / {project.totalTasks} -

-
- ))} -
-
-
-
- ) -} - -================ -File: app/projects/[ProjectId]/tasks/page.tsx -================ -'use client' - -import { useState, useEffect } from 'react' -import { useParams } from 'next/navigation' -import { Plus, Edit, Trash2 } from 'lucide-react' +import { useState, useEffect } from 'react' +import { useParams } from 'next/navigation' +import { Plus, Edit, Trash2 } from 'lucide-react' import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" @@ -2363,6 +2973,244 @@ export default function ProjectTasksPage() { ) } +================ +File: app/projects/page.tsx +================ +'use client' + +import { useState, useEffect } from 'react' +import CenteredAtomSpinner from '@/components/CenteredAtomSpinner' +import { mockClient } from '@/lib/dataProvider' +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" +import { ScrollArea } from "@/components/ui/scroll-area" +import { PlusCircle, Search, Calendar, Users, BarChart } from 'lucide-react' +import { toast } from "react-hot-toast" +import { Label } from '@/components/forms/label' +import { Spinner } from '@geist-ui/react' + +interface Project { + id: string + name: string + description: string + progress: number + startDate: string + endDate: string + teamId: string +} + +const getProgressColor = (progress: number) => { + if (progress < 30) return 'bg-red-500'; + if (progress < 70) return 'bg-yellow-500'; + return 'bg-green-500'; +}; + +const ProjectCard: React.FC<{ project: Project; isLoading: boolean }> = ({ project, isLoading }) => { + if (isLoading) { + return ( + + + + ); + } + + return ( + + + {project.name} + + +

{project.description}

+
+
+ + {project.startDate} - {project.endDate} +
+
+ + Team {project.teamId} +
+
+
+ +
+
+
+ {project.progress}% +
+
+
+ ); +}; + +const ProjectsPage: React.FC = () => { + const [projects, setProjects] = useState([]) + const [searchTerm, setSearchTerm] = useState('') + const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false) + const [isLoading, setIsLoading] = useState(true) + + useEffect(() => { + const fetchProjects = async () => { + setIsLoading(true) + try { + const fetchedProjects = await mockClient.fetchProjects() + setProjects(fetchedProjects) + } catch (error) { + console.error('Failed to fetch projects:', error) + toast.error("Failed to load projects. Please try again.") + } finally { + setIsLoading(false) + } + } + + fetchProjects() + }, []) + + const handleCreateProject = (event: React.FormEvent) => { + event.preventDefault() + const formData = new FormData(event.currentTarget) + const newProject: Project = { + id: Date.now().toString(), + name: formData.get('name') as string, + description: formData.get('description') as string, + progress: 0, + startDate: formData.get('startDate') as string, + endDate: formData.get('endDate') as string, + teamId: formData.get('teamId') as string, + } + setProjects([...projects, newProject]) + setIsCreateDialogOpen(false) + toast.success("Project created successfully.") + } + + const filteredProjects = projects.filter(project => + project.name.toLowerCase().includes(searchTerm.toLowerCase()) || + project.description.toLowerCase().includes(searchTerm.toLowerCase()) + ) + + if (isLoading) return + + return ( +
+
+

Projects

+ +
+ +
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ + +
+ {filteredProjects.map((project) => ( + + ))} +
+
+ + + + + Create New Project + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+
+
+ ) +} + +export default ProjectsPage + +================ +File: app/quest-designer/page.tsx +================ +import { Dialog, DialogTrigger, DialogContent, DialogDescription } from '@radix-ui/react-dialog'; +import React from 'react'; + +function CustomDialogHeader({ children }: { children: React.ReactNode }) { + return
{children}
; +} + +const QuestDesignerPage: React.FC = () => { + return ( + + + + + + + + Collaborate with our AI Lorekeeper to craft a legendary quest for our champions. + + + + + ); +}; + +export default QuestDesignerPage; + +================ +File: app/robot-transformer-demo/page.tsx +================ +'use client'; + +import React from 'react'; +import CommonLayout from '@/components/CommonLayout'; +import RobotTransformerWallpaperDemo from '@/components/RobotTransformerWallpaperDemo'; + +export default function RobotTransformerDemoPage() { + return ( + + + + ); +} + ================ File: app/search/page.tsx ================ @@ -2371,14 +3219,18 @@ File: app/search/page.tsx import { useState, useEffect } from 'react' import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Badge } from "@/components/ui/badge" import { ScrollArea } from "@/components/ui/scroll-area" import { Search } from 'lucide-react' import supabase from '@/utils/supabaseDbClient' -import { Task, Project, TeamMember } from '@/types/types' +import { Task, Project } from '@/lib/task' +import { Card } from '@/components/ui/card' +import { CardContent } from '@/components/ui/card-content' +import { CardHeader } from '@/components/ui/card-header' +import { CardTitle } from '@/components/ui/card-title' +import { TeamMember } from '@/lib/teamMember' export default function SearchPage() { const [searchTerm, setSearchTerm] = useState('') @@ -2420,7 +3272,7 @@ export default function SearchPage() { ) const filteredTeamMembers = teamMembers.filter(member => - member.full_name.toLowerCase().includes(searchTerm.toLowerCase()) || + member.name.toLowerCase().includes(searchTerm.toLowerCase()) || member.role.toLowerCase().includes(searchTerm.toLowerCase()) ) @@ -2462,7 +3314,7 @@ export default function SearchPage() {

Project ID: {task.project_id}

{task.status} @@ -2499,11 +3351,11 @@ export default function SearchPage() { {filteredTeamMembers.map((member) => (
- - {member.full_name.split(' ').map((n: string) => n[0]).join('')} + + {member.name.split(' ').map((n: string) => n[0]).join('')}
-

{member.full_name}

+

{member.name}

{member.role}

@@ -2530,166 +3382,166 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" -import toast from "react-hot-toast"; -import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from "@/components/ui/select"; -import {Switch} from "@/components/ui/switch"; +import { toast } from "react-hot-toast"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; +import { Switch } from "@/components/ui/switch"; export default function SettingsPage() { - const router = useRouter() - const supabase = createClientComponentClient() - const [settings, setSettings] = useState({ - theme: 'light', - language: 'en', - notifications_enabled: true - }) + const router = useRouter() + const supabase = createClientComponentClient() + const [settings, setSettings] = useState({ + theme: 'light', + language: 'en', + notifications_enabled: true + }) - useEffect(() => { - const fetchSettings = async () => { - const { data: { user } } = await supabase.auth.getUser() - if (user) { - const { data } = await supabase - .from('user_settings') - .select('*') - .eq('user_id', user.id) - .single() - if (data) { - setSettings(data) + useEffect(() => { + const fetchSettings = async () => { + const { data: { user } } = await supabase.auth.getUser() + if (user) { + const { data } = await supabase + .from('user_settings') + .select('*') + .eq('user_id', user.id) + .single() + if (data) { + setSettings(data) + } + } + } + fetchSettings() + }, [supabase]) + + const handleSaveGeneral = async () => { + const { data: { user } } = await supabase.auth.getUser() + if (user) { + const { error } = await supabase + .from('user_settings') + .upsert({ user_id: user.id, ...settings }) + + if (error) { + console.error('Error updating settings:', error) + toast.error("Failed to update settings. Please try again.") + } else { + toast.success("Your general settings have been updated.") + } } - } } - fetchSettings() - }, [supabase]) - - const handleSaveGeneral = async () => { - const { data: { user } } = await supabase.auth.getUser() - if (user) { - const { error } = await supabase - .from('user_settings') - .upsert({ user_id: user.id, ...settings }) - - if (error) { - console.error('Error updating settings:', error) - toast.error("Failed to update settings. Please try again.") - } else { - toast.success("Your general settings have been updated.") - } + + const handleSavePassword = (e: React.FormEvent) => { + e.preventDefault() + // Here you would typically handle password change + console.log('Changing password') + toast.success("Your password has been successfully updated.") } - } - const handleSavePassword = (e: React.FormEvent) => { - e.preventDefault() - // Here you would typically handle password change - console.log('Changing password') - toast.success("Your password has been successfully updated.") - } + const handleDeleteAccount = () => { + // Here you would typically handle account deletion + console.log('Deleting account') + toast.error("Your account has been successfully deleted.") + router.push('/login') + } - const handleDeleteAccount = () => { - // Here you would typically handle account deletion - console.log('Deleting account') - toast.error("Your account has been successfully deleted.") - router.push('/login') - } - - return ( -
-

Settings

- - - General - Security - Advanced - - - - - General Settings - Manage your account settings and preferences. - - -
- - -
-
- - -
-
- setSettings({ ...settings, notifications_enabled: checked })} - /> - -
-
- - - -
-
- - - - Security Settings - Manage your password and account security. - - -
-
- - -
-
- - -
-
- - -
- -
-
-
-
- - - - Advanced Settings - Manage advanced settings for your account. - - -
-

Delete Account

-

- Once you delete your account, there is no going back. Please be certain. -

-
- -
-
-
-
-
- ) + return ( +
+

Settings

+ + + General + Security + Advanced + + + + + General Settings + Manage your account settings and preferences. + + +
+ + +
+
+ + +
+
+ setSettings({ ...settings, notifications_enabled: checked })} + /> + +
+
+ + + +
+
+ + + + Security Settings + Manage your password and account security. + + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ + + + Advanced Settings + Manage advanced settings for your account. + + +
+

Delete Account

+

+ Once you delete your account, there is no going back. Please be certain. +

+
+ +
+
+
+
+
+ ) } ================ @@ -2698,69 +3550,77 @@ File: app/signup/page.tsx 'use client'; import React, { useState } from 'react'; -import { useRouter } from "next/navigation"; -import { createClientComponentClient } from "@supabase/auth-helpers-nextjs"; +import { useRouter } from 'next/navigation'; +import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'; import Link from 'next/link'; -import { useTheme } from '../contexts/ThemeContext'; import Image from 'next/image'; -import { toast } from 'react-hot-toast'; +import { useTheme } from '../contexts/ThemeContext'; +import toast from "react-hot-toast"; import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; +import logger from '@/lib/logger'; +import SharedLayout from '../../components/SharedLayout'; -export default function SignUpPage() { - const { isDark } = useTheme(); +export default function SignupPage() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); const router = useRouter(); const supabase = createClientComponentClient(); - const { theme } = useTheme(); + const themeContext = useTheme(); + const theme = themeContext?.theme ?? 'light'; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); - setIsLoading(true); + setError(null); try { - const { error } = await supabase.auth.signUp({ - email, - password, - options: { - emailRedirectTo: `${window.location.origin}/auth/callback`, - }, - }); + const { error } = await supabase.auth.signUp({ email, password }); if (error) throw error; - toast.success('Signup successful! Please check your email for confirmation.'); - router.push('/login?message=Please check your email to confirm your account'); - } catch (error: any) { - toast.error(error.message); - } finally { - setIsLoading(false); + toast.success('Account created successfully'); + router.push('/login'); + } catch (error: unknown) { + if (error instanceof Error) { + setError(error.message); + toast.error(error.message); + logger.error('Signup error'); + } else { + setError('An unknown error occurred'); + toast.error('An unknown error occurred'); + logger.error('Signup error: An unknown error occurred'); + } } }; - const handleGoogleSignUp = async () => { + const handleGoogleSignIn = async () => { try { const { error } = await supabase.auth.signInWithOAuth({ provider: 'google', options: { - redirectTo: `${window.location.origin}/auth/callback`, + redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`, }, }); if (error) throw error; - } catch (error: any) { - toast.error(error.message); + } catch (error: unknown) { + if (error instanceof Error) { + toast.error(error.message); + logger.error('Google sign-in error'); + } else { + toast.error('An unknown error occurred'); + logger.error('Google sign-in error: An unknown error occurred'); + } } }; return ( -
-
+ +
-

+

Create your account

-
+ +
+ {error &&
{error}
} +
-
+
- - Or continue with - + + Or continue with +
-
+ ); } ================ -File: app/support/page.tsx +File: app/support/layout.tsx ================ -'use client' +import { Metadata } from 'next'; +import RobotTransformerWallpaper from '@/components/RobotTransformerWallpaper'; // Ensure this path is correct -import { useState } from 'react' -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" -import { Input } from "@/components/ui/input" -import { Button } from "@/components/ui/button" -import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" -import { Textarea } from "@/components/ui/textarea" -import { Search, Mail } from 'lucide-react' +export const metadata: Metadata = { + title: 'Support | QuantumLabs', + description: 'Get support for QuantumLabs', +}; -interface FAQ { - question: string - answer: string +export default function SupportLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + <> + {/* Add the wallpaper component */} + {children} + + ); } -export default function SupportPage() { - const [searchTerm, setSearchTerm] = useState('') - const [faqs] = useState([ - { - question: "How do I create a new task?", - answer: "To create a new task, navigate to the Tasks page and click on the 'Add Task' button. Fill in the required details such as title, description, and due date, then click 'Save'." - }, - { - question: "Can I assign tasks to other team members?", - answer: "Yes, you can assign tasks to other team members. When creating or editing a task, you'll see an 'Assignee' field where you can select the team member you want to assign the task to." - }, - { - question: "How do I change the status of a task?", - answer: "To change the status of a task, go to the task details page and look for the 'Status' dropdown. Select the new status from the options provided (e.g., 'To Do', 'In Progress', 'Done') and the change will be saved automatically." - }, - { - question: "Is there a mobile app available?", - answer: "Currently, we don't have a dedicated mobile app. However, our web application is fully responsive and can be accessed through your mobile device's web browser for a seamless experience on the go." - }, - { - question: "How can I create a new project?", - answer: "To create a new project, go to the Projects page and click on the 'New Project' button. Fill in the project details such as name, description, and team members, then click 'Create Project'." - }, - ]) +================ +File: app/support/page.tsx +================ +'use client' - const filteredFAQs = faqs.filter(faq => - faq.question.toLowerCase().includes(searchTerm.toLowerCase()) || - faq.answer.toLowerCase().includes(searchTerm.toLowerCase()) - ) +import React from 'react'; + +// Remove the metadata export from this file +export default function SupportPage() { return ( -
-

Help & Support

- - - FAQ - Contact Support - - - - - Frequently Asked Questions - - -
- setSearchTerm(e.target.value)} - className="flex-1" - /> - -
- - {filteredFAQs.map((faq, index) => ( - - {faq.question} - {faq.answer} - - ))} - -
-
-
- - - - Contact Support - - -
-
- - -
-
- - -
-
- -