2026-07-10 08:18:20 +00:00
|
|
|
import { Basket } from '@/components/orders/Basket'
|
2026-02-24 20:44:16 +00:00
|
|
|
import { TenantForm } from '@/components/orders/TenantForm'
|
|
|
|
|
import { APP_NAME } from '@/constants/app.constant'
|
|
|
|
|
import { CustomTenantDto } from '@/proxy/config/models'
|
|
|
|
|
import { ROUTES_ENUM } from '@/routes/route.constant'
|
2026-07-09 17:55:07 +00:00
|
|
|
import { useStoreActions, useStoreState } from '@/store/store'
|
2026-02-24 20:44:16 +00:00
|
|
|
import {
|
2026-07-10 08:18:20 +00:00
|
|
|
BasketData,
|
|
|
|
|
clearBasket,
|
|
|
|
|
removeItemFromBasket,
|
|
|
|
|
updateBasketItemQuantity,
|
|
|
|
|
} from '@/utils/basketUtils'
|
2026-02-24 20:44:16 +00:00
|
|
|
import { useLocalization } from '@/utils/hooks/useLocalization'
|
|
|
|
|
import React, { useState, useEffect } from 'react'
|
|
|
|
|
import { Helmet } from 'react-helmet'
|
|
|
|
|
import { useNavigate } from 'react-router-dom'
|
|
|
|
|
|
|
|
|
|
const Checkout: React.FC = () => {
|
|
|
|
|
const navigate = useNavigate()
|
2026-07-10 08:18:20 +00:00
|
|
|
const [isBasketOpen, setIsBasketOpen] = useState(false)
|
2026-02-24 20:44:16 +00:00
|
|
|
const { translate } = useLocalization()
|
|
|
|
|
|
2026-07-10 08:18:20 +00:00
|
|
|
const storedBasketData = useStoreState((state) => state.client.basketData)
|
|
|
|
|
const { setBasketData } = useStoreActions((actions) => actions.client)
|
2026-07-09 17:55:07 +00:00
|
|
|
const { setTenantData } = useStoreActions((actions) => actions.client.order)
|
2026-07-10 08:18:20 +00:00
|
|
|
const [basketData, setLocalBasketData] = useState<BasketData>(storedBasketData)
|
2026-02-24 20:44:16 +00:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
2026-07-10 08:18:20 +00:00
|
|
|
setBasketData(basketData)
|
|
|
|
|
}, [basketData, setBasketData])
|
2026-02-24 20:44:16 +00:00
|
|
|
|
|
|
|
|
const handleTenantSubmit = (tenantData: CustomTenantDto) => {
|
2026-07-09 17:55:07 +00:00
|
|
|
setTenantData(tenantData)
|
2026-02-24 20:44:16 +00:00
|
|
|
navigate(ROUTES_ENUM.public.payment)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleBackToCatalog = () => {
|
|
|
|
|
navigate(ROUTES_ENUM.public.home)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleCheckout = () => {
|
2026-07-10 08:18:20 +00:00
|
|
|
setIsBasketOpen(false)
|
2026-02-24 20:44:16 +00:00
|
|
|
navigate(ROUTES_ENUM.public.checkout)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleUpdateQuantity = (id: string, quantity: number) => {
|
2026-07-10 08:18:20 +00:00
|
|
|
setLocalBasketData((currentState) => updateBasketItemQuantity(currentState, id, quantity))
|
2026-02-24 20:44:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleRemoveItem = (id: string) => {
|
2026-07-10 08:18:20 +00:00
|
|
|
setLocalBasketData((currentState) => removeItemFromBasket(currentState, id))
|
2026-02-24 20:44:16 +00:00
|
|
|
}
|
|
|
|
|
|
2026-07-10 08:18:20 +00:00
|
|
|
const handleClearBasket = () => {
|
|
|
|
|
setLocalBasketData(clearBasket())
|
2026-02-24 20:44:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
2026-05-26 16:09:26 +00:00
|
|
|
<div className="min-h-screen bg-gray-50 dark:bg-gray-950">
|
2026-02-24 20:44:16 +00:00
|
|
|
<Helmet
|
|
|
|
|
titleTemplate={`%s | ${APP_NAME}`}
|
|
|
|
|
title={translate('::' + 'Public.nav.checkout')}
|
|
|
|
|
defaultTitle={APP_NAME}
|
|
|
|
|
></Helmet>
|
|
|
|
|
|
|
|
|
|
{/* Hero Section */}
|
|
|
|
|
<div className="relative bg-blue-900 text-white py-12">
|
|
|
|
|
<div
|
|
|
|
|
className="absolute inset-0 opacity-20"
|
|
|
|
|
style={{
|
|
|
|
|
backgroundSize: 'cover',
|
|
|
|
|
backgroundPosition: 'center',
|
|
|
|
|
}}
|
|
|
|
|
></div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="container mx-auto px-4 pt-12">
|
|
|
|
|
<TenantForm onSubmit={handleTenantSubmit} onBack={handleBackToCatalog} />
|
|
|
|
|
|
2026-07-10 08:18:20 +00:00
|
|
|
<Basket
|
|
|
|
|
isOpen={isBasketOpen}
|
|
|
|
|
onClose={() => setIsBasketOpen(false)}
|
2026-02-24 20:44:16 +00:00
|
|
|
onCheckout={handleCheckout}
|
2026-07-10 08:18:20 +00:00
|
|
|
basketData={basketData}
|
2026-02-24 20:44:16 +00:00
|
|
|
updateQuantity={handleUpdateQuantity}
|
|
|
|
|
removeItem={handleRemoveItem}
|
2026-07-10 08:18:20 +00:00
|
|
|
clearBasket={handleClearBasket}
|
2026-02-24 20:44:16 +00:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Checkout
|