48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import type { WishlistAction, WishlistItem, WishlistState } from './entities';
|
|
|
|
export function wishlistReducer(state: WishlistState, action: WishlistAction): WishlistState {
|
|
switch (action.type) {
|
|
case 'TOGGLE_ITEM': {
|
|
const exists = state.items.some((item) => item.id === action.payload.id);
|
|
if (exists) {
|
|
return {
|
|
...state,
|
|
items: state.items.filter((item) => item.id !== action.payload.id),
|
|
};
|
|
}
|
|
return { ...state, items: [...state.items, action.payload] };
|
|
}
|
|
|
|
case 'REMOVE_ITEM':
|
|
return {
|
|
...state,
|
|
items: state.items.filter((item) => item.id !== action.payload),
|
|
};
|
|
|
|
case 'CLEAR_WISHLIST':
|
|
return { ...state, items: [] };
|
|
|
|
case 'RESTORE_ITEMS':
|
|
return { ...state, items: action.payload };
|
|
|
|
case 'TOGGLE_DRAWER':
|
|
return { ...state, isOpen: !state.isOpen };
|
|
|
|
case 'OPEN_DRAWER':
|
|
return { ...state, isOpen: true };
|
|
|
|
case 'CLOSE_DRAWER':
|
|
return { ...state, isOpen: false };
|
|
|
|
default:
|
|
return state;
|
|
}
|
|
}
|
|
|
|
export function isInWishlist(items: WishlistItem[], id: string): boolean {
|
|
return items.some((item) => item.id === id);
|
|
}
|
|
|
|
export function getWishlistCount(items: WishlistItem[]): number {
|
|
return items.length;
|
|
} |