order: enhance UI & styles

This commit is contained in:
2025-12-31 17:46:46 +03:00
parent 2416b37069
commit 1d2c1fda87
16 changed files with 470 additions and 249 deletions

View File

@@ -1,4 +1,13 @@
import { Button, Card, Divider, Flex, Image, Progress, Tooltip } from "antd";
import {
Button,
Card,
Divider,
Flex,
Image,
Layout,
Progress,
Tooltip,
} from "antd";
import Ads2 from "components/Ads/Ads2";
import { CancelOrderBottomSheet } from "components/CustomBottomSheet/CancelOrderBottomSheet";
import LocationIcon from "components/Icons/LocationIcon";
@@ -25,13 +34,16 @@ import NextIcon from "components/Icons/NextIcon";
import { RateBottomSheet } from "components/CustomBottomSheet/RateBottomSheet";
import BriefMenuCard from "pages/checkout/components/BriefMenuCard";
import { QRBottomSheet } from "pages/pay/components/splitBill/QRBottomSheet";
import NewRateIcon from "components/Icons/order/NewRateIcon";
import NoteIcon from "components/Icons/NoteIcon";
import SuccessIcon from "components/Icons/SuccessIcon";
export default function OrderPage() {
const { t } = useTranslation();
const { orderId } = useParams();
const navigate = useNavigate();
const { isRTL } = useAppSelector((state) => state.locale);
const { restaurant } = useAppSelector((state) => state.order);
const navigate = useNavigate();
const hasRefetchedRef = useRef(false);
const [isOpen, setIsOpen] = useState(false);
const [isRateOrderOpen, setIsRateOrderOpen] = useState(false);
@@ -57,6 +69,9 @@ export default function OrderPage() {
skip: !restaurantSubdomain,
},
);
const hasClosedStatus = orderDetails?.status?.some(
(status) => status?.alias === "closed",
);
// Reset refetch flag when orderId changes
useEffect(() => {
@@ -66,10 +81,6 @@ export default function OrderPage() {
// Refetch restaurant details when order status has alias "closed"
useEffect(() => {
if (orderDetails?.status && !hasRefetchedRef.current) {
const hasClosedStatus = orderDetails.status.some(
(status) => status?.alias === "closed",
);
if (hasClosedStatus && restaurantSubdomain) {
refetchRestaurantDetails();
hasRefetchedRef.current = true;
@@ -220,136 +231,182 @@ export default function OrderPage() {
return (
<>
<ProHeader customRoute={`/${restaurant?.subdomain}`}>{t("order.title")}</ProHeader>
<div
style={{
display: "flex",
flexDirection: "column",
height: "92vh",
padding: 16,
gap: 16,
overflow: "auto",
scrollbarWidth: "none",
}}
>
<Card className={styles.orderCard}>
<div
style={{
display: "flex",
flexDirection: "row",
gap: "1rem",
backgroundColor: "rgba(255, 183, 0, 0.08)",
borderRadius: "12px",
padding: 16,
}}
>
<Button
type="text"
shape="circle"
<Layout>
<ProHeader customRoute={`/${restaurant?.subdomain}`}>
{t("order.title")}
</ProHeader>
<Layout.Content className={styles.orderContent}>
<Card className={styles.orderCard}>
<div
style={{
display: "flex",
flexDirection: "row",
gap: "1rem",
backgroundColor: "rgba(255, 183, 0, 0.08)",
borderRadius: "12px",
padding: 16,
}}
>
<Image
src={orderDetails?.restaurant_iimage}
className={styles.profileImage}
width={50}
height={50}
preview={false}
/>
</Button>
<div>
<ProText style={{ fontSize: "1rem" }}>
{t("order.yourOrderFromFascanoRestaurant")}
</ProText>
<br />
<ProText type="secondary">
<LocationIcon className={styles.locationIcon} />{" "}
{isRTL ? orderDetails?.restaurantAR : orderDetails?.restaurant}
</ProText>
<Button
type="text"
shape="circle"
style={{
backgroundColor: "rgba(255, 183, 0, 0.08)",
}}
>
<Image
src={orderDetails?.restaurant_iimage}
className={styles.profileImage}
width={50}
height={50}
preview={false}
/>
</Button>
<div>
<ProText style={{ fontSize: "1rem" }}>
{t("order.yourOrderFromFascanoRestaurant")}
</ProText>
<br />
<ProText type="secondary">
<LocationIcon className={styles.locationIcon} />{" "}
{isRTL
? orderDetails?.restaurantAR
: orderDetails?.restaurant}
</ProText>
</div>
</div>
</div>
{isInProgress ? (
<Flex gap="small" wrap justify="center">
<Tooltip title="3 done / 3 in progress / 4 to do">
<div
style={{
transform: "scaleX(-1)",
}}
>
<Progress
percent={progressPercent}
format={() => (
<div
style={{
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
gap: 4,
transform: "scaleX(-1)",
}}
>
<ProText
{isInProgress ? (
<Flex gap="small" wrap justify="center">
<Tooltip title="3 done / 3 in progress / 4 to do">
<div
style={{
transform: "scaleX(-1)",
}}
>
<Progress
percent={progressPercent}
format={() => (
<div
style={{
fontWeight: 400,
fontStyle: "Regular",
fontSize: 18,
lineHeight: "140%",
letterSpacing: "0%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
gap: 4,
transform: "scaleX(-1)",
}}
>
{t("order.remainingTime")}
</ProText>
{formatTimer(remainingSeconds)}
</div>
)}
strokeColor="#FFB700"
size={200}
type="dashboard"
/>
</div>
</Tooltip>
</Flex>
) : (
<OrderDishIcon className={styles.orderDishIcon} />
)}
<ProText
style={{
fontWeight: 400,
fontStyle: "Regular",
fontSize: 18,
lineHeight: "140%",
letterSpacing: "0%",
}}
>
{t("order.remainingTime")}
</ProText>
{formatTimer(remainingSeconds)}
</div>
)}
strokeColor="#FFB700"
size={200}
type="dashboard"
/>
</div>
</Tooltip>
</Flex>
) : (
<OrderDishIcon className={styles.orderDishIcon} />
)}
<div>
<ProTitle
level={5}
style={{
fontWeight: 600,
fontSize: "18px",
marginBottom: "0.75rem",
}}
>
{t("order.inProgressOrder")} (1)
</ProTitle>
<div style={{ display: "flex", flexDirection: "row", gap: 8 }}>
<InvoiceIcon className={styles.invoiceIcon} />
<ProText type="secondary" style={{ fontSize: "14px" }}>
#{orderDetails?.order.id}
</ProText>
<TimeIcon className={styles.timeIcon} />
<ProText type="secondary" style={{ fontSize: "14px" }}>
ordered :- Today -{" "}
{dayjs(orderDetails?.status[0]?.pivot?.created_at).format(
"h:mm A",
)}
</ProText>
<div>
<ProTitle
level={5}
style={{
fontWeight: 600,
fontSize: "18px",
marginBottom: "0.75rem",
}}
>
{t("order.inProgressOrder")} (1)
</ProTitle>
<div style={{ display: "flex", flexDirection: "row", gap: 8 }}>
<InvoiceIcon className={styles.invoiceIcon} />
<ProText type="secondary" style={{ fontSize: "14px" }}>
#{orderDetails?.order.id}
</ProText>
<TimeIcon className={styles.timeIcon} />
<ProText type="secondary" style={{ fontSize: "14px" }}>
ordered :- Today -{" "}
{dayjs(orderDetails?.status[0]?.pivot?.created_at).format(
"h:mm A",
)}
</ProText>
</div>
<Divider style={{ margin: "12px 0" }} />
<Stepper statuses={orderDetails?.status} />
</div>
<Divider style={{ margin: "12px 0" }} />
{!hasClosedStatus && (
<div className={styles.orderNotes}>
<NoteIcon className={styles.noteIcon} />
<div
style={{ display: "flex", flexDirection: "column", gap: 4 }}
>
<ProText
style={{
fontWeight: 400,
fontStyle: "Regular",
fontSize: 12,
lineHeight: "140%",
letterSpacing: "0%",
color: "#777580",
}}
>
{t(
"order.aStaffMemberWillCollectTheCashFromYouAtYourTable",
)}
</ProText>
<ProText
style={{
fontWeight: 600,
fontStyle: "SemiBold",
fontSize: 12,
lineHeight: "140%",
letterSpacing: "0%",
color: "#3D3B4A",
}}
>
{t("order.callWaiter")}
</ProText>
</div>
</div>
)}
{hasClosedStatus && (
<div className={styles.orderNotesClosed}>
<SuccessIcon className={styles.noteIcon} />
<ProText
style={{
fontSize: "12px",
lineHeight: "140%",
letterSpacing: "0%",
color: "#3D3B4A",
}}
>
{t("order.cashPaymentConfirmed")}
</ProText>
</div>
)}
</Card>
<Stepper statuses={orderDetails?.status} />
</div>
</Card>
<Ads2 />
<Ads2 />
{/* <ProInputCard
{/* <ProInputCard
title={
<div style={{ marginBottom: 7 }}>
<ProText style={{ fontSize: "1rem" }}>
@@ -398,113 +455,98 @@ export default function OrderPage() {
</div>
</ProInputCard> */}
<BriefMenuCard />
<BriefMenuCard />
<PaymentDetails order={orderDetails?.order} />
<PaymentDetails order={orderDetails?.order} />
<Card
className={styles.backToHomePage}
onClick={() => navigate(`/${restaurant?.subdomain}`)}
>
<div
style={{
display: "flex",
flexDirection: "row",
justifyContent: "space-between",
marginTop: 1,
}}
<Card
className={styles.inviteToBillCard}
onClick={() => setIsOpen(true)}
>
<Image
src={restaurant?.restautantImage}
width={30}
height={30}
preview={false}
<div
style={{
borderRadius: "50%",
objectFit: "cover",
position: "relative",
top: -4,
}}
/>
<ProTitle
level={5}
style={{
fontSize: 14,
display: "flex",
flexDirection: "row",
justifyContent: "center",
marginTop: 1,
}}
>
{isRTL ? restaurant?.nameAR : restaurant?.restautantName}
</ProTitle>
<div style={{ display: "flex", flexDirection: "row", gap: 10 }}>
<ProTitle
level={5}
style={{
marginTop: 1,
fontSize: 14,
}}
>
{t("order.inviteToBill")}
</ProTitle>
</div>
</div>
</Card>
{isRTL ? (
<BackIcon className={styles.serviceIcon} />
) : (
<NextIcon className={styles.serviceIcon} />
)}
</div>
</Card>
<QRBottomSheet isOpen={isOpen} onClose={() => setIsOpen(false)} />
<Card
className={styles.inviteToBillCard}
onClick={() => setIsOpen(true)}
>
<div
style={{
display: "flex",
flexDirection: "row",
justifyContent: "center",
marginTop: 1,
}}
>
<div style={{ display: "flex", flexDirection: "row", gap: 10 }}>
<ProTitle
level={5}
{hasClosedStatus && (
<Card
className={styles.backToHomePage}
onClick={() => setIsRateOrderOpen(true)}
>
<div
style={{
marginTop: 1,
fontSize: 14,
display: "flex",
flexDirection: "row",
justifyContent: "space-between",
}}
>
{t("order.inviteToBill")}
</ProTitle>
</div>
</div>
</Card>
<div>
<NewRateIcon className={styles.newRateIcon} />
<ProText
style={{
fontWeight: 500,
fontStyle: "Medium",
fontSize: 14,
lineHeight: "140%",
letterSpacing: "0%",
color: "#595764",
position: "relative",
margin: "0 8px",
top: -12,
}}
>
{t("order.rateOrder")}
</ProText>
</div>
<QRBottomSheet isOpen={isOpen} onClose={() => setIsOpen(false)} />
{isRTL ? (
<BackIcon className={styles.serviceIcon} />
) : (
<NextIcon className={styles.serviceIcon} />
)}
</div>
</Card>
)}
<Card
className={styles.rateServiceCard}
onClick={() => setIsRateOrderOpen(true)}
>
<div
style={{
display: "flex",
flexDirection: "row",
justifyContent: "center",
marginTop: 1,
<RateBottomSheet
isOpen={isRateOrderOpen}
onClose={() => setIsRateOrderOpen(false)}
/>
<CancelOrderBottomSheet />
</Layout.Content>
<Layout.Footer className={styles.checkoutButtonContainer}>
<Button
type="primary"
shape="round"
className={styles.checkoutButton}
onClick={() => {
navigate(`/${restaurant?.subdomain}/menu`);
}}
>
<div style={{ display: "flex", flexDirection: "row", gap: 10 }}>
<ProTitle
level={5}
style={{
marginTop: 1,
fontSize: 14,
}}
>
{t("order.rateOrder")}
</ProTitle>
</div>
</div>
</Card>
<RateBottomSheet
isOpen={isRateOrderOpen}
onClose={() => setIsRateOrderOpen(false)}
/>
<CancelOrderBottomSheet />
</div>
{t("order.newOrder")}
</Button>
</Layout.Footer>
</Layout>
</>
);
}