From 4b7bf4c6b2d7aae462be592d019d509abf59e0a1 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 13:34:16 +0700 Subject: [PATCH 01/13] feat: add signup --- package-lock.json | 280 +++++++++++++++++++++++++++ package.json | 1 + src/app/auth/signup/page.tsx | 32 +++ src/components/auth/signupButton.tsx | 25 +++ src/components/auth/signupForm.tsx | 60 ++++++ src/types/database.types.ts | Bin 0 -> 34556 bytes 6 files changed, 398 insertions(+) create mode 100644 src/app/auth/signup/page.tsx create mode 100644 src/components/auth/signupButton.tsx create mode 100644 src/components/auth/signupForm.tsx create mode 100644 src/types/database.types.ts diff --git a/package-lock.json b/package-lock.json index ac30d67..2d4a09d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,7 @@ "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", + "supabase": "^1.200.3", "tailwindcss": "^3.4.1", "typescript": "^5" } @@ -254,6 +255,18 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -1881,6 +1894,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2174,6 +2199,21 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/bin-links": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", + "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", + "dev": true, + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -2322,6 +2362,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/class-variance-authority": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", @@ -2354,6 +2403,15 @@ "node": ">=6" } }, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2552,6 +2610,15 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", @@ -3482,6 +3549,29 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3576,6 +3666,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3902,6 +4004,19 @@ "node": ">= 0.4" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4660,6 +4775,49 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", + "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4784,6 +4942,43 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4792,6 +4987,15 @@ "node": ">=0.10.0" } }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5472,6 +5676,15 @@ "pify": "^2.3.0" } }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6073,6 +6286,25 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supabase": { + "version": "1.200.3", + "resolved": "https://registry.npmjs.org/supabase/-/supabase-1.200.3.tgz", + "integrity": "sha512-3NdhqBkfPVlm+rAhWQoVcyr54kykuAlHav/GWaAoQEHBDbbYI1lhbDzugk8ryQg92vSLwr3pWz0s4Hjdte8WyQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bin-links": "^4.0.3", + "https-proxy-agent": "^7.0.2", + "node-fetch": "^3.3.2", + "tar": "7.4.3" + }, + "bin": { + "supabase": "bin/supabase" + }, + "engines": { + "npm": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6158,6 +6390,23 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -6444,6 +6693,15 @@ "d3-timer": "^3.0.1" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -6653,6 +6911,19 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -6681,6 +6952,15 @@ "@babel/runtime-corejs3": "^7.16.5" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/yaml": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", diff --git a/package.json b/package.json index 1ea5e8a..24ab385 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", + "supabase": "^1.200.3", "tailwindcss": "^3.4.1", "typescript": "^5" } diff --git a/src/app/auth/signup/page.tsx b/src/app/auth/signup/page.tsx new file mode 100644 index 0000000..b280f2b --- /dev/null +++ b/src/app/auth/signup/page.tsx @@ -0,0 +1,32 @@ +import Image from "next/image"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardFooter, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; + +import { SignupButton } from "@/components/auth/signupButton"; +import { SignupForm } from "@/components/auth/signupForm"; + +export default function Signup() { + return ( +
+ + + Join Our Community + + Create an account and be a part of a thriving community of investors and innovators. + + + +

Sign Up With

+ +
+ +
+ + By signing up, you agree to the Terms of Service and acknowledge you’ve read our Privacy Policy. + +
+
+ ); +} diff --git a/src/components/auth/signupButton.tsx b/src/components/auth/signupButton.tsx new file mode 100644 index 0000000..4e7e339 --- /dev/null +++ b/src/components/auth/signupButton.tsx @@ -0,0 +1,25 @@ +"use client"; + +import Image from "next/image"; +import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { Button } from "@/components/ui/button"; + +export function SignupButton(props: { nextUrl?: string }) { + const supabase = createSupabaseClient(); + + const handleSignup = async () => { + await supabase.auth.signInWithOAuth({ + provider: "google", + options: { + redirectTo: `${location.origin}/auth/callback?next=${props.nextUrl || ""}`, + }, + }); + }; + + return ( + + ); +} diff --git a/src/components/auth/signupForm.tsx b/src/components/auth/signupForm.tsx new file mode 100644 index 0000000..aaca740 --- /dev/null +++ b/src/components/auth/signupForm.tsx @@ -0,0 +1,60 @@ +"use client"; + +import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { useState } from "react"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { useRouter } from "next/navigation"; +import toast from "react-hot-toast"; + +export function SignupForm() { + const router = useRouter(); + const supabase = createSupabaseClient(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + + const handleSignup = async (event: React.MouseEvent) => { + event.preventDefault(); + + if (password !== confirmPassword) { + alert("Passwords do not match!"); + return; + } + + const { error } = await supabase.auth.signUp({ + email, + password, + }); + + if (error) { + toast.error(error.message); + } else { + toast.success("Account created successfully!"); + router.push("/"); + } + }; + + return ( +
+ setEmail(e.target.value)} placeholder="Email" /> + setPassword(e.target.value)} + placeholder="Password" + /> + setConfirmPassword(e.target.value)} + placeholder="Confirm Password" + /> + +
+ ); +} diff --git a/src/types/database.types.ts b/src/types/database.types.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd875f5903da834733f1af5922cb8ddeb10be53d GIT binary patch literal 34556 zcmeHQTW{P{5cV??{~^i)0;w;&qSC6RjT8_xYExcT(JI%nB{yZ$LR9+Kf%$xPaxOEr z$H(@r16H*4*6TB8F5g_v#r8jcpB8@>*Tq$FQ`{C?^tq$|ozk}-izS`Cq;KCBUlw1` zajW=?K1;ghrdZG~@1paU#fRdeIHI;U(fK2ya#ftu`9o?GQbLP!`U}r}q8?_&?{xKD z@mlCFa6Tg9h) zde_w75pldIj!RzrFVN0@*%Fd2m0xkiGve=r^n)v^uEBM$Nn?Lh(7^BbJ0>n*tyD|S zN~vzS6(5hO2j~vAyeoEzE6~ww$SwGIT=EY+LEH0EV<``8QEtP>MT>rbNnq`e^!)>U zhn3TQY_eVx$5+M25+TRgR2=S4sr_vxA4}3WY?dR3$298_$6c}*a0=grZel!!S29|j zX7b)IUL+TFh;dh2u&H52_LYa4Tsk3c@@X(~awzE7c}sErr1V~g$8}=INnx?57Hy;s zCiH}PH1vCX_i;yRuGtrK^t`61b6%onL9rE4=r@XO*K|Z2n%!s2l$UCh;mR|jh3vSX z+TybKiN4(xzfdn1^bK^klMFhiESTo8IZ<)-!*(SX=nE~+DI#B#+&iwf6?)sNx*?T> z|GyxaUlEN{%KulZZ=iNoW-dhMDs+MZq&=e#j+fLsa%!quCpmJU&)D^{X;jf(%8QI# zC*kMfk;=cTrC0|zN}N0=ewSs|?W5i~N~ndn2y4=2M1$Lu+CCu-buV-s#w8oIHg(N= zvIDATSlZQ_IrRW!I44TSfe(WB_L_i=fIn*uDD4bh?3GBWdA4ItY^t-Q%rSOb%C=QL ztXVTxlGL8Lbo#NVy*`*MT7`}wENa81?xksFSy$G6p2Y5XW&G`yy;CG|RIkf$h#~9B z;i(=xe^m$qcjL_F%saA*)aY!mPYqx4sj64wautY~(t9SE|@uGUnILzg3)5v*2 z5eYM%ZzvXGjuo}sgrD`tv4@JEopO|qy0dQmz>=9U7lT$iVH`3qC|eJo zrQOW^d+PO=d|{WkK%e3G+#c8M*}7SB86}1oTlOivJ%f)|dRxsSvoWGaQ&!h-gm!vm zi(l{uU7?7dHwOh3sulI4yk>@Y4 z6>8~c#3Qerr1gU>Z!@K^D%YwJ8#UCHDIc2skYN^qrjcv7S7<)ng~M5ik1{)?y*Bf! zW5^yEbbCttHgf{0*bbpZWmV9QR%+8+da$Z&+s3X^D^;zfWo6IJTF`B4kA;(M-L5$H zH$G}UI}Y1!stT^l7xR0sPCe1r#^2H!b(Jqb>-t(gM~js1SZd@KtNax5S1%{V8tHC< ze%JM(&8}mfdTYzr4YmZ!GrRdvIf*&~m6YP%r3cu*@JGl4twfu3Wi%FJ=M*Qp+}F!g3Qyhq5c})dIzHZlYYKSvHq0C z`nV6{UB}$jCg-?4{TKIR^Y$4IYklw3_FDXxk|TfEb5`4ts?#d+x6Dtr4Bm%)_FT0| z`J{&I7TjEp3jJnI^_I7Ix0n`E8cR$YS5@B6cq_J__qJ}<^K`~yyZtgwZn~1NLF~+w8w32aQWZ2cUbTBY3q>gIPJ_FZraA}=Rq+3 z)Arb6jIp2@MT|4`d|=s|aaOV0J%2>JXfb=TsE`e7*?77do{rIe9E}WlQMT4}2YT&S z=Hfi2X{W0Cf}L(?RS(Y#>yMvXs>ne3yeFD^#R-0G`(NsClw11)NwRH~o`Dw4PeLp? zYD>}_@0qrZLaNau`Lj_R4o|rp)gvm0s*Wl9SboA3KSwhcQ_^Zx-qRGNBqbY9>q6By z#>QHF$Gi~dYSdi%-DSuqz9P%p=Uhj7ELGV~h5VbY%laQxH)BEO0FQureM~!`XEa(v zeNcz%F3+rs=LFJK{BAY(2}OjyR^6b3w4$ww@fYQ)gxrgO*pt$*Mfa5ATdJ$vh@^du zCA}f#Ns~*jG3<4#ZVQ*~+RFfI$V{p6?Zznj-VoSBQt4umTzUGmiM{TdY*P0WS7{T8 z6%BE^r;MX+O5^LC#_!d>;j?63om5A=E}y_>*Y$+BR3l@Vzv{nEN+q41jsYFZzZ`J{cez9veTm;1H!YV1+QJ(TX*%I;}f;XI)| zrrN8IcJ+cLd46UeM)uSy`ph)YJyzL=%%=GshV`j#KBiYypxNGY+W2c9J8A76rAwLX zCG9ZUhopA@8Hc1&v-UXIRC~7f7Os*ePicM=%sB9q#veO+CQtEi*|2!Zep&5w^NjJv z{V_-CT;4VrTR%r*0aVDR^!(4N8e~Rm7pUm)mN=~0V;%N}-j@Qj`TvK$9n*KK0(iD3 zzePsJY1e*U5;u6$%TRJ){D3E-;*DkQo=46|L-go$=>COnZ&&Xw*(&x(N`61x8+s}Z z?o7a}hkK7*`gXfn@si&Chc)rT^7*QdSMSZaqVeX|>fI#%U3ib^+&0PRd)O|X7~ZLe z_ye9W_x<=DT_LCb3f}eqigTeJX3roxHwTTi7Yo zp2twfPZOEG7WkM&I<#;J-G+LDb`R*?QM!#nZg`d?)oh~)n!QTN#@q>l`zw0Ddb2t zEFN_xJ^HMWMR{dap*UfvgbO-m5GL3iX il@>jOxi-XLT6;2WX*FoW-ZHK`nJUXBIrh@(QRiR9Sc78# literal 0 HcmV?d00001 From 4bb97829d6f5b43542d3072cf2492f03516539f6 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 13:52:14 +0700 Subject: [PATCH 02/13] refactor: link signup button --- src/components/navigationBar/nav.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/navigationBar/nav.tsx b/src/components/navigationBar/nav.tsx index 92f83d1..940e917 100644 --- a/src/components/navigationBar/nav.tsx +++ b/src/components/navigationBar/nav.tsx @@ -77,7 +77,9 @@ const unAuthenticatedComponents = () => { Login - + + + ); }; From 10d03da196b15ab4d8b0b290f5d40be90cc13adf Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 14:07:46 +0700 Subject: [PATCH 03/13] refactor: extract client component from navbar --- src/components/navigationBar/nav.tsx | 134 +------------------- src/components/navigationBar/profileBar.tsx | 100 +++++++++++++++ src/components/navigationBar/serchBar.tsx | 35 +++++ 3 files changed, 139 insertions(+), 130 deletions(-) create mode 100644 src/components/navigationBar/profileBar.tsx create mode 100644 src/components/navigationBar/serchBar.tsx diff --git a/src/components/navigationBar/nav.tsx b/src/components/navigationBar/nav.tsx index 940e917..9fc31a7 100644 --- a/src/components/navigationBar/nav.tsx +++ b/src/components/navigationBar/nav.tsx @@ -1,5 +1,3 @@ -"use client"; - import * as React from "react"; import Link from "next/link"; import Image from "next/image"; @@ -7,8 +5,6 @@ import Image from "next/image"; import { cn } from "@/lib/utils"; import { Separator } from "@/components/ui/separator"; import { ThemeToggle } from "@/components/theme-toggle"; -import { Button } from "@/components/ui/button"; -import { useRouter } from "next/navigation"; import { NavigationMenu, NavigationMenuContent, @@ -16,36 +12,10 @@ import { NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, - navigationMenuTriggerStyle, } from "@/components/ui/navigation-menu"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Skeleton } from "@/components/ui/skeleton"; -import { Search, Bell, Heart, Wallet } from "lucide-react"; +import { SearchBar } from "./serchBar"; +import { ProfileBar } from "./profileBar"; -import { LogoutButton } from "@/components/auth/logoutButton"; - -import useSession from "@/lib/supabase/useSession"; - -const landings = [ - { - id: 1, - title: "Landing 01", - route: "/project-management", - }, - { - id: 2, - title: "Landing 02", - route: "/crm-landing", - }, -]; const ListItem = React.forwardRef, React.ComponentPropsWithoutRef<"a">>( ({ className, title, children, ...props }, ref) => { return ( @@ -69,83 +39,7 @@ const ListItem = React.forwardRef, React.ComponentPropsWit ); ListItem.displayName = "ListItem"; -const unAuthenticatedComponents = () => { - return ( -
- - - - - - -
- ); -}; - -const authenticatedComponents = () => { - let notifications = 100; - const displayValue = notifications >= 100 ? "..." : notifications; - return ( -
- - {" "} -
- - - {displayValue} - -
- - - - - - - - - My Account - - Settings - Support - - - - - - -
- ); -}; - export function NavigationBar() { - const { session, loading } = useSession(); - const user = session?.user; - const [sessionLoaded, setSessionLoaded] = React.useState(false); - const [searchActive, setSearchActive] = React.useState(false); - const router = useRouter(); - - React.useEffect(() => { - if (!loading) { - setSessionLoaded(true); - } - }, [loading]); - - const handleKeyDown = async (k: React.KeyboardEvent) => { - if (k.key === "Enter") { - const query = (k.target as HTMLInputElement).value.trim(); - if (query) { - router.push(`/find?query=${encodeURIComponent(query)}`); - } - } - }; - const businessComponents = [ { title: "Businesses", @@ -234,17 +128,7 @@ export function NavigationBar() { - setSearchActive(!searchActive)} className="cursor-pointer" /> - {/* search bar's input */} - + @@ -252,17 +136,7 @@ export function NavigationBar() {
- {sessionLoaded ? ( - user ? ( - authenticatedComponents() - ) : ( - unAuthenticatedComponents() - ) - ) : ( -
- -
- )} +
diff --git a/src/components/navigationBar/profileBar.tsx b/src/components/navigationBar/profileBar.tsx new file mode 100644 index 0000000..2f6943c --- /dev/null +++ b/src/components/navigationBar/profileBar.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { useState, useEffect } from "react"; +import Link from "next/link"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Bell, Heart, Wallet } from "lucide-react"; +import { LogoutButton } from "@/components/auth/logoutButton"; +import useSession from "@/lib/supabase/useSession"; + +const UnAuthenticatedComponents = () => { + return ( +
+ + + + + + +
+ ); +}; + +const AuthenticatedComponents = () => { + let notifications = 100; + const displayValue = notifications >= 100 ? "..." : notifications; + return ( +
+ +
+ + + {displayValue} + +
+ + + + + + + + + My Account + + Settings + Support + + + + + + +
+ ); +}; + +export function ProfileBar() { + const { session } = useSession(); + const user = session?.user; + const [sessionLoaded, setSessionLoaded] = useState(false); + + useEffect(() => { + if (!session) { + setSessionLoaded(true); + } + }, [session]); + + return ( + <> + {sessionLoaded ? ( + user ? ( + + ) : ( + + ) + ) : ( +
+ +
+ )} + + ); +} diff --git a/src/components/navigationBar/serchBar.tsx b/src/components/navigationBar/serchBar.tsx new file mode 100644 index 0000000..026e52b --- /dev/null +++ b/src/components/navigationBar/serchBar.tsx @@ -0,0 +1,35 @@ +"use client"; + +import * as React from "react"; +import { useRouter } from "next/navigation"; +import { Search } from "lucide-react"; +import { cn } from "@/lib/utils"; + +export function SearchBar() { + const [searchActive, setSearchActive] = React.useState(false); + const router = useRouter(); + + const handleKeyDown = async (e: React.KeyboardEvent) => { + if (e.key === "Enter") { + const query = (e.target as HTMLInputElement).value.trim(); + if (query) { + router.push(`/find?query=${encodeURIComponent(query)}`); + } + } + }; + + return ( +
+ setSearchActive(!searchActive)} className="cursor-pointer" /> + +
+ ); +} From ca5764fb24a94822104fe43dd1616fcf9dd197c4 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 14:10:13 +0700 Subject: [PATCH 04/13] refactor: refresh profileBar when logout --- src/components/auth/logoutButton.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/auth/logoutButton.tsx b/src/components/auth/logoutButton.tsx index d4cd348..d84b562 100644 --- a/src/components/auth/logoutButton.tsx +++ b/src/components/auth/logoutButton.tsx @@ -1,15 +1,23 @@ "use client"; import { createSupabaseClient } from "@/lib/supabase/clientComponentClient"; +import { usePathname } from "next/navigation"; import { useRouter } from "next/navigation"; export function LogoutButton() { const supabase = createSupabaseClient(); + const pathname = usePathname(); const router = useRouter(); const handleLogout = async () => { await supabase.auth.signOut(); - router.push("/"); + + if (pathname === "/") { + window.location.reload(); + } else { + await router.push("/"); + window.location.reload(); + } }; return ; From 690c44bd7d7c3d3dd9af80321804698a13ad0788 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 14:14:44 +0700 Subject: [PATCH 05/13] refactor: extract supabase query + use projectCard instead of extendableCard --- src/app/deals/page.tsx | 4 +- src/app/find/page.tsx | 76 ++----------------- src/app/page.tsx | 10 +-- .../{extendableCard.tsx => projectCard.tsx} | 4 +- src/lib/data/query.ts | 35 +++++++++ 5 files changed, 51 insertions(+), 78 deletions(-) rename src/components/{extendableCard.tsx => projectCard.tsx} (97%) create mode 100644 src/lib/data/query.ts diff --git a/src/app/deals/page.tsx b/src/app/deals/page.tsx index 6aff49f..c60cd9a 100644 --- a/src/app/deals/page.tsx +++ b/src/app/deals/page.tsx @@ -3,7 +3,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@ import { useState } from "react"; import { Clock3Icon, MessageSquareIcon, UserIcon, UsersIcon } from "lucide-react"; import { Separator } from "@/components/ui/separator"; -import { ExtendableCard } from "@/components/extendableCard"; +import { ProjectCard } from "@/components/projectCard"; export default function Deals() { const [postAtFilter, setPostAtFilter] = useState(""); @@ -111,7 +111,7 @@ export default function Deals() { {/* Block for all the deals */}
{filteredData.map((item, index) => ( - {} -interface Project { - id: string; - projectName: string; - businessId: string; - investmentCount: number; - projectShortDescription: string; - publishedTime: string; +interface Project extends Tables<"Project"> { ProjectInvestmentDetail: ProjectInvestmentDetail[]; - tags: string[]; } -interface Business { - id: string; - businessName: string; - joinedDate: string; +interface Business extends Tables<"Business"> { Projects: Project[]; } -function getBusinesses(client: SupabaseClient, query: string | null) { - return client.from("Business").select("id, businessName, joinedDate").ilike("businessName", `%${query}%`); -} - -function getProjects(client: SupabaseClient, businessIds: string[]) { - return client - .from("Project") - .select( - ` - id, - projectName, - businessId, - publishedTime, - projectShortDescription, - ProjectInvestmentDetail ( - minInvestment, - totalInvestment, - targetInvestment - ) - ` - ) - .in("businessId", businessIds); -} - -function getTags(client: SupabaseClient, projectIds: string[]) { - return client.from("ItemTag").select("itemId, Tag (value)").in("itemId", projectIds); -} - -function getInvestmentCounts(client: SupabaseClient, projectIds: string[]) { - return client.from("InvestmentDeal").select("*", { count: "exact", head: true }).in("projectId", projectIds); -} - export default function Find() { const searchParams = useSearchParams(); const query = searchParams.get("query"); @@ -132,22 +86,6 @@ export default function Find() {
    {results.map((business) => (
  • - {/*

    {business.businessName}

    -

    Joined Date: {new Date(business.joinedDate).toLocaleDateString()}

    - {business.Projects.map((project) => ( - - ))} */} - {business.businessName} @@ -155,7 +93,7 @@ export default function Find() { {business.Projects.map((project) => ( -
    - - - - Date: Sun, 6 Oct 2024 16:27:59 +0700 Subject: [PATCH 06/13] feat: add profile page --- next.config.mjs | 17 +- package-lock.json | 1149 ++++++++++++++++++- package.json | 3 + public/banner.jpg | Bin 0 -> 109223 bytes src/app/(user)/profile/page.tsx | 100 ++ src/components/navigationBar/profileBar.tsx | 4 +- src/lib/data/userQuery.ts | 23 + src/types/database.types.ts | Bin 34556 -> 36516 bytes tailwind.config.ts | 2 +- 9 files changed, 1287 insertions(+), 11 deletions(-) create mode 100644 public/banner.jpg create mode 100644 src/app/(user)/profile/page.tsx create mode 100644 src/lib/data/userQuery.ts diff --git a/next.config.mjs b/next.config.mjs index 4678774..394ef64 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,19 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; + +const SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL_SOURCE; + +const nextConfig = { + reactStrictMode: true, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: SUPABASE_URL, + port: "", + pathname: "/storage/v1/object/sign/**", + }, + ], + }, +}; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 2d4a09d..00c256c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "b2d-ventures": "file:", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^4.1.0", "dotenv": "^16.4.5", "embla-carousel-react": "^8.2.0", "lucide-react": "^0.428.0", @@ -38,12 +39,14 @@ "react-countup": "^6.5.3", "react-dom": "^18", "react-hot-toast": "^2.4.1", + "react-markdown": "^9.0.1", "recharts": "^2.12.7", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@playwright/test": "^1.47.2", + "@tailwindcss/typography": "^0.5.15", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -1585,6 +1588,34 @@ "tslib": "^2.4.0" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@tanstack/query-core": { "version": "5.59.0", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.0.tgz", @@ -1688,12 +1719,54 @@ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.16.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", @@ -1710,14 +1783,12 @@ "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", - "devOptional": true + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "node_modules/@types/react": { "version": "18.3.10", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", - "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1732,6 +1803,11 @@ "@types/react": "*" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, "node_modules/@types/ws": { "version": "8.5.12", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", @@ -1870,8 +1946,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/acorn": { "version": "8.12.1", @@ -2194,6 +2269,15 @@ "resolved": "", "link": true }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2312,6 +2396,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2328,6 +2421,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -2428,6 +2557,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -2670,11 +2808,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -2692,6 +2838,18 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -2764,11 +2922,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -3475,6 +3653,15 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3489,6 +3676,11 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4004,6 +4196,53 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -4068,6 +4307,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -4098,6 +4342,28 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -4249,6 +4515,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4303,6 +4578,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -4359,6 +4643,17 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4682,12 +4977,33 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4712,6 +5028,150 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/merge-anything": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz", @@ -4734,6 +5194,427 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -4821,8 +5702,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mz": { "version": "2.7.0", @@ -5198,6 +6078,30 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5490,6 +6394,15 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5572,6 +6485,31 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-remove-scroll": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", @@ -5770,6 +6708,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -6024,6 +6993,15 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -6199,6 +7177,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6243,6 +7234,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -6453,6 +7452,24 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -6617,6 +7634,87 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6672,6 +7770,32 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/victory-vendor": { "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", @@ -6983,6 +8107,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 24ab385..b372e61 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "b2d-ventures": "file:", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^4.1.0", "dotenv": "^16.4.5", "embla-carousel-react": "^8.2.0", "lucide-react": "^0.428.0", @@ -39,12 +40,14 @@ "react-countup": "^6.5.3", "react-dom": "^18", "react-hot-toast": "^2.4.1", + "react-markdown": "^9.0.1", "recharts": "^2.12.7", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@playwright/test": "^1.47.2", + "@tailwindcss/typography": "^0.5.15", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/public/banner.jpg b/public/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6eeb714acc532e8ec0196e121de8bd60375b8564 GIT binary patch literal 109223 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 literal 0 HcmV?d00001 diff --git a/src/app/(user)/profile/page.tsx b/src/app/(user)/profile/page.tsx new file mode 100644 index 0000000..ceecf73 --- /dev/null +++ b/src/app/(user)/profile/page.tsx @@ -0,0 +1,100 @@ +// components/ProfilePage.tsx + +import React from "react"; +import Image from "next/image"; +import { createSupabaseClient } from "@/lib/supabase/serverComponentClient"; +import { getUserProfile } from "@/lib/data/userQuery"; +import { Tables } from "@/types/database.types"; +import { format } from "date-fns"; +import ReactMarkdown from "react-markdown"; + +interface Profile extends Tables<"Profiles"> {} + +export default async function ProfilePage() { + const supabase = createSupabaseClient(); + + const { + data: { user }, + } = await supabase.auth.getUser(); + + if (!user) { + return ( +

    +

    No user found!

    +
    + ); + } + + const { data: profileData, error } = await getUserProfile(supabase, user.id); + + if (error) { + return ( +
    +

    Error loading profile: {error}

    +
    + ); + } + + if (!profileData) { + return ( +
    +

    Loading profile...

    +
    + ); + } + + return ( +
    +
    +
    +
    + +
    +
    +
    + {/* Upper */} +
    + {/* Profile Image */} +
    + {profileData.full_name +
    + {/* Name and Username */} +
    +

    {profileData.full_name || "No Name"}

    +

    @{profileData.username || "username"}

    + {profileData.website && ( +

    + + {profileData.website} + +

    + )} +
    +
    + {/* Lower */} +
    +
    +

    Bio

    +
    + {profileData.bio || "No bio available."} +
    +
    +
    +
    +
    +

    + Last updated: {profileData.updated_at ? format(new Date(profileData.updated_at), "PPpp") : "N/A"} +

    +
    +
    +
    + ); +} diff --git a/src/components/navigationBar/profileBar.tsx b/src/components/navigationBar/profileBar.tsx index 2f6943c..41b31b9 100644 --- a/src/components/navigationBar/profileBar.tsx +++ b/src/components/navigationBar/profileBar.tsx @@ -57,7 +57,9 @@ const AuthenticatedComponents = () => { - My Account + + Profile + Settings Support diff --git a/src/lib/data/userQuery.ts b/src/lib/data/userQuery.ts new file mode 100644 index 0000000..5ddd8f0 --- /dev/null +++ b/src/lib/data/userQuery.ts @@ -0,0 +1,23 @@ +import { SupabaseClient } from "@supabase/supabase-js"; + +async function getUserProfile(client: SupabaseClient, userId: string) { + try { + const { data, error } = await client + .from("Profiles") + .select("updated_at, username, full_name, avatar_url, website, bio") + .eq("id", userId) + .single(); + + if (error) { + console.error("Error fetching user profile:", error.message); + return { data: null, error: error.message }; + } + + return { data, error: null }; + } catch (err) { + console.error("Unexpected error:", err); + return { data: null, error: "An unexpected error occurred." }; + } +} + +export { getUserProfile }; diff --git a/src/types/database.types.ts b/src/types/database.types.ts index cd875f5903da834733f1af5922cb8ddeb10be53d..6239e08dde62ddd158a65dd041aff3d3a972126c 100644 GIT binary patch delta 359 zcmey<%d})J(}pe^<}`-P$$^ZrlRp?~2q!X>F(fjS0C5pRJVPmv%$a_ZZ}LK0+sO-9SSDW(Vwt={S%tNfp@1P}vN@Cd}wxk>7H%fQSQ0rgKfs$X1w~z{Ub~ zGk((zQq3km2#F9b0ER+712B|;{!e8n28KcAyGHe0!5c>w@XeFx(J diff --git a/tailwind.config.ts b/tailwind.config.ts index 84287e8..4d932d5 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -74,7 +74,7 @@ const config = { }, }, }, - plugins: [require("tailwindcss-animate")], + plugins: [require("tailwindcss-animate"), require('@tailwindcss/typography'),], } satisfies Config export default config \ No newline at end of file From bc0d347e186d47ae85d346cec69305588fd73e73 Mon Sep 17 00:00:00 2001 From: sirin Date: Sun, 6 Oct 2024 18:23:42 +0700 Subject: [PATCH 07/13] feat: load top project card from database --- src/app/page.tsx | 97 +++++++++++++++++------------------ src/lib/data/projectQuery.ts | 49 ++++++++++++++++++ src/types/database.types.ts | Bin 36516 -> 36818 bytes 3 files changed, 97 insertions(+), 49 deletions(-) create mode 100644 src/lib/data/projectQuery.ts diff --git a/src/app/page.tsx b/src/app/page.tsx index 27d5d0b..9d234b5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,8 +4,52 @@ import Link from "next/link"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { ProjectCard } from "@/components/projectCard"; +import { getTopProjects } from "@/lib/data/projectQuery"; +import { createSupabaseClient } from "@/lib/supabase/serverComponentClient"; +import { Suspense } from "react"; -export default function Home() { +const TopProjects = async () => { + const supabase = createSupabaseClient(); + const { data: topProjectsData, error: topProjectsError } = await getTopProjects(supabase); + + if (topProjectsError) { + return
    Error loading top projects: {topProjectsError}
    ; + } + + if (!topProjectsData || topProjectsData.length === 0) { + return
    No top projects available.
    ; + } + + return ( +
    + {topProjectsData.map((project) => ( + + item.Tag.value)} + minInvestment={project.ProjectInvestmentDetail[0]?.minInvestment || 0} + totalInvestor={0} + totalRaised={project.ProjectInvestmentDetail[0]?.totalInvestment || 0} + /> + + ))} +
    + ); +}; + +const ProjectsLoader = () => ( +
    + {[...Array(4)].map((_, index) => ( +
    + ))} +
    +); + +export default async function Home() { return (
    @@ -81,54 +125,9 @@ export default function Home() {

    Hottest Deals

    The deals attracting the most interest right now

    -
    - - - - - - -
    + }> + +
    + )} + + {tagsFilter && + tagsFilter.map((tag: string) => ( + + ))} + + {projectStatusFilter && projectStatusFilter !== "all" && ( + + )} + + {businessTypeFilter && businessTypeFilter !== "all" && ( + + )} + + {sortByTimeFilter && sortByTimeFilter !== "all" && ( + + )} + + {/* Clear All button */} + +
    + ); +}; export default function Deals() { - const [postAtFilter, setPostAtFilter] = useState(""); - const [contentTypeFilter, setContentTypeFilter] = useState(""); - const [authorFilter, setAuthorFilter] = useState(""); - const [groupsFilter, setGroupFilter] = useState(""); - const [selectedTag, setSelectedTag] = useState(""); - const data = [ - { - name: "NVDA", - description: "Founded in 1993, NVIDIA is a key innovator of computer graphics and AI technology", - joinDate: "December 2021", - location: "Bangkok, Thailand", - tags: ["AI", "Technology"], - imageUri: "/login.png", - minInvestment: 10000, - totalInvestor: 58400, - totalRaised: 9000000, - }, - { - name: "Apple Inc.", - description: - "Founded in 1976, Apple Inc. is a leading innovator in consumer electronics, software, and online services, known for products like the iPhone, MacBook, and the App Store.", - joinDate: "February 2020", - location: "Cupertino, California, USA", - tags: ["Consumer Electronics", "Software"], - imageUri: "/money.png", - minInvestment: 10000, - totalInvestor: 58400, - totalRaised: 9000000, - }, - { - name: "Google LLC", - description: - "Founded in 1998, Google LLC specializes in internet-related services and products, including search engines, online advertising, cloud computing, and the Android operating system.", - joinDate: "April 2019", - location: "Mountain View, California, USA", - tags: ["Internet", "Search Engine"], - imageUri: "/money.png", - minInvestment: 10000, - totalInvestor: 5000, - totalRaised: 1500000000, - }, - { - name: "Microsoft Corporation", - description: "Microsoft Corporation is a multinational technology company.", - joinDate: "January 2018", - location: "California, USA", - tags: ["Technology", "Software"], - imageUri: null, - minInvestment: 250, - totalInvestor: 5000, - totalRaised: 1500000, - }, - ]; + const supabase = createSupabaseClient(); - const filteredData = selectedTag ? data.filter((item) => item.tags.includes(selectedTag)) : data; + const [searchTerm, setSearchTerm] = useState(""); + const [searchTermVisual, setSearchTermVisual] = useState(""); + const [sortByTimeFilter, setSortByTimeFilter] = useState("all"); + const [businessTypeFilter, setBusinessTypeFilter] = useState("all"); + const [tagFilter, setTagFilter] = useState([]); + const [projectStatusFilter, setprojectStatusFilter] = useState("all"); + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(4); + + const filterParams: FilterParams = { + searchTerm, + tagsFilter: tagFilter, + projectStatusFilter, + businessTypeFilter, + sortByTimeFilter, + }; + + const filterProjectQueryParams: FilterProjectQueryParams = { + searchTerm, + tagsFilter: tagFilter, + projectStatusFilter, + businessTypeFilter, + sortByTimeFilter, + page, + pageSize, + }; + + const { data: tags, isLoading: isLoadingTags, error: tagsLoadingError } = useQuery(getAllTagsQuery(supabase)); + const { + data: projectStatus, + isLoading: isLoadingFunded, + error: fundedLoadingError, + } = useQuery(getALlFundedStatusQuery(supabase)); + const { + data: businessType, + isLoading: isLoadingBusinessType, + error: businessTypeLoadingError, + } = useQuery(getAllBusinessTypeQuery(supabase)); + + const { + data: projects, + isLoading: isLoadingProjects, + error: projectsLoadingError, + } = useQuery(searchProjectsQuery(supabase, filterProjectQueryParams)); + + const clearAll = () => { + setSearchTerm(""); + setTagFilter([]); + setprojectStatusFilter("all"); + setBusinessTypeFilter("all"); + setSortByTimeFilter("all"); + }; return (
    @@ -72,58 +172,98 @@ export default function Deals() { All companies are vetted & pass due diligence.

    - {/* Filters */} -
    - setSearchTermVisual(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + setSearchTerm(e.currentTarget.value); + } + }} + /> + + {/* Posted At Filter */} + - setBusinessTypeFilter}> - - + + - All Tags - AI - Technology - Consumer Electronics - Software - Internet + {isLoadingBusinessType ? ( + + Loading... + + ) : businessTypeLoadingError ? ( + + No data available + + ) : ( + <> + All Types + {businessType && + businessType.map((type) => ( + + {type.value} + + ))} + + )} + + + + {/* Project Status Filter */} +
    + -
    -
    -

    Deals

    -

    The deals attracting the most interest right now

    -
    - - {/* Block for all the deals */} -
    - {filteredData.map((item, index) => ( - - ))} + {/* Project Cards Section */} +
    ); diff --git a/src/app/landing/page.tsx b/src/app/landing/page.tsx deleted file mode 100644 index 604a8de..0000000 --- a/src/app/landing/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -"use client"; - -import React from "react"; - -export default function Page() { - return
    hello
    ; -} diff --git a/src/lib/data/projectQuery.ts b/src/lib/data/projectQuery.ts index aefe0e7..ce652b9 100644 --- a/src/lib/data/projectQuery.ts +++ b/src/lib/data/projectQuery.ts @@ -1,6 +1,5 @@ import { SupabaseClient } from "@supabase/supabase-js"; - async function getTopProjects(client: SupabaseClient, numberOfRecords: number = 4) { try { const { data, error } = await client @@ -45,5 +44,139 @@ async function getTopProjects(client: SupabaseClient, numberOfRecords: number = } } - export { getTopProjects }; +async function searchProjects(client: SupabaseClient, searchTerm: string | null, page: number = 1, pageSize: number = 4) { + const start = (page - 1) * pageSize; + const end = start + pageSize - 1; + + try { + let query = client.from("Project").select( + ` + id, + projectName, + businessId, + publishedTime, + projectShortDescription, + cardImage, + ProjectInvestmentDetail ( + minInvestment, + totalInvestment, + targetInvestment, + investmentDeadline + ), + ItemTag ( + Tag ( + id, + value + ) + ), + Business ( + location + ) + ` + ).order("publishedTime", { ascending: false }) + .range(start, end); + + if (searchTerm) { + query = query.ilike('projectName', `%${searchTerm}%`); + } + + const { data, error } = await query; + + if (error) { + console.error("Error searching projects:", error.message); + return { data: null, error: error.message }; + } + + return { data, error: null }; + } catch (err) { + console.error("Unexpected error:", err); + return { data: null, error: "An unexpected error occurred." }; + } +} + +export interface FilterParams { + searchTerm?: string; + tagsFilter?: string[]; + projectStatus?: string; + projectStatusFilter?: string; + businessTypeFilter?: string; + sortByTimeFilter?: string; +} + +export interface FilterProjectQueryParams extends FilterParams { + page: number, + pageSize: number +} + +function searchProjectsQuery(client: SupabaseClient, {searchTerm, tagsFilter, projectStatus, businessTypeFilter, sortByTimeFilter, page = 1, pageSize = 4}: FilterProjectQueryParams) { + const start = (page - 1) * pageSize; + const end = start + pageSize - 1; + + let query = client.from("Project").select( + ` + id, + project_name:projectName, + published_time:publishedTime, + project_short_description:projectShortDescription, + card_image_url:cardImage, + ...ProjectStatus!Project_projectStatusId_fkey!inner ( + project_status:value + ), + ...ProjectInvestmentDetail!inner ( + min_investment:minInvestment, + total_investment:totalInvestment, + target_investment:targetInvestment, + investment_deadline:investmentDeadline + ), + tags:ItemTag!inner ( + ...Tag!inner ( + tag_name:value + ) + ), + ...Business!inner ( + ...businessType!inner ( + business_type:value + ), + business_location:location + ) + ` + ).order("publishedTime", { ascending: false }).range(start, end) + + if (sortByTimeFilter === "all") { + sortByTimeFilter = undefined; + } + + if (projectStatus === "all") { + projectStatus = undefined; + } + + if (businessTypeFilter === "all") { + businessTypeFilter = undefined; + } + + if (tagsFilter?.length === 0) { + tagsFilter = undefined; + } + + if (searchTerm) { + query = query.ilike('projectName', `%${searchTerm}%`) + } + + if (tagsFilter) { + query = query.in('ItemTag.Tag.value', tagsFilter) + } + + if (projectStatus) { + query = query.eq("ProjectStatus.value", projectStatus) + } + + if (businessTypeFilter) { + query = query.eq("Business.businessType.value", businessTypeFilter) + } + + return query; +} + + +export { getTopProjects, searchProjects, searchProjectsQuery }; From bcc9617010501f5e1fa4ad8e46446022c2adb4ec Mon Sep 17 00:00:00 2001 From: sirin Date: Wed, 9 Oct 2024 05:39:52 +0700 Subject: [PATCH 10/13] refactor: update outdated layout format --- src/components/projectCard.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/projectCard.tsx b/src/components/projectCard.tsx index c111ae2..5734f04 100644 --- a/src/components/projectCard.tsx +++ b/src/components/projectCard.tsx @@ -35,14 +35,14 @@ export function ProjectCard(props: ProjectCardProps) { Card image ) : ( Card image )} From 06904bc6dd3e24d0bbff3842aee505aba889bc21 Mon Sep 17 00:00:00 2001 From: sirin Date: Wed, 9 Oct 2024 05:40:21 +0700 Subject: [PATCH 11/13] feat: dynamically load some data for project deals page --- src/app/deals/[id]/followShareButton.tsx | 61 +++++ src/app/deals/[id]/page.tsx | 162 ++++++++++++ src/components/ui/carousel.tsx | 318 ++++++++++------------- src/lib/data/projectQuery.ts | 69 ++--- 4 files changed, 384 insertions(+), 226 deletions(-) create mode 100644 src/app/deals/[id]/followShareButton.tsx create mode 100644 src/app/deals/[id]/page.tsx diff --git a/src/app/deals/[id]/followShareButton.tsx b/src/app/deals/[id]/followShareButton.tsx new file mode 100644 index 0000000..d143860 --- /dev/null +++ b/src/app/deals/[id]/followShareButton.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; +import { ShareIcon, StarIcon } from "lucide-react"; +import { redirect } from "next/navigation"; +import useSession from "@/lib/supabase/useSession"; +import toast from "react-hot-toast"; + +const FollowShareButtons = () => { + const [progress, setProgress] = useState(0); + const [tab, setTab] = useState("Pitch"); + const { session, loading } = useSession(); + const user = session?.user; + const [sessionLoaded, setSessionLoaded] = useState(false); + const [isFollow, setIsFollow] = useState(false); + + useEffect(() => { + if (!loading) { + setSessionLoaded(true); + } + }, [loading]); + + const handleShare = () => { + const currentUrl = window.location.href; + if (document.hasFocus()) { + navigator.clipboard.writeText(currentUrl).then(() => { + toast.success("URL copied to clipboard!"); + }); + } + }; + const handleFollow = () => { + if (user) { + setIsFollow((prevState) => !prevState); + } else { + redirect("/login"); + } + }; + + return ( +
    +
    + + + + + + +

    Follow NVIDIA

    +
    +
    +
    +
    +
    + +
    +
    + ); +}; + +export default FollowShareButtons; diff --git a/src/app/deals/[id]/page.tsx b/src/app/deals/[id]/page.tsx new file mode 100644 index 0000000..92b21aa --- /dev/null +++ b/src/app/deals/[id]/page.tsx @@ -0,0 +1,162 @@ +import Image from "next/image"; +import Link from "next/link"; + +import ReactMarkdown from "react-markdown"; + +import * as Tabs from "@radix-ui/react-tabs"; +import { Button } from "@/components/ui/button"; +import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/ui/carousel"; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; +import { Progress } from "@/components/ui/progress"; +import { Separator } from "@/components/ui/separator"; +import { createSupabaseClient } from "@/lib/supabase/serverComponentClient"; +import FollowShareButtons from "./followShareButton"; + +import { getProjectData } from "@/lib/data/projectQuery"; + +export default async function ProjectDealPage({ params }: { params: { id: number } }) { + const supabase = createSupabaseClient(); + + const { data: projectData, error: projectDataError } = await getProjectData(supabase, params.id); + + const carouselData = [ + { src: "/boiler1.jpg", alt: "Boiler 1" }, + { src: "/boiler1.jpg", alt: "Boiler 1" }, + { src: "/boiler1.jpg", alt: "Boiler 1" }, + { src: "/boiler1.jpg", alt: "Boiler 1" }, + { src: "/boiler1.jpg", alt: "Boiler 1" }, + ]; + + if (projectDataError) { + return
    Error
    ; + } + + return ( +
    +
    +
    + {/* Name, star and share button packed */} + +
    + {/* image carousel */} +
    + + + {carouselData.map((item, index) => ( + + {item.alt} + + ))} + + + + + + + + {carouselData.map((item, index) => ( + + {item.alt} + + ))} + + +
    +
    +
    + +

    ${projectData?.total_investment}

    +

    5% raised of \$5M max goal

    + +
    + +

    +

    {projectData?.total_investment}

    +

    +

    Investors

    +
    + + +

    +

    1 hours

    +

    Left to invest

    +
    + +
    +
    +
    +
    + {/* menu */} +
    +
    + + + Pitch + General Data + Updates + + + + + + + + + +
    + {projectData?.project_description || "No pitch available."} +
    +
    +
    +
    + + + + general + general Description + + +

    general Content

    +
    +
    +
    + + + + update + update Description + + +

    update Content

    +
    +
    +
    +
    +
    +
    +
    +
    + ); +} diff --git a/src/components/ui/carousel.tsx b/src/components/ui/carousel.tsx index ec505d0..59831f9 100644 --- a/src/components/ui/carousel.tsx +++ b/src/components/ui/carousel.tsx @@ -1,124 +1,108 @@ -"use client" +"use client"; -import * as React from "react" -import useEmblaCarousel, { - type UseEmblaCarouselType, -} from "embla-carousel-react" -import { ArrowLeft, ArrowRight } from "lucide-react" +import * as React from "react"; +import useEmblaCarousel, { type UseEmblaCarouselType } from "embla-carousel-react"; +import { ArrowLeft, ArrowRight } from "lucide-react"; -import { cn } from "@/lib/utils" -import { Button } from "@/components/ui/button" +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; -type CarouselApi = UseEmblaCarouselType[1] -type UseCarouselParameters = Parameters -type CarouselOptions = UseCarouselParameters[0] -type CarouselPlugin = UseCarouselParameters[1] +type CarouselApi = UseEmblaCarouselType[1]; +type UseCarouselParameters = Parameters; +type CarouselOptions = UseCarouselParameters[0]; +type CarouselPlugin = UseCarouselParameters[1]; type CarouselProps = { - opts?: CarouselOptions - plugins?: CarouselPlugin - orientation?: "horizontal" | "vertical" - setApi?: (api: CarouselApi) => void -} + opts?: CarouselOptions; + plugins?: CarouselPlugin; + orientation?: "horizontal" | "vertical"; + setApi?: (api: CarouselApi) => void; +}; type CarouselContextProps = { - carouselRef: ReturnType[0] - api: ReturnType[1] - scrollPrev: () => void - scrollNext: () => void - canScrollPrev: boolean - canScrollNext: boolean -} & CarouselProps + carouselRef: ReturnType[0]; + api: ReturnType[1]; + scrollPrev: () => void; + scrollNext: () => void; + canScrollPrev: boolean; + canScrollNext: boolean; +} & CarouselProps; -const CarouselContext = React.createContext(null) +const CarouselContext = React.createContext(null); function useCarousel() { - const context = React.useContext(CarouselContext) + const context = React.useContext(CarouselContext); if (!context) { - throw new Error("useCarousel must be used within a ") + throw new Error("useCarousel must be used within a "); } - return context + return context; } -const Carousel = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & CarouselProps ->( - ( - { - orientation = "horizontal", - opts, - setApi, - plugins, - className, - children, - ...props - }, - ref - ) => { +const Carousel = React.forwardRef & CarouselProps>( + ({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }, ref) => { const [carouselRef, api] = useEmblaCarousel( { ...opts, axis: orientation === "horizontal" ? "x" : "y", }, plugins - ) - const [canScrollPrev, setCanScrollPrev] = React.useState(false) - const [canScrollNext, setCanScrollNext] = React.useState(false) + ); + const [canScrollPrev, setCanScrollPrev] = React.useState(false); + const [canScrollNext, setCanScrollNext] = React.useState(false); const onSelect = React.useCallback((api: CarouselApi) => { if (!api) { - return + return; } - setCanScrollPrev(api.canScrollPrev()) - setCanScrollNext(api.canScrollNext()) - }, []) + setCanScrollPrev(api.canScrollPrev()); + setCanScrollNext(api.canScrollNext()); + }, []); const scrollPrev = React.useCallback(() => { - api?.scrollPrev() - }, [api]) + api?.scrollPrev(); + }, [api]); const scrollNext = React.useCallback(() => { - api?.scrollNext() - }, [api]) + api?.scrollNext(); + }, [api]); const handleKeyDown = React.useCallback( (event: React.KeyboardEvent) => { if (event.key === "ArrowLeft") { - event.preventDefault() - scrollPrev() + event.preventDefault(); + scrollPrev(); } else if (event.key === "ArrowRight") { - event.preventDefault() - scrollNext() + event.preventDefault(); + scrollNext(); } }, [scrollPrev, scrollNext] - ) + ); React.useEffect(() => { if (!api || !setApi) { - return + return; } - setApi(api) - }, [api, setApi]) + setApi(api); + }, [api, setApi]); React.useEffect(() => { if (!api) { - return + return; } - onSelect(api) - api.on("reInit", onSelect) - api.on("select", onSelect) + onSelect(api); + api.on("reInit", onSelect); + api.on("select", onSelect); return () => { - api?.off("select", onSelect) - } - }, [api, onSelect]) + api?.off("select", onSelect); + }; + }, [api, onSelect]); return ( + }}>
    + {...props}> {children}
    - ) + ); } -) -Carousel.displayName = "Carousel" +); +Carousel.displayName = "Carousel"; -const CarouselContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { carouselRef, orientation } = useCarousel() +const CarouselContent = React.forwardRef>( + ({ className, ...props }, ref) => { + const { carouselRef, orientation } = useCarousel(); - return ( -
    + return ( +
    +
    +
    + ); + } +); +CarouselContent.displayName = "CarouselContent"; + +const CarouselItem = React.forwardRef>( + ({ className, ...props }, ref) => { + const { orientation } = useCarousel(); + + return (
    -
    - ) -}) -CarouselContent.displayName = "CarouselContent" + ); + } +); +CarouselItem.displayName = "CarouselItem"; -const CarouselItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { orientation } = useCarousel() +const CarouselPrevious = React.forwardRef>( + ({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollPrev, canScrollPrev } = useCarousel(); - return ( -
    - ) -}) -CarouselItem.displayName = "CarouselItem" + return ( + + ); + } +); +CarouselPrevious.displayName = "CarouselPrevious"; -const CarouselPrevious = React.forwardRef< - HTMLButtonElement, - React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollPrev, canScrollPrev } = useCarousel() +const CarouselNext = React.forwardRef>( + ({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollNext, canScrollNext } = useCarousel(); - return ( - - ) -}) -CarouselPrevious.displayName = "CarouselPrevious" + return ( + + ); + } +); +CarouselNext.displayName = "CarouselNext"; -const CarouselNext = React.forwardRef< - HTMLButtonElement, - React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollNext, canScrollNext } = useCarousel() - - return ( - - ) -}) -CarouselNext.displayName = "CarouselNext" - -export { - type CarouselApi, - Carousel, - CarouselContent, - CarouselItem, - CarouselPrevious, - CarouselNext, -} +export { type CarouselApi, Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext }; diff --git a/src/lib/data/projectQuery.ts b/src/lib/data/projectQuery.ts index ce652b9..75e3f01 100644 --- a/src/lib/data/projectQuery.ts +++ b/src/lib/data/projectQuery.ts @@ -44,54 +44,29 @@ async function getTopProjects(client: SupabaseClient, numberOfRecords: number = } } -async function searchProjects(client: SupabaseClient, searchTerm: string | null, page: number = 1, pageSize: number = 4) { - const start = (page - 1) * pageSize; - const end = start + pageSize - 1; - - try { - let query = client.from("Project").select( - ` - id, - projectName, - businessId, - publishedTime, - projectShortDescription, - cardImage, - ProjectInvestmentDetail ( - minInvestment, - totalInvestment, - targetInvestment, - investmentDeadline - ), - ItemTag ( - Tag ( - id, - value - ) - ), - Business ( - location +async function getProjectData(client: SupabaseClient, projectId: number) { + const query = client.from("Project").select( + ` + project_name:projectName, + project_short_description:projectShortDescription, + project_description:projectDescription, + published_time:publishedTime, + ...ProjectInvestmentDetail!inner ( + min_investment:minInvestment, + total_investment:totalInvestment, + target_investment:targetInvestment, + investment_deadline:investmentDeadline + ), + tags:ItemTag!inner ( + ...Tag!inner ( + tag_name:value ) - ` - ).order("publishedTime", { ascending: false }) - .range(start, end); + ) + ` + ).eq("id", projectId).single() - if (searchTerm) { - query = query.ilike('projectName', `%${searchTerm}%`); - } - - const { data, error } = await query; - - if (error) { - console.error("Error searching projects:", error.message); - return { data: null, error: error.message }; - } - - return { data, error: null }; - } catch (err) { - console.error("Unexpected error:", err); - return { data: null, error: "An unexpected error occurred." }; - } + const {data, error} = await query; + return { data, error } } export interface FilterParams { @@ -178,5 +153,5 @@ function searchProjectsQuery(client: SupabaseClient, {searchTerm, tagsFilter, pr } -export { getTopProjects, searchProjects, searchProjectsQuery }; +export { getTopProjects, getProjectData, searchProjectsQuery }; From e78e62dbe554cb11ffaa9a82e2e904a4880c3e4f Mon Sep 17 00:00:00 2001 From: sirin Date: Wed, 9 Oct 2024 05:42:32 +0700 Subject: [PATCH 12/13] refactor: group some routes --- src/app/{ => (investment)}/deals/[id]/followShareButton.tsx | 0 src/app/{ => (investment)}/deals/[id]/page.tsx | 0 src/app/{ => (investment)}/deals/page.tsx | 0 src/app/{ => (investment)}/invest/page.tsx | 0 src/app/{ => (user)}/notification/page.tsx | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename src/app/{ => (investment)}/deals/[id]/followShareButton.tsx (100%) rename src/app/{ => (investment)}/deals/[id]/page.tsx (100%) rename src/app/{ => (investment)}/deals/page.tsx (100%) rename src/app/{ => (investment)}/invest/page.tsx (100%) rename src/app/{ => (user)}/notification/page.tsx (100%) diff --git a/src/app/deals/[id]/followShareButton.tsx b/src/app/(investment)/deals/[id]/followShareButton.tsx similarity index 100% rename from src/app/deals/[id]/followShareButton.tsx rename to src/app/(investment)/deals/[id]/followShareButton.tsx diff --git a/src/app/deals/[id]/page.tsx b/src/app/(investment)/deals/[id]/page.tsx similarity index 100% rename from src/app/deals/[id]/page.tsx rename to src/app/(investment)/deals/[id]/page.tsx diff --git a/src/app/deals/page.tsx b/src/app/(investment)/deals/page.tsx similarity index 100% rename from src/app/deals/page.tsx rename to src/app/(investment)/deals/page.tsx diff --git a/src/app/invest/page.tsx b/src/app/(investment)/invest/page.tsx similarity index 100% rename from src/app/invest/page.tsx rename to src/app/(investment)/invest/page.tsx diff --git a/src/app/notification/page.tsx b/src/app/(user)/notification/page.tsx similarity index 100% rename from src/app/notification/page.tsx rename to src/app/(user)/notification/page.tsx From 5bdeef67e0a40035980f770d63549b33f7b6da7a Mon Sep 17 00:00:00 2001 From: sirin Date: Wed, 9 Oct 2024 07:47:12 +0700 Subject: [PATCH 13/13] refactor: link to real deals data --- src/app/(investment)/deals/[id]/page.tsx | 2 +- src/app/(investment)/deals/page.tsx | 27 +++++++++++++----------- src/app/page.tsx | 2 +- src/lib/data/projectQuery.ts | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/app/(investment)/deals/[id]/page.tsx b/src/app/(investment)/deals/[id]/page.tsx index 92b21aa..37fd7f4 100644 --- a/src/app/(investment)/deals/[id]/page.tsx +++ b/src/app/(investment)/deals/[id]/page.tsx @@ -102,7 +102,7 @@ export default async function ProjectDealPage({ params }: { params: { id: number

    Left to invest

    diff --git a/src/app/(investment)/deals/page.tsx b/src/app/(investment)/deals/page.tsx index f83da6e..799cad4 100644 --- a/src/app/(investment)/deals/page.tsx +++ b/src/app/(investment)/deals/page.tsx @@ -11,6 +11,7 @@ import { useQuery } from "@supabase-cache-helpers/postgrest-react-query"; import { searchProjectsQuery, FilterParams, FilterProjectQueryParams } from "@/lib/data/projectQuery"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; +import Link from "next/link"; const ProjectSection = ({ filteredProjects }) => { interface Tags { @@ -31,18 +32,20 @@ const ProjectSection = ({ filteredProjects }) => { {/* Block for all the deals */}
    {filteredProjects.map((item, index) => ( - tag.tag_name)} - /> + + tag.tag_name)} + /> + ))}
    diff --git a/src/app/page.tsx b/src/app/page.tsx index 9d234b5..eebac2c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -23,7 +23,7 @@ const TopProjects = async () => { return (
    {topProjectsData.map((project) => ( - +