From f35cf0bd3ac8302d9cdc93aebc79ef620aec3124 Mon Sep 17 00:00:00 2001 From: Mohammed Al-yaseen Date: Thu, 25 Dec 2025 00:35:32 +0300 Subject: [PATCH] add qr bottom sheet --- src/assets/locals/ar.json | 8 +- src/assets/locals/en.json | 8 +- src/components/Icons/QRIcon.tsx | 55 ++++++++ src/pages/pay/components/PayButton.tsx | 23 +++- .../components/splitBill/QRBottomSheet.tsx | 123 ++++++++++++++++++ 5 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 src/components/Icons/QRIcon.tsx create mode 100644 src/pages/pay/components/splitBill/QRBottomSheet.tsx diff --git a/src/assets/locals/ar.json b/src/assets/locals/ar.json index 62ce0d0..1f9d573 100644 --- a/src/assets/locals/ar.json +++ b/src/assets/locals/ar.json @@ -436,6 +436,12 @@ "howMuchWouldYouLikeToPay": "كم مبلغ تريد دفعه؟", "confirm": "تأكيد", "totalBill": "الفاتورة الكلية", - "remainingToPay": "المبلغ المتبقي" + "remainingToPay": "المبلغ المتبقي", + "scanQRCodeToPay": "مسح الكود الباري الى الدفع", + "copyQRCode": "نسخ الكود الباري", + "payWithQR": "دفع باستخدام الكود الباري", + "cancel": "إلغاء", + "done": "تم", + "inviteEveryonePayingWithYou": "دع الجميع يدفعوا معك" } } diff --git a/src/assets/locals/en.json b/src/assets/locals/en.json index 11c85c0..6439615 100644 --- a/src/assets/locals/en.json +++ b/src/assets/locals/en.json @@ -448,6 +448,12 @@ "howMuchWouldYouLikeToPay": "How much would you like to pay?", "confirm": "Confirm", "totalBill": "Total Bill", - "remainingToPay": "Remaining to Pay" + "remainingToPay": "Remaining to Pay", + "scanQRCodeToPay": "Scan QR Code to Pay", + "copyQRCode": "Copy QR Code", + "payWithQR": "Pay with QR", + "cancel": "Cancel", + "done": "Done", + "inviteEveryonePayingWithYou": "Invite everyone paying with you" } } diff --git a/src/components/Icons/QRIcon.tsx b/src/components/Icons/QRIcon.tsx new file mode 100644 index 0000000..6776e02 --- /dev/null +++ b/src/components/Icons/QRIcon.tsx @@ -0,0 +1,55 @@ +interface QRIconType { + className?: string; + onClick?: () => void; +} + +const QRIcon = ({ className, onClick }: QRIconType) => { + return ( + + + + + + + + + + ); +}; + +export default QRIcon; diff --git a/src/pages/pay/components/PayButton.tsx b/src/pages/pay/components/PayButton.tsx index c8e5c3e..0370613 100644 --- a/src/pages/pay/components/PayButton.tsx +++ b/src/pages/pay/components/PayButton.tsx @@ -10,6 +10,7 @@ import { CustomAmountChoiceBottomSheet } from "./splitBill/CustomAmountChoiceBot import { EqualltyChoiceBottomSheet } from "./splitBill/EqualltyChoiceBottomSheet"; import { PayForYourItemsChoiceBottomSheet } from "./splitBill/PayForYourItemsChoiceBottomSheet"; import { SplitBillChoiceBottomSheet } from "./splitBill/SplitBillChoiceBottomSheet"; +import { QRBottomSheet } from "./splitBill/QRBottomSheet"; type SplitWay = "customAmount" | "equality" | "payForItems" | null; @@ -26,6 +27,7 @@ export default function PayButton({ form }: { form: FormInstance }) { const [isCustomAmountOpen, setIsCustomAmountOpen] = useState(false); const [isEqualityOpen, setIsEqualityOpen] = useState(false); const [isPayForItemsOpen, setIsPayForItemsOpen] = useState(false); + const [isQROpen, setIsQROpen] = useState(false); const handleSplitBillClick = useCallback(() => { if (selectedSplitWay === "customAmount") { @@ -99,21 +101,36 @@ export default function PayButton({ form }: { form: FormInstance }) { setIsCustomAmountOpen(false)} + onClose={() => { + setIsCustomAmountOpen(false); + }} onRemoveSplitWay={handleRemoveSplitWay} + onSave={() => { + setIsQROpen(true); + }} /> setIsEqualityOpen(false)} + onClose={() => { + setIsEqualityOpen(false); + }} onRemoveSplitWay={handleRemoveSplitWay} + onSave={() => { + setIsQROpen(true); + }} /> setIsPayForItemsOpen(false)} + onClose={() => { + setIsPayForItemsOpen(false); + setIsQROpen(true); + }} onRemoveSplitWay={handleRemoveSplitWay} /> + + setIsQROpen(false)} /> ); } diff --git a/src/pages/pay/components/splitBill/QRBottomSheet.tsx b/src/pages/pay/components/splitBill/QRBottomSheet.tsx new file mode 100644 index 0000000..d8ebdc0 --- /dev/null +++ b/src/pages/pay/components/splitBill/QRBottomSheet.tsx @@ -0,0 +1,123 @@ +import { Button } from "antd"; +import { ProBottomSheet } from "components/ProBottomSheet/ProBottomSheet.tsx"; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; + +import ProText from "components/ProText"; +import QRIcon from "components/Icons/QRIcon"; + +interface QRBottomSheetProps { + isOpen: boolean; + onClose: () => void; + onSave?: (value: string) => void; +} + +export function QRBottomSheet({ + isOpen, + onClose, +}: QRBottomSheetProps) { + const { t } = useTranslation(); + const [qrCode, setQRCode] = useState(""); + + const handleSave = () => { + onClose(); + }; + + const handleCopyQRCode = () => { + navigator.clipboard.writeText(qrCode); + }; + + return ( + +
+ + {t("splitBill.inviteEveryonePayingWithYou")} + +
+ + +
+
+ +
+ + +
+
+ ); +}