change and sync wishlist with api

This commit is contained in:
2025-05-29 23:18:44 +02:00
parent 9962dc1e55
commit eca62c8b45
5 changed files with 11055 additions and 18 deletions

View File

@@ -0,0 +1,29 @@
import axios from "axios";
// import FormData from 'form-data'
const API_URL = "https://testowe.zikor.pl/api/v1/wishlist";
export async function toggleNoticeStatus(noticeId) {
try {
const response = await axios.post(`${API_URL}/toggle/${noticeId}`, null, {
headers: {
"Content-Type": "application/json",
},
});
return response.data;
} catch (error) {
console.error("Error toggling wishlist item:", error);
throw error;
}
}
export async function getWishlist() {
try {
const response = await axios.get(`${API_URL}/`);
console.log("Wishlist response:", response.data);
return response.data;
} catch (error) {
console.error("Error fetching wishlist:", error);
throw error;
}
}

View File

@@ -4,9 +4,15 @@ import { NoticeCard } from "@/components/NoticeCard";
import { Ionicons } from "@expo/vector-icons"; import { Ionicons } from "@expo/vector-icons";
import { Box } from "@/components/ui/box"; import { Box } from "@/components/ui/box";
import { Text } from "@/components/ui/text"; import { Text } from "@/components/ui/text";
import { useEffect } from "react";
export default function Wishlist() { export default function Wishlist() {
const wishlistNotices = useWishlist((state) => state.wishlistNotices); const wishlistNotices = useWishlist((state) => state.wishlistNotices);
const fetchWishlist = useWishlist((state) => state.fetchWishlist);
useEffect(() => {
fetchWishlist();
}, []);
if (wishlistNotices.length === 0) { if (wishlistNotices.length === 0) {
return ( return (
<Box className="flex-row flex-1 justify-center"> <Box className="flex-row flex-1 justify-center">

View File

@@ -14,8 +14,7 @@ import {useEffect, useState} from "react";
export function NoticeCard({notice}) { export function NoticeCard({notice}) {
const noticeId = notice?.noticeId; const noticeId = notice?.noticeId;
const addNoticeToWishlist = useWishlist((state) => state.addNoticeToWishlist); const toggleNoticeInWishlist = useWishlist((state) => state.toggleNoticeInWishlist);
const removeNoticeFromWishlist = useWishlist((state) => state.removeNoticeFromWishlist);
const isInWishlist = useWishlist((state) => const isInWishlist = useWishlist((state) =>
noticeId ? state.wishlistNotices.some((item) => item.noticeId === noticeId) : false noticeId ? state.wishlistNotices.some((item) => item.noticeId === noticeId) : false
); );
@@ -94,11 +93,7 @@ export function NoticeCard({notice}) {
</Heading> </Heading>
<Pressable <Pressable
onPress={() => { onPress={() => {
if (isInWishlist) { toggleNoticeInWishlist(noticeId);
removeNoticeFromWishlist(noticeId);
} else {
addNoticeToWishlist(notice);
}
}} }}
> >
<Ionicons <Ionicons

10984
ArtisanConnect/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,15 +1,38 @@
import { create } from "zustand"; import { create } from "zustand";
import * as api from "@/api/wishlist";
export const useWishlist = create((set) => ({ export const useWishlist = create((set) => ({
wishlistNotices: [], wishlistNotices: [],
addNoticeToWishlist: (wishlistNotice) => toggleNoticeInWishlist: async (noticeId) => {
set((state) => ({ try {
wishlistNotices: [...state.wishlistNotices, wishlistNotice], await api.toggleNoticeStatus(noticeId);
})), set((state) => {
removeNoticeFromWishlist: (noticeId) => const exists = state.wishlistNotices.some(
set((state) => ({ (item) => item.noticeId == noticeId
wishlistNotices: state.wishlistNotices.filter( );
(item) => item.noticeId !== noticeId return exists
), ? {
})), wishlistNotices: state.wishlistNotices.filter(
(item) => item.noticeId != noticeId
),
}
: {
wishlistNotices: [
...state.wishlistNotices,
{ noticeId },
],
};
});
} catch (error) {
console.error("Error toggling wishlist notice:", error);
}
},
fetchWishlist: async () => {
try {
const data = await api.getWishlist();
set({ wishlistNotices: data });
} catch (error) {
console.error("Error fetching wishlist:", error);
}
},
})); }));