67 lines
1.5 KiB
JavaScript
67 lines
1.5 KiB
JavaScript
import { computed, ref } from 'vue'
|
|
import { authState, isLoggedIn } from './auth'
|
|
import {
|
|
fetchWishlist as apiFetchWishlist,
|
|
addToWishlist as apiAddToWishlist,
|
|
removeFromWishlist as apiRemoveFromWishlist
|
|
} from './api'
|
|
|
|
const wishlistIds = ref([])
|
|
const wishlistSet = computed(() => new Set(wishlistIds.value))
|
|
const wishlistCount = computed(() => wishlistIds.value.length)
|
|
|
|
const loadWishlist = async () => {
|
|
if (!isLoggedIn()) {
|
|
wishlistIds.value = []
|
|
return
|
|
}
|
|
try {
|
|
wishlistIds.value = await apiFetchWishlist(authState.token)
|
|
} catch {
|
|
wishlistIds.value = []
|
|
}
|
|
}
|
|
|
|
const isInWishlist = (productId) => wishlistSet.value.has(productId)
|
|
|
|
const addToWishlist = async (productId) => {
|
|
if (!isLoggedIn()) return
|
|
try {
|
|
wishlistIds.value = await apiAddToWishlist(authState.token, productId)
|
|
} catch {
|
|
// 忽略错误
|
|
}
|
|
}
|
|
|
|
const removeFromWishlist = async (productId) => {
|
|
if (!isLoggedIn()) return
|
|
try {
|
|
wishlistIds.value = await apiRemoveFromWishlist(authState.token, productId)
|
|
} catch {
|
|
// 忽略错误
|
|
}
|
|
}
|
|
|
|
const toggleWishlist = async (productId) => {
|
|
if (isInWishlist(productId)) {
|
|
await removeFromWishlist(productId)
|
|
} else {
|
|
await addToWishlist(productId)
|
|
}
|
|
}
|
|
|
|
const getWishlistProducts = (allProducts) => {
|
|
const idSet = wishlistSet.value
|
|
return allProducts.filter((p) => idSet.has(p.id))
|
|
}
|
|
|
|
export {
|
|
wishlistCount,
|
|
isInWishlist,
|
|
addToWishlist,
|
|
removeFromWishlist,
|
|
toggleWishlist,
|
|
getWishlistProducts,
|
|
loadWishlist
|
|
}
|