From 145542659dfb6b4fa24db05e1c0aec8cfb5402a0 Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Wed, 3 Jan 2024 11:34:57 +0100 Subject: [PATCH 01/30] feat: Filter options passed as search params in the router --- components/filter.tsx | 41 +++++++++++++++++++++++++++++------------ utils/url.ts | 11 +++++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 utils/url.ts diff --git a/components/filter.tsx b/components/filter.tsx index 2032285..3e290c3 100644 --- a/components/filter.tsx +++ b/components/filter.tsx @@ -1,15 +1,22 @@ "use client"; -import React, { FC } from "react"; +import React from "react"; +import { usePathname, useSearchParams } from "next/navigation"; +import { useRouter } from "next/navigation"; import { Select, SelectItem } from "@nextui-org/select"; import { FilterItem } from "@/types/filters"; +import { createUrl } from "@/utils/url"; import Emoji from "./emoji"; -interface FilterProps { +interface IFilterProps { placeholder: string; emoji: string; items: FilterItem[]; } -export const Filter: FC = ({ placeholder, items, emoji }) => { +export const Filter = ({ placeholder, items, emoji }: IFilterProps) => { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + return ( ); }; diff --git a/utils/url.ts b/utils/url.ts new file mode 100644 index 0000000..42eb7ea --- /dev/null +++ b/utils/url.ts @@ -0,0 +1,11 @@ +import { ReadonlyURLSearchParams } from "next/navigation"; + +export const createUrl = ( + pathname: string, + params: URLSearchParams | ReadonlyURLSearchParams, +) => { + const paramsString = params.toString(); + const queryString = `${paramsString.length ? "?" : ""}${paramsString}`; + + return `${pathname}${queryString}`; +}; From 2b003a64391fa66d51f841b3c1b56619de80485e Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Wed, 3 Jan 2024 13:34:48 +0100 Subject: [PATCH 02/30] (WIP) feat: Dynamic filtering with search params --- app/page.tsx | 38 +++++++++++++++++++++++- components/contributions-table/row.tsx | 14 +++++---- components/contributions-table/table.tsx | 2 +- types/contribution.ts | 2 +- utils/contribution.ts | 4 +-- 5 files changed, 50 insertions(+), 10 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 6d7ccf1..8accbd0 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,9 +1,42 @@ +import ContributionsTable from "@/components/contributions-table/table"; import Filter from "@/components/filter"; import { title, subtitle } from "@/components/primitives"; import Search from "@/components/search"; import { SEARCH_OPTIONS, LANGUAGES_OPTIONS } from "@/data/filters"; +import { queryDatabase } from "@/lib/notion"; +import { transformNotionDataToContributions } from "@/utils/contribution"; + +export default async function Home({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const params = searchParams as { [key: string]: string }; + const filter = + params && params.languages + ? { + property: "Repo Language", + rollup: { + any: { + multi_select: { + contains: params.languages, + }, + }, + }, + } + : undefined; + + const data = await queryDatabase({ + page_size: 10, + filter, + }); + const contributions = transformNotionDataToContributions(data); + const items = { + data: contributions, + hasMore: data.has_more, + nextCursor: data.next_cursor ?? undefined, + }; -export default function Home() { return (
@@ -42,6 +75,9 @@ export default function Home() {

Sort

+
+ +
); diff --git a/components/contributions-table/row.tsx b/components/contributions-table/row.tsx index 242fa6f..a96d488 100644 --- a/components/contributions-table/row.tsx +++ b/components/contributions-table/row.tsx @@ -38,15 +38,19 @@ Project.Avatar = Avatar; interface IContentProps { title: string; - language: string; //TODO: make it an enum type with available languages from filters + languages: string[]; //TODO: make it an enum type with available languages from filters } -export const Content = ({ title, language }: IContentProps) => { +export const Content = ({ title, languages }: IContentProps) => { return (

{title}

- - {language} - +
+ {languages.map((language, idx) => ( + + {language} + + ))} +
); }; diff --git a/components/contributions-table/table.tsx b/components/contributions-table/table.tsx index 6d03445..2a1b07c 100644 --- a/components/contributions-table/table.tsx +++ b/components/contributions-table/table.tsx @@ -48,7 +48,7 @@ export const Table = ({ items, queries = {} }: ITableProps) => { /> ); case "content": - return ; + return ; case "labels": return ; case "date": diff --git a/types/contribution.ts b/types/contribution.ts index 0d4f985..2caae5b 100644 --- a/types/contribution.ts +++ b/types/contribution.ts @@ -4,7 +4,7 @@ export type Contribution = { id: number; avatar: string; labels: string[]; - language: string; + languages: string[]; project: string; repository: string; title: string; diff --git a/utils/contribution.ts b/utils/contribution.ts index 21b1cd8..95459ad 100644 --- a/utils/contribution.ts +++ b/utils/contribution.ts @@ -16,9 +16,9 @@ export function transformNotionDataToContributions( labels: properties["Issue Labels"].multi_select.map( (label: any) => label.name, ), - language: properties["Repo Language"].rollup.array[0].multi_select.map( + languages: properties["Repo Language"].rollup.array[0].multi_select.map( (language: any) => language.name, - )[0], + ), project: properties["Project Name"].rollup.array[0].rich_text[0].plain_text, repository: avatarKey.split("/").pop(), From a9056f0166873a09b2d4a3ea6569dd8f4b1d14b1 Mon Sep 17 00:00:00 2001 From: Leandro Date: Wed, 3 Jan 2024 17:19:06 -0300 Subject: [PATCH 03/30] chore: add checkbox from next-ui --- package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/package.json b/package.json index 2851428..015f7d5 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@nextui-org/autocomplete": "^2.0.9", "@nextui-org/button": "2.0.26", "@nextui-org/card": "^2.0.24", + "@nextui-org/checkbox": "^2.0.25", "@nextui-org/chip": "^2.0.25", "@nextui-org/code": "2.0.24", "@nextui-org/dropdown": "^2.1.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77c4440..cbba7c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: '@nextui-org/card': specifier: ^2.0.24 version: 2.0.24(@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) + '@nextui-org/checkbox': + 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) '@nextui-org/chip': 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) From d9d1b959ea99f71d0f27b0ec312e88f0cc857f2b Mon Sep 17 00:00:00 2001 From: Leandro Date: Wed, 3 Jan 2024 17:19:57 -0300 Subject: [PATCH 04/30] feat: use query in contributions tabe to get new issues when a filter is updated --- app/page.tsx | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index 8accbd0..578c172 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -5,6 +5,7 @@ import Search from "@/components/search"; import { SEARCH_OPTIONS, LANGUAGES_OPTIONS } from "@/data/filters"; import { queryDatabase } from "@/lib/notion"; import { transformNotionDataToContributions } from "@/utils/contribution"; +import RemoveFilters from "@/components/removeFilters"; export default async function Home({ searchParams, @@ -12,7 +13,8 @@ export default async function Home({ searchParams?: { [key: string]: string | string[] | undefined }; }) { const params = searchParams as { [key: string]: string }; - const filter = + const languagesFilterIsSelected = params && params.languages; + let filter = params && params.languages ? { property: "Repo Language", @@ -55,20 +57,17 @@ export default async function Home({ placeholder="Languages" emoji={"💪"} items={LANGUAGES_OPTIONS} + selectedValue={params.languages} /> - {/*
- -
*/} + {languagesFilterIsSelected && ( + + )}
@@ -76,7 +75,13 @@ export default async function Home({
- +
From ad1ded1f63e68d2a5662bc187a1204a68eafe74c Mon Sep 17 00:00:00 2001 From: Leandro Date: Wed, 3 Jan 2024 17:20:44 -0300 Subject: [PATCH 05/30] refactor: add new prop to show the fiter value from the url --- components/filter.tsx | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/components/filter.tsx b/components/filter.tsx index 3e290c3..7eb9a34 100644 --- a/components/filter.tsx +++ b/components/filter.tsx @@ -1,5 +1,5 @@ "use client"; -import React from "react"; +import React, { useEffect } from "react"; import { usePathname, useSearchParams } from "next/navigation"; import { useRouter } from "next/navigation"; import { Select, SelectItem } from "@nextui-org/select"; @@ -11,8 +11,25 @@ interface IFilterProps { placeholder: string; emoji: string; items: FilterItem[]; + selectedValue: string; } -export const Filter = ({ placeholder, items, emoji }: IFilterProps) => { +export const Filter = ({ + placeholder, + items, + emoji, + selectedValue, +}: IFilterProps) => { + const [value, setValue] = React.useState(selectedValue); + + useEffect(() => { + setValue(selectedValue); + }, [selectedValue]); + + const handleSelectionChange = (e: { + target: { value: React.SetStateAction }; + }) => { + setValue(e.target.value); + }; const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); @@ -21,8 +38,11 @@ export const Filter = ({ placeholder, items, emoji }: IFilterProps) => { Date: Fri, 5 Jan 2024 10:46:29 -0300 Subject: [PATCH 11/30] fix: allow only parametrized search --- components/search.tsx | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/components/search.tsx b/components/search.tsx index f749347..408fbda 100644 --- a/components/search.tsx +++ b/components/search.tsx @@ -18,9 +18,8 @@ const Search: FC = ({ placeholder, emoji, items, - selectedValue + selectedValue, }: SearchProps) => { - const [value, setValue] = React.useState(selectedValue); const router = useRouter(); @@ -28,12 +27,14 @@ const Search: FC = ({ const searchParams = useSearchParams(); useEffect(() => { - setValue(selectedValue ? selectedValue : ""); + setValue(selectedValue || ""); }, [selectedValue]); + console.log(value); useEffect(() => { + console.log(value); if (value === undefined || value === "") { - return + return; } const optionNameLowerCase = placeholder.toLowerCase(); const optionSearchParams = new URLSearchParams(searchParams.toString()); @@ -44,30 +45,26 @@ const Search: FC = ({ } const optionUrl = createUrl(pathname, optionSearchParams); router.replace(optionUrl, { scroll: false }); - }, [value]); return ( } className="max-w-md" size="lg" - allowsCustomValue={true} selectedKey={value} onSelectionChange={setValue} > {(item: FilterItem) => { - - - return - -   - {item.label} - + return ( + + +   + {item.label} + + ); }} ); From f9b716e1e2b5c3f31e25b2a157118f55f73cf124 Mon Sep 17 00:00:00 2001 From: Leandro Date: Fri, 5 Jan 2024 10:46:39 -0300 Subject: [PATCH 12/30] feat: add remove all feature --- app/page.tsx | 70 +++++++++++++++++++++--------------- components/removeFilters.tsx | 18 ++++++---- 2 files changed, 52 insertions(+), 36 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index ece5c14..bebde18 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -2,9 +2,12 @@ import ContributionsTable from "@/components/contributions-table/table"; import Filter from "@/components/filter"; import { title, subtitle } from "@/components/primitives"; import Search from "@/components/search"; -import { SEARCH_OPTIONS, LANGUAGES_OPTIONS, INTERESTS_OPTIONS, } from "@/data/filters"; -import { REPOSITORIES_BY_INTERESTS } from "@/data/interests"; -import { queryDatabase, getIssuesByProject } from "@/lib/notion"; +import { + SEARCH_OPTIONS, + LANGUAGES_OPTIONS, + INTERESTS_OPTIONS, +} from "@/data/filters"; +import { queryDatabase } from "@/lib/notion"; import { transformNotionDataToContributions } from "@/utils/contribution"; import RemoveFilters from "@/components/removeFilters"; @@ -13,33 +16,39 @@ export default async function Home({ }: { searchParams?: { [key: string]: string | string[] | undefined }; }) { - const params = searchParams as { [key: string]: string }; - const languagesFilterIsSelected = params && params.languages; - const interestsFilterIsSelected = params && params.interests; - const hasSearch = params && params.search; + const languagesFilterIsSelected = !!params && !!params.languages; + const interestsFilterIsSelected = !!params && !!params.interests; + const hasSearch = !!params && !!params.search; + const showRemoveAllFilters = + [languagesFilterIsSelected, interestsFilterIsSelected, hasSearch].filter( + Boolean, + ).length >= 2; + let filter = params && params.languages ? { - property: "Repo Language", - rollup: { - any: { - multi_select: { - contains: params.languages, - }, - }, - }, - } - : params && params.languages ? { - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: params.search + property: "Repo Language", + rollup: { + any: { + multi_select: { + contains: params.languages, + }, }, }, } - } : undefined; + : params && params.languages + ? { + property: "Project Name", + rollup: { + any: { + rich_text: { + contains: params.search, + }, + }, + }, + } + : undefined; const data = await queryDatabase({ page_size: 10, @@ -60,9 +69,12 @@ export default async function Home({
- + selectedValue={params.search} + /> {/* TODO: 1. make it controlled 2. set the selected value in the params @@ -91,9 +103,9 @@ export default async function Home({ {interestsFilterIsSelected && ( )} - {hasSearch && ( - - )} + {hasSearch && } + + {showRemoveAllFilters && }
@@ -110,6 +122,6 @@ export default async function Home({ />
-
+ ); } diff --git a/components/removeFilters.tsx b/components/removeFilters.tsx index 8e6dd09..3e5783f 100644 --- a/components/removeFilters.tsx +++ b/components/removeFilters.tsx @@ -6,7 +6,7 @@ import { Chip } from "@nextui-org/chip"; import { createUrl } from "@/utils/url"; interface IRemoveFilters { - param: string; + param?: string; value: string; } @@ -15,15 +15,19 @@ export const RemoveFilters = ({ param, value }: IRemoveFilters) => { const pathname = usePathname(); const searchParams = useSearchParams(); const removeSearchParams = () => { - const optionNameLowerCase = param.toLowerCase(); - const optionSearchParams = new URLSearchParams(searchParams.toString()); - optionSearchParams.delete(optionNameLowerCase); - const optionUrl = createUrl(pathname, optionSearchParams); - router.replace(optionUrl); + if (!!param) { + const optionNameLowerCase = param.toLowerCase(); + const optionSearchParams = new URLSearchParams(searchParams.toString()); + optionSearchParams.delete(optionNameLowerCase); + const optionUrl = createUrl(pathname, optionSearchParams); + router.replace(optionUrl); + } else { + router.replace(pathname); + } }; return (
- + {value}
From 85f65db061a5768b9b4785bb7cbee9867f4f8e69 Mon Sep 17 00:00:00 2001 From: Leandro Palazzolo Date: Fri, 5 Jan 2024 17:51:01 -0300 Subject: [PATCH 13/30] refactor: filter and search --- app/page.tsx | 29 +--- components/search.tsx | 2 +- data/filters.ts | 312 +++++++++++++++++++++++++++++++++--------- data/interests.ts | 161 ---------------------- lib/notion/index.ts | 76 ++++++++-- 5 files changed, 315 insertions(+), 265 deletions(-) delete mode 100644 data/interests.ts diff --git a/app/page.tsx b/app/page.tsx index bebde18..709c960 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -6,8 +6,9 @@ import { SEARCH_OPTIONS, LANGUAGES_OPTIONS, INTERESTS_OPTIONS, + REPOSITORIES_BY_INTERESTS, } from "@/data/filters"; -import { queryDatabase } from "@/lib/notion"; +import { queryDatabase, createFilter } from "@/lib/notion"; import { transformNotionDataToContributions } from "@/utils/contribution"; import RemoveFilters from "@/components/removeFilters"; @@ -24,31 +25,7 @@ export default async function Home({ [languagesFilterIsSelected, interestsFilterIsSelected, hasSearch].filter( Boolean, ).length >= 2; - - let filter = - params && params.languages - ? { - property: "Repo Language", - rollup: { - any: { - multi_select: { - contains: params.languages, - }, - }, - }, - } - : params && params.languages - ? { - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: params.search, - }, - }, - }, - } - : undefined; + const filter = await createFilter(params.languages, params.search, REPOSITORIES_BY_INTERESTS[params.interests]) const data = await queryDatabase({ page_size: 10, diff --git a/components/search.tsx b/components/search.tsx index 408fbda..6981c68 100644 --- a/components/search.tsx +++ b/components/search.tsx @@ -59,7 +59,7 @@ const Search: FC = ({ > {(item: FilterItem) => { return ( - +   {item.label} diff --git a/data/filters.ts b/data/filters.ts index 3f27bff..79f333d 100644 --- a/data/filters.ts +++ b/data/filters.ts @@ -102,66 +102,252 @@ export const INTERESTS_OPTIONS = [ ]; export const SEARCH_OPTIONS = [ - { value: "t3rn/t3rn", label: "T3Rn", emoji: "🔄" }, - { value: "paritytech/polkadot-sdk", label: "Polkadot Sdk", emoji: "🔗" }, - { value: "automata-network/automata", label: "Automata", emoji: "🤖" }, - { value: "subspace/subspace", label: "Subspace", emoji: "🚀" }, - { value: "mangata-finance/mangata-node", label: "Mangata Node", emoji: "🌐" }, - { value: "virto-network/virto-node", label: "Virto Node", emoji: "🌐" }, - { value: "galacticcouncil/HydraDX-node", label: "HydraDX Node", emoji: "🌌" }, - { value: "InvArch/InvArch-Frames", label: "Invarch Frames", emoji: "🖼️" }, - { value: "darwinia-network/darwinia", label: "Darwinia", emoji: "🌐" }, - { value: "hashed-io/hashed-substrate", label: "Hashed Substrate", emoji: "🔍" }, - { value: "LibertyDSNP/frequency", label: "Frequency", emoji: "📡" }, - { value: "OAK-Foundation/OAK-blockchain", label: "Oak Blockchain", emoji: "🌳" }, - { value: "centrifuge/centrifuge-chain", label: "Centrifuge Chain", emoji: "🔄" }, - { value: "dappforce/subsocial-parachain", label: "Subsocial Parachain", emoji: "🌐" }, - { value: "pendulum-chain/spacewalk", label: "Spacewalk", emoji: "🚀" }, - { value: "Brushfam/openbrush-contracts", label: "Openbrush Contracts", emoji: "🎨" }, - { value: "KILTprotocol/kilt-node", label: "Kilt Node", emoji: "🔄" }, - { value: "Manta-Network/Manta", label: "Manta", emoji: "🌊" }, - { value: "sora-xor/sora2-parachain", label: "Sora2 Parachain", emoji: "🔄" }, - { value: "moondance-labs/tanssi", label: "Tanssi", emoji: "💃" }, - { value: "sora-xor/sora2-network", label: "Sora2 Network", emoji: "🔄" }, - { value: "gear-tech/gear", label: "Gear", emoji: "⚙️" }, - { value: "Joystream/joystream", label: "Joystream", emoji: "🎮" }, - { value: "peaqnetwork/peaq-network-node", label: "Peaq Network Node", emoji: "🌐" }, - { value: "zeitgeistpm/zeitgeist", label: "Zeitgeist", emoji: "🕰️" }, - { value: "docknetwork/dock-substrate", label: "Dock Substrate", emoji: "🚢" }, - { value: "capsule-corp-ternoa/ternoa-node", label: "Ternoa Node", emoji: "📦" }, - { value: "NodleCode/chain", label: "Chain", emoji: "⛓️" }, - { value: "bifrost-finance/bifrost", label: "Bifrost", emoji: "🌈" }, - { value: "ImbueNetwork/imbue", label: "Imbue", emoji: "🌊" }, - { value: "encointer/encointer-parachain", label: "Encointer Parachain", emoji: "🔄" }, - { value: "parallel-finance/parallel", label: "Parallel", emoji: "🔄" }, - { value: "bitgreen/bitgreen-node", label: "Bitgreen Node", emoji: "🌱" }, - { value: "deeper-chain/deeper-chain", label: "Deeper Chain", emoji: "🔄" }, - { value: "crustio/crust", label: "Crust", emoji: "🍞" }, - { value: "AcalaNetwork/Acala", label: "Acala", emoji: "♾️" }, - { value: "InvArch/InvArch-Node", label: "Invarch Node", emoji: "🏛️" }, - { value: "Phala-Network/phala-blockchain", label: "Phala Blockchain", emoji: "🔒" }, - { value: "encointer/encointer-node", label: "Encointer Node", emoji: "🔄" }, - { value: "encointer/personhood-oracle", label: "Personhood Oracle", emoji: "🔄" }, - { value: "airalab/robonomics", label: "Robonomics", emoji: "🤖" }, - { value: "pendulum-chain/pendulum", label: "Pendulum", emoji: "🕰️" }, - { value: "encointer/pallets", label: "Pallets", emoji: "🔄" }, - { value: "integritee-network/worker", label: "Worker", emoji: "🛠️" }, - { value: "bit-country/Metaverse-Network", label: "Metaverse Network", emoji: "🌐" }, - { value: "grindytech/gafi", label: "Gafi", emoji: "🔄" }, - { value: "litentry/litentry-parachain", label: "Litentry Parachain", emoji: "📜" }, - { value: "AstarNetwork/Astar", label: "Astar", emoji: "⭐" }, - { value: "interlay/interbtc", label: "Interbtc", emoji: "🔄" }, - { value: "aleph-zero-foundation/aleph-node", label: "Aleph Node", emoji: "🔄" }, - { value: "opensquare-network/dotreasury", label: "Dotreasury", emoji: "💼" }, - { value: "opensquare-network/subsquare", label: "Subsquare", emoji: "🔄" }, - { value: "OAK-Foundation/xcm-demo", label: "Xcm Demo", emoji: "🔄" }, - { value: "subquery/subql", label: "Subql", emoji: "🔍" }, - { value: "subsquid/squid-sdk", label: "Squid Sdk", emoji: "🦑" }, - { value: "pendulum-chain/portal", label: "Portal", emoji: "🚪" }, - { value: "ImbueNetwork/imbue-frontend", label: "Imbue Frontend", emoji: "🌐" }, - { value: "OAK-Foundation/oak.js", label: "Oak.Js", emoji: "🌳" }, - { value: "moonbeam-foundation/moonbeam", label: "Moonbeam", emoji: "🌙" }, - { value: "webb-tools/tangle", label: "Tangle", emoji: "🌀" }, - { value: "TalismanSociety/talisman", label: "Talisman", emoji: "📿" }, - { value: "opentensor/bittensor", label: "Bittensor", emoji: "🧠" }, -] \ No newline at end of file + { value: "polkadot-sdk", label: "Polkadot Sdk", emoji: "🔗" }, + { value: "OAK-blockchain", label: "Oak Blockchain", emoji: "🌳" }, + { value: "InvArch-Node", label: "Invarch Node", emoji: "🏛️" }, + { value: "phala-blockchain", label: "Phala Blockchain", emoji: "🔒" }, + { value: "talisman", label: "Talisman", emoji: "📿" }, + { value: "t3rn", label: "T3Rn", emoji: "🔄" }, + { value: "automata", label: "Automata", emoji: "🤖" }, + { value: "subspace", label: "Subspace", emoji: "🚀" }, + { value: "mangata-node", label: "Mangata Node", emoji: "🌐" }, + { value: "virto-node", label: "Virto Node", emoji: "🌐" }, + { value: "HydraDX-node", label: "HydraDX Node", emoji: "🌌" }, + { value: "InvArch-Frames", label: "Invarch Frames", emoji: "🖼️" }, + { value: "network/darwinia", label: "Darwinia", emoji: "🌐" }, + { value: "hashed-substrate", label: "Hashed Substrate", emoji: "🔍" }, + { value: "frequency", label: "Frequency", emoji: "📡" }, + { value: "centrifuge-chain", label: "Centrifuge Chain", emoji: "🔄" }, + { value: "subsocial-parachain", label: "Subsocial Parachain", emoji: "🌐" }, + { value: "spacewalk", label: "Spacewalk", emoji: "🚀" }, + { value: "openbrush-contracts", label: "Openbrush Contracts", emoji: "🎨" }, + { value: "kilt-node", label: "Kilt Node", emoji: "🔄" }, + { value: "Manta", label: "Manta", emoji: "🌊" }, + { value: "sora2-parachain", label: "Sora2 Parachain", emoji: "🔄" }, + { value: "tanssi", label: "Tanssi", emoji: "💃" }, + { value: "sora2-network", label: "Sora2 Network", emoji: "🔄" }, + { value: "gear", label: "Gear", emoji: "⚙️" }, + { value: "joystream", label: "Joystream", emoji: "🎮" }, + { value: "peaq-network-node", label: "Peaq Network Node", emoji: "🌐" }, + { value: "zeitgeist", label: "Zeitgeist", emoji: "🕰️" }, + { value: "dock-substrate", label: "Dock Substrate", emoji: "🚢" }, + { value: "ternoa-node", label: "Ternoa Node", emoji: "📦" }, + { value: "chain", label: "Chain", emoji: "⛓️" }, + { value: "bifrost", label: "Bifrost", emoji: "🌈" }, + { value: "imbue", label: "Imbue", emoji: "🌊" }, + { value: "encointer-parachain", label: "Encointer Parachain", emoji: "🔄" }, + { value: "parallel", label: "Parallel", emoji: "🔄" }, + { value: "bitgreen-node", label: "Bitgreen Node", emoji: "🌱" }, + { value: "deeper-chain", label: "Deeper Chain", emoji: "🔄" }, + { value: "crust", label: "Crust", emoji: "🍞" }, + { value: "Acala", label: "Acala", emoji: "♾️" }, + { value: "encointer-node", label: "Encointer Node", emoji: "🔄" }, + { value: "personhood-oracle", label: "Personhood Oracle", emoji: "🔄" }, + { value: "robonomics", label: "Robonomics", emoji: "🤖" }, + { value: "pendulum", label: "Pendulum", emoji: "🕰️" }, + { value: "pallets", label: "Pallets", emoji: "🔄" }, + { value: "worker", label: "Worker", emoji: "🛠️" }, + { value: "Metaverse-Network", label: "Metaverse Network", emoji: "🌐" }, + { value: "gafi", label: "Gafi", emoji: "🔄" }, + { value: "litentry-parachain", label: "Litentry Parachain", emoji: "📜" }, + { value: "Astar", label: "Astar", emoji: "⭐" }, + { value: "interbtc", label: "Interbtc", emoji: "🔄" }, + { value: "aleph-node", label: "Aleph Node", emoji: "🔄" }, + { value: "dotreasury", label: "Dotreasury", emoji: "💼" }, + { value: "subsquare", label: "Subsquare", emoji: "🔄" }, + { value: "xcm-demo", label: "Xcm Demo", emoji: "🔄" }, + { value: "subql", label: "Subql", emoji: "🔍" }, + { value: "squid-sdk", label: "Squid Sdk", emoji: "🦑" }, + { value: "portal", label: "Portal", emoji: "🚪" }, + { value: "imbue-frontend", label: "Imbue Frontend", emoji: "🌐" }, + { value: "oak.js", label: "Oak.Js", emoji: "🌳" }, + { value: "moonbeam", label: "Moonbeam", emoji: "🌙" }, + { value: "tangle", label: "Tangle", emoji: "🌀" }, + { value: "bittensor", label: "Bittensor", emoji: "🧠" }, +] +type RepositoryList = { + [key: string]: string[]; +}; + +export const REPOSITORIES_BY_INTERESTS: RepositoryList = { + "substrate": [ + "InvArch-Node", + "pendulum", + "Metaverse-Network", + "gafi", + "Astar", + "interbtc", + "xcm-demo", + "oak.js", + "moonbeam", + "tangle", + "talisman", + "t3rn", + "polkadot-sdk", + "automata", + "subspace", + "mangata-node", + "virto-node", + "HydraDX-node", + "InvArch-Frames", + "darwinia", + "hashed-substrate", + "frequency", + "OAK-blockchain", + "centrifuge-chain", + "subsocial-parachain", + "spacewalk", + "openbrush-contracts", + "kilt-node", + "Manta", + "sora2-parachain", + "tanssi", + "sora2-network", + "gear", + "joystream", + "dock-substrate", + "ternoa-node", + "bifrost", + "bitgreen-node", + "deeper-chain", + "crust", + "Acala" + ], + "polkadot": [ + "InvArch-Node", + "pendulum", + "Metaverse-Network", + "gafi", + "Astar", + "interbtc", + "aleph-node", + "dotreasury", + "subsquare", + "xcm-demo", + "subql", + "squid-sdk", + "portal", + "imbue-frontend", + "oak.js", + "moonbeam", + "talisman", + "polkadot-sdk", + "automata", + "subspace", + "mangata-node", + "virto-node", + "HydraDX-node", + "InvArch-Frames", + "darwinia", + "hashed-substrate", + "frequency", + "OAK-blockchain", + "centrifuge-chain", + "subsocial-parachain", + "spacewalk", + "openbrush-contracts", + "kilt-node", + "Manta", + "sora2-parachain", + "tanssi", + "sora2-network", + "joystream", + "zeitgeist", + "dock-substrate", + "ternoa-node", + "chain", + "bifrost", + "imbue", + "encointer-parachain", + "parallel", + "bitgreen-node", + "deeper-chain", + "crust", + "Acala" + ], + "kusama": [ + "interbtc", + "dotreasury", + "subsquare", + "sora2-parachain", + "sora2-network", + "parallel", + "encointer-parachain", + "Acala", + "robonomics", + "Astar", + "dotreasury" + ], + "evm": [ + "Astar", + "moonbeam", + "darwinia", + "OAK-blockchain", + "mangata-node", + "sora2-network" + ], + "ethereum": [ + "Astar", + "moonbeam", + "talisman", + "darwinia", + "sora2-network", + "mangata-node" + ], + "defi": [ + "Metaverse-Network", + "gafi", + "Astar", + "interbtc", + "moonbeam", + "talisman", + "sora2-parachain", + "sora2-network", + "bifrost", + "parallel", + "Acala", + "interbtc" + ], + "smart-contracts": [ + "Metaverse-Network", + "gafi", + "Astar", + "moonbeam", + "talisman", + "t3rn", + "polkadot-sdk", + "subspace", + "mangata-node", + "joystream" + ], + "cumulus": [ + "pendulum", + "moonbeam", + "polkadot-sdk", + "parallel" + ], + "bitcoin": ["interbtc"], + "bridge": [ + "interbtc", + "Metaverse-Network", + "darwinia", + "bifrost" + ], + "wasm": [ + "pendulum", + "Metaverse-Network", + "moonbeam", + "bifrost", + "parallel" + ], + "mev": ["mangata-node"], + "rollup": ["mangata-node"], + "dex": ["HydraDX-node"], + "dao": ["InvArch-Frames"], + "social": ["subsocial-parachain"], + "zero-knowledge": ["tangle", "Manta"], + "iot": ["robonomics"], + "xcm": ["xcm-demo"], + "wallet": ["talisman"], + "ai": ["bittensor"] +} diff --git a/data/interests.ts b/data/interests.ts deleted file mode 100644 index f4d7ea6..0000000 --- a/data/interests.ts +++ /dev/null @@ -1,161 +0,0 @@ -export const REPOSITORIES_BY_INTERESTS = [ - "InvArch/InvArch-Node", - "pendulum-chain/pendulum", - "bit-country/Metaverse-Network", - "grindytech/gafi", - "AstarNetwork/Astar", - "interlay/interbtc", - "OAK-Foundation/xcm-demo", - "OAK-Foundation/oak.js", - "moonbeam-foundation/moonbeam", - "webb-tools/tangle", - "TalismanSociety/talisman", - "t3rn/t3rn", - "paritytech/polkadot-sdk", - "automata-network/automata", - "subspace/subspace", - "mangata-finance/mangata-node", - "virto-network/virto-node", - "galacticcouncil/HydraDX-node", - "InvArch/InvArch-Frames", - "darwinia-network/darwinia", - "hashed-io/hashed-substrate", - "LibertyDSNP/frequency", - "OAK-Foundation/OAK-blockchain", - "centrifuge/centrifuge-chain", - "dappforce/subsocial-parachain", - "KILTprotocol/kilt-node", - "Manta-Network/Manta", - "sora-xor/sora2-parachain", - "moondance-labs/tanssi", - "sora-xor/sora2-network", - "gear-tech/gear", - "Joystream/joystream", - "docknetwork/dock-substrate", - "capsule-corp-ternoa/ternoa-node", - "bifrost-finance/bifrost", - "bitgreen/bitgreen-node", - "deeper-chain/deeper-chain", - "crustio/crust", - "AcalaNetwork/Acala", - "InvArch/InvArch-Node", - "pendulum-chain/pendulum", - "bit-country/Metaverse-Network", - "grindytech/gafi", - "AstarNetwork/Astar", - "interlay/interbtc", - "aleph-zero-foundation/aleph-node", - "opensquare-network/dotreasury", - "opensquare-network/subsquare", - "OAK-Foundation/xcm-demo", - "subquery/subql", - "subsquid/squid-sdk", - "pendulum-chain/portal", - "ImbueNetwork/imbue-frontend", - "OAK-Foundation/oak.js", - "moonbeam-foundation/moonbeam", - "TalismanSociety/talisman", - "paritytech/polkadot-sdk", - "automata-network/automata", - "subspace/subspace", - "mangata-finance/mangata-node", - "virto-network/virto-node", - "galacticcouncil/HydraDX-node", - "InvArch/InvArch-Frames", - "darwinia-network/darwinia", - "hashed-io/hashed-substrate", - "LibertyDSNP/frequency", - "OAK-Foundation/OAK-blockchain", - "centrifuge/centrifuge-chain", - "dappforce/subsocial-parachain", - "pendulum-chain/spacewalk", - "Brushfam/openbrush-contracts", - "KILTprotocol/kilt-node", - "Manta-Network/Manta", - "sora-xor/sora2-parachain", - "moondance-labs/tanssi", - "sora-xor/sora2-network", - "Joystream/joystream", - "zeitgeistpm/zeitgeist", - "docknetwork/dock-substrate", - "capsule-corp-ternoa/ternoa-node", - "NodleCode/chain", - "bifrost-finance/bifrost", - "ImbueNetwork/imbue", - "encointer/encointer-parachain", - "parallel-finance/parallel", - "bitgreen/bitgreen-node", - "deeper-chain/deeper-chain", - "crustio/crust", - "AcalaNetwork/Acala", - "interlay/interbtc", - "opensquare-network/dotreasury", - "opensquare-network/subsquare", - "sora-xor/sora2-parachain", - "sora-xor/sora2-network", - "parallel-finance/parallel", - "encointer/encointer-parachain", - "AcalaNetwork/Acala", - "airalab/robonomics", - "AstarNetwork/Astar", - "opensquare-network/dotreasury", - "AstarNetwork/Astar", - "moonbeam-foundation/moonbeam", - "darwinia-network/darwinia", - "OAK-Foundation/OAK-blockchain", - "mangata-finance/mangata-node", - "sora-xor/sora2-network", - "AstarNetwork/Astar", - "moonbeam-foundation/moonbeam", - "TalismanSociety/talisman", - "darwinia-network/darwinia", - "sora-xor/sora2-network", - "mangata-finance/mangata-node", - "bit-country/Metaverse-Network", - "grindytech/gafi", - "AstarNetwork/Astar", - "interlay/interbtc", - "moonbeam-foundation/moonbeam", - "TalismanSociety/talisman", - "sora-xor/sora2-parachain", - "sora-xor/sora2-network", - "bifrost-finance/bifrost", - "parallel-finance/parallel", - "AcalaNetwork/Acala", - "interlay/interbtc", - "bit-country/Metaverse-Network", - "grindytech/gafi", - "AstarNetwork/Astar", - "moonbeam-foundation/moonbeam", - "TalismanSociety/talisman", - "t3rn/t3rn", - "paritytech/polkadot-sdk", - "subspace/subspace", - "mangata-finance/mangata-node", - "Joystream/joystream", - "pendulum-chain/pendulum", - "moonbeam-foundation/moonbeam", - "paritytech/polkadot-sdk", - "parallel-finance/parallel", - "interlay/interbtc", - "interlay/interbtc", - "bit-country/Metaverse-Network", - "darwinia-network/darwinia", - "bifrost-finance/bifrost", - "pendulum-chain/pendulum", - "bit-country/Metaverse-Network", - "moonbeam-foundation/moonbeam", - "bifrost-finance/bifrost", - "parallel-finance/parallel", - "mangata-finance/mangata-node", - "mangata-finance/mangata-node", - "galacticcouncil/HydraDX-node", - "InvArch/InvArch-Frames", - "dappforce/subsocial-parachain", - "webb-tools/tangle", - "Manta-Network/Manta", - "airalab/robonomics", - "OAK-Foundation/xcm-demo", - "TalismanSociety/talisman", - "opentensor/bittensor" -] diff --git a/lib/notion/index.ts b/lib/notion/index.ts index 8c05d43..dcd0bbb 100644 --- a/lib/notion/index.ts +++ b/lib/notion/index.ts @@ -42,6 +42,7 @@ export async function queryDatabase( start_cursor: undefined, filter: undefined, }; + const query = { ...defaultQuery, ...queryOverrides, @@ -274,18 +275,65 @@ export async function createRepoMap() { return out; } -// async function main() { -// // const r = await getGoodFirstIssues({ page_size: 1 }); -// // const r = await getUnassignedIssues({ page_size: 1 }); -// // const r = await getIssuesByProject("Polkadot", { page_size: 1 }); -// // const r = await getIssuesByRepo("af89c412b69f4437a6a0cdf80070a4a9", { -// // page_size: 1, -// // }); -// const r = await createRepoMap(); -// // const r = await queryDatabase({ page_size: 105 }); -// // console.log(r.results.length); -// console.log(JSON.stringify(r, null, 2)); -// // console.log(JSON.stringify(r, null, 2)); -// } +export async function createFilter(languages: string, search: string, interests: string[]) { + if (!languages && !search && !interests) { + // If all parameters are undefined, return undefined + return undefined; + } else { + const filters = []; -// main(); + if (languages) { + // If languages is defined, create a filter for Repo Language + filters.push({ + property: "Repo Language", + rollup: { + any: { + multi_select: { + contains: languages, + }, + }, + }, + }); + } + + if (search) { + // If search is defined, create a filter for Project Name + filters.push({ + property: "Project Name", + rollup: { + any: { + rich_text: { + contains: search, + }, + }, + }, + }); + } + if (interests && interests.length > 0) { + // If interests is defined and not empty, create a filter for Interests using "or" + filters.push({ + or: interests.map((interest) => ({ + property: "Project Name", + rollup: { + any: { + rich_text: { + contains: interest, + }, + }, + }, + })), + }); + } + + + if (filters.length === 1) { + // If there's only one filter, return it directly + return filters[0]; + } else if (filters.length > 1) { + // If there are multiple filters, combine them with "and" + return { + and: filters, + }; + } + } +} \ No newline at end of file From 07083b500e14a9d2491a3854b45d63b5aaa1b53a Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Sat, 6 Jan 2024 11:48:20 +0100 Subject: [PATCH 14/30] chore: Notion utility functions grouped together --- app/page.tsx | 13 +++-- app/table/page.tsx | 2 +- hooks/useContributions.tsx | 2 +- lib/notion/index.ts | 63 ------------------------ utils/contribution.ts | 33 ------------- utils/notion.ts | 99 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 101 deletions(-) delete mode 100644 utils/contribution.ts create mode 100644 utils/notion.ts diff --git a/app/page.tsx b/app/page.tsx index 709c960..714f3e3 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -8,8 +8,11 @@ import { INTERESTS_OPTIONS, REPOSITORIES_BY_INTERESTS, } from "@/data/filters"; -import { queryDatabase, createFilter } from "@/lib/notion"; -import { transformNotionDataToContributions } from "@/utils/contribution"; +import { queryDatabase } from "@/lib/notion"; +import { + createNotionFilter, + transformNotionDataToContributions, +} from "@/utils/notion"; import RemoveFilters from "@/components/removeFilters"; export default async function Home({ @@ -25,7 +28,11 @@ export default async function Home({ [languagesFilterIsSelected, interestsFilterIsSelected, hasSearch].filter( Boolean, ).length >= 2; - const filter = await createFilter(params.languages, params.search, REPOSITORIES_BY_INTERESTS[params.interests]) + const filter = await createNotionFilter( + params.languages, + params.search, + REPOSITORIES_BY_INTERESTS[params.interests], + ); const data = await queryDatabase({ page_size: 10, diff --git a/app/table/page.tsx b/app/table/page.tsx index 09159a9..53e155e 100644 --- a/app/table/page.tsx +++ b/app/table/page.tsx @@ -1,6 +1,6 @@ import { getGoodFirstIssues } from "@/lib/notion"; import ContributionsTable from "@/components/contributions-table/table"; -import { transformNotionDataToContributions } from "@/utils/contribution"; +import { transformNotionDataToContributions } from "@/utils/notion"; export default async function Page() { const data = await getGoodFirstIssues({ page_size: 10 }); diff --git a/hooks/useContributions.tsx b/hooks/useContributions.tsx index 78846d7..202bc86 100644 --- a/hooks/useContributions.tsx +++ b/hooks/useContributions.tsx @@ -4,7 +4,7 @@ import { QueryKey, } from "@tanstack/react-query"; import { queryDatabase } from "@/lib/notion"; -import { transformNotionDataToContributions } from "@/utils/contribution"; +import { transformNotionDataToContributions } from "@/utils/notion"; import { PaginatedContributions } from "@/types/contribution"; import { KudosQueryParameters } from "@/lib/notion/types"; diff --git a/lib/notion/index.ts b/lib/notion/index.ts index dcd0bbb..79d8c30 100644 --- a/lib/notion/index.ts +++ b/lib/notion/index.ts @@ -274,66 +274,3 @@ export async function createRepoMap() { } return out; } - -export async function createFilter(languages: string, search: string, interests: string[]) { - if (!languages && !search && !interests) { - // If all parameters are undefined, return undefined - return undefined; - } else { - const filters = []; - - if (languages) { - // If languages is defined, create a filter for Repo Language - filters.push({ - property: "Repo Language", - rollup: { - any: { - multi_select: { - contains: languages, - }, - }, - }, - }); - } - - if (search) { - // If search is defined, create a filter for Project Name - filters.push({ - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: search, - }, - }, - }, - }); - } - if (interests && interests.length > 0) { - // If interests is defined and not empty, create a filter for Interests using "or" - filters.push({ - or: interests.map((interest) => ({ - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: interest, - }, - }, - }, - })), - }); - } - - - if (filters.length === 1) { - // If there's only one filter, return it directly - return filters[0]; - } else if (filters.length > 1) { - // If there are multiple filters, combine them with "and" - return { - and: filters, - }; - } - } -} \ No newline at end of file diff --git a/utils/contribution.ts b/utils/contribution.ts deleted file mode 100644 index 95459ad..0000000 --- a/utils/contribution.ts +++ /dev/null @@ -1,33 +0,0 @@ -import projectLogosJson from "@/public/images/imageMap.json"; -import { Contribution } from "@/types/contribution"; -import { getImagePath } from "./github"; -import { QueryDatabaseResponse } from "@notionhq/client/build/src/api-endpoints"; - -export function transformNotionDataToContributions( - notionData: QueryDatabaseResponse, -): Contribution[] { - return notionData.results.reduce((acc: Contribution[], currentItem: any) => { - const properties = currentItem.properties; - - const [avatarKey, id] = properties["Issue Link"].url.split("/issues/"); - const contribution: Contribution = { - id, - avatar: getImagePath(avatarKey, projectLogosJson), // Assuming getImagePath is a defined function - labels: properties["Issue Labels"].multi_select.map( - (label: any) => label.name, - ), - languages: properties["Repo Language"].rollup.array[0].multi_select.map( - (language: any) => language.name, - ), - project: - properties["Project Name"].rollup.array[0].rich_text[0].plain_text, - repository: avatarKey.split("/").pop(), - title: properties["Issue Title"].title[0].text.content, - timestamp: properties["Opened Date"].date.start, - url: properties["Issue Link"].url, - }; - - acc.push(contribution); - return acc; - }, []); -} diff --git a/utils/notion.ts b/utils/notion.ts new file mode 100644 index 0000000..1beb2c7 --- /dev/null +++ b/utils/notion.ts @@ -0,0 +1,99 @@ +import projectLogosJson from "@/public/images/imageMap.json"; +import { Contribution } from "@/types/contribution"; +import { getImagePath } from "./github"; +import { QueryDatabaseResponse } from "@notionhq/client/build/src/api-endpoints"; + +export function transformNotionDataToContributions( + notionData: QueryDatabaseResponse, +): Contribution[] { + return notionData.results.reduce((acc: Contribution[], currentItem: any) => { + const properties = currentItem.properties; + + const [avatarKey, id] = properties["Issue Link"].url.split("/issues/"); + const contribution: Contribution = { + id, + avatar: getImagePath(avatarKey, projectLogosJson), // Assuming getImagePath is a defined function + labels: properties["Issue Labels"].multi_select.map( + (label: any) => label.name, + ), + languages: properties["Repo Language"].rollup.array[0].multi_select.map( + (language: any) => language.name, + ), + project: + properties["Project Name"].rollup.array[0].rich_text[0].plain_text, + repository: avatarKey.split("/").pop(), + title: properties["Issue Title"].title[0].text.content, + timestamp: properties["Opened Date"].date.start, + url: properties["Issue Link"].url, + }; + + acc.push(contribution); + return acc; + }, []); +} + +export async function createNotionFilter( + languages: string, + search: string, + interests: string[], +) { + if (!languages && !search && !interests) { + // If all parameters are undefined, return undefined + return undefined; + } else { + const filters = []; + + if (languages) { + // If languages is defined, create a filter for Repo Language + filters.push({ + property: "Repo Language", + rollup: { + any: { + multi_select: { + contains: languages, + }, + }, + }, + }); + } + + if (search) { + // If search is defined, create a filter for Project Name + filters.push({ + property: "Project Name", + rollup: { + any: { + rich_text: { + contains: search, + }, + }, + }, + }); + } + if (interests && interests.length > 0) { + // If interests is defined and not empty, create a filter for Interests using "or" + filters.push({ + or: interests.map((interest) => ({ + property: "Project Name", + rollup: { + any: { + rich_text: { + contains: interest, + }, + }, + }, + })), + }); + } + + if (filters.length === 1) { + // If there's only one filter, return it directly + return filters[0]; + } else if (filters.length > 1) { + // If there are multiple filters, combine them with "and" + return { + and: filters, + }; + } + } +} From a76c242333838d5cad870730387bee88d4721f49 Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Sat, 6 Jan 2024 12:00:11 +0100 Subject: [PATCH 15/30] chore: Filter component renamed SelectFilter --- app/page.tsx | 6 +++--- .../{filter.tsx => filters/select-filter.tsx} | 14 ++++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) rename components/{filter.tsx => filters/select-filter.tsx} (91%) diff --git a/app/page.tsx b/app/page.tsx index 714f3e3..c888be2 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,5 @@ import ContributionsTable from "@/components/contributions-table/table"; -import Filter from "@/components/filter"; +import SelectFilter from "@/components/filters/select-filter"; import { title, subtitle } from "@/components/primitives"; import Search from "@/components/search"; import { @@ -69,13 +69,13 @@ export default async function Home({
- - { +}: ISelectFilterProps) => { const [value, setValue] = React.useState(selectedValue); const router = useRouter(); @@ -29,10 +29,9 @@ export const Filter = ({ setValue(selectedValue); }, [selectedValue]); - useEffect(() => { if (value === undefined) { - return + return; } const optionNameLowerCase = placeholder.toLowerCase(); const optionSearchParams = new URLSearchParams(searchParams.toString()); @@ -64,7 +63,6 @@ export const Filter = ({ key={item.value} value={item.value} startContent={} - > {item.label} @@ -74,4 +72,4 @@ export const Filter = ({ ); }; -export default Filter; +export default SelectFilter; From ce2b448f0410b62e443a512ca24ac688c5804283 Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Sat, 6 Jan 2024 12:04:05 +0100 Subject: [PATCH 16/30] chore: RemoveFilters component renamed ClearFilters --- app/page.tsx | 10 +++++----- .../{removeFilters.tsx => filters/clear-filters.tsx} | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) rename components/{removeFilters.tsx => filters/clear-filters.tsx} (79%) diff --git a/app/page.tsx b/app/page.tsx index c888be2..8a4b1fd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,4 +1,5 @@ import ContributionsTable from "@/components/contributions-table/table"; +import ClearFilters from "@/components/filters/clear-filters"; import SelectFilter from "@/components/filters/select-filter"; import { title, subtitle } from "@/components/primitives"; import Search from "@/components/search"; @@ -13,7 +14,6 @@ import { createNotionFilter, transformNotionDataToContributions, } from "@/utils/notion"; -import RemoveFilters from "@/components/removeFilters"; export default async function Home({ searchParams, @@ -82,14 +82,14 @@ export default async function Home({ selectedValue={params.interests} /> {languagesFilterIsSelected && ( - + )} {interestsFilterIsSelected && ( - + )} - {hasSearch && } + {hasSearch && } - {showRemoveAllFilters && } + {showRemoveAllFilters && }
diff --git a/components/removeFilters.tsx b/components/filters/clear-filters.tsx similarity index 79% rename from components/removeFilters.tsx rename to components/filters/clear-filters.tsx index 3e5783f..3cc2d18 100644 --- a/components/removeFilters.tsx +++ b/components/filters/clear-filters.tsx @@ -5,16 +5,16 @@ import { useRouter } from "next/navigation"; import { Chip } from "@nextui-org/chip"; import { createUrl } from "@/utils/url"; -interface IRemoveFilters { +interface IClearFilters { param?: string; value: string; } -export const RemoveFilters = ({ param, value }: IRemoveFilters) => { +export const ClearFilters = ({ param, value }: IClearFilters) => { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); - const removeSearchParams = () => { + const clearSearchParams = () => { if (!!param) { const optionNameLowerCase = param.toLowerCase(); const optionSearchParams = new URLSearchParams(searchParams.toString()); @@ -27,11 +27,11 @@ export const RemoveFilters = ({ param, value }: IRemoveFilters) => { }; return (
- + {value}
); }; -export default RemoveFilters; +export default ClearFilters; From db3b8ca1be4563bb1f87fe873b94cc746e954d0a Mon Sep 17 00:00:00 2001 From: Connor Campbell Date: Sat, 6 Jan 2024 16:37:04 +0000 Subject: [PATCH 17/30] fix: fix search filter + tweak repo mapping --- data/filters.ts | 829 +++++++++++++++++++++++++++++----------- lib/notion/constants.ts | 180 +++------ lib/notion/index.ts | 29 +- 3 files changed, 670 insertions(+), 368 deletions(-) diff --git a/data/filters.ts b/data/filters.ts index 79f333d..fcfd5c3 100644 --- a/data/filters.ts +++ b/data/filters.ts @@ -1,4 +1,3 @@ - export const LANGUAGES_OPTIONS = [ { value: "Assembly", label: "Assembly", emoji: "🔧" }, // Assembly // { value: "Astro", label: "Astro", emoji: "" }, @@ -102,252 +101,616 @@ export const INTERESTS_OPTIONS = [ ]; export const SEARCH_OPTIONS = [ - { value: "polkadot-sdk", label: "Polkadot Sdk", emoji: "🔗" }, - { value: "OAK-blockchain", label: "Oak Blockchain", emoji: "🌳" }, - { value: "InvArch-Node", label: "Invarch Node", emoji: "🏛️" }, - { value: "phala-blockchain", label: "Phala Blockchain", emoji: "🔒" }, - { value: "talisman", label: "Talisman", emoji: "📿" }, - { value: "t3rn", label: "T3Rn", emoji: "🔄" }, - { value: "automata", label: "Automata", emoji: "🤖" }, - { value: "subspace", label: "Subspace", emoji: "🚀" }, - { value: "mangata-node", label: "Mangata Node", emoji: "🌐" }, - { value: "virto-node", label: "Virto Node", emoji: "🌐" }, - { value: "HydraDX-node", label: "HydraDX Node", emoji: "🌌" }, - { value: "InvArch-Frames", label: "Invarch Frames", emoji: "🖼️" }, - { value: "network/darwinia", label: "Darwinia", emoji: "🌐" }, - { value: "hashed-substrate", label: "Hashed Substrate", emoji: "🔍" }, - { value: "frequency", label: "Frequency", emoji: "📡" }, - { value: "centrifuge-chain", label: "Centrifuge Chain", emoji: "🔄" }, - { value: "subsocial-parachain", label: "Subsocial Parachain", emoji: "🌐" }, - { value: "spacewalk", label: "Spacewalk", emoji: "🚀" }, - { value: "openbrush-contracts", label: "Openbrush Contracts", emoji: "🎨" }, - { value: "kilt-node", label: "Kilt Node", emoji: "🔄" }, - { value: "Manta", label: "Manta", emoji: "🌊" }, - { value: "sora2-parachain", label: "Sora2 Parachain", emoji: "🔄" }, - { value: "tanssi", label: "Tanssi", emoji: "💃" }, - { value: "sora2-network", label: "Sora2 Network", emoji: "🔄" }, - { value: "gear", label: "Gear", emoji: "⚙️" }, - { value: "joystream", label: "Joystream", emoji: "🎮" }, - { value: "peaq-network-node", label: "Peaq Network Node", emoji: "🌐" }, - { value: "zeitgeist", label: "Zeitgeist", emoji: "🕰️" }, - { value: "dock-substrate", label: "Dock Substrate", emoji: "🚢" }, - { value: "ternoa-node", label: "Ternoa Node", emoji: "📦" }, - { value: "chain", label: "Chain", emoji: "⛓️" }, - { value: "bifrost", label: "Bifrost", emoji: "🌈" }, - { value: "imbue", label: "Imbue", emoji: "🌊" }, - { value: "encointer-parachain", label: "Encointer Parachain", emoji: "🔄" }, - { value: "parallel", label: "Parallel", emoji: "🔄" }, - { value: "bitgreen-node", label: "Bitgreen Node", emoji: "🌱" }, - { value: "deeper-chain", label: "Deeper Chain", emoji: "🔄" }, - { value: "crust", label: "Crust", emoji: "🍞" }, - { value: "Acala", label: "Acala", emoji: "♾️" }, - { value: "encointer-node", label: "Encointer Node", emoji: "🔄" }, - { value: "personhood-oracle", label: "Personhood Oracle", emoji: "🔄" }, - { value: "robonomics", label: "Robonomics", emoji: "🤖" }, - { value: "pendulum", label: "Pendulum", emoji: "🕰️" }, - { value: "pallets", label: "Pallets", emoji: "🔄" }, - { value: "worker", label: "Worker", emoji: "🛠️" }, - { value: "Metaverse-Network", label: "Metaverse Network", emoji: "🌐" }, - { value: "gafi", label: "Gafi", emoji: "🔄" }, - { value: "litentry-parachain", label: "Litentry Parachain", emoji: "📜" }, - { value: "Astar", label: "Astar", emoji: "⭐" }, - { value: "interbtc", label: "Interbtc", emoji: "🔄" }, - { value: "aleph-node", label: "Aleph Node", emoji: "🔄" }, - { value: "dotreasury", label: "Dotreasury", emoji: "💼" }, - { value: "subsquare", label: "Subsquare", emoji: "🔄" }, - { value: "xcm-demo", label: "Xcm Demo", emoji: "🔄" }, - { value: "subql", label: "Subql", emoji: "🔍" }, - { value: "squid-sdk", label: "Squid Sdk", emoji: "🦑" }, - { value: "portal", label: "Portal", emoji: "🚪" }, - { value: "imbue-frontend", label: "Imbue Frontend", emoji: "🌐" }, - { value: "oak.js", label: "Oak.Js", emoji: "🌳" }, - { value: "moonbeam", label: "Moonbeam", emoji: "🌙" }, - { value: "tangle", label: "Tangle", emoji: "🌀" }, + { + value: "paritytech/polkadot-sdk", + label: "Polkadot Sdk", + emoji: "🔗", + }, + { + value: "OAK-Foundation/OAK-blockchain", + label: "Oak Blockchain", + emoji: "🌳", + }, + { + value: "InvArch/InvArch-Node", + label: "Invarch Node", + emoji: "🏛️", + }, + { + value: "Phala-Network/phala-blockchain", + label: "Phala Blockchain", + emoji: "🔒", + }, + { value: "TalismanSociety/talisman", label: "Talisman", emoji: "📿" }, + { value: "t3rn/t3rn", label: "T3Rn", emoji: "🔄" }, + { + value: "automata-network/automata", + label: "Automata", + emoji: "🤖", + }, + { value: "subspace/subspace", label: "Subspace", emoji: "🚀" }, + { + value: "mangata-finance/mangata-node", + label: "Mangata Node", + emoji: "🌐", + }, + { + value: "virto-network/virto-node", + label: "Virto Node", + emoji: "🌐", + }, + { + value: "galacticcouncil/HydraDX-node", + label: "HydraDX Node", + emoji: "🌌", + }, + { + value: "InvArch/InvArch-Frames", + label: "Invarch Frames", + emoji: "🖼️", + }, + { + value: "darwinia-network/darwinia", + label: "Darwinia", + emoji: "🌐", + }, + { + value: "hashed-io/hashed-substrate", + label: "Hashed Substrate", + emoji: "🔍", + }, + { value: "LibertyDSNP/frequency", label: "Frequency", emoji: "📡" }, + { + value: "centrifuge/centrifuge-chain", + label: "Centrifuge Chain", + emoji: "🔄", + }, + { + value: "dappforce/subsocial-parachain", + label: "Subsocial Parachain", + emoji: "🌐", + }, + { + value: "pendulum-chain/spacewalk", + label: "Spacewalk", + emoji: "🚀", + }, + { + value: "Brushfam/openbrush-contracts", + label: "Openbrush Contracts", + emoji: "🎨", + }, + { value: "KILTprotocol/kilt-node", label: "Kilt Node", emoji: "🔄" }, + { value: "Manta-Network/Manta", label: "Manta", emoji: "🌊" }, + { + value: "sora-xor/sora2-parachain", + label: "Sora2 Parachain", + emoji: "🔄", + }, + { value: "moondance-labs/tanssi", label: "Tanssi", emoji: "💃" }, + { + value: "sora-xor/sora2-network", + label: "Sora2 Network", + emoji: "🔄", + }, + { value: "gear-tech/gear", label: "Gear", emoji: "⚙️" }, + { value: "Joystream/joystream", label: "Joystream", emoji: "🎮" }, + { + value: "peaqnetwork/peaq-network-node", + label: "Peaq Network Node", + emoji: "🌐", + }, + { value: "zeitgeistpm/zeitgeist", label: "Zeitgeist", emoji: "🕰️" }, + { + value: "docknetwork/dock-substrate", + label: "Dock Substrate", + emoji: "🚢", + }, + { + value: "capsule-corp-ternoa/ternoa-node", + label: "Ternoa Node", + emoji: "📦", + }, + { value: "NodleCode/chain", label: "Chain", emoji: "⛓️" }, + { value: "bifrost-finance/bifrost", label: "Bifrost", emoji: "🌈" }, + { value: "ImbueNetwork/imbue", label: "Imbue", emoji: "🌊" }, + { + value: "encointer/encointer-parachain", + label: "Encointer Parachain", + emoji: "🔄", + }, + { + value: "parallel-finance/parallel", + label: "Parallel", + emoji: "🔄", + }, + { + value: "bitgreen/bitgreen-node", + label: "Bitgreen Node", + emoji: "🌱", + }, + { + value: "deeper-chain/deeper-chain", + label: "Deeper Chain", + emoji: "🔄", + }, + { value: "crustio/crust", label: "Crust", emoji: "🍞" }, + { value: "AcalaNetwork/Acala", label: "Acala", emoji: "♾️" }, + { + value: "encointer/encointer-node", + label: "Encointer Node", + emoji: "🔄", + }, + { + value: "encointer/personhood-oracle", + label: "Personhood Oracle", + emoji: "🔄", + }, + { value: "airalab/robonomics", label: "Robonomics", emoji: "🤖" }, + { value: "pendulum-chain/pendulum", label: "Pendulum", emoji: "🕰️" }, + { value: "encointer/pallets", label: "Pallets", emoji: "🔄" }, + { value: "integritee-network/worker", label: "Worker", emoji: "🛠️" }, + { + value: "bit-country/Metaverse-Network", + label: "Metaverse Network", + emoji: "🌐", + }, + { value: "grindytech/gafi", label: "Gafi", emoji: "🔄" }, + { + value: "litentry/litentry-parachain", + label: "Litentry Parachain", + emoji: "📜", + }, + { value: "AstarNetwork/Astar", label: "Astar", emoji: "⭐" }, + { value: "interlay/interbtc", label: "Interbtc", emoji: "🔄" }, + { + value: "aleph-zero-foundation/aleph-node", + label: "Aleph Node", + emoji: "🔄", + }, + { + value: "opensquare-network/dotreasury", + label: "Dotreasury", + emoji: "💼", + }, + { + value: "opensquare-network/subsquare", + label: "Subsquare", + emoji: "🔄", + }, + { value: "OAK-Foundation/xcm-demo", label: "Xcm Demo", emoji: "🔄" }, + { value: "subquery/subql", label: "Subql", emoji: "🔍" }, + { value: "subsquid/squid-sdk", label: "Squid Sdk", emoji: "🦑" }, + { value: "pendulum-chain/portal", label: "Portal", emoji: "🚪" }, + { + value: "ImbueNetwork/imbue-frontend", + label: "Imbue Frontend", + emoji: "🌐", + }, + { value: "OAK-Foundation/oak.js", label: "Oak.Js", emoji: "🌳" }, + { + value: "moonbeam-foundation/moonbeam", + label: "Moonbeam", + emoji: "🌙", + }, + { value: "webb-tools/tangle", label: "Tangle", emoji: "🌀" }, { value: "bittensor", label: "Bittensor", emoji: "🧠" }, -] +]; + +// export const SEARCH_OPTIONS = [ +// { value: "polkadot-sdk", label: "Polkadot Sdk", emoji: "🔗" }, +// { value: "OAK-blockchain", label: "Oak Blockchain", emoji: "🌳" }, +// { value: "InvArch-Node", label: "Invarch Node", emoji: "🏛️" }, +// { value: "phala-blockchain", label: "Phala Blockchain", emoji: "🔒" }, +// { value: "talisman", label: "Talisman", emoji: "📿" }, +// { value: "t3rn", label: "T3Rn", emoji: "🔄" }, +// { value: "automata", label: "Automata", emoji: "🤖" }, +// { value: "subspace", label: "Subspace", emoji: "🚀" }, +// { value: "mangata-node", label: "Mangata Node", emoji: "🌐" }, +// { value: "virto-node", label: "Virto Node", emoji: "🌐" }, +// { value: "HydraDX-node", label: "HydraDX Node", emoji: "🌌" }, +// { value: "InvArch-Frames", label: "Invarch Frames", emoji: "🖼️" }, +// { value: "network/darwinia", label: "Darwinia", emoji: "🌐" }, +// { value: "hashed-substrate", label: "Hashed Substrate", emoji: "🔍" }, +// { value: "frequency", label: "Frequency", emoji: "📡" }, +// { value: "centrifuge-chain", label: "Centrifuge Chain", emoji: "🔄" }, +// { value: "subsocial-parachain", label: "Subsocial Parachain", emoji: "🌐" }, +// { value: "spacewalk", label: "Spacewalk", emoji: "🚀" }, +// { value: "openbrush-contracts", label: "Openbrush Contracts", emoji: "🎨" }, +// { value: "kilt-node", label: "Kilt Node", emoji: "🔄" }, +// { value: "Manta", label: "Manta", emoji: "🌊" }, +// { value: "sora2-parachain", label: "Sora2 Parachain", emoji: "🔄" }, +// { value: "tanssi", label: "Tanssi", emoji: "💃" }, +// { value: "sora2-network", label: "Sora2 Network", emoji: "🔄" }, +// { value: "gear", label: "Gear", emoji: "⚙️" }, +// { value: "joystream", label: "Joystream", emoji: "🎮" }, +// { value: "peaq-network-node", label: "Peaq Network Node", emoji: "🌐" }, +// { value: "zeitgeist", label: "Zeitgeist", emoji: "🕰️" }, +// { value: "dock-substrate", label: "Dock Substrate", emoji: "🚢" }, +// { value: "ternoa-node", label: "Ternoa Node", emoji: "📦" }, +// { value: "chain", label: "Chain", emoji: "⛓️" }, +// { value: "bifrost", label: "Bifrost", emoji: "🌈" }, +// { value: "imbue", label: "Imbue", emoji: "🌊" }, +// { value: "encointer-parachain", label: "Encointer Parachain", emoji: "🔄" }, +// { value: "parallel", label: "Parallel", emoji: "🔄" }, +// { value: "bitgreen-node", label: "Bitgreen Node", emoji: "🌱" }, +// { value: "deeper-chain", label: "Deeper Chain", emoji: "🔄" }, +// { value: "crust", label: "Crust", emoji: "🍞" }, +// { value: "Acala", label: "Acala", emoji: "♾️" }, +// { value: "encointer-node", label: "Encointer Node", emoji: "🔄" }, +// { value: "personhood-oracle", label: "Personhood Oracle", emoji: "🔄" }, +// { value: "robonomics", label: "Robonomics", emoji: "🤖" }, +// { value: "pendulum", label: "Pendulum", emoji: "🕰️" }, +// { value: "pallets", label: "Pallets", emoji: "🔄" }, +// { value: "worker", label: "Worker", emoji: "🛠️" }, +// { value: "Metaverse-Network", label: "Metaverse Network", emoji: "🌐" }, +// { value: "gafi", label: "Gafi", emoji: "🔄" }, +// { value: "litentry-parachain", label: "Litentry Parachain", emoji: "📜" }, +// { value: "Astar", label: "Astar", emoji: "⭐" }, +// { value: "interbtc", label: "Interbtc", emoji: "🔄" }, +// { value: "aleph-node", label: "Aleph Node", emoji: "🔄" }, +// { value: "dotreasury", label: "Dotreasury", emoji: "💼" }, +// { value: "subsquare", label: "Subsquare", emoji: "🔄" }, +// { value: "xcm-demo", label: "Xcm Demo", emoji: "🔄" }, +// { value: "subql", label: "Subql", emoji: "🔍" }, +// { value: "squid-sdk", label: "Squid Sdk", emoji: "🦑" }, +// { value: "portal", label: "Portal", emoji: "🚪" }, +// { value: "imbue-frontend", label: "Imbue Frontend", emoji: "🌐" }, +// { value: "oak.js", label: "Oak.Js", emoji: "🌳" }, +// { value: "moonbeam", label: "Moonbeam", emoji: "🌙" }, +// { value: "tangle", label: "Tangle", emoji: "🌀" }, +// { value: "bittensor", label: "Bittensor", emoji: "🧠" }, +// ]; type RepositoryList = { [key: string]: string[]; }; export const REPOSITORIES_BY_INTERESTS: RepositoryList = { - "substrate": [ - "InvArch-Node", - "pendulum", - "Metaverse-Network", - "gafi", - "Astar", - "interbtc", - "xcm-demo", - "oak.js", - "moonbeam", - "tangle", - "talisman", - "t3rn", - "polkadot-sdk", - "automata", - "subspace", - "mangata-node", - "virto-node", - "HydraDX-node", - "InvArch-Frames", - "darwinia", - "hashed-substrate", - "frequency", - "OAK-blockchain", - "centrifuge-chain", - "subsocial-parachain", - "spacewalk", - "openbrush-contracts", - "kilt-node", - "Manta", - "sora2-parachain", - "tanssi", - "sora2-network", - "gear", - "joystream", - "dock-substrate", - "ternoa-node", - "bifrost", - "bitgreen-node", - "deeper-chain", - "crust", - "Acala" + substrate: [ + "InvArch/InvArch-Node", + "pendulum-chain/pendulum", + "bit-country/Metaverse-Network", + "grindytech/gafi", + "AstarNetwork/Astar", + "interlay/interbtc", + "OAK-Foundation/xcm-demo", + "OAK-Foundation/oak.js", + "moonbeam-foundation/moonbeam", + "webb-tools/tangle", + "TalismanSociety/talisman", + "t3rn/t3rn", + "paritytech/polkadot-sdk", + "automata-network/automata", + "subspace/subspace", + "mangata-finance/mangata-node", + "virto-network/virto-node", + "galacticcouncil/HydraDX-node", + "InvArch/InvArch-Frames", + "darwinia-network/darwinia", + "hashed-io/hashed-substrate", + "LibertyDSNP/frequency", + "OAK-Foundation/OAK-blockchain", + "centrifuge/centrifuge-chain", + "dappforce/subsocial-parachain", + "pendulum-chain/spacewalk", + "Brushfam/openbrush-contracts", + "KILTprotocol/kilt-node", + "Manta-Network/Manta", + "sora-xor/sora2-parachain", + "moondance-labs/tanssi", + "sora-xor/sora2-network", + "gear-tech/gear", + "Joystream/joystream", + "docknetwork/dock-substrate", + "capsule-corp-ternoa/ternoa-node", + "bifrost-finance/bifrost", + "bitgreen/bitgreen-node", + "deeper-chain/deeper-chain", + "crustio/crust", + "AcalaNetwork/Acala", ], - "polkadot": [ - "InvArch-Node", - "pendulum", - "Metaverse-Network", - "gafi", - "Astar", - "interbtc", - "aleph-node", - "dotreasury", - "subsquare", - "xcm-demo", - "subql", - "squid-sdk", - "portal", - "imbue-frontend", - "oak.js", - "moonbeam", - "talisman", - "polkadot-sdk", - "automata", - "subspace", - "mangata-node", - "virto-node", - "HydraDX-node", - "InvArch-Frames", - "darwinia", - "hashed-substrate", - "frequency", - "OAK-blockchain", - "centrifuge-chain", - "subsocial-parachain", - "spacewalk", - "openbrush-contracts", - "kilt-node", - "Manta", - "sora2-parachain", - "tanssi", - "sora2-network", - "joystream", - "zeitgeist", - "dock-substrate", - "ternoa-node", - "chain", - "bifrost", - "imbue", - "encointer-parachain", - "parallel", - "bitgreen-node", - "deeper-chain", - "crust", - "Acala" + polkadot: [ + "InvArch/InvArch-Node", + "pendulum-chain/pendulum", + "bit-country/Metaverse-Network", + "grindytech/gafi", + "AstarNetwork/Astar", + "interlay/interbtc", + "aleph-zero-foundation/aleph-node", + "opensquare-network/dotreasury", + "opensquare-network/subsquare", + "OAK-Foundation/xcm-demo", + "subquery/subql", + "subsquid/squid-sdk", + "pendulum-chain/portal", + "ImbueNetwork/imbue-frontend", + "OAK-Foundation/oak.js", + "moonbeam-foundation/moonbeam", + "TalismanSociety/talisman", + "paritytech/polkadot-sdk", + "automata-network/automata", + "subspace/subspace", + "mangata-finance/mangata-node", + "virto-network/virto-node", + "galacticcouncil/HydraDX-node", + "InvArch/InvArch-Frames", + "darwinia-network/darwinia", + "hashed-io/hashed-substrate", + "LibertyDSNP/frequency", + "OAK-Foundation/OAK-blockchain", + "centrifuge/centrifuge-chain", + "dappforce/subsocial-parachain", + "pendulum-chain/spacewalk", + "Brushfam/openbrush-contracts", + "KILTprotocol/kilt-node", + "Manta-Network/Manta", + "sora-xor/sora2-parachain", + "moondance-labs/tanssi", + "sora-xor/sora2-network", + "Joystream/joystream", + "zeitgeistpm/zeitgeist", + "docknetwork/dock-substrate", + "capsule-corp-ternoa/ternoa-node", + "NodleCode/chain", + "bifrost-finance/bifrost", + "ImbueNetwork/imbue", + "encointer/encointer-parachain", + "parallel-finance/parallel", + "bitgreen/bitgreen-node", + "deeper-chain/deeper-chain", + "crustio/crust", + "AcalaNetwork/Acala", ], - "kusama": [ - "interbtc", - "dotreasury", - "subsquare", - "sora2-parachain", - "sora2-network", - "parallel", - "encointer-parachain", - "Acala", - "robonomics", - "Astar", - "dotreasury" + kusama: [ + "interlay/interbtc", + "opensquare-network/dotreasury", + "opensquare-network/subsquare", + "sora-xor/sora2-parachain", + "sora-xor/sora2-network", + "parallel-finance/parallel", + "encointer/encointer-parachain", + "AcalaNetwork/Acala", + "airalab/robonomics", + "AstarNetwork/Astar", + "opensquare-network/dotreasury", ], - "evm": [ - "Astar", - "moonbeam", - "darwinia", - "OAK-blockchain", - "mangata-node", - "sora2-network" + evm: [ + "AstarNetwork/Astar", + "moonbeam-foundation/moonbeam", + "darwinia-network/darwinia", + "OAK-Foundation/OAK-blockchain", + "mangata-finance/mangata-node", + "sora-xor/sora2-network", ], - "ethereum": [ - "Astar", - "moonbeam", - "talisman", - "darwinia", - "sora2-network", - "mangata-node" + ethereum: [ + "AstarNetwork/Astar", + "moonbeam-foundation/moonbeam", + "TalismanSociety/talisman", + "darwinia-network/darwinia", + "sora-xor/sora2-network", + "mangata-finance/mangata-node", ], - "defi": [ - "Metaverse-Network", - "gafi", - "Astar", - "interbtc", - "moonbeam", - "talisman", - "sora2-parachain", - "sora2-network", - "bifrost", - "parallel", - "Acala", - "interbtc" + defi: [ + "bit-country/Metaverse-Network", + "grindytech/gafi", + "AstarNetwork/Astar", + "interlay/interbtc", + "moonbeam-foundation/moonbeam", + "TalismanSociety/talisman", + "sora-xor/sora2-parachain", + "sora-xor/sora2-network", + "bifrost-finance/bifrost", + "parallel-finance/parallel", + "AcalaNetwork/Acala", + "interlay/interbtc", ], "smart-contracts": [ - "Metaverse-Network", - "gafi", - "Astar", - "moonbeam", - "talisman", - "t3rn", - "polkadot-sdk", - "subspace", - "mangata-node", - "joystream" + "bit-country/Metaverse-Network", + "grindytech/gafi", + "AstarNetwork/Astar", + "moonbeam-foundation/moonbeam", + "TalismanSociety/talisman", + "t3rn/t3rn", + "paritytech/polkadot-sdk", + "subspace/subspace", + "mangata-finance/mangata-node", + "Joystream/joystream", ], - "cumulus": [ - "pendulum", - "moonbeam", - "polkadot-sdk", - "parallel" + cumulus: [ + "pendulum-chain/pendulum", + "moonbeam-foundation/moonbeam", + "paritytech/polkadot-sdk", + "parallel-finance/parallel", ], - "bitcoin": ["interbtc"], - "bridge": [ - "interbtc", - "Metaverse-Network", - "darwinia", - "bifrost" + bitcoin: ["interlay/interbtc"], + bridge: [ + "interlay/interbtc", + "bit-country/Metaverse-Network", + "darwinia-network/darwinia", + "bifrost-finance/bifrost", ], - "wasm": [ - "pendulum", - "Metaverse-Network", - "moonbeam", - "bifrost", - "parallel" + wasm: [ + "pendulum-chain/pendulum", + "bit-country/Metaverse-Network", + "moonbeam-foundation/moonbeam", + "bifrost-finance/bifrost", + "parallel-finance/parallel", ], - "mev": ["mangata-node"], - "rollup": ["mangata-node"], - "dex": ["HydraDX-node"], - "dao": ["InvArch-Frames"], - "social": ["subsocial-parachain"], - "zero-knowledge": ["tangle", "Manta"], - "iot": ["robonomics"], - "xcm": ["xcm-demo"], - "wallet": ["talisman"], - "ai": ["bittensor"] -} + mev: ["mangata-finance/mangata-node"], + rollup: ["mangata-finance/mangata-node"], + dex: ["galacticcouncil/HydraDX-node"], + dao: ["InvArch/InvArch-Frames"], + social: ["dappforce/subsocial-parachain"], + "zero-knowledge": ["webb-tools/tangle", "Manta-Network/Manta"], + iot: ["airalab/robonomics"], + xcm: ["OAK-Foundation/xcm-demo"], + wallet: ["TalismanSociety/talisman"], + ai: ["bittensor"], +}; + +// export const REPOSITORIES_BY_INTERESTS: RepositoryList = { +// substrate: [ +// "InvArch-Node", +// "pendulum", +// "Metaverse-Network", +// "gafi", +// "Astar", +// "interbtc", +// "xcm-demo", +// "oak.js", +// "moonbeam", +// "tangle", +// "talisman", +// "t3rn", +// "polkadot-sdk", +// "automata", +// "subspace", +// "mangata-node", +// "virto-node", +// "HydraDX-node", +// "InvArch-Frames", +// "darwinia", +// "hashed-substrate", +// "frequency", +// "OAK-blockchain", +// "centrifuge-chain", +// "subsocial-parachain", +// "spacewalk", +// "openbrush-contracts", +// "kilt-node", +// "Manta", +// "sora2-parachain", +// "tanssi", +// "sora2-network", +// "gear", +// "joystream", +// "dock-substrate", +// "ternoa-node", +// "bifrost", +// "bitgreen-node", +// "deeper-chain", +// "crust", +// "Acala", +// ], +// polkadot: [ +// "InvArch-Node", +// "pendulum", +// "Metaverse-Network", +// "gafi", +// "Astar", +// "interbtc", +// "aleph-node", +// "dotreasury", +// "subsquare", +// "xcm-demo", +// "subql", +// "squid-sdk", +// "portal", +// "imbue-frontend", +// "oak.js", +// "moonbeam", +// "talisman", +// "polkadot-sdk", +// "automata", +// "subspace", +// "mangata-node", +// "virto-node", +// "HydraDX-node", +// "InvArch-Frames", +// "darwinia", +// "hashed-substrate", +// "frequency", +// "OAK-blockchain", +// "centrifuge-chain", +// "subsocial-parachain", +// "spacewalk", +// "openbrush-contracts", +// "kilt-node", +// "Manta", +// "sora2-parachain", +// "tanssi", +// "sora2-network", +// "joystream", +// "zeitgeist", +// "dock-substrate", +// "ternoa-node", +// "chain", +// "bifrost", +// "imbue", +// "encointer-parachain", +// "parallel", +// "bitgreen-node", +// "deeper-chain", +// "crust", +// "Acala", +// ], +// kusama: [ +// "interbtc", +// "dotreasury", +// "subsquare", +// "sora2-parachain", +// "sora2-network", +// "parallel", +// "encointer-parachain", +// "Acala", +// "robonomics", +// "Astar", +// "dotreasury", +// ], +// evm: [ +// "Astar", +// "moonbeam", +// "darwinia", +// "OAK-blockchain", +// "mangata-node", +// "sora2-network", +// ], +// ethereum: [ +// "Astar", +// "moonbeam", +// "talisman", +// "darwinia", +// "sora2-network", +// "mangata-node", +// ], +// defi: [ +// "Metaverse-Network", +// "gafi", +// "Astar", +// "interbtc", +// "moonbeam", +// "talisman", +// "sora2-parachain", +// "sora2-network", +// "bifrost", +// "parallel", +// "Acala", +// "interbtc", +// ], +// "smart-contracts": [ +// "Metaverse-Network", +// "gafi", +// "Astar", +// "moonbeam", +// "talisman", +// "t3rn", +// "polkadot-sdk", +// "subspace", +// "mangata-node", +// "joystream", +// ], +// cumulus: ["pendulum", "moonbeam", "polkadot-sdk", "parallel"], +// bitcoin: ["interbtc"], +// bridge: ["interbtc", "Metaverse-Network", "darwinia", "bifrost"], +// wasm: ["pendulum", "Metaverse-Network", "moonbeam", "bifrost", "parallel"], +// mev: ["mangata-node"], +// rollup: ["mangata-node"], +// dex: ["HydraDX-node"], +// dao: ["InvArch-Frames"], +// social: ["subsocial-parachain"], +// "zero-knowledge": ["tangle", "Manta"], +// iot: ["robonomics"], +// xcm: ["xcm-demo"], +// wallet: ["talisman"], +// ai: ["bittensor"], +// }; diff --git a/lib/notion/constants.ts b/lib/notion/constants.ts index 7f2e05d..c74f1df 100644 --- a/lib/notion/constants.ts +++ b/lib/notion/constants.ts @@ -3,124 +3,68 @@ import { ValidSort } from "./types"; export const DATABASE_ID = "bc9fe682dbe04550b121303a2befad8a"; export const REPO_LINK_TO_PAGE_ID_MAP = { - "https://github.com/automata-network/automata": - "094fe93b-27b7-4547-b604-98a700c905e5", - "https://github.com/subspace/subspace": - "0d16a11f-c7e2-4aa9-ae75-d46fe715e26a", - "https://github.com/mangata-finance/mangata-node": - "104823c7-9380-4672-94ee-0accd5772d02", - "https://github.com/virto-network/virto-node": - "179afa85-2631-419a-b2d0-c0db9bfc0750", - "https://github.com/opensquare-network/dotreasury": - "1b8ae28f-a0f5-44d6-8046-d348f791c804", - "https://github.com/galacticcouncil/HydraDX-node": - "247abce9-3946-4e12-803b-255e2d03158a", - "https://github.com/subquery/subql": "252a454a-56e0-4744-965a-fbe00692b0e5", - "https://github.com/InvArch/InvArch-Frames": - "256086e7-3943-4662-a560-a14d023ca565", - "https://github.com/subsquid/squid-sdk": - "2640eb41-4d1c-4d91-9217-10b6da10c5cf", - "https://github.com/darwinia-network/darwinia": - "26412c33-0827-4c50-ab34-cb5e4aa31feb", - "https://github.com/hashed-io/hashed-substrate": - "267341d3-765c-4520-a9a9-784776d02da6", - "https://github.com/pendulum-chain/portal": - "2f3ee721-14fe-4f54-9a4b-fd93e9439c58", - "https://github.com/LibertyDSNP/frequency": - "2f813d2a-6546-448e-b749-6cb10c8b4684", - "https://github.com/OAK-Foundation/OAK-blockchain": - "3913379f-49cb-48bc-ae7c-d73bf6c13f77", - "https://github.com/centrifuge/centrifuge-chain": - "3d8f376a-f6c3-4644-912d-4aec6adb827b", - "https://github.com/dappforce/subsocial-parachain": - "4be6f937-5d13-4b07-a159-521aa96599fd", - "https://github.com/ImbueNetwork/imbue-frontend": - "601f4e3f-33ef-42f4-843e-bd6dfdc7ad1d", - "https://github.com/pendulum-chain/spacewalk": - "63ee19c8-2439-422a-b4e0-4d27cd0daaad", - "https://github.com/Brushfam/openbrush-contracts": - "70bf41c5-f7f9-48be-b6f1-1cbd10f79b1e", - "https://github.com/KILTprotocol/kilt-node": - "71e6763d-5bd0-4eed-8bc9-368b4c0148f3", - "https://github.com/Manta-Network/Manta": - "794a40b3-7eb6-41b0-b46f-ab84d8fcc5ff", - "https://github.com/sora-xor/sora2-parachain": - "7d0a5a1e-15a0-469b-b11e-10cd00226b00", - "https://github.com/moondance-labs/tanssi": - "7d89bfac-aae2-4306-a922-5d9c0ed4707f", - "https://github.com/OAK-Foundation/oak.js": - "7dd9de32-1f6e-4bd0-bae5-79d77cb131ca", - "https://github.com/sora-xor/sora2-network": - "7f447eeb-c416-4dcc-b7fc-4f41394ed09d", - "https://github.com/gear-tech/gear": "84528f03-b3ff-412d-8af6-97468433e5a7", - "https://github.com/Joystream/joystream": - "8c34d6f5-eb40-4d05-a333-075ad9d9df46", - "https://github.com/moonbeam-foundation/moonbeam": - "8ddff70d-b906-4660-ab48-8c3563fe1e49", - "https://github.com/webb-tools/tangle": - "8e76ee24-cbbb-4e89-94fb-4f6cdadb8988", - "https://github.com/peaqnetwork/peaq-network-node": - "8ecb0e53-74a5-44a2-ac79-251bf1c8923c", - "https://github.com/zeitgeistpm/zeitgeist": - "927dab5a-c64d-4225-b1b2-ff46146458f0", - "https://github.com/docknetwork/dock-substrate": - "943ecd57-04b6-4a41-b313-a7f50380870f", - "https://github.com/capsule-corp-ternoa/ternoa-node": - "98d18e95-74df-4535-a1a4-be648b72a41e", - "https://github.com/NodleCode/chain": "992c9a36-65dd-4b5b-8d1c-8d16b1a85b51", - "https://github.com/bifrost-finance/bifrost": - "9a1c18ea-be2e-49f0-886d-912a2f983170", - "https://github.com/ImbueNetwork/imbue": - "9a329a5b-f0df-43bc-aefd-d2491313aab9", - "https://github.com/TalismanSociety/talisman": - "9e63c326-3e9d-4d41-a7d1-5b36a986f746", - "https://github.com/encointer/encointer-parachain": - "a0706249-3918-44d4-838e-68b742cedb89", - "https://github.com/parallel-finance/parallel": - "a2f2fdbf-9903-4676-9d4b-14beb4d79ca4", - "https://github.com/bitgreen/bitgreen-node": - "a85f6556-99c6-47d9-ad21-6950fa9dc57c", - "https://github.com/opentensor/bittensor": - "ae3161b1-6ec7-4a7e-9f4b-026be1ed0282", - "https://github.com/deeper-chain/deeper-chain": - "af4b75c9-6a4f-452d-979c-3b954683a17d", - "https://github.com/t3rn/t3rn": "af89c412-b69f-4437-a6a0-cdf80070a4a9", - "https://github.com/crustio/crust": "b7d9b901-1529-4d44-b2bc-fe9ad1481f61", - "https://github.com/AcalaNetwork/Acala": - "bdb953d9-c4a3-4340-b62f-d79c35dfb36a", - "https://github.com/InvArch/InvArch-Node": - "c1d08eca-419a-41d0-9e13-4ff77c3daa84", - "https://github.com/Phala-Network/phala-blockchain": - "c2121346-154a-46d5-8aab-b3ca09d0ba96", - "https://github.com/encointer/encointer-node": - "ca0085d5-2c38-4fda-84c2-6294e1415414", - "https://github.com/opensquare-network/subsquare": - "ce541040-c2a1-40e1-ab90-193e5f3d0ae0", - "https://github.com/encointer/personhood-oracle": - "cf75d097-40d2-4f89-a5d1-f57b5fc721f2", - "https://github.com/airalab/robonomics": - "d215802e-377c-467a-90db-9144cc5368c7", - "https://github.com/pendulum-chain/pendulum": - "d3ca21a3-cabc-4dde-a63c-be1a5ab5687b", - "https://github.com/encointer/pallets": - "da578f24-d13e-4294-b8b7-b752adfaac22", - "https://github.com/integritee-network/worker": - "dd2da285-139a-4d39-bbef-89188acae91e", - "https://github.com/OAK-Foundation/xcm-demo": - "e1c4d97b-a60a-4b86-8592-08e0bc72a555", - "https://github.com/bit-country/Metaverse-Network": - "e6d8a01c-5f41-4b3a-99ac-2e8ae274f476", - "https://github.com/grindytech/gafi": "ecc13454-c074-4b81-9d98-c3cb15d48d8a", - "https://github.com/paritytech/polkadot-sdk": - "f149aef9-2669-4f93-97cc-848da31be521", - "https://github.com/litentry/litentry-parachain": - "f4684d74-d632-4301-b76f-2da40798d71b", - "https://github.com/AstarNetwork/Astar": - "f7e6066b-2424-4a46-b720-b82b62553b09", - "https://github.com/interlay/interbtc": - "f92c9d2d-58c0-4fcf-9ca4-fb637da54ecb", - "https://github.com/aleph-zero-foundation/aleph-node": - "fc87cecc-505c-40cb-bf10-9235830b4a33", + "automata-network/automata": "094fe93b-27b7-4547-b604-98a700c905e5", + "subspace/subspace": "0d16a11f-c7e2-4aa9-ae75-d46fe715e26a", + "mangata-finance/mangata-node": "104823c7-9380-4672-94ee-0accd5772d02", + "virto-network/virto-node": "179afa85-2631-419a-b2d0-c0db9bfc0750", + "opensquare-network/dotreasury": "1b8ae28f-a0f5-44d6-8046-d348f791c804", + "galacticcouncil/HydraDX-node": "247abce9-3946-4e12-803b-255e2d03158a", + "subquery/subql": "252a454a-56e0-4744-965a-fbe00692b0e5", + "InvArch/InvArch-Frames": "256086e7-3943-4662-a560-a14d023ca565", + "subsquid/squid-sdk": "2640eb41-4d1c-4d91-9217-10b6da10c5cf", + "darwinia-network/darwinia": "26412c33-0827-4c50-ab34-cb5e4aa31feb", + "hashed-io/hashed-substrate": "267341d3-765c-4520-a9a9-784776d02da6", + "pendulum-chain/portal": "2f3ee721-14fe-4f54-9a4b-fd93e9439c58", + "LibertyDSNP/frequency": "2f813d2a-6546-448e-b749-6cb10c8b4684", + "OAK-Foundation/OAK-blockchain": "3913379f-49cb-48bc-ae7c-d73bf6c13f77", + "centrifuge/centrifuge-chain": "3d8f376a-f6c3-4644-912d-4aec6adb827b", + "dappforce/subsocial-parachain": "4be6f937-5d13-4b07-a159-521aa96599fd", + "ImbueNetwork/imbue-frontend": "601f4e3f-33ef-42f4-843e-bd6dfdc7ad1d", + "pendulum-chain/spacewalk": "63ee19c8-2439-422a-b4e0-4d27cd0daaad", + "Brushfam/openbrush-contracts": "70bf41c5-f7f9-48be-b6f1-1cbd10f79b1e", + "KILTprotocol/kilt-node": "71e6763d-5bd0-4eed-8bc9-368b4c0148f3", + "Manta-Network/Manta": "794a40b3-7eb6-41b0-b46f-ab84d8fcc5ff", + "sora-xor/sora2-parachain": "7d0a5a1e-15a0-469b-b11e-10cd00226b00", + "moondance-labs/tanssi": "7d89bfac-aae2-4306-a922-5d9c0ed4707f", + "OAK-Foundation/oak.js": "7dd9de32-1f6e-4bd0-bae5-79d77cb131ca", + "sora-xor/sora2-network": "7f447eeb-c416-4dcc-b7fc-4f41394ed09d", + "gear-tech/gear": "84528f03-b3ff-412d-8af6-97468433e5a7", + "Joystream/joystream": "8c34d6f5-eb40-4d05-a333-075ad9d9df46", + "moonbeam-foundation/moonbeam": "8ddff70d-b906-4660-ab48-8c3563fe1e49", + "webb-tools/tangle": "8e76ee24-cbbb-4e89-94fb-4f6cdadb8988", + "peaqnetwork/peaq-network-node": "8ecb0e53-74a5-44a2-ac79-251bf1c8923c", + "zeitgeistpm/zeitgeist": "927dab5a-c64d-4225-b1b2-ff46146458f0", + "docknetwork/dock-substrate": "943ecd57-04b6-4a41-b313-a7f50380870f", + "capsule-corp-ternoa/ternoa-node": "98d18e95-74df-4535-a1a4-be648b72a41e", + "NodleCode/chain": "992c9a36-65dd-4b5b-8d1c-8d16b1a85b51", + "bifrost-finance/bifrost": "9a1c18ea-be2e-49f0-886d-912a2f983170", + "ImbueNetwork/imbue": "9a329a5b-f0df-43bc-aefd-d2491313aab9", + "TalismanSociety/talisman": "9e63c326-3e9d-4d41-a7d1-5b36a986f746", + "encointer/encointer-parachain": "a0706249-3918-44d4-838e-68b742cedb89", + "parallel-finance/parallel": "a2f2fdbf-9903-4676-9d4b-14beb4d79ca4", + "bitgreen/bitgreen-node": "a85f6556-99c6-47d9-ad21-6950fa9dc57c", + "opentensor/bittensor": "ae3161b1-6ec7-4a7e-9f4b-026be1ed0282", + "deeper-chain/deeper-chain": "af4b75c9-6a4f-452d-979c-3b954683a17d", + "t3rn/t3rn": "af89c412-b69f-4437-a6a0-cdf80070a4a9", + "crustio/crust": "b7d9b901-1529-4d44-b2bc-fe9ad1481f61", + "AcalaNetwork/Acala": "bdb953d9-c4a3-4340-b62f-d79c35dfb36a", + "InvArch/InvArch-Node": "c1d08eca-419a-41d0-9e13-4ff77c3daa84", + "Phala-Network/phala-blockchain": "c2121346-154a-46d5-8aab-b3ca09d0ba96", + "encointer/encointer-node": "ca0085d5-2c38-4fda-84c2-6294e1415414", + "opensquare-network/subsquare": "ce541040-c2a1-40e1-ab90-193e5f3d0ae0", + "encointer/personhood-oracle": "cf75d097-40d2-4f89-a5d1-f57b5fc721f2", + "airalab/robonomics": "d215802e-377c-467a-90db-9144cc5368c7", + "pendulum-chain/pendulum": "d3ca21a3-cabc-4dde-a63c-be1a5ab5687b", + "encointer/pallets": "da578f24-d13e-4294-b8b7-b752adfaac22", + "integritee-network/worker": "dd2da285-139a-4d39-bbef-89188acae91e", + "OAK-Foundation/xcm-demo": "e1c4d97b-a60a-4b86-8592-08e0bc72a555", + "bit-country/Metaverse-Network": "e6d8a01c-5f41-4b3a-99ac-2e8ae274f476", + "grindytech/gafi": "ecc13454-c074-4b81-9d98-c3cb15d48d8a", + "paritytech/polkadot-sdk": "f149aef9-2669-4f93-97cc-848da31be521", + "litentry/litentry-parachain": "f4684d74-d632-4301-b76f-2da40798d71b", + "AstarNetwork/Astar": "f7e6066b-2424-4a46-b720-b82b62553b09", + "interlay/interbtc": "f92c9d2d-58c0-4fcf-9ca4-fb637da54ecb", + "aleph-zero-foundation/aleph-node": "fc87cecc-505c-40cb-bf10-9235830b4a33", } as const; export const FIELDNAME_TO_PROPERTY_ID_MAP = { diff --git a/lib/notion/index.ts b/lib/notion/index.ts index dcd0bbb..824854c 100644 --- a/lib/notion/index.ts +++ b/lib/notion/index.ts @@ -275,7 +275,11 @@ export async function createRepoMap() { return out; } -export async function createFilter(languages: string, search: string, interests: string[]) { +export async function createFilter( + languages: string, + search: string, + interests: string[], +) { if (!languages && !search && !interests) { // If all parameters are undefined, return undefined return undefined; @@ -299,13 +303,9 @@ export async function createFilter(languages: string, search: string, interests: if (search) { // If search is defined, create a filter for Project Name filters.push({ - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: search, - }, - }, + property: "Github Repo", + relation: { + contains: REPO_LINK_TO_PAGE_ID_MAP[search as ValidRepositoryLink], }, }); } @@ -313,19 +313,14 @@ export async function createFilter(languages: string, search: string, interests: // If interests is defined and not empty, create a filter for Interests using "or" filters.push({ or: interests.map((interest) => ({ - property: "Project Name", - rollup: { - any: { - rich_text: { - contains: interest, - }, - }, + property: "Github Repo", + relation: { + contains: REPO_LINK_TO_PAGE_ID_MAP[search as ValidRepositoryLink], }, })), }); } - if (filters.length === 1) { // If there's only one filter, return it directly return filters[0]; @@ -336,4 +331,4 @@ export async function createFilter(languages: string, search: string, interests: }; } } -} \ No newline at end of file +} From 52723f288bdec443d8c5cd542d216fe50638aa21 Mon Sep 17 00:00:00 2001 From: Igor Papandinas Date: Sun, 7 Jan 2024 14:31:26 +0100 Subject: [PATCH 18/30] feat: Filters controlled logic handle from useFilters hook --- components/filters/clear-filters.tsx | 4 +- components/filters/select-filter.tsx | 73 +++++++++++++--------------- components/filters/toolbar.tsx | 47 ++++++++++++++++++ hooks/useFilters.tsx | 42 ++++++++++++++++ types/filters.ts | 6 ++- 5 files changed, 130 insertions(+), 42 deletions(-) create mode 100644 components/filters/toolbar.tsx create mode 100644 hooks/useFilters.tsx diff --git a/components/filters/clear-filters.tsx b/components/filters/clear-filters.tsx index 3cc2d18..eac6f7d 100644 --- a/components/filters/clear-filters.tsx +++ b/components/filters/clear-filters.tsx @@ -8,9 +8,10 @@ import { createUrl } from "@/utils/url"; interface IClearFilters { param?: string; value: string; + onClear: () => void; } -export const ClearFilters = ({ param, value }: IClearFilters) => { +export const ClearFilters = ({ param, value, onClear }: IClearFilters) => { const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); @@ -24,6 +25,7 @@ export const ClearFilters = ({ param, value }: IClearFilters) => { } else { router.replace(pathname); } + onClear(); }; return (
diff --git a/components/filters/select-filter.tsx b/components/filters/select-filter.tsx index 67c5a20..58310ca 100644 --- a/components/filters/select-filter.tsx +++ b/components/filters/select-filter.tsx @@ -1,70 +1,63 @@ "use client"; -import React, { useEffect } from "react"; +import React from "react"; import { usePathname, useSearchParams } from "next/navigation"; import { useRouter } from "next/navigation"; import { Select, SelectItem } from "@nextui-org/select"; -import { FilterItem } from "@/types/filters"; +import { FilterOption } from "@/types/filters"; import { createUrl } from "@/utils/url"; import Emoji from "../emoji"; interface ISelectFilterProps { placeholder: string; - emoji: string; - items: FilterItem[]; - selectedValue: string; + mainEmoji: string; + options: FilterOption[]; + selectedKey?: string; + onSelect: (value: string) => void; } export const SelectFilter = ({ placeholder, - items, - emoji, - selectedValue, + mainEmoji, + options, + selectedKey, + onSelect, }: ISelectFilterProps) => { - const [value, setValue] = React.useState(selectedValue); - const router = useRouter(); const pathname = usePathname(); const searchParams = useSearchParams(); - useEffect(() => { - setValue(selectedValue); - }, [selectedValue]); - - useEffect(() => { - if (value === undefined) { - return; - } - const optionNameLowerCase = placeholder.toLowerCase(); - const optionSearchParams = new URLSearchParams(searchParams.toString()); - optionSearchParams.set(optionNameLowerCase, value); - const optionUrl = createUrl(pathname, optionSearchParams); - router.replace(optionUrl, { scroll: false }); - }, [value]); - - const handleSelectionChange = (e: { - target: { value: React.SetStateAction }; - }) => { - setValue(e.target.value); + const handleSelectionChange = (selection: unknown) => { + const selectedValue = Array.from(selection as Iterable)[0]; + onSelect(selectedValue); }; return ( } + endContent={selectedKey && } selectedKeys={selectedKey ? new Set([selectedKey]) : new Set()} onSelectionChange={handleSelectionChange} > diff --git a/components/filters/toolbar.tsx b/components/filters/toolbar.tsx index 2a12b3f..60caefc 100644 --- a/components/filters/toolbar.tsx +++ b/components/filters/toolbar.tsx @@ -57,25 +57,10 @@ const Toolbar = ({ searchParams }: IToolbarProps) => { />
- { - numberOfFilters > 0 && -
+ {numberOfFilters > 1 && ( + + )} - {searchParams?.languages && ( - - )} - {searchParams?.interests && ( - - )} - {searchParams?.projects && ( - - )} - {numberOfFilters > 1 && ( - - )} -
- - } ); };