change and sync wishlist with api
This commit is contained in:
29
ArtisanConnect/api/wishlist.jsx
Normal file
29
ArtisanConnect/api/wishlist.jsx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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
10984
ArtisanConnect/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
|
}
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user