From 4e718053a3720c877b5cf3d1ee2aec9844857efa Mon Sep 17 00:00:00 2001 From: Connor Campbell Date: Fri, 29 Dec 2023 17:04:30 +0100 Subject: [PATCH 1/3] feat: add infinite scroll + small type refactor --- actions/notion.ts | 58 ++- app/test/page.tsx | 16 +- components/loadMore.tsx | 85 ++++ package-lock.json | 1029 +++++++++++++++++++++++++++++++++++---- package.json | 4 +- types.ts | 14 +- utils/helpers.ts | 6 +- 7 files changed, 1098 insertions(+), 114 deletions(-) create mode 100644 components/loadMore.tsx diff --git a/actions/notion.ts b/actions/notion.ts index 436999e..405e607 100644 --- a/actions/notion.ts +++ b/actions/notion.ts @@ -20,7 +20,7 @@ const notion = new Client({ }); export async function baseQueryDatabase( - queryParams: QueryDatabaseParameters + queryParams: QueryDatabaseParameters, ): Promise { try { const response = await notion.databases.query(queryParams); @@ -33,33 +33,37 @@ export async function baseQueryDatabase( } export async function queryDatabase( - queryOverrides: Partial = {} + queryOverrides: Partial = {}, ): Promise { const defaultQuery: KudosQueryParameters = { database_id: databaseId, filter_properties: defaultFilterProperties, sorts: defaultSort, page_size: 100, + start_cursor: undefined, + filter: undefined, }; const query = { ...defaultQuery, ...queryOverrides, - }; + } as QueryDatabaseParameters; return await baseQueryDatabase(query); } export async function getGoodFirstIssues({ + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, -}): Promise { + start_cursor, +}: KudosQueryParameters = {}): Promise { return await queryDatabase({ filter: { or: [ { property: "Issue Labels", multi_select: { - contains: "good-first-issue", + contains: "C-good-first-issue", }, }, { @@ -68,19 +72,29 @@ export async function getGoodFirstIssues({ contains: "good first issue", }, }, + { + property: "Issue Labels", + multi_select: { + contains: "good first issue :baby:", + }, + }, ], }, page_size, filter_properties, sorts, + start_cursor, + database_id, }); } export async function getBugIssues({ + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, -}): Promise { + start_cursor, +}: KudosQueryParameters = {}): Promise { return await queryDatabase({ filter: { property: "Issue Labels", @@ -91,13 +105,17 @@ export async function getBugIssues({ page_size, filter_properties, sorts, + start_cursor, + database_id, }); } export async function getUnassignedIssues({ + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, -}): Promise { + start_cursor, +}: KudosQueryParameters = {}): Promise { return await queryDatabase({ filter: { property: "Assignee", @@ -108,14 +126,18 @@ export async function getUnassignedIssues({ page_size, filter_properties, sorts, + start_cursor, + database_id, }); } export async function getIssuesOpenedWithin3Months({ + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, -}): Promise { + start_cursor, +}: KudosQueryParameters = {}): Promise { return await queryDatabase({ filter: { property: "Opened Date", @@ -126,14 +148,18 @@ export async function getIssuesOpenedWithin3Months({ page_size, filter_properties, sorts, + start_cursor, + database_id, }); } export async function getIssuesOpenedWithin1Month({ + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, -}): Promise { + start_cursor, +}: KudosQueryParameters = {}): Promise { return await queryDatabase({ filter: { property: "Opened Date", @@ -144,6 +170,8 @@ export async function getIssuesOpenedWithin1Month({ page_size, filter_properties, sorts, + start_cursor, + database_id, }); } @@ -152,12 +180,15 @@ export async function getIssuesOpenedWithin1Month({ export async function getIssuesByProject( projectName: string, { + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, - } + start_cursor, + }: KudosQueryParameters = {}, ): Promise { return await queryDatabase({ + database_id, filter: { property: "Project Name", rollup: { @@ -171,16 +202,19 @@ export async function getIssuesByProject( page_size, filter_properties, sorts, + start_cursor, }); } export async function getIssuesByRepo( repoLink: ValidRepositoryLink, { + database_id = databaseId, page_size = 100, filter_properties = defaultFilterProperties, sorts = defaultSort, - } + start_cursor, + }: KudosQueryParameters = {}, ): Promise { return await queryDatabase({ filter: { @@ -192,6 +226,8 @@ export async function getIssuesByRepo( page_size, filter_properties, sorts, + start_cursor, + database_id, }); } diff --git a/app/test/page.tsx b/app/test/page.tsx index d92abc0..200d64e 100644 --- a/app/test/page.tsx +++ b/app/test/page.tsx @@ -5,19 +5,16 @@ import { PageObjectResponse, } from "@notionhq/client/build/src/api-endpoints"; import { ValidNotionResponse, Properties } from "@/types"; -import { - daysSince, - isValidNotionResponse, - getImagePath, -} from "@/utils/helpers"; +import { daysSince, isValidNotionPage, getImagePath } from "@/utils/helpers"; import projectLogosJson from "@/public/images/imageMap.json"; +import { LoadMore } from "@/components/loadMore"; export default async function Page() { const data = await getGoodFirstIssues({ page_size: 10 }); return (
{data.results.map((row, index) => { - if (isValidNotionResponse(row)) { + if (isValidNotionPage(row)) { return ( label.name + (label) => label.name, )} image={getImagePath( row.properties["Issue Link"].url.split("/issues")[0], - projectLogosJson + projectLogosJson, )} /> ); } })} + {data.has_more && data.next_cursor && ( + + )}
); } diff --git a/components/loadMore.tsx b/components/loadMore.tsx new file mode 100644 index 0000000..b2224fd --- /dev/null +++ b/components/loadMore.tsx @@ -0,0 +1,85 @@ +"use client"; + +import { isValidNotionPage, daysSince, getImagePath } from "@/utils/helpers"; +import { Spinner } from "@nextui-org/spinner"; +import { useEffect, useState } from "react"; +import { QueryDatabaseResponse } from "@notionhq/client/build/src/api-endpoints"; +import projectLogosJson from "@/public/images/imageMap.json"; + +// import { useInView } from "framer-motion"; +import { useInView } from "react-intersection-observer"; +import Row from "./row"; +import { getGoodFirstIssues } from "@/actions/notion"; +import { findDOMNode } from "react-dom"; +import { f } from "@nextui-org/slider/dist/use-slider-64459b54"; + +export function LoadMore({ cursor }: { cursor: string }) { + const { ref, inView } = useInView(); + const [data, setData] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [nextCursor, setNextCursor] = useState(cursor); + + useEffect(() => { + const fetchData = async () => { + if (inView && nextCursor && !isLoading) { + setIsLoading(true); + try { + const res = await getGoodFirstIssues({ + page_size: 10, + start_cursor: nextCursor, + }); + setData((prevData) => [...prevData, res]); + setNextCursor(res.next_cursor || undefined); + } catch (error) { + console.log("There was an error fetching the data", error); + } finally { + setIsLoading(false); + } + } + }; + + fetchData(); + }, [inView, data, isLoading]); + return ( + <> + {data && + data.map((query) => { + return query.results.map((row, index) => { + if (isValidNotionPage(row)) { + return ( + label.name, + )} + image={getImagePath( + row.properties["Issue Link"].url.split("/issues")[0], + projectLogosJson, + )} + /> + ); + } + }); + })} + {nextCursor && ( +
+
+ +
+
+ )} + + ); +} diff --git a/package-lock.json b/package-lock.json index 7dd4c10..bdaa2a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,31 @@ { - "name": "next-app-template", + "name": "kudos-portal", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "next-app-template", + "name": "kudos-portal", "version": "0.0.1", "dependencies": { + "@nextui-org/autocomplete": "^2.0.9", "@nextui-org/button": "2.0.26", "@nextui-org/card": "^2.0.24", "@nextui-org/chip": "^2.0.25", "@nextui-org/code": "2.0.24", + "@nextui-org/dropdown": "^2.1.16", "@nextui-org/image": "^2.0.24", "@nextui-org/input": "2.1.16", "@nextui-org/kbd": "2.0.25", "@nextui-org/link": "2.0.26", "@nextui-org/navbar": "2.0.27", + "@nextui-org/select": "^2.1.20", + "@nextui-org/slider": "^2.2.5", "@nextui-org/snippet": "2.0.30", + "@nextui-org/spinner": "^2.0.24", "@nextui-org/switch": "2.0.25", "@nextui-org/system": "2.0.15", + "@nextui-org/table": "^2.0.28", "@nextui-org/theme": "2.1.17", "@notionhq/client": "^2.2.14", "@react-aria/ssr": "^3.9.1", @@ -39,9 +45,14 @@ "postcss": "8.4.32", "react": "18.2.0", "react-dom": "18.2.0", + "react-intersection-observer": "^9.5.3", "tailwind-variants": "^0.1.19", "tailwindcss": "3.4.0", "typescript": "5.3.3" + }, + "devDependencies": { + "eslint-config-prettier": "^9.1.0", + "prettier": "^3.1.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -216,9 +227,9 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, "node_modules/@internationalized/date": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.0.tgz", - "integrity": "sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz", + "integrity": "sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ==", "dependencies": { "@swc/helpers": "^0.5.0" } @@ -233,17 +244,17 @@ } }, "node_modules/@internationalized/number": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.4.0.tgz", - "integrity": "sha512-8TvotW3qVDHC4uv/BVoN6Qx0Dm8clHY1/vpH+dh+XRiPW/9NVpKn1P8d1A+WLphWrMwyqyWXI7uWehJPviaeIw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.0.tgz", + "integrity": "sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w==", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.1.1.tgz", - "integrity": "sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.0.tgz", + "integrity": "sha512-Xx3Sy3f2c9ctT+vh8c7euEaEHQZltp0euZ3Hy4UfT3E13r6lxpUS3kgKyumEjboJZSnaZv7JhqWz3D75v+IxQg==", "dependencies": { "@swc/helpers": "^0.5.0" } @@ -457,6 +468,40 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/autocomplete": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@nextui-org/autocomplete/-/autocomplete-2.0.9.tgz", + "integrity": "sha512-ViPXrZnP35k7LF+TBA4w8nqu0OEj9p1z9Rt7rwrACmY2VmDGY6h6a6nDCMjhuTVXptftRvzxfIPsIyzBYqxb0g==", + "dependencies": { + "@nextui-org/aria-utils": "2.0.15", + "@nextui-org/button": "2.0.26", + "@nextui-org/input": "2.1.16", + "@nextui-org/listbox": "2.1.16", + "@nextui-org/popover": "2.1.14", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/scroll-shadow": "2.1.12", + "@nextui-org/shared-icons": "2.0.6", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/spinner": "2.0.24", + "@nextui-org/use-aria-button": "2.0.6", + "@react-aria/combobox": "^3.7.1", + "@react-aria/focus": "^3.14.3", + "@react-aria/i18n": "^3.8.4", + "@react-aria/interactions": "^3.19.1", + "@react-aria/utils": "^3.21.1", + "@react-aria/visually-hidden": "^3.8.6", + "@react-stately/combobox": "^3.7.1", + "@react-types/combobox": "^3.8.1", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/button": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/@nextui-org/button/-/button-2.0.26.tgz", @@ -505,6 +550,31 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/checkbox": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@nextui-org/checkbox/-/checkbox-2.0.25.tgz", + "integrity": "sha512-X6WkwPbZlDvioEcXF6HhKH21wD6OK+3+FSroKkzMPQLJrj2KYUIYGbiuw9rT9aCtdjbT+6HUCv+FA8/cBQr7cA==", + "dependencies": { + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/use-aria-press": "2.0.1", + "@react-aria/checkbox": "^3.11.2", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/utils": "^3.21.1", + "@react-aria/visually-hidden": "^3.8.6", + "@react-stately/checkbox": "^3.5.1", + "@react-stately/toggle": "^3.6.3", + "@react-types/checkbox": "^3.5.2", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/chip": { "version": "2.0.25", "resolved": "https://registry.npmjs.org/@nextui-org/chip/-/chip-2.0.25.tgz", @@ -541,6 +611,45 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/divider": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@nextui-org/divider/-/divider-2.0.25.tgz", + "integrity": "sha512-yEvHqYlhNBwmF68pfjJKdzC8gVQtL+txxD5COBGF9uFyfxA5hVw2D6GmYgOH514bxrFBuWOLcQX6gyljgcN3bA==", + "dependencies": { + "@nextui-org/react-rsc-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/system-rsc": "2.0.11", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@nextui-org/dropdown": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@nextui-org/dropdown/-/dropdown-2.1.16.tgz", + "integrity": "sha512-3KINNvC7Cz+deQltCM8gaB7iJCfU4Qsp1fwnoy1wUEjeZhEtPOPR59oTyqT+gPaPIisP1+LLOfcqRl4jNQoVXw==", + "dependencies": { + "@nextui-org/menu": "2.0.17", + "@nextui-org/popover": "2.1.14", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@react-aria/focus": "^3.14.3", + "@react-aria/menu": "^3.11.1", + "@react-aria/utils": "^3.21.1", + "@react-stately/menu": "^3.5.6", + "@react-types/menu": "^3.9.5" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/framer-transitions": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/@nextui-org/framer-transitions/-/framer-transitions-2.0.15.tgz", @@ -632,6 +741,59 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/listbox": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@nextui-org/listbox/-/listbox-2.1.16.tgz", + "integrity": "sha512-5PmUCoHFgAr+1nAU3IlqPFTgyHo7zsTcNeja4wcErD/KseCF2h7Uk5OqUX5hQDN9B9fZuGjPrkG4yoK/6pqcUQ==", + "dependencies": { + "@nextui-org/aria-utils": "2.0.15", + "@nextui-org/divider": "2.0.25", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/use-aria-press": "2.0.1", + "@nextui-org/use-is-mobile": "2.0.6", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/listbox": "^3.11.1", + "@react-aria/utils": "^3.21.1", + "@react-stately/list": "^3.10.0", + "@react-types/menu": "^3.9.5", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@nextui-org/menu": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@nextui-org/menu/-/menu-2.0.17.tgz", + "integrity": "sha512-qr/BPDbBvg5tpAZZLkLx8eNnvYwJYM3Q72fmRYbzwmG3upNtdjln0QYxSwPXUz7RYqTKEFWc9JPxq2pgPM15Wg==", + "dependencies": { + "@nextui-org/aria-utils": "2.0.15", + "@nextui-org/divider": "2.0.25", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/use-aria-press": "2.0.1", + "@nextui-org/use-is-mobile": "2.0.6", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/menu": "^3.11.1", + "@react-aria/utils": "^3.21.1", + "@react-stately/menu": "^3.5.6", + "@react-stately/tree": "^3.7.3", + "@react-types/menu": "^3.9.5", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/navbar": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/@nextui-org/navbar/-/navbar-2.0.27.tgz", @@ -658,6 +820,35 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/popover": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@nextui-org/popover/-/popover-2.1.14.tgz", + "integrity": "sha512-fqqktFQ/chIBS9Y3MghL6KX6qAy3hodtXUDchnxLa1GL+oi6TCBLUjo+wgI5EMJrTTbqo/eFLui/Ks00JfCj+A==", + "dependencies": { + "@nextui-org/aria-utils": "2.0.15", + "@nextui-org/button": "2.0.26", + "@nextui-org/framer-transitions": "2.0.15", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/use-aria-button": "2.0.6", + "@react-aria/dialog": "^3.5.7", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/overlays": "^3.18.1", + "@react-aria/utils": "^3.21.1", + "@react-stately/overlays": "^3.6.3", + "@react-types/button": "^3.9.0", + "@react-types/overlays": "^3.8.3", + "react-remove-scroll": "^2.5.6" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/react-rsc-utils": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@nextui-org/react-rsc-utils/-/react-rsc-utils-2.0.10.tgz", @@ -691,6 +882,51 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/scroll-shadow": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@nextui-org/scroll-shadow/-/scroll-shadow-2.1.12.tgz", + "integrity": "sha512-uxT8D+WCWeBy4xaFDfqVpBgjjHZUwydXsX5HhbzZCBir/1eRG5GMnUES3w98DSwcUVadG64gAVsyGW4HmSZw1Q==", + "dependencies": { + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/use-data-scroll-overflow": "2.1.2" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@nextui-org/select": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@nextui-org/select/-/select-2.1.20.tgz", + "integrity": "sha512-GCO9uzyYnFIdJTqIe6aDe2NnYlclcdYfZnECFAze/R2MW0jpoysk5ysGBDjVDmZis6tLu+BOFXJbIlYEi+LoUQ==", + "dependencies": { + "@nextui-org/aria-utils": "2.0.15", + "@nextui-org/listbox": "2.1.16", + "@nextui-org/popover": "2.1.14", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/scroll-shadow": "2.1.12", + "@nextui-org/shared-icons": "2.0.6", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/spinner": "2.0.24", + "@nextui-org/use-aria-button": "2.0.6", + "@nextui-org/use-aria-multiselect": "2.1.3", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/utils": "^3.21.1", + "@react-aria/visually-hidden": "^3.8.6", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/shared-icons": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@nextui-org/shared-icons/-/shared-icons-2.0.6.tgz", @@ -707,6 +943,30 @@ "react": ">=18" } }, + "node_modules/@nextui-org/slider": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@nextui-org/slider/-/slider-2.2.5.tgz", + "integrity": "sha512-dC6HHMmtn2WvxDmbY/Dq51XJjQ7cAnjZsuYVIvhwIiCLDG8QnEIhmYN0DQp/6oeZsCHnyMHC4DmtgOiJL0eXrQ==", + "dependencies": { + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/tooltip": "2.0.29", + "@nextui-org/use-aria-press": "2.0.1", + "@react-aria/focus": "^3.14.3", + "@react-aria/i18n": "^3.8.4", + "@react-aria/interactions": "^3.19.1", + "@react-aria/slider": "^3.7.2", + "@react-aria/utils": "^3.21.1", + "@react-aria/visually-hidden": "^3.8.6", + "@react-stately/slider": "^3.4.4" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/snippet": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/@nextui-org/snippet/-/snippet-2.0.30.tgz", @@ -729,6 +989,21 @@ "react-dom": ">=18" } }, + "node_modules/@nextui-org/spacer": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@nextui-org/spacer/-/spacer-2.0.24.tgz", + "integrity": "sha512-bLnhPRnoyHQXhLneHjbRqZNxJWMFOBYOZkuX83uy59/FFUY07BcoNsb2s80tN3GoVxsaZ2jB6NxxVbaCJwoPog==", + "dependencies": { + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/system-rsc": "2.0.11" + }, + "peerDependencies": { + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/spinner": { "version": "2.0.24", "resolved": "https://registry.npmjs.org/@nextui-org/spinner/-/spinner-2.0.24.tgz", @@ -804,6 +1079,33 @@ "node": ">=6" } }, + "node_modules/@nextui-org/table": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/@nextui-org/table/-/table-2.0.28.tgz", + "integrity": "sha512-qH/7jdV5+tiMDDvBfMrUZN4jamds0FsL5Ak+ighoKIUYRFTSXOroi+63ZzzAh/mZAsUALCPPcfbXt4r4aBFDzg==", + "dependencies": { + "@nextui-org/checkbox": "2.0.25", + "@nextui-org/react-utils": "2.0.10", + "@nextui-org/shared-icons": "2.0.6", + "@nextui-org/shared-utils": "2.0.4", + "@nextui-org/spacer": "2.0.24", + "@react-aria/focus": "^3.14.3", + "@react-aria/interactions": "^3.19.1", + "@react-aria/table": "^3.13.1", + "@react-aria/utils": "^3.21.1", + "@react-aria/visually-hidden": "^3.8.6", + "@react-stately/table": "^3.11.2", + "@react-stately/virtualizer": "^3.6.4", + "@react-types/grid": "^3.2.2", + "@react-types/table": "^3.9.0" + }, + "peerDependencies": { + "@nextui-org/system": ">=2.0.0", + "@nextui-org/theme": ">=2.1.0", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/theme": { "version": "2.1.17", "resolved": "https://registry.npmjs.org/@nextui-org/theme/-/theme-2.1.17.tgz", @@ -881,6 +1183,30 @@ "react": ">=18" } }, + "node_modules/@nextui-org/use-aria-multiselect": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nextui-org/use-aria-multiselect/-/use-aria-multiselect-2.1.3.tgz", + "integrity": "sha512-OM1lj2jdl0Q2Zme/ds6qyT4IIGsBJSGNjvkM6pEnpdyoej/HwTKsSEpEFTDGJ5t9J9DWWCEt3hz0uJxOPnZ66Q==", + "dependencies": { + "@react-aria/i18n": "^3.8.4", + "@react-aria/interactions": "^3.19.1", + "@react-aria/label": "^3.7.2", + "@react-aria/listbox": "^3.11.1", + "@react-aria/menu": "^3.11.1", + "@react-aria/selection": "^3.17.1", + "@react-aria/utils": "^3.21.1", + "@react-stately/list": "^3.10.0", + "@react-stately/menu": "^3.5.6", + "@react-types/button": "^3.9.0", + "@react-types/overlays": "^3.8.3", + "@react-types/select": "^3.8.4", + "@react-types/shared": "^3.21.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@nextui-org/use-aria-press": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@nextui-org/use-aria-press/-/use-aria-press-2.0.1.tgz", @@ -918,6 +1244,17 @@ "react": ">=18" } }, + "node_modules/@nextui-org/use-data-scroll-overflow": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nextui-org/use-data-scroll-overflow/-/use-data-scroll-overflow-2.1.2.tgz", + "integrity": "sha512-3h9QX+dWkfqnqciQc2KeeR67e77hobjefNHGBTDuB4LhJSJ180ToZH09SQNHaUmKRLTU/RABjGWXxdbORI0r6g==", + "dependencies": { + "@nextui-org/shared-utils": "2.0.4" + }, + "peerDependencies": { + "react": ">=18" + } + }, "node_modules/@nextui-org/use-image": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nextui-org/use-image/-/use-image-2.0.4.tgz", @@ -929,6 +1266,17 @@ "react": ">=18" } }, + "node_modules/@nextui-org/use-is-mobile": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nextui-org/use-is-mobile/-/use-is-mobile-2.0.6.tgz", + "integrity": "sha512-HeglWUoq6Ln8P5n6s1SZvBRatLYMKsiXQM7Mk2l+6jFByzZh3VWtZ05xmuX8te/1rGmeUxjeXtW6x+F7/f/JoA==", + "dependencies": { + "@react-aria/ssr": "^3.8.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, "node_modules/@nextui-org/use-safe-layout-effect": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@nextui-org/use-safe-layout-effect/-/use-safe-layout-effect-2.0.4.tgz", @@ -1006,36 +1354,91 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-aria/focus": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.15.0.tgz", - "integrity": "sha512-nnxRyfqHuAjRwdQ4BpQyZPtGFKZmRU6cnaIb3pqWFCqEyJQensV7MA3TJ4Jhadq67cy1Ji5SYSlr1duBwjoYvw==", + "node_modules/@react-aria/checkbox": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.13.0.tgz", + "integrity": "sha512-eylJwtADIPKJ1Y5rITNJm/8JD8sXG2nhiZBIg1ko44Szxrpu+Le53NoGtg8nlrfh9vbUrXVvuFtf2jxbPXR5Jw==", "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", + "@react-aria/form": "^3.0.1", + "@react-aria/label": "^3.7.4", + "@react-aria/toggle": "^3.10.0", + "@react-aria/utils": "^3.23.0", + "@react-stately/checkbox": "^3.6.1", + "@react-stately/form": "^3.0.0", + "@react-stately/toggle": "^3.7.0", + "@react-types/checkbox": "^3.6.0", "@react-types/shared": "^3.22.0", - "@swc/helpers": "^0.5.0", - "clsx": "^1.1.1" + "@swc/helpers": "^0.5.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-aria/focus/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" + "node_modules/@react-aria/combobox": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.1.tgz", + "integrity": "sha512-0Zsy91WC2uhnIjtProL1E5qRjBtRVdsNgpr8T9QCQht4i2sHd8L/srrOx7b6vRIngUMZq7GofOpQcKVdxx4kEA==", + "dependencies": { + "@react-aria/i18n": "^3.10.0", + "@react-aria/listbox": "^3.11.3", + "@react-aria/live-announcer": "^3.3.1", + "@react-aria/menu": "^3.12.0", + "@react-aria/overlays": "^3.20.0", + "@react-aria/selection": "^3.17.3", + "@react-aria/textfield": "^3.14.0", + "@react-aria/utils": "^3.23.0", + "@react-stately/collections": "^3.10.4", + "@react-stately/combobox": "^3.8.1", + "@react-stately/form": "^3.0.0", + "@react-types/button": "^3.9.1", + "@react-types/combobox": "^3.10.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/dialog": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.9.tgz", + "integrity": "sha512-Eg5pFJN3b5NitKL60nf30iPpQGCyOcU4YakUVn5+GWKLBlm8ryE8jyoIIO0e0LCM65K+fL+gGHGK01GCZyKrpQ==", + "dependencies": { + "@react-aria/focus": "^3.16.0", + "@react-aria/overlays": "^3.20.0", + "@react-aria/utils": "^3.23.0", + "@react-types/dialog": "^3.5.7", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/focus": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.0.tgz", + "integrity": "sha512-GP6EYI07E8NKQQcXHjpIocEU0vh0oi0Vcsd+/71fKS0NnTR0TUOEeil0JuuQ9ymkmPDTu51Aaaa4FxVsuN/23A==", + "dependencies": { + "@react-aria/interactions": "^3.20.1", + "@react-aria/utils": "^3.23.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-aria/form": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.0.tgz", - "integrity": "sha512-APeGph9oTO8nro4ZObuy1hk+0hpF/ji9O3odPGhLkzP/HvW2J7NI9pjKJOINfgtYr2yvVUZf/MbTMxPwtAxhaQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.0.1.tgz", + "integrity": "sha512-6586oODMDR4/ciGRwXjpvEAg7tWGSDrXE//waK0n5e5sMuzlPOo1DHc5SpPTvz0XdJsu6VDt2rHdVWVIC9LEyw==", "dependencies": { - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/utils": "^3.23.0", "@react-stately/form": "^3.0.0", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" @@ -1044,17 +1447,42 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-aria/grid": { + "version": "3.8.6", + "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.6.tgz", + "integrity": "sha512-JlQDkdm5heG1FfRyy5KnB8b6s/hRqSI6Xt2xN2AccLX5kcbfFr2/d5KVxyf6ahfa4Gfd46alN6477ju5eTWJew==", + "dependencies": { + "@react-aria/focus": "^3.16.0", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/live-announcer": "^3.3.1", + "@react-aria/selection": "^3.17.3", + "@react-aria/utils": "^3.23.0", + "@react-stately/collections": "^3.10.4", + "@react-stately/grid": "^3.8.4", + "@react-stately/selection": "^3.14.2", + "@react-stately/virtualizer": "^3.6.6", + "@react-types/checkbox": "^3.6.0", + "@react-types/grid": "^3.2.3", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-aria/i18n": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.9.0.tgz", - "integrity": "sha512-ebGP/sVG0ZtNF4RNFzs/W01tl7waYpBManh1kKWgA4roDPFt/odkgkDBzKGl+ggBb7TQRHsfUFHuqKsrsMy9TA==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.0.tgz", + "integrity": "sha512-sviD5Y1pLPG49HHRmVjR+5nONrp0HK219+nu9Y7cDfUhXu2EjyhMS9t/n9/VZ69hHChZ2PnHYLEE2visu9CuCg==", "dependencies": { - "@internationalized/date": "^3.5.0", + "@internationalized/date": "^3.5.1", "@internationalized/message": "^3.1.1", - "@internationalized/number": "^3.4.0", - "@internationalized/string": "^3.1.1", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", + "@internationalized/number": "^3.5.0", + "@internationalized/string": "^3.2.0", + "@react-aria/ssr": "^3.9.1", + "@react-aria/utils": "^3.23.0", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" }, @@ -1077,54 +1505,143 @@ } }, "node_modules/@react-aria/label": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.3.tgz", - "integrity": "sha512-v1zuqbpYyYaPjrBWpceGjMpwP4ne6fLoOXdoIZoKLux2jkAcyIF2kIJFiyYoPQYQJWGRNo7q1oSwamxmng4xJw==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.4.tgz", + "integrity": "sha512-3Y0yyrqpLzZdzHw+TOyzwuyx5wa2ujU5DGfKuL5GFnU9Ii4DtdwBGSYS7Yu7qadU+eQmG4OGhAgFVswbIgIwJw==", + "dependencies": { + "@react-aria/utils": "^3.23.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/link": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.2.tgz", + "integrity": "sha512-v9gXgQ3Gev0JOlg2MAXcubDMgX+0BlJ+hTyFYFMuN/4jVBlAe426WKbjg+6MMzxwukWg9C3Q08JzqdFTi4cBng==", "dependencies": { + "@react-aria/focus": "^3.15.0", + "@react-aria/interactions": "^3.20.0", "@react-aria/utils": "^3.22.0", + "@react-types/link": "^3.5.2", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/listbox": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.3.tgz", + "integrity": "sha512-PBrnldmyEYUUJvfDeljW8ITvZyBTfGpLNf0b5kfBPK3TDgRH4niEH2vYEcaZvSqb0FrpdvcunuTRXcOpfb+gCQ==", + "dependencies": { + "@react-aria/interactions": "^3.20.1", + "@react-aria/label": "^3.7.4", + "@react-aria/selection": "^3.17.3", + "@react-aria/utils": "^3.23.0", + "@react-stately/collections": "^3.10.4", + "@react-stately/list": "^3.10.2", + "@react-types/listbox": "^3.4.6", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/live-announcer": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz", + "integrity": "sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-aria/menu": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.12.0.tgz", + "integrity": "sha512-Nsujv3b61WR0gybDKnBjAeyxDVJOfPLMggRUf9SQDfPWnrPXEsAFxaPaVcAkzlfI4HiQs1IxNwsKFNpc3PPZTQ==", + "dependencies": { + "@react-aria/focus": "^3.16.0", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/overlays": "^3.20.0", + "@react-aria/selection": "^3.17.3", + "@react-aria/utils": "^3.23.0", + "@react-stately/collections": "^3.10.4", + "@react-stately/menu": "^3.6.0", + "@react-stately/tree": "^3.7.5", + "@react-types/button": "^3.9.1", + "@react-types/menu": "^3.9.6", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/overlays": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.20.0.tgz", + "integrity": "sha512-2m7MpRJL5UucbEuu08lMHsiFJoDowkJV4JAIFBZYK1NzVH0vF/A+w9HRNM7jRwx2DUxE+iIsZnl8yKV/7KY8OQ==", + "dependencies": { + "@react-aria/focus": "^3.16.0", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/ssr": "^3.9.1", + "@react-aria/utils": "^3.23.0", + "@react-aria/visually-hidden": "^3.8.8", + "@react-stately/overlays": "^3.6.4", + "@react-types/button": "^3.9.1", + "@react-types/overlays": "^3.8.4", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-aria/link": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.6.2.tgz", - "integrity": "sha512-v9gXgQ3Gev0JOlg2MAXcubDMgX+0BlJ+hTyFYFMuN/4jVBlAe426WKbjg+6MMzxwukWg9C3Q08JzqdFTi4cBng==", + "node_modules/@react-aria/selection": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.3.tgz", + "integrity": "sha512-xl2sgeGH61ngQeE05WOWWPVpGRTPMjQEFmsAWEprArFi4Z7ihSZgpGX22l1w7uSmtXM/eN/v0W8hUYUju5iXlQ==", "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", - "@react-types/link": "^3.5.2", + "@react-aria/focus": "^3.16.0", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/utils": "^3.23.0", + "@react-stately/selection": "^3.14.2", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, - "node_modules/@react-aria/overlays": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.19.0.tgz", - "integrity": "sha512-VN5GkB8+uZ2cfXljBtkqmrsAhBdGoj4un/agH0Qyihi2dazsMeafczSNnqzbpVgB4Zt2UHPJUkKwihgzXRxJJA==", + "node_modules/@react-aria/slider": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.4.tgz", + "integrity": "sha512-OFJWeGSL2duVDFs/kcjlWsY6bqCVKZgM0aFn2QN4wmID+vfBvBnqGHAgWv3BCePTAPS3+GBjMN002TrftorjwQ==", "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/i18n": "^3.9.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/ssr": "^3.9.0", - "@react-aria/utils": "^3.22.0", - "@react-aria/visually-hidden": "^3.8.7", - "@react-stately/overlays": "^3.6.4", - "@react-types/button": "^3.9.1", - "@react-types/overlays": "^3.8.4", + "@react-aria/focus": "^3.16.0", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/label": "^3.7.4", + "@react-aria/utils": "^3.23.0", + "@react-stately/slider": "^3.5.0", "@react-types/shared": "^3.22.0", + "@react-types/slider": "^3.7.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, "node_modules/@react-aria/ssr": { @@ -1155,15 +1672,42 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-aria/table": { + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.13.3.tgz", + "integrity": "sha512-AzmETpyxwNqISTzwHJPs85x9gujG40IIsSOBUdp49oKhB85RbPLvMwhadp4wCVAoHw3erOC/TJxHtVc7o2K1LA==", + "dependencies": { + "@react-aria/focus": "^3.16.0", + "@react-aria/grid": "^3.8.6", + "@react-aria/i18n": "^3.10.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/live-announcer": "^3.3.1", + "@react-aria/utils": "^3.23.0", + "@react-aria/visually-hidden": "^3.8.8", + "@react-stately/collections": "^3.10.4", + "@react-stately/flags": "^3.0.0", + "@react-stately/table": "^3.11.4", + "@react-stately/virtualizer": "^3.6.6", + "@react-types/checkbox": "^3.6.0", + "@react-types/grid": "^3.2.3", + "@react-types/shared": "^3.22.0", + "@react-types/table": "^3.9.2", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-aria/textfield": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.13.0.tgz", - "integrity": "sha512-sUlinDE+k/WhbskyqVOkuffuhiQpjgvp+iGRoralStVgb8Tcb+POxgAlw5jS4tNjdivCb3IjVJemUNJM7xsxxA==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.0.tgz", + "integrity": "sha512-LtHFcPK/N9m3KWSRM5KdmlIk7cUEk0OF+uBUrfKsGGc1bJKVToimdW7jQusChHmHhslHUR7WQ4KDjXyFjoLXOw==", "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/form": "^3.0.0", - "@react-aria/label": "^3.7.3", - "@react-aria/utils": "^3.22.0", + "@react-aria/focus": "^3.16.0", + "@react-aria/form": "^3.0.1", + "@react-aria/label": "^3.7.4", + "@react-aria/utils": "^3.23.0", "@react-stately/form": "^3.0.0", "@react-stately/utils": "^3.9.0", "@react-types/shared": "^3.22.0", @@ -1175,13 +1719,13 @@ } }, "node_modules/@react-aria/toggle": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.9.0.tgz", - "integrity": "sha512-2YMWYQUEmcoAXtrAE86QXBS9XlmJyV6IFRlMTBNaeLTdH3AmACExgsyU66Tt0sKl6LMDMI376ItMFqAz27BBdQ==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.0.tgz", + "integrity": "sha512-6cUf4V9TuG2J7AvXUdU/GspEPFCubUOID3mrselSe563RViy+mMZk0vUEOdyoNanDcEXl58W4dE3SGWxFn71vg==", "dependencies": { - "@react-aria/focus": "^3.15.0", - "@react-aria/interactions": "^3.20.0", - "@react-aria/utils": "^3.22.0", + "@react-aria/focus": "^3.16.0", + "@react-aria/interactions": "^3.20.1", + "@react-aria/utils": "^3.23.0", "@react-stately/toggle": "^3.7.0", "@react-types/checkbox": "^3.6.0", "@swc/helpers": "^0.5.0" @@ -1236,11 +1780,45 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/checkbox": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.1.tgz", + "integrity": "sha512-rOjFeVBy32edYwhKiHj3ZLdLeO+xZ2fnBwxnOBjcygnw4Neygm8FJH/dB1J0hdYYR349yby86ED2x0wRc84zPw==", + "dependencies": { + "@react-stately/form": "^3.0.0", + "@react-stately/utils": "^3.9.0", + "@react-types/checkbox": "^3.6.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-stately/collections": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.3.tgz", - "integrity": "sha512-fA28HIApAIz9sNGeOVXZJPgV5Kig6M72KI1t9sUbnRUr9Xq9OMJTR6ElDMXNe0iTeZffRFDOPYyqnX9zkxof6Q==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.4.tgz", + "integrity": "sha512-OHhCrItGt4zB2bSrgObRo0H2SC7QlkH8ReGxo+NVIWchXRLRoiWBP7S+IwleewEo5gOqDVPY3hqA9n4iiI8twg==", + "dependencies": { + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/combobox": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.1.tgz", + "integrity": "sha512-FaWkqTXQdWg7ptaeU4iPcqF/kxbRg2ZNUcvW/hiL/enciV5tRCsddvfNqvDvy1L30z9AUwlp9MWqzm/DhBITCw==", "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/form": "^3.0.0", + "@react-stately/list": "^3.10.2", + "@react-stately/overlays": "^3.6.4", + "@react-stately/select": "^3.6.1", + "@react-stately/utils": "^3.9.0", + "@react-types/combobox": "^3.10.0", "@react-types/shared": "^3.22.0", "@swc/helpers": "^0.5.0" }, @@ -1248,6 +1826,23 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/flags": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.0.tgz", + "integrity": "sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w==", + "dependencies": { + "@swc/helpers": "^0.4.14" + } + }, + "node_modules/@react-stately/flags/node_modules/@swc/helpers": { + "version": "0.4.36", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz", + "integrity": "sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==", + "dependencies": { + "legacy-swc-helpers": "npm:@swc/helpers@=0.4.14", + "tslib": "^2.4.0" + } + }, "node_modules/@react-stately/form": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-stately/form/-/form-3.0.0.tgz", @@ -1260,6 +1855,50 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/grid": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.4.tgz", + "integrity": "sha512-rwqV1K4lVhaiaqJkt4TfYqdJoVIyqvSm98rKAYfCNzrKcivVpoiCMJ2EMt6WlYCjDVBdEOQ7fMV1I60IV0pntA==", + "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/selection": "^3.14.2", + "@react-types/grid": "^3.2.3", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/list": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.10.2.tgz", + "integrity": "sha512-INt+zofkIg2KN8B95xPi9pJG7ZFWAm30oIm/lCPBqM3K1Nm03/QaAbiQj2QeJcOsG3lb7oqI6D6iwTolwJkjIQ==", + "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/selection": "^3.14.2", + "@react-stately/utils": "^3.9.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/menu": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.6.0.tgz", + "integrity": "sha512-OB6CjNyfOkAuirqx1oTL8z8epS9WDzLyrXjmRnxdiCU9EgRXLGAQNECuO7VIpl58oDry8tgRJiJ8fn8FivWSQA==", + "dependencies": { + "@react-stately/overlays": "^3.6.4", + "@react-types/menu": "^3.9.6", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-stately/overlays": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz", @@ -1273,6 +1912,69 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/select": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@react-stately/select/-/select-3.6.1.tgz", + "integrity": "sha512-e5ixtLiYLlFWM8z1msDqXWhflF9esIRfroptZsltMn1lt2iImUlDRlOTZlMtPQzUrDWoiHXRX88sSKUM/jXjQQ==", + "dependencies": { + "@react-stately/form": "^3.0.0", + "@react-stately/list": "^3.10.2", + "@react-stately/overlays": "^3.6.4", + "@react-types/select": "^3.9.1", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/selection": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.2.tgz", + "integrity": "sha512-mL7OoiUgVWaaF7ks5XSxgbXeShijYmD4G3bkBHhqkpugU600QH6BM2hloCq8KOUupk1y8oTljPtF9EmCv375DA==", + "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/utils": "^3.9.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/slider": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.0.tgz", + "integrity": "sha512-dOVpIxb7XKuiRxgpHt1bUSlsklciFki100tKIyBPR+Okar9iC/CwLYROYgVfLkGe77jEBNkor9tDLjDGEWcc1w==", + "dependencies": { + "@react-stately/utils": "^3.9.0", + "@react-types/shared": "^3.22.0", + "@react-types/slider": "^3.7.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/table": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.11.4.tgz", + "integrity": "sha512-dWINJIEOKQl4qq3moq+S8xCD3m+yJqBj0dahr+rOkS+t2uqORwzsusTM35D2T/ZHZi49S2GpE7QuDa+edCynPw==", + "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/flags": "^3.0.0", + "@react-stately/grid": "^3.8.4", + "@react-stately/selection": "^3.14.2", + "@react-stately/utils": "^3.9.0", + "@react-types/grid": "^3.2.3", + "@react-types/shared": "^3.22.0", + "@react-types/table": "^3.9.2", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-stately/toggle": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.0.tgz", @@ -1299,6 +2001,21 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/tree": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.5.tgz", + "integrity": "sha512-xTJVwvhAeY0N5rui4N/TxN7f8hjXdqApDuGDxMZeFAWoQz8Abf7LFKBVQ3OkT6qVr7P+23dgoisUDBhD5a45Hg==", + "dependencies": { + "@react-stately/collections": "^3.10.4", + "@react-stately/selection": "^3.14.2", + "@react-stately/utils": "^3.9.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-stately/utils": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz", @@ -1310,6 +2027,19 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-stately/virtualizer": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.6.tgz", + "integrity": "sha512-9hWvfITdE/028q4YFve6FxlmA3PdSMkUwpYA+vfaGCXI/4DFZIssBMspUeu4PTRJoV+k+m0z1wYHPmufrq6a3g==", + "dependencies": { + "@react-aria/utils": "^3.23.0", + "@react-types/shared": "^3.22.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/button": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz", @@ -1332,6 +2062,40 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-types/combobox": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.10.0.tgz", + "integrity": "sha512-1IXSNS02TPbguyYopaW2snU6sZusbClHrEyVr4zPeexTV4kpUUBNXOzFQ+eSQRR0r2XW57Z0yRW4GJ6FGU0yCA==", + "dependencies": { + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/dialog": { + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.7.tgz", + "integrity": "sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w==", + "dependencies": { + "@react-types/overlays": "^3.8.4", + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/grid": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.3.tgz", + "integrity": "sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w==", + "dependencies": { + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/link": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/@react-types/link/-/link-3.5.2.tgz", @@ -1343,6 +2107,29 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-types/listbox": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.6.tgz", + "integrity": "sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ==", + "dependencies": { + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/menu": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.6.tgz", + "integrity": "sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg==", + "dependencies": { + "@react-types/overlays": "^3.8.4", + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/overlays": { "version": "3.8.4", "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz", @@ -1354,6 +2141,17 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-types/select": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-types/select/-/select-3.9.1.tgz", + "integrity": "sha512-EpKSxrnh8HdZvOF9dHQkjivAcdIp1K81FaxmvosH8Lygqh0iYXxAdZGtKLMyBoPI8YFhA+rotIzTcOqgCCnqWA==", + "dependencies": { + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/shared": { "version": "3.22.0", "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz", @@ -1362,6 +2160,17 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-types/slider": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.0.tgz", + "integrity": "sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q==", + "dependencies": { + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/switch": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.0.tgz", @@ -1373,6 +2182,18 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" } }, + "node_modules/@react-types/table": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@react-types/table/-/table-3.9.2.tgz", + "integrity": "sha512-brw5JUANOzBa2rYNpN8AIl9nDZ9RwRZC6G/wTM/JhtirjC1S42oCtf8Ap5rWJBdmMG/5KOfcGNcAl/huyqb3gg==", + "dependencies": { + "@react-types/grid": "^3.2.3", + "@react-types/shared": "^3.22.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@react-types/textfield": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.0.tgz", @@ -2495,6 +3316,18 @@ } } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -3738,6 +4571,15 @@ "node": ">=0.10" } }, + "node_modules/legacy-swc-helpers": { + "name": "@swc/helpers", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4436,6 +5278,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -4496,6 +5353,14 @@ "react": "^18.2.0" } }, + "node_modules/react-intersection-observer": { + "version": "9.5.3", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.3.tgz", + "integrity": "sha512-NJzagSdUPS5rPhaLsHXYeJbsvdpbJwL6yCHtMk91hc0ufQ2BnXis+0QQ9NBh6n9n+Q3OyjR6OQLShYbaNBkThQ==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/package.json b/package.json index 74477f7..815260b 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "@nextui-org/card": "^2.0.24", "@nextui-org/chip": "^2.0.25", "@nextui-org/code": "2.0.24", - "@nextui-org/image": "^2.0.24", "@nextui-org/dropdown": "^2.1.16", + "@nextui-org/image": "^2.0.24", "@nextui-org/input": "2.1.16", "@nextui-org/kbd": "2.0.25", "@nextui-org/link": "2.0.26", @@ -24,6 +24,7 @@ "@nextui-org/select": "^2.1.20", "@nextui-org/slider": "^2.2.5", "@nextui-org/snippet": "2.0.30", + "@nextui-org/spinner": "^2.0.24", "@nextui-org/switch": "2.0.25", "@nextui-org/system": "2.0.15", "@nextui-org/table": "^2.0.28", @@ -46,6 +47,7 @@ "postcss": "8.4.32", "react": "18.2.0", "react-dom": "18.2.0", + "react-intersection-observer": "^9.5.3", "tailwind-variants": "^0.1.19", "tailwindcss": "3.4.0", "typescript": "5.3.3" diff --git a/types.ts b/types.ts index cf577ca..868e9ec 100644 --- a/types.ts +++ b/types.ts @@ -179,14 +179,12 @@ export type ValidSort = Array< export type KudosQueryParameters = Omit< QueryDatabaseParameters, - "filter_properties" -> & - Omit & { - filter_properties?: Array; - } & { - sorts?: ValidSort; - }; - + "database_id" | "filter_properties" | "sorts" +> & { + database_id?: string; + filter_properties?: Array; + sorts?: ValidSort; +}; export type ValidNotionResponse = { object: string; id: string; diff --git a/utils/helpers.ts b/utils/helpers.ts index c829121..34d4d64 100644 --- a/utils/helpers.ts +++ b/utils/helpers.ts @@ -16,15 +16,13 @@ export function daysSince(date: Date) { return differenceInDays; } -export function isValidNotionResponse( - object: any -): object is ValidNotionResponse { +export function isValidNotionPage(object: any): object is ValidNotionResponse { return object && object.object === "page" && "properties" in object; } export function getImagePath( githubUrl: string, - projectLogos: ProjectLogoImages + projectLogos: ProjectLogoImages, ): string { return ( "images/" + projectLogos[githubUrl] || From 322f513367d76ed6f5f1be8e4c4571eb4902cc6d Mon Sep 17 00:00:00 2001 From: Connor Campbell Date: Sat, 30 Dec 2023 11:36:29 +0100 Subject: [PATCH 2/3] fix: double fetchData issue --- components/loadMore.tsx | 43 +++++++++++++++++++++++------------------ types.ts | 5 +++++ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/components/loadMore.tsx b/components/loadMore.tsx index b2224fd..cf6d928 100644 --- a/components/loadMore.tsx +++ b/components/loadMore.tsx @@ -5,45 +5,50 @@ import { Spinner } from "@nextui-org/spinner"; import { useEffect, useState } from "react"; import { QueryDatabaseResponse } from "@notionhq/client/build/src/api-endpoints"; import projectLogosJson from "@/public/images/imageMap.json"; - -// import { useInView } from "framer-motion"; import { useInView } from "react-intersection-observer"; import Row from "./row"; import { getGoodFirstIssues } from "@/actions/notion"; -import { findDOMNode } from "react-dom"; -import { f } from "@nextui-org/slider/dist/use-slider-64459b54"; +import { LoadMoreState } from "@/types"; export function LoadMore({ cursor }: { cursor: string }) { const { ref, inView } = useInView(); - const [data, setData] = useState([]); - const [isLoading, setIsLoading] = useState(false); - const [nextCursor, setNextCursor] = useState(cursor); + const [awaitingResponse, setAwaitingResponse] = useState(false); + const [queryData, setQueryData] = useState({ + data: [], + nextCursor: cursor, + }); useEffect(() => { const fetchData = async () => { - if (inView && nextCursor && !isLoading) { - setIsLoading(true); + if (inView && !awaitingResponse) { + setAwaitingResponse(true); try { const res = await getGoodFirstIssues({ page_size: 10, - start_cursor: nextCursor, + start_cursor: queryData.nextCursor, }); - setData((prevData) => [...prevData, res]); - setNextCursor(res.next_cursor || undefined); + setQueryData((prevData) => ({ + data: prevData.data.concat(res), + nextCursor: res.next_cursor || undefined, + })); } catch (error) { console.log("There was an error fetching the data", error); - } finally { - setIsLoading(false); } } }; - fetchData(); - }, [inView, data, isLoading]); + }, [inView, queryData, awaitingResponse]); + + useEffect(() => { + if (!inView && awaitingResponse) { + setAwaitingResponse(false); + } + }, [inView, awaitingResponse]); + return ( <> - {data && - data.map((query) => { + {queryData.data && + queryData.data.map((query) => { return query.results.map((row, index) => { if (isValidNotionPage(row)) { return ( @@ -73,7 +78,7 @@ export function LoadMore({ cursor }: { cursor: string }) { } }); })} - {nextCursor && ( + {queryData.nextCursor && (
diff --git a/types.ts b/types.ts index 868e9ec..76052ff 100644 --- a/types.ts +++ b/types.ts @@ -327,3 +327,8 @@ export type RepoLanguageSelectArray = { }; export type ProjectLogoImages = Record; + +export type LoadMoreState = { + data: QueryDatabaseResponse[]; + nextCursor: string | undefined; +}; From 8a8461f73b8ec9497464eaba075b5e4c2e718824 Mon Sep 17 00:00:00 2001 From: Connor Campbell Date: Sat, 30 Dec 2023 11:55:55 +0100 Subject: [PATCH 3/3] chore: add dependencies --- pnpm-lock.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2cf0934..d177b74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ dependencies: '@nextui-org/snippet': specifier: 2.0.30 version: 2.0.30(@nextui-org/system@2.0.15)(@nextui-org/theme@2.1.17)(framer-motion@10.16.16)(react-dom@18.2.0)(react@18.2.0)(tailwind-variants@0.1.19) + '@nextui-org/spinner': + specifier: ^2.0.24 + version: 2.0.24(@nextui-org/theme@2.1.17)(react-dom@18.2.0)(react@18.2.0)(tailwind-variants@0.1.19) '@nextui-org/switch': specifier: 2.0.25 version: 2.0.25(@nextui-org/system@2.0.15)(@nextui-org/theme@2.1.17)(react-dom@18.2.0)(react@18.2.0) @@ -113,6 +116,9 @@ dependencies: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + react-intersection-observer: + specifier: ^9.5.3 + version: 9.5.3(react@18.2.0) tailwind-variants: specifier: ^0.1.19 version: 0.1.19(tailwindcss@3.4.0) @@ -4149,6 +4155,14 @@ packages: scheduler: 0.23.0 dev: false + /react-intersection-observer@9.5.3(react@18.2.0): + resolution: {integrity: sha512-NJzagSdUPS5rPhaLsHXYeJbsvdpbJwL6yCHtMk91hc0ufQ2BnXis+0QQ9NBh6n9n+Q3OyjR6OQLShYbaNBkThQ==} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false