From d6c163dd06285116dbd201fa050c08e17695e904 Mon Sep 17 00:00:00 2001 From: Jelaletdin12 Date: Tue, 9 Dec 2025 14:59:20 +0500 Subject: [PATCH] fixed favorites api --- app/[locale]/favicon.ico | Bin 25931 -> 0 bytes app/[locale]/favorites/page.tsx | 86 +++++++------- app/[locale]/globals.css | 72 +++++++++++- app/favicon.ico | Bin 0 -> 15086 bytes components/PageLoader/PreLoader.tsx | 80 +++++++++++++ components/icons.tsx | 66 +++++++++++ components/layout/Header.tsx | 5 +- components/layout/ui/ActionButtons.tsx | 11 +- components/layout/ui/AuthDialog.tsx | 2 +- components/layout/ui/SearchBar.tsx | 3 +- context/AuthWrapper.tsx | 8 +- features/favorites/hooks/useFavorites.ts | 144 ++++++++++++++++++----- features/home/components/Carousel.tsx | 2 +- features/home/components/HomePage.tsx | 30 ++++- features/home/components/ProductCard.tsx | 70 +++++------ features/home/components/ProductGrid.tsx | 27 ++--- package-lock.json | 7 +- package.json | 1 + public/logo.png | Bin 21999 -> 0 bytes public/logo.webp | Bin 0 -> 7888 bytes public/seller.png | Bin 0 -> 24175 bytes 21 files changed, 467 insertions(+), 147 deletions(-) delete mode 100644 app/[locale]/favicon.ico create mode 100644 app/favicon.ico create mode 100644 components/PageLoader/PreLoader.tsx create mode 100644 components/icons.tsx delete mode 100644 public/logo.png create mode 100644 public/logo.webp create mode 100644 public/seller.png diff --git a/app/[locale]/favicon.ico b/app/[locale]/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/[locale]/favorites/page.tsx b/app/[locale]/favorites/page.tsx index 33fe7cc..595f993 100644 --- a/app/[locale]/favorites/page.tsx +++ b/app/[locale]/favorites/page.tsx @@ -26,30 +26,12 @@ export default function FavoritesPage() { useRemoveFromFavorites(); const { mutate: addToCart, isPending: isAddingToCart } = useAddToCart(); - const handleRemoveFromFavorites = useCallback((productId: number) => { - removeFromFavorites(productId, { - onSuccess: () => { - toast({ - title: t("removed_from_favorites"), - }); - }, - onError: (error) => { - toast({ - title: t("error"), - description: error.message, - variant: "destructive", - }); - }, - }); - }, [removeFromFavorites, toast, t]); - - const handleAddToCart = useCallback((productId: number) => { - addToCart( - { productId }, - { + const handleRemoveFromFavorites = useCallback( + (productId: number) => { + removeFromFavorites(productId, { onSuccess: () => { toast({ - title: t("added_to_cart"), + title: t("removed_from_favorites"), }); }, onError: (error) => { @@ -59,20 +41,47 @@ export default function FavoritesPage() { variant: "destructive", }); }, - } - ); - }, [addToCart, toast, t]); + }); + }, + [removeFromFavorites, toast, t] + ); - const loadingSkeleton = useMemo(() => ( -
-

{t("favorite_products")}

-
- {Array.from({ length: 10 }).map((_, i) => ( - - ))} + const handleAddToCart = useCallback( + (productId: number) => { + addToCart( + { productId }, + { + onSuccess: () => { + toast({ + title: t("added_to_cart"), + }); + }, + onError: (error) => { + toast({ + title: t("error"), + description: error.message, + variant: "destructive", + }); + }, + } + ); + }, + [addToCart, toast, t] + ); + + const loadingSkeleton = useMemo( + () => ( +
+

{t("favorite_products")}

+
+ {Array.from({ length: 10 }).map((_, i) => ( + + ))} +
-
- ), [t]); + ), + [t] + ); if (isLoading) { return loadingSkeleton; @@ -95,7 +104,7 @@ export default function FavoritesPage() {
{favorites.map((favorite: Favorite) => ( handleRemoveFromFavorites(favorite.product.id)} @@ -170,7 +179,6 @@ function ProductCard({ >
- {/* Favorite Button */} - {/* Product Image */} {product.name} - {/* Out of Stock Badge */} {product.stock === 0 && (
@@ -203,7 +209,6 @@ function ProductCard({ )}
- {/* Product Info */}

{product.name} @@ -217,7 +222,6 @@ function ProductCard({

- {/* Add to Cart Button - показывается при hover */} {isHovered && product.stock > 0 && (
diff --git a/components/layout/ui/ActionButtons.tsx b/components/layout/ui/ActionButtons.tsx index 902bf93..cf870ae 100644 --- a/components/layout/ui/ActionButtons.tsx +++ b/components/layout/ui/ActionButtons.tsx @@ -16,6 +16,7 @@ import { useCart, useFavorites, useOrders } from "@/lib/hooks"; import { Skeleton } from "@/components/ui/skeleton"; import { useTranslations } from "next-intl"; import { useLogout } from "@/lib/hooks/useAuth"; +import { CartIcon, FavoriteIcon, OrderIcon, ProfileIcon } from "@/components/icons"; interface ActionButtonsProps { isAuthenticated: boolean; @@ -70,21 +71,21 @@ export default function ActionButtons({ const buttons: ActionButtonData[] = useMemo(() => [ { - icon: , + icon: , label: t("common.orders"), href: "/orders", badgeCount: ordersCount, isLoading: ordersLoading, }, { - icon: , + icon: , label: t("common.favorites"), href: "/favorites", badgeCount: favoritesCount, isLoading: favoritesLoading, }, { - icon: , + icon: , label: t("common.cart"), href: "/cart", badgeCount: cartCount, @@ -101,7 +102,7 @@ export default function ActionButtons({ @@ -118,7 +119,7 @@ export default function ActionButtons({ ) : ( )} diff --git a/components/layout/ui/AuthDialog.tsx b/components/layout/ui/AuthDialog.tsx index 422e51c..ad07be7 100644 --- a/components/layout/ui/AuthDialog.tsx +++ b/components/layout/ui/AuthDialog.tsx @@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { toast } from "sonner"; -import Logo from "@/public/logo.png"; +import Logo from "@/public/logo.webp"; import { useLogin, useVerifyToken } from "@/lib/hooks/useAuth"; import { useTranslations } from "next-intl"; diff --git a/components/layout/ui/SearchBar.tsx b/components/layout/ui/SearchBar.tsx index 30eea7d..fcf8f93 100644 --- a/components/layout/ui/SearchBar.tsx +++ b/components/layout/ui/SearchBar.tsx @@ -13,6 +13,7 @@ import { import { useRouter } from "next/navigation"; import { useSearchProducts } from "@/features/search/hooks/useSearch"; import Image from "next/image"; +import { SearchIcon } from "@/components/icons"; interface SearchBarProps { isMobile: boolean; @@ -158,7 +159,7 @@ export default function SearchBar({ size="icon" className="h-auto hover:bg-[#005bff] cursor-pointer bg-transparent flex items-center mr-1.5 text-white" > - +
diff --git a/context/AuthWrapper.tsx b/context/AuthWrapper.tsx index 84ead5f..4b7ae08 100644 --- a/context/AuthWrapper.tsx +++ b/context/AuthWrapper.tsx @@ -4,6 +4,7 @@ import { useEffect, type ReactNode } from "react"; import { useRouter, usePathname } from "next/navigation"; import { useAuthStatus, useGetGuestToken } from "@/lib/hooks/useAuth"; import { useUserProfile } from "@/features/profile/hooks/useUserProfile"; +import Preloader from "@/components/PageLoader/PreLoader"; interface AuthWrapperProps { children: ReactNode; @@ -58,12 +59,7 @@ export default function AuthWrapper({ if (isLoading || (requireAuth && !isAuthenticated)) { return ( -
-
-
-

Yükleniyor...

-
-
+ ); } diff --git a/features/favorites/hooks/useFavorites.ts b/features/favorites/hooks/useFavorites.ts index 69398e4..0dea131 100644 --- a/features/favorites/hooks/useFavorites.ts +++ b/features/favorites/hooks/useFavorites.ts @@ -2,69 +2,148 @@ import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { apiClient } from "@/lib/api"; import type { Favorite } from "@/lib/types/api"; -// Response tiplerini tanımlayalım interface FavoritesResponse { data?: Favorite[]; [key: string]: any; } -interface FavoriteActionResponse { - data?: string | Favorite[]; - [key: string]: any; -} - -// Response'u transform eden yardımcı fonksiyon function transformFavoritesResponse(response: any): Favorite[] { if (typeof response === "object" && response.data) { return response.data; } - if (typeof response === "string") { try { const parsed = JSON.parse(response); return parsed.data || []; - } catch (error) { - console.error("Failed to parse favorites response:", error); + } catch { return []; } } - return []; } -function transformActionResponse(response: any, defaultValue: string): string { - if (typeof response === "object" && response.data) { - return response.data; - } +// Fetch ALL favorite products (handle pagination on backend) +async function fetchAllFavorites(): Promise { + const allFavorites: Favorite[] = []; + let currentPage = 1; + let hasMorePages = true; - if (typeof response === "string") { + while (hasMorePages) { try { - const parsed = JSON.parse(response); - return parsed.data || defaultValue; - } catch (error) { - if (response.includes("")) { - return defaultValue; + const response = await apiClient.get("/favorites", { + params: { page: currentPage, perPage: 100 }, + }); + + const favorites = transformFavoritesResponse(response.data); + allFavorites.push(...favorites); + + // Check pagination + const pagination = response.data?.pagination; + if (pagination?.next_page_url) { + currentPage++; + } else { + hasMorePages = false; } - console.error(`Failed to parse favorite response:`, error); - return defaultValue; + } catch (error) { + // If pagination not supported, return what we have + hasMorePages = false; } } - return defaultValue; + return allFavorites; } +// Get all favorites with automatic pagination export function useFavorites() { return useQuery({ queryKey: ["favorites"], - queryFn: async () => { - const response = await apiClient.get("/favorites"); - return transformFavoritesResponse(response.data); - }, + queryFn: fetchAllFavorites, staleTime: 1000 * 60 * 5, + gcTime: 1000 * 60 * 10, // Keep in cache for 10 minutes retry: 1, }); } +// Get favorite product IDs as Set for O(1) lookup - ALWAYS loads favorites first +export function useFavoriteIds() { + const { data: favorites, isLoading } = useFavorites(); + + // Return Set with IDs, empty Set while loading + return { + favoriteIds: new Set(favorites?.map((fav) => fav.product.id) || []), + isLoading, + }; +} + +// Check if product is favorited - with loading state +export function useIsFavorite(productId: number) { + const { favoriteIds, isLoading } = useFavoriteIds(); + + return { + isFavorite: favoriteIds.has(productId), + isLoading, + }; +} + +// Toggle favorite (add/remove) with optimistic updates +export function useToggleFavorite() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async ({ + productId, + isFavorite, + }: { + productId: number; + isFavorite: boolean; + }) => { + const formData = new URLSearchParams({ + product_id: productId.toString(), + }); + + await apiClient.post("/favorites", formData, { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + }); + + return { productId, wasAdded: !isFavorite }; + }, + onMutate: async ({ productId, isFavorite }) => { + // Cancel outgoing refetches + await queryClient.cancelQueries({ queryKey: ["favorites"] }); + + // Snapshot previous + const previousFavorites = queryClient.getQueryData([ + "favorites", + ]); + + // Optimistically update + queryClient.setQueryData(["favorites"], (old = []) => { + if (isFavorite) { + // Remove from favorites + return old.filter((fav) => fav.product.id !== productId); + } + // For add, we'll refetch to get full product data + return old; + }); + + return { previousFavorites }; + }, + onError: (err, variables, context) => { + // Rollback on error + if (context?.previousFavorites) { + queryClient.setQueryData(["favorites"], context.previousFavorites); + } + }, + onSettled: () => { + // Refetch to ensure consistency + queryClient.invalidateQueries({ queryKey: ["favorites"] }); + }, + }); +} + +// Add to favorites export function useAddToFavorites() { const queryClient = useQueryClient(); @@ -74,13 +153,13 @@ export function useAddToFavorites() { product_id: productId.toString(), }); - const response = await apiClient.post("/favorites", formData, { + await apiClient.post("/favorites", formData, { headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); - return transformActionResponse(response.data, "Added"); + return productId; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["favorites"] }); @@ -88,6 +167,7 @@ export function useAddToFavorites() { }); } +// Remove from favorites export function useRemoveFromFavorites() { const queryClient = useQueryClient(); @@ -97,13 +177,13 @@ export function useRemoveFromFavorites() { product_id: productId.toString(), }); - const response = await apiClient.post("/favorites", formData, { + await apiClient.post("/favorites", formData, { headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); - return transformActionResponse(response.data, "Removed"); + return productId; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["favorites"] }); diff --git a/features/home/components/Carousel.tsx b/features/home/components/Carousel.tsx index aaca9a1..6884b71 100644 --- a/features/home/components/Carousel.tsx +++ b/features/home/components/Carousel.tsx @@ -21,7 +21,7 @@ export default function HeroCarousel({ items }: { items: CarouselItem[] }) { > {items.map((item, i) => ( -
+
{item.title} setMounted(true), []); const loadMore = () => { @@ -48,8 +55,12 @@ export default function HomePage() { const visibleCollections = collections?.slice(0, visibleCount) || []; const hasMore = collections ? visibleCount < collections.length : false; + // Show loading indicator while favorites are being fetched + const showFavoritesLoading = + favoritesLoading && !categoriesLoading && !collectionsLoading; + return ( -
+
{!carouselsLoading && carouselItems.length > 0 && ( )} @@ -62,6 +73,13 @@ export default function HomePage() { title={t("categories")} /> + {showFavoritesLoading && ( +
+
+

Loading favorites...

+
+ )} + {collectionsError ? (

@@ -115,4 +133,4 @@ export default function HomePage() { )}

); -} \ No newline at end of file +} diff --git a/features/home/components/ProductCard.tsx b/features/home/components/ProductCard.tsx index 762289e..1b105b8 100644 --- a/features/home/components/ProductCard.tsx +++ b/features/home/components/ProductCard.tsx @@ -13,6 +13,7 @@ import { } from "@/components/ui/carousel"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; +import { useToggleFavorite, useIsFavorite } from "@/lib/hooks"; type ProductCardProps = { id: number; @@ -22,12 +23,10 @@ type ProductCardProps = { discount?: number | null; discount_text?: string | null; images: string[]; - is_favorite: boolean; labels?: { text: string; bg_color: string }[]; price_color?: string; height?: number; width?: number; - button?: boolean; }; export default function ProductCard({ @@ -38,32 +37,29 @@ export default function ProductCard({ discount, discount_text, images, - is_favorite, labels = [], price_color = "#005bff", height = 360, width = 280, - button = true, }: ProductCardProps) { - const [favorite, setFavorite] = useState(is_favorite); + const { isFavorite, isLoading: isFavoriteLoading } = useIsFavorite(id); + const { mutate: toggleFavorite, isPending } = useToggleFavorite(); + const [api, setApi] = useState(); const [current, setCurrent] = useState(0); const autoplayRef = useRef(null); const hasMultipleImages = images.length > 1; - // Track carousel current slide useEffect(() => { if (!api) return; setCurrent(api.selectedScrollSnap()); - api.on("select", () => { setCurrent(api.selectedScrollSnap()); }); }, [api]); - // Auto-play functionality - 3 seconds useEffect(() => { if (!api || !hasMultipleImages) return; @@ -85,28 +81,34 @@ export default function ProductCard({ }; startAutoplay(); - return () => stopAutoplay(); }, [api, hasMultipleImages]); - const handleFavorite = async (e: MouseEvent) => { + const handleFavorite = (e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); - const newFavoriteState = !favorite; - setFavorite(newFavoriteState); - - if (newFavoriteState) { - toast.success("Товар добавлен в избранное"); - } else { - toast.success("Товар удален из избранного"); - } + toggleFavorite( + { productId: id, isFavorite }, + { + onSuccess: (data) => { + toast.success( + data.wasAdded + ? "Товар добавлен в избранное" + : "Товар удален из избранного" + ); + }, + onError: () => { + toast.error("Ошибка. Попробуйте снова"); + }, + } + ); }; const handleCardClick = (e: MouseEvent) => { const target = e.target as HTMLElement; if ( - target.closest('button') || + target.closest("button") || target.closest('[data-carousel-control="true"]') ) { e.preventDefault(); @@ -122,20 +124,19 @@ export default function ProductCard({ return ( - {/* Image Section with Carousel */}
{images.map((image, index) => ( -
+
{`${name} - {/* Navigation Arrows - Only show if multiple images */} {hasMultipleImages && ( <> - {/* Favorite Button */} + {/* Favorite button - show skeleton while loading favorites */} - {/* Image Indicators */} {hasMultipleImages && (
{images.map((_, index) => ( @@ -200,7 +202,6 @@ export default function ProductCard({
)} - {/* Labels */} {labels?.length > 0 && (
{labels.map((label, idx) => ( @@ -216,17 +217,18 @@ export default function ProductCard({ )}
- {/* Content */}

{struct_price_text}

-

{name}

+

+ {name} +

); -} \ No newline at end of file +} diff --git a/features/home/components/ProductGrid.tsx b/features/home/components/ProductGrid.tsx index 448996a..f529770 100644 --- a/features/home/components/ProductGrid.tsx +++ b/features/home/components/ProductGrid.tsx @@ -60,7 +60,7 @@ export default function CollectionSection({ collection, locale }: Props) { const displayProducts = productsData?.data.slice(0, 10) || []; return ( -
+
{displayProducts.map((product) => { - // 🔥 TÜM RESİMLERİ AL - Burada değişiklik! - const allImages = product.media?.map( - (media) => - media.images_800x800 || - media.images_720x720 || - media.images_400x400 || - media.thumbnail - ).filter(Boolean) || ["/placeholder-product.jpg"]; + const allImages = product.media + ?.map( + (media) => + media.images_800x800 || + media.images_720x720 || + media.images_400x400 || + media.thumbnail + ) + .filter(Boolean) || ["/placeholder-product.jpg"]; const formattedPrice = product.price_amount ? `${parseFloat(product.price_amount).toFixed(2)} TMT` @@ -95,17 +96,15 @@ export default function CollectionSection({ collection, locale }: Props) { product.price_amount ? parseFloat(product.price_amount) : null } struct_price_text={formattedPrice} - images={allImages} // 🔥 Array olarak tüm resimler - is_favorite={false} + images={allImages} labels={[]} - price_color="#111" + price_color="#0059ff" height={360} width={250} - button={false} /> ); })}
); -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 2d41069..6f6afb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "baseline-browser-mapping": "^2.9.5", "eslint": "^9", "eslint-config-next": "16.0.1", "tailwindcss": "^4", @@ -3868,9 +3869,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", - "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", + "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index aee9a66..f6aff0e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "baseline-browser-mapping": "^2.9.5", "eslint": "^9", "eslint-config-next": "16.0.1", "tailwindcss": "^4", diff --git a/public/logo.png b/public/logo.png deleted file mode 100644 index c7c8c4dcfaa9ccd73716c8294610384ab0985135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21999 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 diff --git a/public/logo.webp b/public/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1debe69bb26f6f14ed411baf8dbd74680e1f6b8 GIT binary patch literal 7888 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 literal 0 HcmV?d00001 diff --git a/public/seller.png b/public/seller.png new file mode 100644 index 0000000000000000000000000000000000000000..a8aa0aa7ea43d52dcbb1c967999ee60566d6a5af GIT binary patch literal 24175 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