From 44b2298be598bd096a36256f1fca1b7c4bf33680 Mon Sep 17 00:00:00 2001 From: thaleous <99901847+karim-mev@users.noreply.github.com> Date: Sat, 30 Mar 2024 21:53:14 +0200 Subject: [PATCH] Feature/projects (#15) * add project-page UI * update icons source to react-icon * fix(mock): updated mock getMock * delete project-page * update project page * update (proejcts): changed some styling * fix(projects): added tags * wip(filterstore): projects filterstore wip * feat(projects): projects overview and global filtering * fix(filterstore): updated filterstore with filterobject * wip(filterscreen): added filterscreen in the interactive projects overview * fix(filters): updated filters through ui * wip(filtersidebar): changed sidebar filter to use react-hook-form and no more localstate * fix(filters): updated filters in projects with new filterscreen * fix(filtering): adjusted reset filter states * fix(scroll): added scrolling bar in projects overview and tags in legend based on maintag --------- Co-authored-by: Haxfx --- app/(app)/ecosystem/ChartSkeleton.tsx | 4 +- app/(app)/ecosystem/RelationsChart.tsx | 8 +- app/(app)/ecosystem/RelationsContainer.tsx | 12 +- app/(app)/projects/ProjectsFilter.tsx | 89 +++++ app/(app)/projects/TagFilter.tsx | 26 ++ app/(app)/projects/page.tsx | 37 +- app/globals.css | 12 +- bun.lockb | Bin 367645 -> 415049 bytes .../Chart/entities/Canvas/behaviours/zoom.ts | 6 +- components/d3/Chart/entities/Simulation.ts | 2 +- .../d3/Chart/hooks/useRelationChartManager.ts | 4 +- .../d3/Chart/hooks/useRelationChartState.ts | 2 +- .../d3/Chart/ui/DetailScreen/DetailScreen.tsx | 15 +- components/d3/Chart/ui/Legend/Legend.tsx | 19 +- components/d3/Chart/ui/constants.ts | 2 +- components/filter/CheckboxItem.tsx | 44 +++ components/filter/FilterFormField.tsx | 77 ++++ components/filter/FilterScreen.tsx | 143 +++++++ components/filter/index.ts | 1 + components/header.tsx | 2 +- components/navigation/navigation.tsx | 6 +- components/project-card.tsx | 5 +- components/spinner.tsx | 9 + components/ui/checkbox.tsx | 6 +- components/ui/collapsible.tsx | 11 + components/ui/sheet.tsx | 140 +++++++ ...t_zero.sql => 0000_moaning_hammerhead.sql} | 2 +- .../migrations/0001_loving_blue_shield.sql | 1 - database/migrations/meta/0000_snapshot.json | 4 +- database/migrations/meta/0001_snapshot.json | 348 ------------------ database/migrations/meta/_journal.json | 4 +- database/schemas/auth.schema.ts | 1 - database/schemas/projects.schema.ts | 8 + mocks/projects.mocks.ts | 14 +- mocks/tags.mock.ts | 31 ++ package.json | 1 + stores/project-filter-store.tsx | 76 ++++ 37 files changed, 758 insertions(+), 414 deletions(-) create mode 100644 app/(app)/projects/ProjectsFilter.tsx create mode 100644 app/(app)/projects/TagFilter.tsx create mode 100644 components/filter/CheckboxItem.tsx create mode 100644 components/filter/FilterFormField.tsx create mode 100644 components/filter/FilterScreen.tsx create mode 100644 components/filter/index.ts create mode 100644 components/spinner.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/sheet.tsx rename database/migrations/{0000_jazzy_agent_zero.sql => 0000_moaning_hammerhead.sql} (99%) delete mode 100644 database/migrations/0001_loving_blue_shield.sql delete mode 100644 database/migrations/meta/0001_snapshot.json create mode 100644 mocks/tags.mock.ts create mode 100644 stores/project-filter-store.tsx diff --git a/app/(app)/ecosystem/ChartSkeleton.tsx b/app/(app)/ecosystem/ChartSkeleton.tsx index 1cabc53..ebda74e 100644 --- a/app/(app)/ecosystem/ChartSkeleton.tsx +++ b/app/(app)/ecosystem/ChartSkeleton.tsx @@ -1,9 +1,7 @@ export const ChartSkeleton = () => { return (
-

- With a large amount of nodes it might take time for the graph to load. -

+

Loading the visualization of projects in the SEI Ecosystem

) } diff --git a/app/(app)/ecosystem/RelationsChart.tsx b/app/(app)/ecosystem/RelationsChart.tsx index 3a19bb8..b9ac677 100644 --- a/app/(app)/ecosystem/RelationsChart.tsx +++ b/app/(app)/ecosystem/RelationsChart.tsx @@ -3,6 +3,7 @@ import { DetailScreen, useRelationChartState } from "@/components/d3" import { Project } from "@/database/schemas/projects.schema" +import { FilterScreen } from "@/components/filter" import ChartWrapper from "./ChartWrapper" export type TProps = { @@ -15,12 +16,15 @@ const RelationsChart = ({ nodes, loading }: TProps) => { return (
+ {chart! && ( + <> + + + )} {chart! && ( <> - {/* */} - {/* */} )}
diff --git a/app/(app)/ecosystem/RelationsContainer.tsx b/app/(app)/ecosystem/RelationsContainer.tsx index 2a9c713..931ab2d 100644 --- a/app/(app)/ecosystem/RelationsContainer.tsx +++ b/app/(app)/ecosystem/RelationsContainer.tsx @@ -1,17 +1,23 @@ +"use client" + import React, { Suspense } from "react" import { mockProjects } from "@/mocks/projects.mocks" +import { useFilterStore } from "@/stores/project-filter-store" import { ChartSkeleton } from "./ChartSkeleton" import RelationsChart from "./RelationsChart" export const RelationsContainer = () => { - const generateMockData2 = mockProjects(100) + const { projects, filteredProjects, setProjects } = useFilterStore() + if (projects.length === 0) { + setProjects(mockProjects(100)) + } const [nodes] = React.useMemo(() => { - const nodes = generateMockData2 + const nodes = filteredProjects return [nodes] as const - }, [generateMockData2]) + }, [filteredProjects]) return ( }> diff --git a/app/(app)/projects/ProjectsFilter.tsx b/app/(app)/projects/ProjectsFilter.tsx new file mode 100644 index 0000000..be8bf71 --- /dev/null +++ b/app/(app)/projects/ProjectsFilter.tsx @@ -0,0 +1,89 @@ +"use client" + +import { FilterScreen } from "@/components/filter" +import Spinner from "@/components/spinner" +import { AspectRatio } from "@/components/ui/aspect-ratio" +import { Project } from "@/database/schemas/projects.schema" +import { useFilterStore } from "@/stores/project-filter-store" +import Image from "next/image" +import Link from "next/link" +import React, { useEffect } from "react" + +export default function FilterProjects({ + initialProjects, +}: { + initialProjects: Project[] +}) { + const { + projects, + filter, + resetFilters, + setProjects, + updateFilter, + filteredProjects, + isLoading, + } = useFilterStore() + + useEffect(() => { + // Fetch and set projects from db here + if (projects.length === 0) { + setProjects(initialProjects) + } + }, [setProjects]) + + const handleInputChange = (event: React.ChangeEvent) => { + updateFilter({ searchTerm: event.target.value }) + } + + if (isLoading) { + return + } + + return ( +
+
+ +
+ + {filteredProjects.length === 0 ? ( +
+ No Projects found +
+ ) : ( +
+
+ {filteredProjects.map((project) => ( + + + {project.name} +
+ {project.mainTag} +
+
+
+ {project.name} +

{project.name}

+
+ + ))} +
+
+ )} +
+ ) +} diff --git a/app/(app)/projects/TagFilter.tsx b/app/(app)/projects/TagFilter.tsx new file mode 100644 index 0000000..00c19d6 --- /dev/null +++ b/app/(app)/projects/TagFilter.tsx @@ -0,0 +1,26 @@ +import { Button } from "@/components/ui/button" +import { projectTagSchema } from "@/database/schemas/projects.schema" +import { useFilterStore } from "@/stores/project-filter-store" + +const TagFilter = () => { + const { filter, toggleMainTagFilter } = useFilterStore() + + console.log("filter", filter) + + return ( +
+ {projectTagSchema.options.map((tag) => ( + + ))} +
+ ) +} + +export default TagFilter diff --git a/app/(app)/projects/page.tsx b/app/(app)/projects/page.tsx index d507d25..2eba87a 100644 --- a/app/(app)/projects/page.tsx +++ b/app/(app)/projects/page.tsx @@ -1,19 +1,40 @@ -import { Projects } from "@/components/pages/projects" +import { Button } from "@/components/ui/button" import { appMetadata } from "@/config/meteada.config" -import { getAllProjectsAction } from "@/server-actions/projects/projects.actions" +import { mockProjects } from "@/mocks/projects.mocks" +import { Fullscreen } from "lucide-react" import { Metadata } from "next" - -export const dynamic = "force-dynamic" +import Link from "next/link" +import FilterProjects from "./ProjectsFilter" export const metadata: Metadata = { ...appMetadata.projects, } export default async function ProjectsPage() { - const { projects } = await getAllProjectsAction() + // const { projects } = await getAllProjectsAction() + const projectsList = mockProjects(50) + return ( - <> - - +
+
+

+ Journey Through the SEI Ecosystem +

+
+
+ +
+ +
+ +
+ +
) } diff --git a/app/globals.css b/app/globals.css index 06b7f96..893fa13 100644 --- a/app/globals.css +++ b/app/globals.css @@ -87,7 +87,7 @@ /* Handle */ ::-webkit-scrollbar-thumb { - background: #888; + background: #c5c5c5; border-radius: 5px; } @@ -95,3 +95,13 @@ ::-webkit-scrollbar-thumb:hover { background: #555; } + +/* styles.css */ +.scrollbar-left { + direction: rtl; /* Right to left */ + overflow-y: scroll; /* Enable vertical scrolling */ +} + +.scrollbar-left > * { + direction: ltr; /* Reset content to left to right */ +} diff --git a/bun.lockb b/bun.lockb index 4be527bf792c1b5e3ceb0ec49b7431bd71464f62..38edad179f673370810293cc3390c31b4fe2d36c 100755 GIT binary patch delta 106134 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 APXGV_ delta 76430 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

av9{qc7yA`cX-FKUXKep=_ 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"#canvas") ) { + if (!selection || selection.empty()) { + return 30 + } + const canvasNode = selection.node() const canvasDatum = selection.datum() const zoomScale = canvasDatum.scales.zoom @@ -227,7 +231,7 @@ export const getZoomLevel = function ( export const getZoomLevelRange = function ( selection: CanvasSelection = select("#canvas") ) { - if (!selection) { + if (!selection || selection.empty()) { return [30, 30] } diff --git a/components/d3/Chart/entities/Simulation.ts b/components/d3/Chart/entities/Simulation.ts index ec14f7a..46c0f60 100644 --- a/components/d3/Chart/entities/Simulation.ts +++ b/components/d3/Chart/entities/Simulation.ts @@ -82,7 +82,7 @@ export const createSimulation: CreateSimulationFn = function ( 1 - Math.pow( ALPHA_MIN, - 1 / (minimalIterations ? 1 : INITIAL_ALPHA_AIMED_ITERATIONS) + 1 / (minimalIterations ? 2 : INITIAL_ALPHA_AIMED_ITERATIONS) ) ) diff --git a/components/d3/Chart/hooks/useRelationChartManager.ts b/components/d3/Chart/hooks/useRelationChartManager.ts index 6df42ff..38cfeef 100644 --- a/components/d3/Chart/hooks/useRelationChartManager.ts +++ b/components/d3/Chart/hooks/useRelationChartManager.ts @@ -63,6 +63,7 @@ import type { ForceGraphInstance } from "../ForceGraph" import { CanvasCursorMode, CanvasDatum, NodeDatum } from "../types" import { isNodeDatum } from "../utils/node" +import { useFilterStore } from "@/stores/project-filter-store" import { useRelationChartState } from "./useRelationChartState" import { useSpaceMove } from "./useSpaceMove" @@ -87,6 +88,7 @@ export const useRelationChartManager = function () { setHistory, setToolTip, } = useRelationChartState() + const { filteredProjects } = useFilterStore() const contentRectRef = useRef(null) const canvasRectRef = useRef(null) @@ -277,7 +279,7 @@ export const useRelationChartManager = function () { [chart, resetDrawTimer] ) const debouncedOnUpdateDimensions = useMemo(() => { - return debounce(onUpdateDimensions, 10) + return debounce(onUpdateDimensions, 20) }, [onUpdateDimensions]) const resizeObserver = useRef( typeof ResizeObserver !== "undefined" diff --git a/components/d3/Chart/hooks/useRelationChartState.ts b/components/d3/Chart/hooks/useRelationChartState.ts index d0152c0..1e348c4 100644 --- a/components/d3/Chart/hooks/useRelationChartState.ts +++ b/components/d3/Chart/hooks/useRelationChartState.ts @@ -76,7 +76,7 @@ export const useRelationChartState = create()((set) => ({ ready: false, setReady: (ready) => set(() => ({ ready })), - performanceMode: false, + performanceMode: true, setPerformanceMode: (enabled: boolean) => set(() => ({ performanceMode: enabled })), diff --git a/components/d3/Chart/ui/DetailScreen/DetailScreen.tsx b/components/d3/Chart/ui/DetailScreen/DetailScreen.tsx index dafadc3..c2f6a55 100644 --- a/components/d3/Chart/ui/DetailScreen/DetailScreen.tsx +++ b/components/d3/Chart/ui/DetailScreen/DetailScreen.tsx @@ -10,7 +10,8 @@ export type TProps = { } export const DetailScreen = ({ nodes }: TProps) => { - const { selection, details, setShowDetails, ready } = useRelationChartState() + const { selection, setSelection, details, setShowDetails, ready } = + useRelationChartState() const items = React.useMemo(() => nodes, [nodes]) @@ -24,10 +25,10 @@ export const DetailScreen = ({ nodes }: TProps) => { return [selectedItems] as const }, [selection, items]) - const onClose = React.useCallback( - () => setShowDetails(false), - [setShowDetails] - ) + const onClose = React.useCallback(() => { + setShowDetails(false) + setSelection([]) + }, [setShowDetails]) React.useEffect(() => { if (!selection.length) { @@ -43,6 +44,8 @@ export const DetailScreen = ({ nodes }: TProps) => { } }, [ready, setShowDetails]) + console.log("selection", selection) + return (

{ {selectedItems.map((item: Project, key) => ( <> - + {key !== selectedItems.length - 1 && (
)} diff --git a/components/d3/Chart/ui/Legend/Legend.tsx b/components/d3/Chart/ui/Legend/Legend.tsx index 4c15eb4..fc4554e 100644 --- a/components/d3/Chart/ui/Legend/Legend.tsx +++ b/components/d3/Chart/ui/Legend/Legend.tsx @@ -1,5 +1,6 @@ import { useEffect, useRef, useState } from "react" +import { Button } from "@/components/ui/button" import { Project, projectTag } from "@/database/schemas/projects.schema" import { getColor, projectTagSchema } from "@/utils/colors.utils" import { FaCircle } from "react-icons/fa" @@ -21,9 +22,7 @@ export const Legend = ({ show, nodes, ...rest }: Props) => { // Count the occurrences of each tag const tagCounts = nodes?.reduce((acc, node) => { - node.tags.forEach((tag) => { - acc[tag] = (acc[tag] || 0) + 1 - }) + acc[node.mainTag] = (acc[node.mainTag] || 0) + 1 return acc }, {}) @@ -40,7 +39,7 @@ export const Legend = ({ show, nodes, ...rest }: Props) => { return (

@@ -57,9 +56,15 @@ export const Legend = ({ show, nodes, ...rest }: Props) => { ))}

- + {sortedTags.length > 5 && ( + + )}
diff --git a/components/d3/Chart/ui/constants.ts b/components/d3/Chart/ui/constants.ts index dbe4a83..d6272e2 100644 --- a/components/d3/Chart/ui/constants.ts +++ b/components/d3/Chart/ui/constants.ts @@ -14,7 +14,7 @@ export const CHART_DETAILS = { export const LEGEND = { BUTTON_TEXT: "Legend", - NODES: "Node Types", + NODES: "Projects", NODES_DESCRIPTION: "The size of the node is calculated based on the total marketcap of the project.", NODE_DEFI: "DeFi", diff --git a/components/filter/CheckboxItem.tsx b/components/filter/CheckboxItem.tsx new file mode 100644 index 0000000..1d592e6 --- /dev/null +++ b/components/filter/CheckboxItem.tsx @@ -0,0 +1,44 @@ +import { Controller } from "react-hook-form" +import { Checkbox } from "../ui/checkbox" +import { FormControl, FormItem, FormLabel } from "../ui/form" + +type Props = { + key: string + item: string + name: string + control: any +} + +export function CheckboxItem({ key, item, name, control }: Props) { + return ( + { + const isChecked = value?.includes(item) + return ( + + + { + const newValue = checked + ? [...(value || []), item] + : value?.filter( + (currentItem: string) => currentItem !== item + ) + onChange(newValue) + }} + /> + + {item} + + ) + }} + /> + ) +} diff --git a/components/filter/FilterFormField.tsx b/components/filter/FilterFormField.tsx new file mode 100644 index 0000000..97e814d --- /dev/null +++ b/components/filter/FilterFormField.tsx @@ -0,0 +1,77 @@ +import { FormField, FormItem, FormMessage } from "../ui/form" + +import { CaretSortIcon } from "@radix-ui/react-icons" +import { useState } from "react" +import { Button } from "../ui/button" +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "../ui/collapsible" +import { CheckboxItem } from "./CheckboxItem" + +type Props = { + name: string + methods: any + items: any[] +} + +export function FilterFormField({ name, methods, items }: Props) { + const [itemIsOpen, setItemIsOpen] = useState(false) + + const initialItems = items.slice(0, 5) + const collabsibleItems = items.slice(5) + + const disabled = items.length < 5 + + return ( + ( + + {/* Collapsible Items */} + +
+

{name}

+ + + +
+ {/* Initial Items */} + {initialItems.map((item: string) => ( + + ))} +
+ + {collabsibleItems.map((item: string) => ( + + ))} + +
+
+ + +
+ )} + /> + ) +} diff --git a/components/filter/FilterScreen.tsx b/components/filter/FilterScreen.tsx new file mode 100644 index 0000000..d379a1b --- /dev/null +++ b/components/filter/FilterScreen.tsx @@ -0,0 +1,143 @@ +import { + projectTagSchema, + stageSchema, +} from "@/database/schemas/projects.schema" +import { useFilterStore } from "@/stores/project-filter-store" +import { zodResolver } from "@hookform/resolvers/zod" +import { DoubleArrowRightIcon } from "@radix-ui/react-icons" +import * as React from "react" +import { useState } from "react" +import { useForm } from "react-hook-form" +import { z } from "zod" +import { Button } from "../ui/button" +import { Form, FormControl, FormField, FormItem, FormLabel } from "../ui/form" +import { FilterFormField } from "./FilterFormField" + +type Props = { + close: boolean +} + +// Define form schema +export const FormSchema = z.object({ + searchTerm: z.string().optional(), + tags: z.array(z.string()), + stage: z.array(z.string()), +}) + +export const FilterScreen = ({ close }: Props) => { + const { filter, filteredProjects, resetFilters, updateFilter } = + useFilterStore() + const [showFilters, setShowFilters] = useState(true) + + const ready = true // changed uppon loading graph + + // Tags - Derived from the tags schema + const tags = projectTagSchema.options + + // Stages - Derived from the stage schema + const stages = stageSchema.options + + React.useEffect(() => { + if (!ready) { + setShowFilters(true) + } + }, [ready, setShowFilters]) + + const methods = useForm({ + resolver: zodResolver(FormSchema), + defaultValues: { + searchTerm: filter.searchTerm, + tags: filter.mainTag, + stage: filter.stage, + }, + }) + + const onSubmit = (data: z.infer) => { + updateFilter({ + searchTerm: data.searchTerm, + mainTag: data.tags, + stage: data.stage, + }) + close && setShowFilters(false) + } + + const handleResetFilters = () => { + resetFilters() + methods.reset({ + searchTerm: "", + tags: [], + stage: [], + }) + close && setShowFilters(false) + } + + return ( +
+ {close && ( + + )} + +
+
+
+ Visible projects: {filteredProjects.length} +
+
+
+ + ( + <> + Search + + + + + + + )} + /> + + + +
+ + +
+ + +
+
+ ) +} diff --git a/components/filter/index.ts b/components/filter/index.ts new file mode 100644 index 0000000..ed0bd58 --- /dev/null +++ b/components/filter/index.ts @@ -0,0 +1 @@ +export { FilterScreen } from "./FilterScreen" diff --git a/components/header.tsx b/components/header.tsx index 67068cc..11e9b3e 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -13,7 +13,7 @@ interface HeaderProps { export const Header = async ({}: HeaderProps) => { return ( -
+
test diff --git a/components/navigation/navigation.tsx b/components/navigation/navigation.tsx index 0b810de..fd2b4a5 100644 --- a/components/navigation/navigation.tsx +++ b/components/navigation/navigation.tsx @@ -43,6 +43,7 @@ export const NavigationMenuPage = () => {
    {components.map((component) => ( @@ -112,10 +113,7 @@ const ListItem = ({ className, title, children, href }: ListItemProps) => {
    {title}

    {children}

    diff --git a/components/project-card.tsx b/components/project-card.tsx index 7a58fd0..bd76a11 100644 --- a/components/project-card.tsx +++ b/components/project-card.tsx @@ -7,13 +7,12 @@ import { Badge } from "./ui/badge" import { Button } from "./ui/button" type Props = { - key: number item: Project } -export const ProjectCardDetails = ({ key, item }: Props) => { +export const ProjectCardDetails = ({ item }: Props) => { return ( -
    +
    diff --git a/components/spinner.tsx b/components/spinner.tsx new file mode 100644 index 0000000..8b486c4 --- /dev/null +++ b/components/spinner.tsx @@ -0,0 +1,9 @@ +const Spinner = () => ( + <> +
    +
    +
    + +) + +export default Spinner diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx index e6ad9cb..18dbf50 100644 --- a/components/ui/checkbox.tsx +++ b/components/ui/checkbox.tsx @@ -13,15 +13,15 @@ const Checkbox = React.forwardRef< - + )) diff --git a/components/ui/collapsible.tsx b/components/ui/collapsible.tsx new file mode 100644 index 0000000..20b4284 --- /dev/null +++ b/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleContent, CollapsibleTrigger } diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx new file mode 100644 index 0000000..e14ba4c --- /dev/null +++ b/components/ui/sheet.tsx @@ -0,0 +1,140 @@ +"use client" + +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" +import * as React from "react" + +import { cn } from "@/utils/tailwind.utils" + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +) + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps +>(({ side = "right", className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +) +SheetHeader.displayName = "SheetHeader" + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
    +) +SheetFooter.displayName = "SheetFooter" + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetClose, + SheetContent, + SheetDescription, + SheetFooter, + SheetHeader, + SheetOverlay, + SheetPortal, + SheetTitle, + SheetTrigger, +} diff --git a/database/migrations/0000_jazzy_agent_zero.sql b/database/migrations/0000_moaning_hammerhead.sql similarity index 99% rename from database/migrations/0000_jazzy_agent_zero.sql rename to database/migrations/0000_moaning_hammerhead.sql index 6757f83..77460a8 100644 --- a/database/migrations/0000_jazzy_agent_zero.sql +++ b/database/migrations/0000_moaning_hammerhead.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS "session" ( "id" text PRIMARY KEY NOT NULL, "user_id" text NOT NULL, "entitlements" text NOT NULL, - "expires_at" timestamp with time zone NOT NULL + "expires_at" timestamp NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "user_profile" ( diff --git a/database/migrations/0001_loving_blue_shield.sql b/database/migrations/0001_loving_blue_shield.sql deleted file mode 100644 index 7d8c5fc..0000000 --- a/database/migrations/0001_loving_blue_shield.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "projects" DROP COLUMN IF EXISTS "wechat"; \ No newline at end of file diff --git a/database/migrations/meta/0000_snapshot.json b/database/migrations/meta/0000_snapshot.json index 93db638..e408532 100644 --- a/database/migrations/meta/0000_snapshot.json +++ b/database/migrations/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "id": "f5f40f70-88b8-4416-acdf-18a7f75524b5", + "id": "84680cfe-2504-4df3-b72e-e7d0dd6216c0", "prevId": "00000000-0000-0000-0000-000000000000", "version": "5", "dialect": "pg", @@ -28,7 +28,7 @@ }, "expires_at": { "name": "expires_at", - "type": "timestamp with time zone", + "type": "timestamp", "primaryKey": false, "notNull": true } diff --git a/database/migrations/meta/0001_snapshot.json b/database/migrations/meta/0001_snapshot.json deleted file mode 100644 index 29250ec..0000000 --- a/database/migrations/meta/0001_snapshot.json +++ /dev/null @@ -1,348 +0,0 @@ -{ - "id": "6b77787d-cb30-4f3e-a3d8-886c9e7d1821", - "prevId": "ddebb7e5-6179-4815-bcc8-b821bc8d049a", - "version": "5", - "dialect": "pg", - "tables": { - "session": { - "name": "session", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "expires_at": { - "name": "expires_at", - "type": "timestamp with time zone", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "session_user_id_user_id_fk": { - "name": "session_user_id_user_id_fk", - "tableFrom": "session", - "tableTo": "user", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "user": { - "name": "user", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "user_email_unique": { - "name": "user_email_unique", - "nullsNotDistinct": false, - "columns": ["email"] - } - } - }, - "projects": { - "name": "projects", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "slug": { - "name": "slug", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "token_name": { - "name": "token_name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "token_supply": { - "name": "token_supply", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "release_date": { - "name": "release_date", - "type": "timestamp", - "primaryKey": false, - "notNull": false - }, - "summary": { - "name": "summary", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true - }, - "is_live": { - "name": "is_live", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "default": false - }, - "none": { - "name": "none", - "type": "stage", - "primaryKey": false, - "notNull": true - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "community_size": { - "name": "community_size", - "type": "integer", - "primaryKey": false, - "notNull": false - }, - "project_type": { - "name": "project_type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "website": { - "name": "website", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "whitepaper": { - "name": "whitepaper", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "twitter": { - "name": "twitter", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "discord": { - "name": "discord", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "telegram": { - "name": "telegram", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "contact_name": { - "name": "contact_name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "contact_email": { - "name": "contact_email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "default": "now()" - } - }, - "indexes": {}, - "foreignKeys": { - "projects_user_id_user_id_fk": { - "name": "projects_user_id_user_id_fk", - "tableFrom": "projects", - "tableTo": "user", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "projects_slug_unique": { - "name": "projects_slug_unique", - "nullsNotDistinct": false, - "columns": ["slug"] - } - } - }, - "project_tags": { - "name": "project_tags", - "schema": "", - "columns": { - "project_id": { - "name": "project_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "tag_id": { - "name": "tag_id", - "type": "integer", - "primaryKey": false, - "notNull": true - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": { - "project_tags_project_id_projects_id_fk": { - "name": "project_tags_project_id_projects_id_fk", - "tableFrom": "project_tags", - "tableTo": "projects", - "columnsFrom": ["project_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "project_tags_tag_id_tags_id_fk": { - "name": "project_tags_tag_id_tags_id_fk", - "tableFrom": "project_tags", - "tableTo": "tags", - "columnsFrom": ["tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - }, - "project_tags_user_id_user_id_fk": { - "name": "project_tags_user_id_user_id_fk", - "tableFrom": "project_tags", - "tableTo": "user", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "tags": { - "name": "tags", - "schema": "", - "columns": { - "id": { - "name": "id", - "type": "serial", - "primaryKey": true, - "notNull": true - }, - "name": { - "name": "name", - "type": "varchar(256)", - "primaryKey": false, - "notNull": true - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { - "tags_name_unique": { - "name": "tags_name_unique", - "nullsNotDistinct": false, - "columns": ["name"] - } - } - } - }, - "enums": { - "stage": { - "name": "stage", - "values": { - "Mainnet": "Mainnet", - "Testnet": "Testnet", - "Devnet": "Devnet", - "Local/Private": "Local/Private" - } - } - }, - "schemas": {}, - "_meta": { - "columns": {}, - "schemas": {}, - "tables": {} - } -} diff --git a/database/migrations/meta/_journal.json b/database/migrations/meta/_journal.json index 4537e02..2847aed 100644 --- a/database/migrations/meta/_journal.json +++ b/database/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1710970419896, - "tag": "0000_jazzy_agent_zero", + "when": 1711141268089, + "tag": "0000_moaning_hammerhead", "breakpoints": true } ] diff --git a/database/schemas/auth.schema.ts b/database/schemas/auth.schema.ts index d2c6e50..89bcd60 100644 --- a/database/schemas/auth.schema.ts +++ b/database/schemas/auth.schema.ts @@ -10,7 +10,6 @@ export const SessionTable = pgTable("session", { .references(() => UserTable.id, { onDelete: "cascade" }), entitlements: text("entitlements").notNull(), expiresAt: timestamp("expires_at", { - withTimezone: true, mode: "date", }).notNull(), }) diff --git a/database/schemas/projects.schema.ts b/database/schemas/projects.schema.ts index 34a884b..77a3cee 100644 --- a/database/schemas/projects.schema.ts +++ b/database/schemas/projects.schema.ts @@ -14,6 +14,14 @@ import { createSelectSchema } from "drizzle-zod" import { z } from "zod" import { TagTable } from "./tags.schema" import { UserTable } from "./users.schema" + +export const stageSchema = z.enum([ + "Mainnet", + "Testnet", + "Devnet", + "Local/Private", +]) + export const stage = pgEnum("stage", [ "Mainnet", "Testnet", diff --git a/mocks/projects.mocks.ts b/mocks/projects.mocks.ts index c8007b7..713f031 100644 --- a/mocks/projects.mocks.ts +++ b/mocks/projects.mocks.ts @@ -1,25 +1,13 @@ import { ProjectWithTagsSchema, ProjectsResponseSchema, - projectTagSchema, } from "@/database/schemas/projects.schema" import { getMockFn } from "@/utils/mock.utils" import { faker } from "@faker-js/faker" +import { generateTags, tags } from "./tags.mock" -// Convert the z.enum to an array -const tags = projectTagSchema.options const seed = 1337 // Ensuring the use of the same seed for consistency -const generateTags = (existingTags = [] as string[], projectType: string) => { - const allExcludedTags = [...existingTags, projectType] - - const filteredTags = tags.filter((tag) => !allExcludedTags.includes(tag)) - - const shuffledTags = filteredTags.sort(() => 0.5 - Math.random()) - - return shuffledTags.slice(0, 2) -} - export const getMockProjects = getMockFn(ProjectsResponseSchema) export const mockProjects = (size: number) => { diff --git a/mocks/tags.mock.ts b/mocks/tags.mock.ts new file mode 100644 index 0000000..061d88b --- /dev/null +++ b/mocks/tags.mock.ts @@ -0,0 +1,31 @@ +import { projectTagSchema } from "@/utils/colors.utils" +import { getMockFn } from "@/utils/mock.utils" + +// Convert the z.enum to an array +export const tags = projectTagSchema.options + +export const generateTags = ( + existingTags = [] as string[], + projectType: string +) => { + const allExcludedTags = [...existingTags, projectType] + + const filteredTags = tags.filter((tag) => !allExcludedTags.includes(tag)) + + const shuffledTags = filteredTags.sort(() => 0.5 - Math.random()) + + return shuffledTags.slice(0, 2) +} + +export const getMockTags = getMockFn(projectTagSchema) + +// export const mockTags = getMockTags({ +// overrideFn: (tags: projectTag[]) => { +// const _projectType = +// tags[faker.number.int({ min: 0, max: tags.length - 1 })] + +// return { +// tags: [_projectType, ...generateTags([], _projectType)], +// } +// }, +// }) diff --git a/package.json b/package.json index 85b2abe..c4049c3 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@radix-ui/react-aspect-ratio": "^1.0.3", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4", + "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", "@radix-ui/react-hover-card": "^1.0.7", diff --git a/stores/project-filter-store.tsx b/stores/project-filter-store.tsx new file mode 100644 index 0000000..c67a996 --- /dev/null +++ b/stores/project-filter-store.tsx @@ -0,0 +1,76 @@ +import { Project } from "@/database/schemas/projects.schema" +import { create } from "zustand" + +interface FilterCriteria { + searchTerm: string + mainTag: string[] + tags: string[] + stage: string[] +} + +interface FilterState { + projects: Project[] + filteredProjects: Project[] + filter: FilterCriteria + isLoading: boolean + setProjects: (projects: Project[]) => void + updateFilter: (criteria: Partial) => void + resetFilters: () => void +} + +export const useFilterStore = create((set) => ({ + projects: [], + filteredProjects: [], + filter: { + tags: [], + stage: [], + mainTag: [], + searchTerm: "", + }, + isLoading: true, + setProjects: (projects) => + set((state) => { + // Apply the current filter criteria to the new projects list + const filteredProjects = projects.filter((project) => + projectMatchesFilter(project, state.filter) + ) + + return { projects, filteredProjects, isLoading: false } + }), + updateFilter: (criteria) => + set((state) => { + const newFilter = { ...state.filter, ...criteria } + const filteredProjects = state.projects.filter((project) => + projectMatchesFilter(project, newFilter) + ) + return { filter: newFilter, filteredProjects } + }), + + resetFilters: () => + set((state) => ({ + filter: { + tags: [], + stage: [], + mainTag: [], + searchTerm: "", + }, + filteredProjects: state.projects, + })), +})) + +function projectMatchesFilter( + project: Project, + filter: FilterCriteria +): boolean { + const matchesSearchTerm = project.name + .toLowerCase() + .includes(filter.searchTerm.toLowerCase()) + const matchesTags = + filter.tags.length === 0 || filter.tags.includes(project.mainTag) + const matchesStage = + filter.stage.length === 0 || filter.stage.includes(project.stage) + const matchesMainTag = + filter.mainTag.length === 0 || filter.mainTag.includes(project.mainTag) + + return matchesSearchTerm && matchesTags && matchesStage && matchesMainTag +}