# shoaaibtaimur/unify-client architecture

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

- Interactive diagram: https://gitdiagram.com/shoaaibtaimur/unify-client
- Repository: https://github.com/shoaaibtaimur/unify-client

## Overview

UNIFY is a role-based academic activity portal. Students select a class to browse schedules, activity details, and a monthly calendar; class representatives and teachers manage activities and import CSVs; administrators manage institution-wide activities, organization structure, and users. Routes render feature screens, shared state handles authentication and cached API data, and the frontend communicates with a credentialed backend. Several feature implementations are unsampled, so those nodes reflect documented capabilities and only evidenced route/API relationships are drawn.

Main entry points: [`lib/api.ts`](https://github.com/shoaaibtaimur/unify-client/blob/main/lib/api.ts) (API query layer), [`app/(dashboard)`](https://github.com/shoaaibtaimur/unify-client/tree/main/app/(dashboard)) (Role dashboards), [`components/features/dashboard/DashboardContent.tsx`](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/dashboard/DashboardContent.tsx) (CR / teacher dashboard), [`app/layout.tsx`](https://github.com/shoaaibtaimur/unify-client/blob/main/app/layout.tsx) (Root layout)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["Routes and layouts"]
  node_root["Root layout<br/>[layout.tsx]"]
  node_loginroute["Login route<br/>[page.tsx]"]
  node_publicroutes["Public routes"]
  node_dashroutes["Role dashboards"]
end

subgraph group_discovery["Public activity discovery"]
  node_home["Activity overview<br/>[HomeContent.tsx]"]
  node_classselect["Class selection"]
  node_directory["Activity directory"]
  node_calendar["Monthly calendar"]
  node_activitydetail["Activity details"]
end

subgraph group_operations["Activity operations"]
  node_dashboard["CR / teacher dashboard"]
  node_activityform["Activity editor<br/>[ActivityForm.tsx]"]
  node_activitymanage["Activity management"]
  node_csv["CSV import"]
end

subgraph group_administration["Administration"]
  node_adminoverview["Admin overview"]
  node_adminactivities["Admin activities"]
  node_organization["Organization management"]
  node_users["User administration"]
end

subgraph group_platform["State and services"]
  node_login["Sign in<br/>[LoginContent.tsx]"]
  node_authstate["Auth and app state<br/>[state.tsx]"]
  node_authclient["Authentication client<br/>[auth-client.ts]"]
  node_api["API query layer<br/>[api.ts]"]
  node_activitytypes["Activity domain types<br/>[activity.ts]"]
  node_academictypes["Academic domain types<br/>[academic.ts]"]
  node_authtypes["Authentication types<br/>[auth.ts]"]
  node_session["Class selection state<br/>[session.ts]"]
end

node_visitor(("Portal user"))
node_backend{{"UNIFY backend"}}
node_eventstream["Live update stream"]

node_visitor -->|"opens portal"| node_root
node_root -.->|"renders routes"| node_loginroute
node_root -.->|"renders routes"| node_publicroutes
node_root -.->|"renders routes"| node_dashroutes
node_loginroute -->|"renders"| node_login
node_publicroutes -->|"renders"| node_home
node_publicroutes -->|"renders"| node_directory
node_publicroutes -->|"renders"| node_calendar
node_dashroutes -->|"renders"| node_dashboard
node_dashroutes -->|"renders"| node_dashboard
node_dashroutes -->|"renders"| node_adminoverview
node_dashroutes -->|"renders"| node_adminactivities
node_dashroutes -->|"renders"| node_organization
node_dashroutes -->|"renders"| node_users
node_login -->|"submits credentials"| node_authstate
node_authstate -->|"verifies session"| node_authclient
node_authclient -->|"auth requests"| node_backend
node_home -->|"offers selection"| node_classselect
node_home -->|"reads class"| node_session
node_home -->|"loads activities"| node_api
node_calendar -->|"loads calendar"| node_api
node_calendar -->|"offers selection"| node_classselect
node_calendar -->|"opens details"| node_activitydetail
node_directory -.->|"loads activities"| node_api
node_dashboard -->|"loads dashboard"| node_api
node_dashboard -->|"opens editor"| node_activityform
node_dashboard -->|"renders management"| node_activitymanage
node_dashboard -->|"opens import"| node_csv
node_activityform -.->|"writes activity"| node_api
node_api -->|"queries and mutates"| node_backend
node_api -->|"uses authenticated fetch"| node_authclient
node_authstate -->|"stores query state"| node_api
node_authstate -->|"subscribes to updates"| node_eventstream
node_eventstream -->|"invalidates cached data"| node_api
node_activityform -->|"uses activity types"| node_activitytypes
node_api -->|"uses activity types"| node_activitytypes
node_api -->|"uses academic types"| node_academictypes
node_authclient -->|"uses auth types"| node_authtypes
node_session -->|"uses class type"| node_academictypes

click node_root "https://github.com/shoaaibtaimur/unify-client/blob/main/app/layout.tsx"
click node_loginroute "https://github.com/shoaaibtaimur/unify-client/blob/main/app/(auth)/login/page.tsx"
click node_publicroutes "https://github.com/shoaaibtaimur/unify-client/tree/main/app/(public)"
click node_dashroutes "https://github.com/shoaaibtaimur/unify-client/tree/main/app/(dashboard)"
click node_login "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/auth/LoginContent.tsx"
click node_home "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/home/HomeContent.tsx"
click node_classselect "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/class-selection/ClassSelectionDialog.tsx"
click node_directory "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivitiesContent.tsx"
click node_calendar "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/calendar/CalendarContent.tsx"
click node_activitydetail "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivityDetailsDialog.tsx"
click node_dashboard "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/dashboard/DashboardContent.tsx"
click node_activityform "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivityForm.tsx"
click node_activitymanage "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ManageActivitiesTable.tsx"
click node_csv "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/CsvImportDialog.tsx"
click node_adminoverview "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminOverviewContent.tsx"
click node_adminactivities "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminActivitiesContent.tsx"
click node_organization "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminOrganizationContent.tsx"
click node_users "https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminUsersContent.tsx"
click node_authstate "https://github.com/shoaaibtaimur/unify-client/blob/main/lib/state.tsx"
click node_authclient "https://github.com/shoaaibtaimur/unify-client/blob/main/lib/auth-client.ts"
click node_api "https://github.com/shoaaibtaimur/unify-client/blob/main/lib/api.ts"
click node_activitytypes "https://github.com/shoaaibtaimur/unify-client/blob/main/types/activity.ts"
click node_academictypes "https://github.com/shoaaibtaimur/unify-client/blob/main/types/academic.ts"
click node_authtypes "https://github.com/shoaaibtaimur/unify-client/blob/main/types/auth.ts"
click node_session "https://github.com/shoaaibtaimur/unify-client/blob/main/lib/session.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_root,node_loginroute,node_publicroutes,node_dashroutes,node_visitor toneBlue
class node_home,node_classselect,node_directory,node_calendar,node_activitydetail toneAmber
class node_dashboard,node_activityform,node_activitymanage,node_csv toneMint
class node_adminoverview,node_adminactivities,node_organization,node_users toneRose
class node_login,node_authstate,node_authclient,node_api,node_activitytypes,node_academictypes,node_authtypes,node_session,node_backend,node_eventstream toneIndigo
```

## Components

### Routes and layouts

- [Root layout](https://github.com/shoaaibtaimur/unify-client/blob/main/app/layout.tsx): `app/layout.tsx`
- [Login route](https://github.com/shoaaibtaimur/unify-client/blob/main/app/(auth)/login/page.tsx): `app/(auth)/login/page.tsx`
- [Public routes](https://github.com/shoaaibtaimur/unify-client/tree/main/app/(public)): `app/(public)`
- [Role dashboards](https://github.com/shoaaibtaimur/unify-client/tree/main/app/(dashboard)): `app/(dashboard)`

### Public activity discovery

- [Activity overview](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/home/HomeContent.tsx): `components/features/home/HomeContent.tsx`
- [Class selection](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/class-selection/ClassSelectionDialog.tsx): `components/features/class-selection/ClassSelectionDialog.tsx`
- [Activity directory](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivitiesContent.tsx): `components/features/activities/ActivitiesContent.tsx`
- [Monthly calendar](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/calendar/CalendarContent.tsx): `components/features/calendar/CalendarContent.tsx`
- [Activity details](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivityDetailsDialog.tsx): `components/features/activities/ActivityDetailsDialog.tsx`

### Activity operations

- [CR / teacher dashboard](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/dashboard/DashboardContent.tsx): `components/features/dashboard/DashboardContent.tsx`
- [Activity editor](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ActivityForm.tsx): `components/features/activities/ActivityForm.tsx`
- [Activity management](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/ManageActivitiesTable.tsx): `components/features/activities/ManageActivitiesTable.tsx`
- [CSV import](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/activities/CsvImportDialog.tsx): `components/features/activities/CsvImportDialog.tsx`

### Administration

- [Admin overview](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminOverviewContent.tsx): `components/features/admin/AdminOverviewContent.tsx`
- [Admin activities](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminActivitiesContent.tsx): `components/features/admin/AdminActivitiesContent.tsx`
- [Organization management](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminOrganizationContent.tsx): `components/features/admin/AdminOrganizationContent.tsx`
- [User administration](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/admin/AdminUsersContent.tsx): `components/features/admin/AdminUsersContent.tsx`

### State and services

- [Sign in](https://github.com/shoaaibtaimur/unify-client/blob/main/components/features/auth/LoginContent.tsx): `components/features/auth/LoginContent.tsx`
- [Auth and app state](https://github.com/shoaaibtaimur/unify-client/blob/main/lib/state.tsx): `lib/state.tsx`
- [Authentication client](https://github.com/shoaaibtaimur/unify-client/blob/main/lib/auth-client.ts): `lib/auth-client.ts`
- [API query layer](https://github.com/shoaaibtaimur/unify-client/blob/main/lib/api.ts): `lib/api.ts`
- [Activity domain types](https://github.com/shoaaibtaimur/unify-client/blob/main/types/activity.ts): `types/activity.ts`
- [Academic domain types](https://github.com/shoaaibtaimur/unify-client/blob/main/types/academic.ts): `types/academic.ts`
- [Authentication types](https://github.com/shoaaibtaimur/unify-client/blob/main/types/auth.ts): `types/auth.ts`
- [Class selection state](https://github.com/shoaaibtaimur/unify-client/blob/main/lib/session.ts): `lib/session.ts`

### Other components

- **Portal user**
- **UNIFY backend**
- **Live update stream**

## Connections

- Portal user → Root layout: opens portal (evidence: `app/layout.tsx`)
- Root layout → Login route: renders routes
- Root layout → Public routes: renders routes
- Root layout → Role dashboards: renders routes
- Login route → Sign in: renders (evidence: `app/(auth)/login/page.tsx`)
- Public routes → Activity overview: renders (evidence: `app/(public)/page.tsx`)
- Public routes → Activity directory: renders (evidence: `app/(public)/activities/page.tsx`)
- Public routes → Monthly calendar: renders (evidence: `app/(public)/calendar/page.tsx`)
- Role dashboards → CR / teacher dashboard: renders (evidence: `app/(dashboard)/cr/page.tsx`)
- Role dashboards → CR / teacher dashboard: renders (evidence: `app/(dashboard)/teacher/page.tsx`)
- Role dashboards → Admin overview: renders (evidence: `app/(dashboard)/admin/page.tsx`)
- Role dashboards → Admin activities: renders (evidence: `app/(dashboard)/admin/activities/page.tsx`)
- Role dashboards → Organization management: renders (evidence: `app/(dashboard)/admin/organization/page.tsx`)
- Role dashboards → User administration: renders (evidence: `app/(dashboard)/admin/users/page.tsx`)
- Sign in → Auth and app state: submits credentials (evidence: `components/features/auth/LoginContent.tsx`)
- Auth and app state → Authentication client: verifies session (evidence: `lib/state.tsx`)
- Authentication client → UNIFY backend: auth requests (evidence: `lib/auth-client.ts`)
- Activity overview → Class selection: offers selection (evidence: `components/features/home/HomeContent.tsx`)
- Activity overview → Class selection state: reads class (evidence: `components/features/home/HomeContent.tsx`)
- Activity overview → API query layer: loads activities (evidence: `components/features/home/HomeContent.tsx`)
- Monthly calendar → API query layer: loads calendar (evidence: `components/features/calendar/CalendarContent.tsx`)
- Monthly calendar → Class selection: offers selection (evidence: `components/features/calendar/CalendarContent.tsx`)
- Monthly calendar → Activity details: opens details (evidence: `components/features/calendar/CalendarContent.tsx`)
- Activity directory → API query layer: loads activities
- CR / teacher dashboard → API query layer: loads dashboard (evidence: `components/features/dashboard/DashboardContent.tsx`)
- CR / teacher dashboard → Activity editor: opens editor (evidence: `components/features/dashboard/DashboardContent.tsx`)
- CR / teacher dashboard → Activity management: renders management (evidence: `components/features/dashboard/DashboardContent.tsx`)
- CR / teacher dashboard → CSV import: opens import (evidence: `components/features/dashboard/DashboardContent.tsx`)
- Activity editor → API query layer: writes activity (evidence: `components/features/activities/ActivityForm.tsx`)
- API query layer → UNIFY backend: queries and mutates (evidence: `lib/api.ts`)
- API query layer → Authentication client: uses authenticated fetch (evidence: `lib/api.ts`)
- Auth and app state → API query layer: stores query state (evidence: `lib/state.tsx`)
- Auth and app state → Live update stream: subscribes to updates (evidence: `lib/state.tsx`)
- Live update stream → API query layer: invalidates cached data
- Activity editor → Activity domain types: uses activity types (evidence: `components/features/activities/ActivityForm.tsx`)
- API query layer → Activity domain types: uses activity types (evidence: `lib/api.ts`)
- API query layer → Academic domain types: uses academic types (evidence: `lib/api.ts`)
- Authentication client → Authentication types: uses auth types (evidence: `lib/auth-client.ts`)
- Class selection state → Academic domain types: uses class type (evidence: `lib/session.ts`)
