# ictudevs/ua-dtr architecture

> Architecture diagram of the GitHub repository ictudevs/ua-dtr, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ictudevs/ua-dtr
- Repository: https://github.com/ictudevs/ua-dtr

## Overview

UA DTR is a mobile attendee app for Google sign-in, device enrollment, biometric attendance check-in, and attendance-log review. The main scan flow gates on location, runs a liveness check, then submits the captured image and transaction ID for attendance recording; users can also manage their account and request device unbinding. The README is only the generic Expo starter, so product capabilities are inferred from the app routes and source index. Some implementation details are unsampled; uncertain integrations are omitted or marked unverified.

Main entry points: [`src/lib/attendee-api.ts`](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/attendee-api.ts) (Attendee API), [`src/app/(app)/index.tsx`](https://github.com/ictudevs/ua-dtr/blob/main/src/app/(app)/index.tsx) (Scan Screen), [`src/app/login.tsx`](https://github.com/ictudevs/ua-dtr/blob/main/src/app/login.tsx) (Google Sign-in), [`src/components/auth-gate.tsx`](https://github.com/ictudevs/ua-dtr/blob/main/src/components/auth-gate.tsx) (Auth Gate)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_identity["Identity &amp; Enrollment"]
  node_login["Google Sign-in<br/>[login.tsx]"]
  node_auth["Auth Gate<br/>[auth-gate.tsx]"]
  node_binding["Device Binding<br/>[bind.tsx]"]
  node_session[("Session Cache<br/>[session.ts]")]
  node_api["Attendee API<br/>[attendee-api.ts]"]
  node_push["Push Registration<br/>[push.ts]"]
end

subgraph group_attendance["Attendance Check-in"]
  node_home["Scan Screen<br/>[index.tsx]"]
  node_location["Location Gate<br/>[location.ts]"]
  node_liveness["Liveness Check<br/>[liveness.ts]"]
  node_attendance_flow["Attendance Submission<br/>[attendance.ts]"]
end

subgraph group_account["Account &amp; Logs"]
  node_logs["Attendance Logs<br/>[logs.tsx]"]
  node_drawer["Account Drawer<br/>[account-drawer.tsx]"]
end

subgraph group_ui["App UI"]
  node_header["University Header<br/>[ua-header.tsx]"]
  node_toast["Status Toast<br/>[float-toast.tsx]"]
  node_theme["Theme Tokens<br/>[theme.ts]"]
  node_errors["Friendly Errors<br/>[friendly-error.ts]"]
end

node_attendee(("Attendee"))
node_service["Attendance Service"]

node_attendee -->|"starts sign-in"| node_login
node_login -->|"submits token"| node_api
node_login -->|"refreshes auth"| node_auth
node_api -->|"calls API"| node_service
node_api -->|"stores session"| node_session
node_auth -->|"fetches attendee"| node_api
node_auth -->|"reads session"| node_session
node_auth -->|"registers token"| node_push
node_attendee -->|"binds device"| node_binding
node_binding -->|"requests binding"| node_api
node_attendee -->|"starts check-in"| node_home
node_home -->|"checks location"| node_location
node_home -->|"runs verification"| node_liveness
node_home -->|"submits scan"| node_attendance_flow
node_attendance_flow -.->|"records attendance"| node_service
node_attendee -->|"reviews history"| node_logs
node_logs -->|"fetches logs"| node_api
node_attendee -->|"opens account"| node_drawer
node_drawer -->|"requests unbind"| node_api
node_login -->|"shows status"| node_toast
node_home -->|"shows status"| node_toast
node_drawer -->|"formats errors"| node_errors
node_home -->|"formats errors"| node_errors
node_header -->|"uses tokens"| node_theme
node_toast -->|"uses tokens"| node_theme

click node_login "https://github.com/ictudevs/ua-dtr/blob/main/src/app/login.tsx"
click node_auth "https://github.com/ictudevs/ua-dtr/blob/main/src/components/auth-gate.tsx"
click node_binding "https://github.com/ictudevs/ua-dtr/blob/main/src/app/bind.tsx"
click node_session "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/session.ts"
click node_api "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/attendee-api.ts"
click node_home "https://github.com/ictudevs/ua-dtr/blob/main/src/app/(app)/index.tsx"
click node_location "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/location.ts"
click node_liveness "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/liveness.ts"
click node_attendance_flow "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/attendance.ts"
click node_logs "https://github.com/ictudevs/ua-dtr/blob/main/src/app/(app)/logs.tsx"
click node_drawer "https://github.com/ictudevs/ua-dtr/blob/main/src/components/account-drawer.tsx"
click node_push "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/push.ts"
click node_header "https://github.com/ictudevs/ua-dtr/blob/main/src/components/ua-header.tsx"
click node_toast "https://github.com/ictudevs/ua-dtr/blob/main/src/components/float-toast.tsx"
click node_theme "https://github.com/ictudevs/ua-dtr/blob/main/src/constants/theme.ts"
click node_errors "https://github.com/ictudevs/ua-dtr/blob/main/src/lib/friendly-error.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_login,node_auth,node_binding,node_session,node_api,node_push toneBlue
class node_home,node_location,node_liveness,node_attendance_flow toneAmber
class node_logs,node_drawer toneMint
class node_header,node_toast,node_theme,node_errors toneRose
class node_attendee,node_service toneIndigo
```

## Components

### Identity & Enrollment

- [Google Sign-in](https://github.com/ictudevs/ua-dtr/blob/main/src/app/login.tsx): `src/app/login.tsx`
- [Auth Gate](https://github.com/ictudevs/ua-dtr/blob/main/src/components/auth-gate.tsx): `src/components/auth-gate.tsx`
- [Device Binding](https://github.com/ictudevs/ua-dtr/blob/main/src/app/bind.tsx): `src/app/bind.tsx`
- [Session Cache](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/session.ts): `src/lib/session.ts`
- [Attendee API](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/attendee-api.ts): `src/lib/attendee-api.ts`
- [Push Registration](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/push.ts): `src/lib/push.ts`

### Attendance Check-in

- [Scan Screen](https://github.com/ictudevs/ua-dtr/blob/main/src/app/(app)/index.tsx): `src/app/(app)/index.tsx`
- [Location Gate](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/location.ts): `src/lib/location.ts`
- [Liveness Check](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/liveness.ts): `src/lib/liveness.ts`
- [Attendance Submission](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/attendance.ts): `src/lib/attendance.ts`

### Account & Logs

- [Attendance Logs](https://github.com/ictudevs/ua-dtr/blob/main/src/app/(app)/logs.tsx): `src/app/(app)/logs.tsx`
- [Account Drawer](https://github.com/ictudevs/ua-dtr/blob/main/src/components/account-drawer.tsx): `src/components/account-drawer.tsx`

### App UI

- [University Header](https://github.com/ictudevs/ua-dtr/blob/main/src/components/ua-header.tsx): `src/components/ua-header.tsx`
- [Status Toast](https://github.com/ictudevs/ua-dtr/blob/main/src/components/float-toast.tsx): `src/components/float-toast.tsx`
- [Theme Tokens](https://github.com/ictudevs/ua-dtr/blob/main/src/constants/theme.ts): `src/constants/theme.ts`
- [Friendly Errors](https://github.com/ictudevs/ua-dtr/blob/main/src/lib/friendly-error.ts): `src/lib/friendly-error.ts`

### Other components

- **Attendee**
- **Attendance Service**

## Connections

- Attendee → Google Sign-in: starts sign-in (evidence: `src/app/login.tsx`)
- Google Sign-in → Attendee API: submits token (evidence: `src/app/login.tsx`)
- Google Sign-in → Auth Gate: refreshes auth (evidence: `src/app/login.tsx`)
- Attendee API → Attendance Service: calls API (evidence: `src/lib/attendee-api.ts`)
- Attendee API → Session Cache: stores session (evidence: `src/lib/attendee-api.ts`)
- Auth Gate → Attendee API: fetches attendee (evidence: `src/components/auth-gate.tsx`)
- Auth Gate → Session Cache: reads session (evidence: `src/components/auth-gate.tsx`)
- Auth Gate → Push Registration: registers token (evidence: `src/components/auth-gate.tsx`)
- Attendee → Device Binding: binds device (evidence: `src/app/bind.tsx`)
- Device Binding → Attendee API: requests binding (evidence: `src/app/bind.tsx`)
- Attendee → Scan Screen: starts check-in (evidence: `src/app/(app)/index.tsx`)
- Scan Screen → Location Gate: checks location (evidence: `src/app/(app)/index.tsx`)
- Scan Screen → Liveness Check: runs verification (evidence: `src/app/(app)/index.tsx`)
- Scan Screen → Attendance Submission: submits scan (evidence: `src/app/(app)/index.tsx`)
- Attendance Submission → Attendance Service: records attendance
- Attendee → Attendance Logs: reviews history (evidence: `src/app/(app)/logs.tsx`)
- Attendance Logs → Attendee API: fetches logs (evidence: `src/app/(app)/logs.tsx`)
- Attendee → Account Drawer: opens account
- Account Drawer → Attendee API: requests unbind (evidence: `src/components/account-drawer.tsx`)
- Google Sign-in → Status Toast: shows status (evidence: `src/app/login.tsx`)
- Scan Screen → Status Toast: shows status (evidence: `src/app/(app)/index.tsx`)
- Account Drawer → Friendly Errors: formats errors (evidence: `src/components/account-drawer.tsx`)
- Scan Screen → Friendly Errors: formats errors (evidence: `src/app/(app)/index.tsx`)
- University Header → Theme Tokens: uses tokens (evidence: `src/components/ua-header.tsx`)
- Status Toast → Theme Tokens: uses tokens (evidence: `src/components/float-toast.tsx`)
