# eng-muhamad-hasan/oasis-app architecture

> Architecture diagram of the GitHub repository eng-muhamad-hasan/oasis-app, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/eng-muhamad-hasan/oasis-app
- Repository: https://github.com/eng-muhamad-hasan/oasis-app

## Overview

This is an Expo Router mobile app whose README presents it as an authentication starter: users register or sign in, verify email, complete required username onboarding, then reach protected content; optional biometric locking gates access locally. The tree also contains a substantial hotel-discovery interface, from destination and date search to hotel details and booking navigation. The README documents Better Auth and server protections, while the sampled client auth service calls Supabase; this mismatch limits certainty about the live auth wiring. Unsampled route and hotel internals are represented only where documented or evident from paths.

Main entry points: [`src/server/auth/auth-server.ts`](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/auth/auth-server.ts) (Auth server), [`src/features/auth/auth-provider.tsx`](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/auth-provider.tsx) (Session provider), [`src/features/auth/screens/sign-in.tsx`](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/screens/sign-in.tsx) (Auth screens), [`src/lib/api/api-client.ts`](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/api/api-client.ts) (API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_navigation["App navigation"]
  node_routes["Route layouts<br/>[_layout.tsx]"]
  node_authroutes["Auth routes<br/>[_layout.tsx]"]
  node_tabs["Main tabs<br/>[_layout.tsx]"]
  node_dashboard["Protected dashboard<br/>[dashboard.tsx]"]
end

subgraph group_identity["Identity and onboarding"]
  node_authui["Auth screens<br/>[sign-in.tsx]"]
  node_authservice["Auth service<br/>[auth-service.ts]"]
  node_nativeid["Native identity<br/>[google-sign-in.ts]"]
  node_authprovider["Session provider<br/>[auth-provider.tsx]"]
  node_onboarding["Profile onboarding"]
  node_biometric["App lock"]
  node_google["Google sign-in<br/>[google-sign-in.ts]"]
  node_apple["Apple sign-in<br/>[apple-sign-in.ts]"]
end

subgraph group_hotel["Hotel discovery"]
  node_hotelhome["Hotel search<br/>[HomeScreen.tsx]"]
  node_hoteldetail["Hotel details"]
  node_hoteldata["Hotel catalog<br/>[hotels.ts]"]
  node_booking["Booking tab<br/>[bookings.tsx]"]
end

subgraph group_server["Server and integrations"]
  node_onboardapi["Onboarding endpoint"]
  node_apiclient["API client<br/>[api-client.ts]"]
  node_demo["Demo handlers<br/>[demo-handler.ts]"]
  node_authserver["Auth server<br/>[auth-server.ts]"]
  node_database[("PostgreSQL database<br/>[index.ts]")]
  node_email["Email delivery<br/>[email-delivery.ts]"]
  node_supabase["Supabase auth<br/>[client.ts]"]
end

node_person(("App user"))

node_person -->|"opens app"| node_routes
node_routes -->|"routes signed-out"| node_authroutes
node_routes -->|"routes signed-in"| node_tabs
node_authroutes -->|"presents auth"| node_authui
node_authui -->|"submits credentials"| node_authservice
node_authui -.->|"starts Google sign-in"| node_google
node_authui -.->|"starts Apple sign-in"| node_apple
node_authservice -->|"calls auth API"| node_supabase
node_authprovider -->|"restores session"| node_authserver
node_authprovider -->|"routes incomplete profile"| node_onboarding
node_onboarding -->|"submits profile"| node_apiclient
node_apiclient -->|"sends request"| node_onboardapi
node_onboardapi -->|"validates session"| node_authserver
node_onboardapi -->|"updates user"| node_database
node_authserver -->|"uses auth storage"| node_database
node_authserver -->|"sends verification"| node_email
node_authprovider -.->|"applies optional lock"| node_biometric
node_authprovider -->|"opens protected area"| node_dashboard
node_dashboard -->|"requests demo data"| node_apiclient
node_apiclient -->|"sends request"| node_demo
node_demo -->|"checks protected session"| node_authserver
node_tabs -->|"opens search"| node_hotelhome
node_hotelhome -->|"reads listings"| node_hoteldata
node_hotelhome -->|"opens property"| node_hoteldetail
node_tabs -->|"opens bookings"| node_booking

click node_routes "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/_layout.tsx"
click node_authroutes "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(auth)/_layout.tsx"
click node_tabs "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(tabs)/_layout.tsx"
click node_authui "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/screens/sign-in.tsx"
click node_authservice "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/service/auth-service.ts"
click node_nativeid "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/google-sign-in.ts"
click node_authprovider "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/auth-provider.tsx"
click node_onboarding "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/onboarding/screens/OnboardingScreen.tsx"
click node_onboardapi "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/onboarding/onboarding-handler.ts"
click node_biometric "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/biometrics/biometric-lock-provider.tsx"
click node_dashboard "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/home/screens/dashboard.tsx"
click node_hotelhome "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/screens/home/HomeScreen.tsx"
click node_hoteldetail "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/screens/hotel-detail/HotelDetailScreen.tsx"
click node_hoteldata "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/data/hotels.ts"
click node_booking "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(tabs)/bookings.tsx"
click node_apiclient "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/api/api-client.ts"
click node_demo "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/demo/demo-handler.ts"
click node_authserver "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/auth/auth-server.ts"
click node_database "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/db/index.ts"
click node_email "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/email/email-delivery.ts"
click node_supabase "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/supabase/client.ts"
click node_google "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/google-sign-in.ts"
click node_apple "https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/apple-sign-in.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_routes,node_authroutes,node_tabs,node_dashboard,node_person toneBlue
class node_authui,node_authservice,node_nativeid,node_authprovider,node_onboarding,node_biometric,node_google,node_apple toneAmber
class node_hotelhome,node_hoteldetail,node_hoteldata,node_booking toneMint
class node_onboardapi,node_apiclient,node_demo,node_authserver,node_database,node_email,node_supabase toneRose
```

## Components

### App navigation

- [Route layouts](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/_layout.tsx): `src/app/_layout.tsx`
- [Auth routes](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(auth)/_layout.tsx): `src/app/(auth)/_layout.tsx`
- [Main tabs](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(tabs)/_layout.tsx): `src/app/(tabs)/_layout.tsx`
- [Protected dashboard](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/home/screens/dashboard.tsx): `src/features/home/screens/dashboard.tsx`

### Identity and onboarding

- [Auth screens](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/screens/sign-in.tsx): `src/features/auth/screens/sign-in.tsx`
- [Auth service](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/service/auth-service.ts): `src/features/auth/service/auth-service.ts`
- [Native identity](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/google-sign-in.ts): `src/lib/auth/google-sign-in.ts`
- [Session provider](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/auth/auth-provider.tsx): `src/features/auth/auth-provider.tsx`
- [Profile onboarding](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/onboarding/screens/OnboardingScreen.tsx): `src/features/onboarding/screens/OnboardingScreen.tsx`
- [App lock](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/features/biometrics/biometric-lock-provider.tsx): `src/features/biometrics/biometric-lock-provider.tsx`
- [Google sign-in](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/google-sign-in.ts): `src/lib/auth/google-sign-in.ts`
- [Apple sign-in](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/auth/apple-sign-in.ts): `src/lib/auth/apple-sign-in.ts`

### Hotel discovery

- [Hotel search](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/screens/home/HomeScreen.tsx): `src/screens/home/HomeScreen.tsx`
- [Hotel details](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/screens/hotel-detail/HotelDetailScreen.tsx): `src/screens/hotel-detail/HotelDetailScreen.tsx`
- [Hotel catalog](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/data/hotels.ts): `src/data/hotels.ts`
- [Booking tab](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/app/(tabs)/bookings.tsx): `src/app/(tabs)/bookings.tsx`

### Server and integrations

- [Onboarding endpoint](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/onboarding/onboarding-handler.ts): `src/server/onboarding/onboarding-handler.ts`
- [API client](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/api/api-client.ts): `src/lib/api/api-client.ts`
- [Demo handlers](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/demo/demo-handler.ts): `src/server/demo/demo-handler.ts`
- [Auth server](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/auth/auth-server.ts): `src/server/auth/auth-server.ts`
- [PostgreSQL database](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/db/index.ts): `src/server/db/index.ts`
- [Email delivery](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/server/email/email-delivery.ts): `src/server/email/email-delivery.ts`
- [Supabase auth](https://github.com/eng-muhamad-hasan/oasis-app/blob/main/src/lib/supabase/client.ts): `src/lib/supabase/client.ts`

### Other components

- **App user**

## Connections

- App user → Route layouts: opens app
- Route layouts → Auth routes: routes signed-out
- Route layouts → Main tabs: routes signed-in
- Auth routes → Auth screens: presents auth
- Auth screens → Auth service: submits credentials
- Auth screens → Google sign-in: starts Google sign-in
- Auth screens → Apple sign-in: starts Apple sign-in
- Auth service → Supabase auth: calls auth API
- Session provider → Auth server: restores session
- Session provider → Profile onboarding: routes incomplete profile
- Profile onboarding → API client: submits profile
- API client → Onboarding endpoint: sends request
- Onboarding endpoint → Auth server: validates session
- Onboarding endpoint → PostgreSQL database: updates user
- Auth server → PostgreSQL database: uses auth storage
- Auth server → Email delivery: sends verification
- Session provider → App lock: applies optional lock
- Session provider → Protected dashboard: opens protected area
- Protected dashboard → API client: requests demo data
- API client → Demo handlers: sends request
- Demo handlers → Auth server: checks protected session
- Main tabs → Hotel search: opens search
- Hotel search → Hotel catalog: reads listings
- Hotel search → Hotel details: opens property
- Main tabs → Booking tab: opens bookings
