sozsoft-platform/ui/src/views/public/Checkout.tsx

95 lines
2.9 KiB
TypeScript
Raw Normal View History

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'
import { useStoreActions, useStoreState } from '@/store/store'
2026-02-24 20:44:16 +00:00
import {
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()
const [isBasketOpen, setIsBasketOpen] = useState(false)
2026-02-24 20:44:16 +00:00
const { translate } = useLocalization()
const storedBasketData = useStoreState((state) => state.client.basketData)
const { setBasketData } = useStoreActions((actions) => actions.client)
const { setTenantData } = useStoreActions((actions) => actions.client.order)
const [basketData, setLocalBasketData] = useState<BasketData>(storedBasketData)
2026-02-24 20:44:16 +00:00
useEffect(() => {
setBasketData(basketData)
}, [basketData, setBasketData])
2026-02-24 20:44:16 +00:00
const handleTenantSubmit = (tenantData: CustomTenantDto) => {
setTenantData(tenantData)
2026-02-24 20:44:16 +00:00
navigate(ROUTES_ENUM.public.payment)
}
const handleBackToCatalog = () => {
navigate(ROUTES_ENUM.public.home)
}
const handleCheckout = () => {
setIsBasketOpen(false)
2026-02-24 20:44:16 +00:00
navigate(ROUTES_ENUM.public.checkout)
}
const handleUpdateQuantity = (id: string, quantity: number) => {
setLocalBasketData((currentState) => updateBasketItemQuantity(currentState, id, quantity))
2026-02-24 20:44:16 +00:00
}
const handleRemoveItem = (id: string) => {
setLocalBasketData((currentState) => removeItemFromBasket(currentState, id))
2026-02-24 20:44:16 +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} />
<Basket
isOpen={isBasketOpen}
onClose={() => setIsBasketOpen(false)}
2026-02-24 20:44:16 +00:00
onCheckout={handleCheckout}
basketData={basketData}
2026-02-24 20:44:16 +00:00
updateQuantity={handleUpdateQuantity}
removeItem={handleRemoveItem}
clearBasket={handleClearBasket}
2026-02-24 20:44:16 +00:00
/>
</div>
</div>
)
}
export default Checkout