From 858972b5caccdb1caa1d863dd390248710aca574 Mon Sep 17 00:00:00 2001 From: kirukib Date: Fri, 7 Aug 2026 16:11:23 +0300 Subject: [PATCH] Add multi-provider login and guest pharmacist order codes. Guests can generate a shareable GSH code for admin fulfillment; sign-in now supports Google, email, phone, and Telegram demos, with the backend spec updated. Co-authored-by: Cursor --- app/(root)/(screens)/checkout.tsx | 54 ++- app/(root)/(screens)/orders/[id].tsx | 19 +- app/(root)/(screens)/orders/code/[id].tsx | 275 ++++++++++++++++ app/(root)/(screens)/profile.tsx | 29 +- app/(root)/(tabs)/cart.tsx | 5 +- app/(root)/auth/language.tsx | 2 +- app/(root)/auth/otp.tsx | 379 +++++++++++++++++----- app/(root)/auth/sign-in.tsx | 146 +++++++++ app/(root)/auth/welcome.tsx | 1 + docs/BACKEND_SPEC.md | 76 ++++- lib/commerce.ts | 49 ++- lib/data/seed.ts | 5 +- lib/routes.ts | 3 + lib/stores/authStore.ts | 27 +- locales/am/common.json | 5 + locales/en/common.json | 5 + package-lock.json | 18 +- package.json | 1 + 18 files changed, 978 insertions(+), 121 deletions(-) create mode 100644 app/(root)/(screens)/orders/code/[id].tsx create mode 100644 app/(root)/auth/sign-in.tsx diff --git a/app/(root)/(screens)/checkout.tsx b/app/(root)/(screens)/checkout.tsx index 1a0905f..c7a9f93 100644 --- a/app/(root)/(screens)/checkout.tsx +++ b/app/(root)/(screens)/checkout.tsx @@ -132,13 +132,19 @@ export default function CheckoutScreen() { const orderNotes = [ notes.trim(), forMember ? `For family: ${forMember.name} (${forMember.relationship})` : "", - useAnyBranchPickup ? "Quick code — redeemable at any Gishen branch" : "", + isGuest + ? "Pharmacist order code — enter in admin to create the order" + : useAnyBranchPickup + ? "Quick code — redeemable at any Gishen branch" + : "", ] .filter(Boolean) .join(" · "); const pickupCode = - effectiveFulfillment === "pickup" ? generatePickupCode() : null; + isGuest || effectiveFulfillment === "pickup" + ? generatePickupCode() + : null; const fee = effectiveFulfillment === "pickup" ? 0 : deliveryFee; const order = addOrder({ @@ -153,7 +159,7 @@ export default function CheckoutScreen() { areaLabel: useAnyBranchPickup ? "Any Gishen branch" : effectiveFulfillment === "pickup" - ? branch?.area ?? areaLabel + ? branch?.name ?? areaLabel : selectedAddress?.area ?? areaLabel, addressId: effectiveFulfillment === "delivery" ? selectedAddress?.id ?? null : null, @@ -166,10 +172,13 @@ export default function CheckoutScreen() { notes: orderNotes, riderAssigned: false, pickupCode, - anyBranch: useAnyBranchPickup, + anyBranch: useAnyBranchPickup || isGuest, isGuestOrder: isGuest, - status: - useAnyBranchPickup || payment === "pay_at_branch" ? "confirmed" : undefined, + status: isGuest + ? "requested" + : useAnyBranchPickup || payment === "pay_at_branch" + ? "confirmed" + : undefined, }); if (forMemberId) setActiveMember(forMemberId); @@ -184,15 +193,26 @@ export default function CheckoutScreen() { pushNotification({ kind: "order", - title: pickupCode ? `Pickup code ${pickupCode}` : "Order placed", - body: pickupCode - ? useAnyBranchPickup - ? `Show ${pickupCode} at any Gishen branch counter to collect your order.` - : `Show ${pickupCode} at ${branch?.name ?? "your branch"} to collect.` - : `Your ${order.fulfillment} order is confirmed.`, - href: routes.orderDetail(order.id), + title: isGuest + ? `Pharmacist code ${pickupCode}` + : pickupCode + ? `Pickup code ${pickupCode}` + : "Order placed", + body: isGuest + ? `Share ${pickupCode} so a pharmacist can create your order in admin.` + : pickupCode + ? useAnyBranchPickup + ? `Show ${pickupCode} at any Gishen branch counter to collect your order.` + : `Show ${pickupCode} at ${branch?.name ?? "your branch"} to collect.` + : `Your ${order.fulfillment} order is confirmed.`, + href: isGuest && pickupCode ? routes.orderCode(order.id) : routes.orderDetail(order.id), }); + if (isGuest && pickupCode) { + router.replace(routes.orderCode(order.id) as never); + return; + } + Alert.alert( pickupCode ? "Quick pickup code ready" : "Order placed", pickupCode @@ -310,10 +330,10 @@ export default function CheckoutScreen() { {isGuest ? ( - Guest quick code + Pharmacist order code - As a guest you get a short pickup code (e.g. GSH-AB12). Show it at any - Gishen branch counter — no account needed to fulfill. + You’ll get a GSH-XXXX code to copy, share, or screenshot. A pharmacist + enters it on the admin page to create your order — then you pay at the branch. ) : null} @@ -522,7 +542,7 @@ export default function CheckoutScreen() { {formatETB(afterDiscount + deliveryFee)}