diff --git a/package.json b/package.json index 5385ec27..9c77b397 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ }, "dependencies": { "@next/font": "^13.1.1", + "@orama/orama": "^2.0.0-beta.10", "@tailwindcss/line-clamp": "^0.4.2", "@tailwindcss/typography": "^0.5.8", "autoprefixer": "^10.4.13", diff --git a/src/components/ActiveMembers.js b/src/components/ActiveMembers.js index 2991915f..f0dd4c73 100644 --- a/src/components/ActiveMembers.js +++ b/src/components/ActiveMembers.js @@ -1,24 +1,38 @@ -import React, { useState } from "react" +import React, { useContext, useState } from "react" + +import { OramaContext } from "context/OramaProvider" import GetActivemembers from "components/GetActivemembers" import Users from "components/Users" // import contributors data import activeMembers from "data/activemembers" import Title from "components/Title" -import { FilterUsers } from "utils/filterUsers" const ActiveMembers = () => { + const { searchDatabase } = useContext(OramaContext) + // state for currentUsers const [currentUsers, setCurrentUsers] = useState(activeMembers) - // filter handler - const searchHandler = (event) => { + // Search handler + const searchHandler = async(event) => { event.preventDefault() - const filterdUsers = FilterUsers( - activeMembers, - event.target.value, - ) - setCurrentUsers(filterdUsers) + + const value = event.target.value + + try { + const results = await searchDatabase( + value + ? { + term: value, + } + : null, + ) + + setCurrentUsers(results) + } catch (error) { + setCurrentUsers([]) + } } const [tab] = useState("Active Members") @@ -50,17 +64,21 @@ const ActiveMembers = () => { - {currentUsers.length - ?
- {tab === "Active Members" - ? ( + {currentUsers.length + ? ( +
+ {tab === "Active Members" + ? ( - ) - : ( + ) + : ( - )} -
- :

User does not exist!

} + )} +
+ ) + : ( +

User does not exist!

+ )} ) diff --git a/src/components/Staff.js b/src/components/Staff.js index 97f12d2a..1f0d3651 100644 --- a/src/components/Staff.js +++ b/src/components/Staff.js @@ -1,23 +1,41 @@ -import React, { useState } from "react" +import React, { useContext, useState } from "react" +import { OramaContext } from "context/OramaProvider" + import GetStaff from "components/GetStaff" import Users from "components/Users" // import staff data import staff from "data/staff" import Title from "components/Title" -import { FilterUsersByNameAndDesc } from "utils/filterUsers" const Staff = () => { + const { searchDatabase } = useContext(OramaContext) + const [tab] = useState("Staff") // state for currentUsers const [currentUsers, setCurrentUsers] = useState(staff) - // filter handler - const searchHandler = (event) => { + // Search handler + const searchHandler = async(event) => { event.preventDefault() - const filterdUsers = FilterUsersByNameAndDesc(staff, event.target.value) - setCurrentUsers(filterdUsers) + + const value = event.target.value + + try { + const results = await searchDatabase( + value + ? { + term: value, + } + : null, + ) + + setCurrentUsers(results) + } catch (error) { + setCurrentUsers([]) + } } + return (
diff --git a/src/context/OramaProvider.js b/src/context/OramaProvider.js new file mode 100644 index 00000000..29c7ae1a --- /dev/null +++ b/src/context/OramaProvider.js @@ -0,0 +1,51 @@ +import React, { createContext, useCallback, useEffect, useMemo, useState } from "react" +import { create, insertMultiple, search } from "@orama/orama" + +export const OramaContext = createContext(null) + +export const OramaProvider = ({ children, schema, initialData }) => { + const [db, setDb] = useState(null) + + useEffect(() => { + const init = async() => { + const database = await create({ + schema, + }) + + setDb(database) + + await insertMultiple(database, initialData) + } + + init() + }, [schema, initialData]) + + const searchDatabase = useCallback( + async(term) => { + if (!db) return null + + if (term) { + const searchResult = await search(db, term) + + const documents = searchResult.hits.map( + (result) => result.document, + ) + + return documents + } else { + const allDocuments = Object.values(db?.data?.docs?.docs) + + return allDocuments + } + }, + [db], + ) + + const value = useMemo(() => ({ searchDatabase }), [searchDatabase]) + + return ( + + {children} + + ) +} diff --git a/src/context/schemas/activemembersSchema.js b/src/context/schemas/activemembersSchema.js new file mode 100644 index 00000000..614ce809 --- /dev/null +++ b/src/context/schemas/activemembersSchema.js @@ -0,0 +1,17 @@ +const activemembersSchema = { + name: "string", + avatar: { + blurDataURL: "string", + blurHeight: "number", + blurWidth: "number", + height: "number", + src: "string", + width: "number", + }, + github: "string", + twitter: "string", + blogUrl: "string", + linkedin: "string", +} + +export default activemembersSchema diff --git a/src/context/schemas/staffmembersSchema.js b/src/context/schemas/staffmembersSchema.js new file mode 100644 index 00000000..4735e16b --- /dev/null +++ b/src/context/schemas/staffmembersSchema.js @@ -0,0 +1,18 @@ +const staffmembersSchema = { + name: "string", + avatar: { + blurDataURL: "string", + blurHeight: "number", + blurWidth: "number", + height: "number", + src: "string", + width: "number", + }, + github: "string", + description: "string", + twitter: "string", + blogUrl: "string", + linkedin: "string", +} + +export default staffmembersSchema diff --git a/src/data/activemembers.js b/src/data/activemembers.js index 6a398f0b..cb86984a 100644 --- a/src/data/activemembers.js +++ b/src/data/activemembers.js @@ -154,7 +154,7 @@ const base = [ name: "Posandu Mapa", avatar: PosanduAvatar, github: "Posandu", - twitter: null, + twitter: "", blogUrl: "https://www.tronic247.com", contributions: 3, }, @@ -198,7 +198,7 @@ const base = [ twitter: "devvsakib", blogUrl: "https://devvsakib.me", linkedin: "devvsakib", - contributions: null, + contributions: 0, }, { name: "Ctofanin", @@ -207,7 +207,7 @@ const base = [ twitter: "ctoffaninDev", blogUrl: "", linkedin: "", - contributions: null, + contributions: 0, }, { name: "Haider Ali Punjabi", @@ -225,7 +225,7 @@ const base = [ twitter: "krshkun", blogUrl: "https://links.krsh.eu.org", linkedin: "krshkun", - contributions: null, + contributions: 0, }, ].sort((a, b) => (a.name > b.name ? 1 : -1)) diff --git a/src/pages/_app.js b/src/pages/_app.js index 8b1e3cb9..329b7a3e 100644 --- a/src/pages/_app.js +++ b/src/pages/_app.js @@ -45,13 +45,10 @@ export default function App({ Component, pageProps }) { - window.scrollTo(0, 0)} - > - + window.scrollTo(0, 0)}> + - +
) } diff --git a/src/pages/active-members.js b/src/pages/active-members.js index 4f4ee220..98097e86 100644 --- a/src/pages/active-members.js +++ b/src/pages/active-members.js @@ -1,10 +1,15 @@ import Layout from "components/Layout" import ActiveMembers from "components/ActiveMembers" +import { OramaProvider } from "context/OramaProvider" +import activeMembers from "data/activemembers" +import activemembersSchema from "context/schemas/activemembersSchema" export default function Home() { return ( - - - + + + + + ) } diff --git a/src/pages/staff.js b/src/pages/staff.js index 9db1d008..a0ab8f9c 100644 --- a/src/pages/staff.js +++ b/src/pages/staff.js @@ -1,10 +1,15 @@ import Layout from "components/Layout" import Staff from "components/Staff" +import { OramaProvider } from "context/OramaProvider" +import staffmembersSchema from "context/schemas/staffmembersSchema" +import staff from "data/staff" export default function Home() { return ( - - - + + + + + ) } diff --git a/yarn.lock b/yarn.lock index 534c5f77..59ce580b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -902,6 +902,11 @@ resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz" integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== +"@orama/orama@^2.0.0-beta.10": + version "2.0.0-beta.12" + resolved "https://registry.npmjs.org/@orama/orama/-/orama-2.0.0-beta.12.tgz" + integrity sha512-svPT72gxR1zyF7bMz+itmZBdZB1ndI97YdzArCqo5esIfWy1u5Ht/K8EEYJ/EuC35Di3j9czjCzhL1e/zVEARQ== + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz"