diff --git a/context/AppContext.tsx b/context/AppContext.tsx new file mode 100644 index 000000000000..696c2ae6f2db --- /dev/null +++ b/context/AppContext.tsx @@ -0,0 +1,4 @@ +import { createContext } from 'react'; +import { AppContextType } from '@/types/context/AppContext'; + +export default createContext({ path: "" }); diff --git a/context/BlogContext.tsx b/context/BlogContext.tsx new file mode 100644 index 000000000000..9a7a6d1306c2 --- /dev/null +++ b/context/BlogContext.tsx @@ -0,0 +1,4 @@ +import { createContext } from 'react'; +import { IDocs } from '@/types/post'; + +export default createContext([]); diff --git a/context/DocsContext.tsx b/context/DocsContext.tsx new file mode 100644 index 000000000000..9cd8ae27a502 --- /dev/null +++ b/context/DocsContext.tsx @@ -0,0 +1,9 @@ +import { createContext } from 'react'; +import { DocsContextType } from '@/types/context/DocsContext'; + +const initialDocsContext: DocsContextType = { + post: [], + navItems: {}, +}; + +export default createContext(initialDocsContext); diff --git a/context/GenericPostContext.tsx b/context/GenericPostContext.tsx new file mode 100644 index 000000000000..9a7a6d1306c2 --- /dev/null +++ b/context/GenericPostContext.tsx @@ -0,0 +1,4 @@ +import { createContext } from 'react'; +import { IDocs } from '@/types/post'; + +export default createContext([]); diff --git a/context/ToolFilterContext.tsx b/context/ToolFilterContext.tsx new file mode 100644 index 000000000000..5bee1a20da2f --- /dev/null +++ b/context/ToolFilterContext.tsx @@ -0,0 +1,50 @@ +import { useRouter } from 'next/router'; +import { createContext, useEffect, useState } from 'react'; + +interface ToolFilterContextProps { + isPaid: string; + isAsyncAPIOwner: boolean; + languages: string[]; + technologies: string[]; + categories: string[]; +} + +export const ToolFilterContext = createContext({ + isPaid: "all", + isAsyncAPIOwner: false, + languages: [], + technologies: [], + categories: [], +}); + +function ToolFilter({ children }: { children: React.ReactNode }) { + const router = useRouter(); + const [isPaid, setIsPaid] = useState("all"); + const [isAsyncAPIOwner, setIsAsyncAPIOwner] = useState(false); + const [languages, setLanguages] = useState([]); + const [technologies, setTechnologies] = useState([]); + const [categories, setCategories] = useState([]); + + // useEffect has been used to apply filters to the tool on each change of router query + useEffect(() => { + if (!router || !router.isReady) return; + + let { pricing, owned, langs, techs, categories } = router.query; + + setIsPaid(pricing as string || "all"); + setIsAsyncAPIOwner(owned === "true"); + setLanguages((langs as string)?.split(",") || []); + setTechnologies((techs as string)?.split(",") || []); + setCategories((categories as string)?.split(",") || []); + }, [router?.query]); + + return ( + + {children} + + ); +} + +export default ToolFilter; diff --git a/types/context/AppContext.ts b/types/context/AppContext.ts new file mode 100644 index 000000000000..9696f7490ced --- /dev/null +++ b/types/context/AppContext.ts @@ -0,0 +1,3 @@ +export interface AppContextType { + path: string; +} \ No newline at end of file diff --git a/types/context/DocsContext.ts b/types/context/DocsContext.ts new file mode 100644 index 000000000000..12199cd61ea2 --- /dev/null +++ b/types/context/DocsContext.ts @@ -0,0 +1,14 @@ +import { IDocs } from "../post"; + +export interface NavigationItem { + title: string; +} + +export interface NavigationItems { + [key: string]: NavigationItem; +} + +export interface DocsContextType { + post: IDocs; + navItems: NavigationItems; +} \ No newline at end of file