From d3b75778de2a9bee70b72ad2b261e9f964a8dee1 Mon Sep 17 00:00:00 2001 From: maxitect Date: Thu, 21 Nov 2024 13:44:15 +0000 Subject: [PATCH] feat: collections page displays collections from database --- src/pages/Collections.tsx | 100 ++++++++++++++++++++++++++------------ src/utils/fetchData.ts | 2 +- src/utils/types.ts | 8 +++ 3 files changed, 79 insertions(+), 31 deletions(-) diff --git a/src/pages/Collections.tsx b/src/pages/Collections.tsx index c375d42..6866e05 100644 --- a/src/pages/Collections.tsx +++ b/src/pages/Collections.tsx @@ -1,41 +1,81 @@ -import { useState } from 'react'; -import { FaPlus } from 'react-icons/fa'; -import Modal from '../components/Modal/Modal'; -import CollectionForm from '../components/Form/CollectionForm'; +import { useEffect, useState } from "react"; +import { fetchData } from "../utils/fetchData"; +import { Collection } from "../utils/types"; +import { FaRegHeart, FaHeart } from "react-icons/fa"; export default function Collections() { - const [isModalOpen, setModalOpen] = useState(false); - const [collections, setCollections] = useState<{ name: string; description: string }[]>([]); + const [collections, setCollections] = useState([]); - const handleCreateCollection = (name: string, description: string) => { - setCollections([...collections, { name, description }]); - setModalOpen(false); + useEffect(() => { + const fetchCollections = async () => { + const data = await fetchData("collections", "GET"); + setCollections(data); + }; + fetchCollections(); + }, []); + + const handleLike = async (col: Collection) => { + const likesCount = + typeof col.likes === "number" + ? col.likes + : parseInt(col.likes || "0", 10); + const updatedCol = { ...col, likes: likesCount + 1 }; + + try { + await fetchData( + `Collection/${col.id}`, + "PATCH", + JSON.stringify({ likes: updatedCol.likes }) + ); + setCollections((prev) => + prev.map((p) => (p.id === col.id ? updatedCol : p)) + ); + } catch (error) { + console.error("Error updating likes:", error); + } }; return ( -
-

Your Collections

-
- {collections.map((collection, index) => ( -
-

{collection.name}

-

{collection.description}

+
+

Collections

+
+ {collections.map((col) => ( +
+
+ {col.pokemonCollections.map((poke) => ( + {poke.pokemon.name} + ))} +
+

+ {col.name} +

+

+ #{col.id} +

+
))}
-
- -
- setModalOpen(false)}> - setModalOpen(false)} /> -
); -} \ No newline at end of file +} diff --git a/src/utils/fetchData.ts b/src/utils/fetchData.ts index 42fc6cd..4f5b708 100644 --- a/src/utils/fetchData.ts +++ b/src/utils/fetchData.ts @@ -4,7 +4,7 @@ export async function fetchData( body?: string ): Promise { try { - const response = await fetch(`http://localhost:5050/${query}`, { + const response = await fetch(`http://34.147.178.6:8080/${query}`, { method, headers: { "Content-Type": "application/json", diff --git a/src/utils/types.ts b/src/utils/types.ts index cca692d..f67d4d8 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -9,3 +9,11 @@ export interface Pokemon extends BaseEntity { apiUrl: string; likes: number; } + +export interface Collection extends BaseEntity { + name: string; + themeId: number; + passwordHash: string; + likes: number; + pokemonCollections: Pokemon[]; +}