From 5085c0cffdc799d1b59a4386acb442d6e25ff388 Mon Sep 17 00:00:00 2001 From: Jelaletdin12 Date: Wed, 10 Dec 2025 17:02:17 +0500 Subject: [PATCH] fixed some ui styles --- app/[locale]/cart/page.tsx | 29 +- app/[locale]/favorites/page.tsx | 2 +- features/cart/components/OrderSummary.tsx | 56 +- .../components/ProductPageContent.tsx | 530 ++++++++++-------- i18n/messages/ru.json | 11 +- i18n/messages/tm.json | 11 +- 6 files changed, 379 insertions(+), 260 deletions(-) diff --git a/app/[locale]/cart/page.tsx b/app/[locale]/cart/page.tsx index 91b2bb9..fea8c0c 100644 --- a/app/[locale]/cart/page.tsx +++ b/app/[locale]/cart/page.tsx @@ -23,7 +23,8 @@ export default function CartPage() { const [selectedRegion, setSelectedRegion] = useState(""); const [selectedProvince, setSelectedProvince] = useState(null); const [note, setNote] = useState(""); - const [phone, setPhone] = useState(""); + const [phone, setPhone] = useState(""); + const [name, setName] = useState(""); const router = useRouter(); const t = useTranslations(); @@ -36,9 +37,15 @@ export default function CartPage() { useEffect(() => { setIsClient(true); + + // Get user data from store if available + const orderData = userStore.getOrderData(); + if (orderData) { + if (orderData.customer_name) setName(orderData.customer_name); + if (orderData.customer_phone) setPhone(orderData.customer_phone); + } }, []); - // Memoize region groups to prevent unnecessary recalculations const regionGroups = useMemo(() => { return provinces.reduce((acc, province) => { if (!acc[province.region]) { @@ -54,7 +61,6 @@ export default function CartPage() { [regionGroups] ); - // Memoize items grouped by seller const itemsBySeller = useMemo(() => { return cartItems.reduce((acc, item) => { const sellerId = item.product.channel?.[0]?.id || 0; @@ -71,7 +77,6 @@ export default function CartPage() { }, {} as Record); }, [cartItems]); - // Memoize total amount const totalAmount = useMemo(() => { return cartItems.reduce((sum, item) => { const price = parseFloat(item.product.price_amount || "0"); @@ -85,7 +90,7 @@ export default function CartPage() { }; const handleCompleteOrder = () => { - if (!selectedRegion || !selectedProvince || !paymentType) { + if (!selectedRegion || !selectedProvince || !paymentType || !phone || !name) { console.warn("Missing required fields for order"); return; } @@ -104,7 +109,7 @@ export default function CartPage() { createOrder( { - customer_name: orderData.customer_name, + customer_name: name, customer_phone: phone, customer_address: selectedProvinceData.name, shipping_method: deliveryType === "PICK_UP" ? "pickup" : "standart", @@ -141,8 +146,8 @@ export default function CartPage() { } return ( -
-

{t("cart")}

+
+

{t("cart")}

@@ -220,6 +225,10 @@ export default function CartPage() { regionGroups={regionGroups} availableRegions={availableRegions} paymentTypes={paymentTypes} + phone={phone} + name={name} + onPhoneChange={setPhone} + onNameChange={setName} onPaymentTypeChange={setPaymentType} onDeliveryTypeChange={handleDeliveryTypeChange} onRegionChange={setSelectedRegion} @@ -227,10 +236,8 @@ export default function CartPage() { onNoteChange={setNote} onCompleteOrder={handleCompleteOrder} isLoading={isCreatingOrder} - phone={phone} - onPhoneChange={setPhone} />
); -} +} \ No newline at end of file diff --git a/app/[locale]/favorites/page.tsx b/app/[locale]/favorites/page.tsx index e8d2143..0dbbf05 100644 --- a/app/[locale]/favorites/page.tsx +++ b/app/[locale]/favorites/page.tsx @@ -71,7 +71,7 @@ export default function FavoritesPage() { price_color="#0059ff" height={360} width={250} - button={true} + button={false} stock={product.stock} /> ); diff --git a/features/cart/components/OrderSummary.tsx b/features/cart/components/OrderSummary.tsx index 98d2192..86cb9c5 100644 --- a/features/cart/components/OrderSummary.tsx +++ b/features/cart/components/OrderSummary.tsx @@ -12,10 +12,10 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; +import { Input } from "@/components/ui/input"; import DeliveryTypeSelector from "./DeliveryTypeSelector"; import { useTranslations } from "next-intl"; import type { DeliveryType, PaymentType, Province } from "@/lib/types/api"; -import { Input } from "@/components/ui/input"; interface OrderBillingItem { title: string; @@ -44,7 +44,9 @@ interface OrderSummaryProps { availableRegions: string[]; paymentTypes: PaymentType[]; phone: string; + name: string; onPhoneChange: (phone: string) => void; + onNameChange: (name: string) => void; onPaymentTypeChange: (type: PaymentType) => void; onDeliveryTypeChange: (type: DeliveryType) => void; onRegionChange: (regionCode: string) => void; @@ -64,7 +66,10 @@ export default function OrderSummary({ regionGroups, availableRegions, paymentTypes, - phone, onPhoneChange, + phone, + name, + onPhoneChange, + onNameChange, onPaymentTypeChange, onDeliveryTypeChange, onRegionChange, @@ -78,10 +83,44 @@ export default function OrderSummary({ const provincesForSelectedRegion = selectedRegion ? regionGroups[selectedRegion] || [] : []; - const isFormValid = selectedRegion && selectedProvince && paymentType && phone; + const isFormValid = + selectedRegion && selectedProvince && paymentType && phone && name; return ( + {/* Customer Information */} +
+

+ {t("customer_information")} +

+
+
+ + onNameChange(e.target.value)} + placeholder={t("name")} + className="rounded-xl" + /> +
+
+ + onPhoneChange(e.target.value)} + placeholder={t("phone")} + className="rounded-xl" + /> +
+
+
+ {/* Payment Type */}

{t("payment_type")}

@@ -171,17 +210,6 @@ export default function OrderSummary({
)} -{/* Phone Number */} -
- - onPhoneChange(e.target.value)} - placeholder={t("phone")} - className="rounded-xl" - /> -
{/* Note */}
diff --git a/features/products/components/ProductPageContent.tsx b/features/products/components/ProductPageContent.tsx index f095da8..c20dac4 100644 --- a/features/products/components/ProductPageContent.tsx +++ b/features/products/components/ProductPageContent.tsx @@ -3,7 +3,15 @@ import { useState, useCallback, useMemo, useRef, useEffect } from "react"; import Image from "next/image"; import Link from "next/link"; -import { Minus, Plus, Heart, ShoppingCart, Store, Loader2, AlertTriangle } from "lucide-react"; +import { + Minus, + Plus, + Heart, + ShoppingCart, + Store, + Loader2, + AlertTriangle, +} from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; @@ -17,7 +25,12 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { useProductsBySlug } from "@/features/products/hooks/useProducts"; -import { useAddToCart, useUpdateCartItemQuantity, useRemoveFromCart, useCart } from "@/features/cart/hooks/useCart"; +import { + useAddToCart, + useUpdateCartItemQuantity, + useRemoveFromCart, + useCart, +} from "@/features/cart/hooks/useCart"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; @@ -25,7 +38,7 @@ interface ProductDetailProps { slug: string; } -const PENDING_PRODUCT_UPDATES_KEY = 'pendingProductUpdates'; +const PENDING_PRODUCT_UPDATES_KEY = "pendingProductUpdates"; interface PendingUpdate { quantity: number; @@ -40,7 +53,7 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { const [isSyncing, setIsSyncing] = useState(false); const [syncError, setSyncError] = useState(false); const [showStockModal, setShowStockModal] = useState(false); - + const t = useTranslations(); const debounceTimerRef = useRef(undefined); @@ -52,22 +65,29 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { const retrySyncRef = useRef<((quantity: number) => void) | null>(null); const autoplayTimerRef = useRef(undefined); - const { data: product, isLoading: productLoading, error } = useProductsBySlug(slug); + const { + data: product, + isLoading: productLoading, + error, + } = useProductsBySlug(slug); const { data: cartData, refetch: refetchCart } = useCart(); const addToCartMutation = useAddToCart(); const updateCartMutation = useUpdateCartItemQuantity(); const removeFromCartMutation = useRemoveFromCart(); - const cartItem = useMemo(() => - cartData?.data?.find((item: any) => item.product?.id === product?.id), + const cartItem = useMemo( + () => cartData?.data?.find((item: any) => item.product?.id === product?.id), [cartData, product] ); const isInCart = !!cartItem; const availableStock = product?.stock || 0; - const imageUrls = useMemo(() => - product?.media?.map(m => m.images_800x800 || m.images_720x720 || m.thumbnail) || [], + const imageUrls = useMemo( + () => + product?.media?.map( + (m) => m.images_800x800 || m.images_720x720 || m.thumbnail + ) || [], [product] ); @@ -77,7 +97,7 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { const startAutoplay = () => { autoplayTimerRef.current = setInterval(() => { - setSelectedImage(prev => (prev + 1) % imageUrls.length); + setSelectedImage((prev) => (prev + 1) % imageUrls.length); }, 3000); }; @@ -91,20 +111,23 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { }, [imageUrls.length]); // Reset autoplay timer when user manually selects image - const handleImageSelect = useCallback((index: number) => { - setSelectedImage(index); - - // Reset autoplay timer - if (autoplayTimerRef.current) { - clearInterval(autoplayTimerRef.current); - } - - if (imageUrls.length > 1) { - autoplayTimerRef.current = setInterval(() => { - setSelectedImage(prev => (prev + 1) % imageUrls.length); - }, 3000); - } - }, [imageUrls.length]); + const handleImageSelect = useCallback( + (index: number) => { + setSelectedImage(index); + + // Reset autoplay timer + if (autoplayTimerRef.current) { + clearInterval(autoplayTimerRef.current); + } + + if (imageUrls.length > 1) { + autoplayTimerRef.current = setInterval(() => { + setSelectedImage((prev) => (prev + 1) % imageUrls.length); + }, 3000); + } + }, + [imageUrls.length] + ); useEffect(() => { if (cartItem?.product_quantity) { @@ -112,121 +135,148 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { } }, [cartItem]); - const savePendingUpdate = useCallback((quantity: number) => { - if (!product?.id) return; - - try { - const stored = sessionStorage.getItem(PENDING_PRODUCT_UPDATES_KEY); - const pending: Record = stored ? JSON.parse(stored) : {}; - - pending[product.id] = { - quantity, - timestamp: Date.now(), - retryCount: retryCountRef.current - }; - - sessionStorage.setItem(PENDING_PRODUCT_UPDATES_KEY, JSON.stringify(pending)); - } catch (error) { - console.error('Failed to save pending update:', error); - } - }, [product?.id]); + const savePendingUpdate = useCallback( + (quantity: number) => { + if (!product?.id) return; + + try { + const stored = sessionStorage.getItem(PENDING_PRODUCT_UPDATES_KEY); + const pending: Record = stored + ? JSON.parse(stored) + : {}; + + pending[product.id] = { + quantity, + timestamp: Date.now(), + retryCount: retryCountRef.current, + }; + + sessionStorage.setItem( + PENDING_PRODUCT_UPDATES_KEY, + JSON.stringify(pending) + ); + } catch (error) { + console.error("Failed to save pending update:", error); + } + }, + [product?.id] + ); const clearPendingUpdate = useCallback(() => { if (!product?.id) return; - + try { const stored = sessionStorage.getItem(PENDING_PRODUCT_UPDATES_KEY); if (stored) { const pending: Record = JSON.parse(stored); delete pending[product.id]; - + if (Object.keys(pending).length === 0) { sessionStorage.removeItem(PENDING_PRODUCT_UPDATES_KEY); } else { - sessionStorage.setItem(PENDING_PRODUCT_UPDATES_KEY, JSON.stringify(pending)); + sessionStorage.setItem( + PENDING_PRODUCT_UPDATES_KEY, + JSON.stringify(pending) + ); } } } catch (error) { - console.error('Failed to clear pending update:', error); + console.error("Failed to clear pending update:", error); } }, [product?.id]); - const retrySync = useCallback((quantity: number) => { - const maxRetries = 4; - const retryCount = retryCountRef.current; + const retrySync = useCallback( + (quantity: number) => { + const maxRetries = 4; + const retryCount = retryCountRef.current; - if (retryCount >= maxRetries) { - setSyncError(true); - setIsSyncing(false); - toast.error(t("error"), { - description: t("update_quantity_failed"), - }); - return; - } + if (retryCount >= maxRetries) { + setSyncError(true); + setIsSyncing(false); + toast.error(t("error"), { + description: t("update_quantity_failed"), + }); + return; + } - const delay = Math.min(1000 * Math.pow(2, retryCount), 16000); - retryCountRef.current++; - - retryTimerRef.current = setTimeout(() => { - syncToServerRef.current?.(quantity); - }, delay); - }, [t]); + const delay = Math.min(1000 * Math.pow(2, retryCount), 16000); + retryCountRef.current++; + + retryTimerRef.current = setTimeout(() => { + syncToServerRef.current?.(quantity); + }, delay); + }, + [t] + ); retrySyncRef.current = retrySync; - const syncToServer = useCallback(async (quantity: number) => { - if (!product?.id) return; + const syncToServer = useCallback( + async (quantity: number) => { + if (!product?.id) return; - if (isRequestInFlightRef.current) { - pendingQuantityRef.current = quantity; - return; - } - - isRequestInFlightRef.current = true; - setIsSyncing(true); - setSyncError(false); - - try { - // If quantity is 0, remove from cart - if (quantity === 0) { - await removeFromCartMutation.mutateAsync(product.id); - toast.success(t("removed_from_cart")); - } else if (isInCart) { - await updateCartMutation.mutateAsync({ - productId: product.id, - quantity: quantity, - }); - } else { - await addToCartMutation.mutateAsync({ - productId: product.id, - quantity: quantity, - }); + if (isRequestInFlightRef.current) { + pendingQuantityRef.current = quantity; + return; } - isRequestInFlightRef.current = false; - setIsSyncing(false); - retryCountRef.current = 0; - clearPendingUpdate(); + isRequestInFlightRef.current = true; + setIsSyncing(true); + setSyncError(false); - await refetchCart(); + try { + // If quantity is 0, remove from cart + if (quantity === 0) { + await removeFromCartMutation.mutateAsync(product.id); + toast.success(t("removed_from_cart")); + } else if (isInCart) { + await updateCartMutation.mutateAsync({ + productId: product.id, + quantity: quantity, + }); + } else { + await addToCartMutation.mutateAsync({ + productId: product.id, + quantity: quantity, + }); + } - if (pendingQuantityRef.current !== null) { - const nextQuantity = pendingQuantityRef.current; - pendingQuantityRef.current = null; - setTimeout(() => syncToServerRef.current?.(nextQuantity), 100); - } - } catch (error) { - console.error('Sync failed:', error); - isRequestInFlightRef.current = false; - - if (retryCountRef.current >= 3) { - setLocalQuantity(cartItem?.product_quantity || 1); + isRequestInFlightRef.current = false; + setIsSyncing(false); + retryCountRef.current = 0; clearPendingUpdate(); + + await refetchCart(); + + if (pendingQuantityRef.current !== null) { + const nextQuantity = pendingQuantityRef.current; + pendingQuantityRef.current = null; + setTimeout(() => syncToServerRef.current?.(nextQuantity), 100); + } + } catch (error) { + console.error("Sync failed:", error); + isRequestInFlightRef.current = false; + + if (retryCountRef.current >= 3) { + setLocalQuantity(cartItem?.product_quantity || 1); + clearPendingUpdate(); + } + + retrySyncRef.current?.(quantity); } - - retrySyncRef.current?.(quantity); - } - }, [product?.id, isInCart, updateCartMutation, addToCartMutation, removeFromCartMutation, cartItem, clearPendingUpdate, refetchCart, t]); + }, + [ + product?.id, + isInCart, + updateCartMutation, + addToCartMutation, + removeFromCartMutation, + cartItem, + clearPendingUpdate, + refetchCart, + t, + ] + ); syncToServerRef.current = syncToServer; @@ -239,17 +289,23 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { if (stored) { const pending: Record = JSON.parse(stored); const productPending = pending[product.id]; - - if (productPending && productPending.quantity !== (cartItem?.product_quantity || 1)) { + + if ( + productPending && + productPending.quantity !== (cartItem?.product_quantity || 1) + ) { setLocalQuantity(productPending.quantity); pendingQuantityRef.current = productPending.quantity; retryCountRef.current = productPending.retryCount; - - setTimeout(() => syncToServerRef.current?.(productPending.quantity), 500); + + setTimeout( + () => syncToServerRef.current?.(productPending.quantity), + 500 + ); } } } catch (error) { - console.error('Failed to load pending updates:', error); + console.error("Failed to load pending updates:", error); } }; @@ -298,11 +354,11 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { productId: product.id, quantity: localQuantity, }); - + await refetchCart(); - + setIsSyncing(false); - + toast.success(t("added_to_cart"), { description: `${product.name} ${t("added_to_cart_description")}`, }); @@ -320,39 +376,42 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { setShowStockModal(true); return; } - - setLocalQuantity(prev => prev + 1); + + setLocalQuantity((prev) => prev + 1); }, [localQuantity, availableStock]); const handleQuantityDecrease = useCallback(() => { // Allow decreasing to 0 to remove from cart if (localQuantity <= 0) return; - - setLocalQuantity(prev => prev - 1); + + setLocalQuantity((prev) => prev - 1); }, [localQuantity]); const handleToggleFavorite = useCallback(() => { setIsFavorite(!isFavorite); }, [isFavorite]); - const loadingSkeleton = useMemo(() => ( -
-
-
- -
- {[1, 2, 3].map((i) => ( - - ))} + const loadingSkeleton = useMemo( + () => ( +
+
+
+ +
+ {[1, 2, 3].map((i) => ( + + ))} +
+
+
+ +
-
- - -
-
- ), []); + ), + [] + ); if (productLoading) { return loadingSkeleton; @@ -361,19 +420,23 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { if (error || !product) { return (
-

{t("product_not_found")}

-

{t("product_not_found_description")}

+

+ {t("product_not_found")} +

+

+ {t("product_not_found_description")} +

); } return ( <> -
-
+
+
-
+
{imageUrls.length > 0 ? ( handleImageSelect(index)} className={`relative w-16 h-16 flex-shrink-0 rounded overflow-hidden border-2 transition-all ${ - selectedImage === index - ? "border-primary ring-2 ring-primary/20" + selectedImage === index + ? "border-primary ring-2 ring-primary/20" : "border-gray-200 hover:border-gray-300" }`} > @@ -414,58 +477,62 @@ export default function ProductPageContent({ slug }: ProductDetailProps) {
-
+

{product.name}

- {product.categories && product.categories.length > 0 && ( -
- {product.categories.map((cat, idx) => ( - - {cat.name} - - ))} -
- )}
-

{t("about_product")}

+

+ {t("about_product")} +

{product.brand?.name && ( <>
- {t("brand")} + {t("brands")} {product.brand.name}
)} - + {product.stock !== undefined && ( <>
{t("stock")} - - {product.stock === 0 ? t("out_of_stock") : product.stock <= 5 ? `${t("only_left", { count: product.stock })}` : product.stock} + + {product.stock === 0 + ? t("out_of_stock") + : product.stock <= 5 + ? `${t("only_left", { count: product.stock })}` + : product.stock}
)} - + {product.barcode && ( <>
{t("barcode")} - {product.barcode} + + {product.barcode} +
)} - + {product.colour && ( <>
@@ -475,20 +542,23 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { )} - + {product.properties && product.properties.length > 0 && ( <> - {product.properties.map((prop, idx) => ( - prop.value && ( -
-
- {prop.name} - {prop.value} + {product.properties.map( + (prop, idx) => + prop.value && ( +
+
+ {prop.name} + {prop.value} +
+ {idx < product.properties.length - 1 && ( + + )}
- {idx < product.properties.length - 1 && } -
- ) - ))} + ) + )} )}
@@ -496,8 +566,10 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { {product.description && ( -

{t("product_description")}

-
+ {t("product_description")} + +
@@ -513,21 +585,22 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { {product.price_amount} TMT - {product.old_price_amount && parseFloat(product.old_price_amount) > 0 && ( - - {product.old_price_amount} TMT - - )} + {product.old_price_amount && + parseFloat(product.old_price_amount) > 0 && ( + + {product.old_price_amount} TMT + + )}
-
+
{isInCart ? ( <> -
{localQuantity} - {isSyncing && ( - - )} + {syncError && ( - + )}
+ +
) : ( @@ -571,7 +670,7 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { size="lg" onClick={handleAddToCart} disabled={isSyncing || product.stock === 0} - className="w-full rounded-xl text-lg font-bold" + className="w-full rounded-lg text-lg font-bold bg-[#005bff] hover:bg-[#0041c4] cursor-pointer" > {isSyncing ? ( <> @@ -581,28 +680,13 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { ) : ( <> - {product.stock === 0 ? t("out_of_stock") : t("add_to_cart")} + {product.stock === 0 + ? t("out_of_stock") + : t("add_to_cart")} )} )} - -
@@ -616,13 +700,15 @@ export default function ProductPageContent({ slug }: ProductDetailProps) {

{t("store")}

-

{product.channel[0].name}

+

+ {product.channel[0].name} +

- @@ -644,16 +730,16 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { {t("stock_limit_title")} - {t("stock_limit_message", { + {t("stock_limit_message", { product: product.name, - stock: availableStock + stock: availableStock, })}
@@ -662,4 +748,4 @@ export default function ProductPageContent({ slug }: ProductDetailProps) { ); -} \ No newline at end of file +} diff --git a/i18n/messages/ru.json b/i18n/messages/ru.json index 09e0a49..eecf6a2 100644 --- a/i18n/messages/ru.json +++ b/i18n/messages/ru.json @@ -109,7 +109,6 @@ "my_orders": "Мои заказы", "active_orders": "Активные заказы", "completed_orders": "Завершенные заказы", - "cancel_order": "Отменить заказ", "keep_order": "Оставить заказ", "cancel_confirmation": "Вы уверены, что хотите отменить этот заказ?", "cancelling": "Отмена...", @@ -142,12 +141,12 @@ "login_success": "Вход выполнен успешно", "error_occurred": "Произошла ошибка", "wrong_code": "Неверный код", - "phone_format": "Формат: 99365123456", + "phone_format": "Формат: 65123456", "sending": "Отправка...", "verifying": "Проверка...", "verify": "Подтвердить", - "only_left": "Sadece {count} adet kaldı", - "stock_limit_title": "Stok Limiti", - "stock_limit_message": "{product} ürününden sadece {stock} adet mevcut. Daha fazla ekleyemezsiniz.", - "understood": "Anladım" + "only_left": "Осталось {count} шт.", + "stock_limit_title": "Недостаточно на складе", + "stock_limit_message": "{product} закончился. Можно купить только {stock} шт.", + "understood": "Понятно" } \ No newline at end of file diff --git a/i18n/messages/tm.json b/i18n/messages/tm.json index 6803c77..cf5caa5 100644 --- a/i18n/messages/tm.json +++ b/i18n/messages/tm.json @@ -109,7 +109,6 @@ "my_orders": "Meniň sargytlarym", "active_orders": "Işjeň sargytlar", "completed_orders": "Tamamlanan sargytlar", - "cancel_order": "Sargydy ýatyrmak", "keep_order": "Sargydy saklamak", "cancel_confirmation": "Siz bu sargydy ýatyrmagy hakykatdanam isleýärsiňizmi?", "cancelling": "Ýatyrylýar...", @@ -142,12 +141,12 @@ "login_success": "Giriş üstünlikli boldy", "error_occurred": "Ýalňyşlyk ýüze çykdy", "wrong_code": "Kod nädogry", - "phone_format": "Format: 99365123456", + "phone_format": "Format: 65123456", "sending": "Iberilýär...", "verifying": "Barlanýar...", "verify": "Tassyklamak", - "only_left": "Sadece {count} adet kaldı", - "stock_limit_title": "Stok Limiti", - "stock_limit_message": "{product} ürününden sadece {stock} adet mevcut. Daha fazla ekleyemezsiniz.", - "understood": "Anladım" + "only_left": "Diňe {count} sany galdy", + "stock_limit_title": "Çäkli sanda", + "stock_limit_message": "{product} harytdan diňe {stock} sany bar. Mundan köp sebediňize goşup bilmersiňiz.", + "understood": "Düşündim" } \ No newline at end of file