Replace entire repo content with shahikitchen-v1-prodcution.zip (v1.1 production)

This commit is contained in:
root
2026-06-25 13:44:21 +00:00
parent 284dcfa120
commit 6cd5aaa048
850 changed files with 15616 additions and 26143 deletions
+22
View File
@@ -0,0 +1,22 @@
export interface WishlistItem {
id: string;
name: string;
price: number;
image?: string;
}
export type NewWishlistItem = WishlistItem;
export interface WishlistState {
items: WishlistItem[];
isOpen: boolean;
}
export type WishlistAction =
| { type: 'TOGGLE_ITEM'; payload: NewWishlistItem }
| { type: 'REMOVE_ITEM'; payload: string }
| { type: 'CLEAR_WISHLIST' }
| { type: 'TOGGLE_DRAWER' }
| { type: 'OPEN_DRAWER' }
| { type: 'CLOSE_DRAWER' }
| { type: 'RESTORE_ITEMS'; payload: WishlistItem[] };
+6
View File
@@ -0,0 +1,6 @@
import type { WishlistItem } from './entities';
export interface WishlistRepository {
load(): WishlistItem[];
save(items: WishlistItem[]): void;
}
+48
View File
@@ -0,0 +1,48 @@
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;
}