diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dbff946 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +node_modules/ +.expo/ +dist/ +npm-debug.* +*.jks +*.p8 +*.p12 +*.key +*.mobileprovision +*.orig.* +web-build/ +.expo-export-check/ +.expo-export-ios/ +.DS_Store +*.log +.env +.env.local + +# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb +# The following patterns were generated by expo-cli + +expo-env.d.ts +# @end expo-cli \ No newline at end of file diff --git a/README.md b/README.md index e69de29..70191db 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,31 @@ +# Gishen Pharmacy — Mobile + +React Native (Expo) customer app for Gishen Pharmacy. + +## Stack + +- Expo SDK 53 + expo-router +- NativeWind / Tailwind +- Zustand + AsyncStorage +- i18next (`en` / `am`) + +## Run + +```bash +npm install --legacy-peer-deps +npx expo start +``` + +## Brand + +Colors and logo from Gishen-Ecom (`#A8C73A` / `#141414`). + +## Backend + +Living contract: [`docs/BACKEND_SPEC.md`](docs/BACKEND_SPEC.md) — update whenever features change. + +## Demo + +- OTP: any 4+ digits (hint `1234`) +- Org join codes: `GISHEN-BANK`, `GISHEN-NGO` +- Payments: Chapa / Telebirr / M-Pesa; pay-at-branch only for pickup diff --git a/app.json b/app.json new file mode 100644 index 0000000..c239ca7 --- /dev/null +++ b/app.json @@ -0,0 +1,73 @@ +{ + "expo": { + "name": "Gishen Pharmacy", + "slug": "gishen-mob", + "version": "1.0.0", + "orientation": "portrait", + "icon": "./assets/icon.png", + "scheme": "gishen", + "userInterfaceStyle": "light", + "newArchEnabled": true, + "splash": { + "image": "./assets/splash-icon.png", + "resizeMode": "contain", + "backgroundColor": "#F6F7F2" + }, + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.gishen.pharmacy", + "infoPlist": { + "NSCameraUsageDescription": "Gishen needs camera access to scan prescriptions.", + "NSPhotoLibraryUsageDescription": "Gishen needs photo access to upload prescriptions.", + "NSLocationWhenInUseUsageDescription": "Gishen uses your location to find the nearest branch.", + "NSFaceIDUsageDescription": "Gishen uses biometrics to unlock the app securely.", + "ITSAppUsesNonExemptEncryption": false + } + }, + "android": { + "adaptiveIcon": { + "foregroundImage": "./assets/adaptive-icon.png", + "backgroundColor": "#F6F7F2" + }, + "package": "com.gishen.pharmacy", + "permissions": [ + "CAMERA", + "ACCESS_FINE_LOCATION", + "RECEIVE_BOOT_COMPLETED", + "VIBRATE" + ] + }, + "plugins": [ + "expo-router", + "expo-font", + [ + "expo-camera", + { + "cameraPermission": "Allow Gishen to scan prescriptions." + } + ], + [ + "expo-location", + { + "locationWhenInUsePermission": "Allow Gishen to find nearby branches." + } + ], + [ + "expo-notifications", + { + "icon": "./assets/icon.png", + "color": "#A8C73A" + } + ], + "expo-local-authentication" + ], + "experiments": { + "typedRoutes": true + }, + "extra": { + "router": { + "origin": false + } + } + } +} diff --git a/app/(root)/(screens)/_layout.tsx b/app/(root)/(screens)/_layout.tsx new file mode 100644 index 0000000..4773c55 --- /dev/null +++ b/app/(root)/(screens)/_layout.tsx @@ -0,0 +1,13 @@ +import { Stack } from "expo-router"; +import { colors } from "@/lib/theme"; + +export default function ScreensLayout() { + return ( + + ); +} diff --git a/app/(root)/(screens)/about.tsx b/app/(root)/(screens)/about.tsx new file mode 100644 index 0000000..a1c7c75 --- /dev/null +++ b/app/(root)/(screens)/about.tsx @@ -0,0 +1,96 @@ +import { Image, Linking, ScrollView, View } from "react-native"; +import { Badge } from "@/components/ui/Badge"; +import { Button } from "@/components/ui/Button"; +import { Card, InfoRow } from "@/components/ui/Card"; +import { AppHeader } from "@/components/ui/Header"; +import { Screen } from "@/components/ui/Screen"; +import { Text } from "@/components/ui/Text"; +import { brand } from "@/lib/data/brand"; +import { colors, gutter } from "@/lib/theme"; + +export default function AboutScreen() { + return ( + + + + + + + + {brand.name} + + Est. {brand.founded} · {brand.branchCount} branches + + + + + + + + + + + + Our story + + {brand.story} + + + + + Purpose + + {brand.purpose} + + + + + Vision + + {brand.vision} + + + + + Mission + + {brand.mission} + + + + + + + + + + +