# dianberlianhutasoit/lab-session-manager architecture

> Architecture diagram of the GitHub repository dianberlianhutasoit/lab-session-manager, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/dianberlianhutasoit/lab-session-manager
- Repository: https://github.com/dianberlianhutasoit/lab-session-manager

## Overview

This Expo app supports practicum assistants managing classes and session schedules, and students viewing sessions, recording attendance, and submitting absence requests. Assistant routes provide class/session CRUD and attendance summaries; student routes provide session details, attendance, permission submission, and permission history. A shared session context coordinates app state and optional Firestore persistence, while an AI classifier supports permission categorization. The README describes only the Expo starter setup, so product capabilities are inferred from the source index and sampled code; unsampled route behavior is represented cautiously.

Main entry points: [`src/context/session-context.tsx`](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/context/session-context.tsx) (Session state), [`src/app/index.tsx`](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/index.tsx) (Assistant dashboard), [`src/app/praktikan/izin.tsx`](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/izin.tsx) (Permission requests), [`src/services/firestore-service.ts`](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/services/firestore-service.ts) (Firestore operations)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_routes["App routes"]
  node_assistant_home["Assistant dashboard<br/>[index.tsx]"]
  node_attendance_report["Attendance summary<br/>[explore.tsx]"]
  node_student_sessions["Session listing<br/>[index.tsx]"]
  node_session_detail["Session detail<br/>[&#91;id&#93;.tsx]"]
  node_permission_route["Permission requests<br/>[izin.tsx]"]
  node_permission_history["Permission history<br/>[riwayat.tsx]"]
end

subgraph group_assistant["Assistant operations"]
  node_class_management["Class management<br/>[class-card.tsx]"]
  node_class_form["Class editor"]
  node_session_management["Session management<br/>[session-card.tsx]"]
  node_session_editor["Session editor"]
  node_session_detail_modal["Session details"]
  node_attendance_views["Attendance views"]
end

subgraph group_student["Student services"]
  node_student_session_card["Student session card<br/>[SessionCard.tsx]"]
  node_attendance_modal["Attendance capture<br/>[PresensiModal.tsx]"]
  node_permission_form["Permission form"]
  node_permission_list["Permission list"]
end

subgraph group_core["Shared services"]
  node_session_state["Session state"]
  node_firestore_service["Firestore operations"]
  node_firestore[("Firestore")]
  node_firebase_config["Firebase setup<br/>[firebase.ts]"]
  node_classifier["AI classifier<br/>[ai-classifier.ts]"]
  node_sample_data["Seed data<br/>[dummy.ts]"]
end

node_user(("App user"))

node_user -->|"opens"| node_assistant_home
node_user -->|"opens"| node_student_sessions
node_assistant_home -->|"renders"| node_class_management
node_assistant_home -->|"renders"| node_session_management
node_assistant_home -->|"opens"| node_class_form
node_assistant_home -->|"opens"| node_session_editor
node_assistant_home -->|"opens"| node_session_detail_modal
node_attendance_report -->|"renders"| node_attendance_views
node_student_sessions -->|"renders"| node_student_session_card
node_session_detail -->|"opens"| node_attendance_modal
node_permission_route -->|"renders"| node_permission_form
node_permission_route -->|"renders"| node_permission_list
node_assistant_home -->|"reads and updates"| node_session_state
node_attendance_report -->|"reads"| node_session_state
node_student_sessions -->|"reads"| node_session_state
node_session_detail -->|"reads and updates"| node_session_state
node_permission_route -->|"submits request"| node_session_state
node_permission_history -.->|"reads"| node_session_state
node_session_state -->|"delegates writes"| node_firestore_service
node_session_state -->|"subscribes"| node_firestore_service
node_firestore_service -->|"uses database config"| node_firebase_config
node_firestore_service -->|"reads and writes"| node_firestore
node_session_state -->|"loads fallback data"| node_sample_data
node_permission_route -->|"classifies reason"| node_classifier

click node_assistant_home "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/index.tsx"
click node_attendance_report "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/explore.tsx"
click node_student_sessions "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/index.tsx"
click node_session_detail "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/%5Bid%5D.tsx"
click node_permission_route "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/izin.tsx"
click node_permission_history "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/riwayat.tsx"
click node_class_management "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/class-card.tsx"
click node_class_form "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/class-form-modal.tsx"
click node_session_management "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-card.tsx"
click node_session_editor "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-form-modal.tsx"
click node_session_detail_modal "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-detail-modal.tsx"
click node_attendance_views "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/attendance-summary-cards.tsx"
click node_student_session_card "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/praktikan/SessionCard.tsx"
click node_attendance_modal "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/praktikan/PresensiModal.tsx"
click node_permission_form "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/izin/form-pengajuan-izin.tsx"
click node_permission_list "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/izin/daftar-riwayat-izin.tsx"
click node_session_state "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/context/session-context.tsx"
click node_firestore_service "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/services/firestore-service.ts"
click node_firebase_config "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/config/firebase.ts"
click node_classifier "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/services/ai-classifier.ts"
click node_sample_data "https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/data/dummy.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_assistant_home,node_attendance_report,node_student_sessions,node_session_detail,node_permission_route,node_permission_history,node_user toneBlue
class node_class_management,node_class_form,node_session_management,node_session_editor,node_session_detail_modal,node_attendance_views toneAmber
class node_student_session_card,node_attendance_modal,node_permission_form,node_permission_list toneMint
class node_session_state,node_firestore_service,node_firestore,node_firebase_config,node_classifier,node_sample_data toneRose
```

## Components

### App routes

- [Assistant dashboard](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/index.tsx): `src/app/index.tsx`
- [Attendance summary](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/explore.tsx): `src/app/explore.tsx`
- [Session listing](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/index.tsx): `src/app/praktikan/index.tsx`
- [Session detail](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/%5Bid%5D.tsx): `src/app/praktikan/[id].tsx`
- [Permission requests](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/izin.tsx): `src/app/praktikan/izin.tsx`
- [Permission history](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/app/praktikan/riwayat.tsx): `src/app/praktikan/riwayat.tsx`

### Assistant operations

- [Class management](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/class-card.tsx): `src/components/asisten/class-card.tsx`
- [Class editor](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/class-form-modal.tsx): `src/components/asisten/class-form-modal.tsx`
- [Session management](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-card.tsx): `src/components/asisten/session-card.tsx`
- [Session editor](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-form-modal.tsx): `src/components/asisten/session-form-modal.tsx`
- [Session details](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/session-detail-modal.tsx): `src/components/asisten/session-detail-modal.tsx`
- [Attendance views](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/asisten/attendance-summary-cards.tsx): `src/components/asisten/attendance-summary-cards.tsx`

### Student services

- [Student session card](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/praktikan/SessionCard.tsx): `src/components/praktikan/SessionCard.tsx`
- [Attendance capture](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/praktikan/PresensiModal.tsx): `src/components/praktikan/PresensiModal.tsx`
- [Permission form](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/izin/form-pengajuan-izin.tsx): `src/components/izin/form-pengajuan-izin.tsx`
- [Permission list](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/components/izin/daftar-riwayat-izin.tsx): `src/components/izin/daftar-riwayat-izin.tsx`

### Shared services

- [Session state](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/context/session-context.tsx): `src/context/session-context.tsx`
- [Firestore operations](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/services/firestore-service.ts): `src/services/firestore-service.ts`
- **Firestore**
- [Firebase setup](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/config/firebase.ts): `src/config/firebase.ts`
- [AI classifier](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/services/ai-classifier.ts): `src/services/ai-classifier.ts`
- [Seed data](https://github.com/dianberlianhutasoit/lab-session-manager/blob/main/src/data/dummy.ts): `src/data/dummy.ts`

### Other components

- **App user**

## Connections

- App user → Assistant dashboard: opens
- App user → Session listing: opens
- Assistant dashboard → Class management: renders (evidence: `src/app/index.tsx`)
- Assistant dashboard → Session management: renders (evidence: `src/app/index.tsx`)
- Assistant dashboard → Class editor: opens (evidence: `src/app/index.tsx`)
- Assistant dashboard → Session editor: opens (evidence: `src/app/index.tsx`)
- Assistant dashboard → Session details: opens (evidence: `src/app/index.tsx`)
- Attendance summary → Attendance views: renders (evidence: `src/app/explore.tsx`)
- Session listing → Student session card: renders (evidence: `src/app/praktikan/index.tsx`)
- Session detail → Attendance capture: opens (evidence: `src/app/praktikan/[id].tsx`)
- Permission requests → Permission form: renders (evidence: `src/app/praktikan/izin.tsx`)
- Permission requests → Permission list: renders (evidence: `src/app/praktikan/izin.tsx`)
- Assistant dashboard → Session state: reads and updates (evidence: `src/app/index.tsx`)
- Attendance summary → Session state: reads (evidence: `src/app/explore.tsx`)
- Session listing → Session state: reads (evidence: `src/app/praktikan/index.tsx`)
- Session detail → Session state: reads and updates (evidence: `src/app/praktikan/[id].tsx`)
- Permission requests → Session state: submits request (evidence: `src/app/praktikan/izin.tsx`)
- Permission history → Session state: reads
- Session state → Firestore operations: delegates writes (evidence: `src/context/session-context.tsx`)
- Session state → Firestore operations: subscribes (evidence: `src/context/session-context.tsx`)
- Firestore operations → Firebase setup: uses database config (evidence: `src/services/firestore-service.ts`)
- Firestore operations → Firestore: reads and writes (evidence: `src/services/firestore-service.ts`)
- Session state → Seed data: loads fallback data (evidence: `src/context/session-context.tsx`)
- Permission requests → AI classifier: classifies reason (evidence: `src/app/praktikan/izin.tsx`)
