Spaces:
Runtime error
Runtime error
| # Dashboard — `/exocore/dashboard` | |
| The Dashboard is the **command-centre** that opens right after a successful | |
| user login. Implemented in | |
| [`client/home/Dashboard.tsx`](../../client/home/Dashboard.tsx); ~770 lines | |
| that orchestrate every other panel as either an inline view (`activeView`) or | |
| a modal (`*Open` flags). | |
| > The screenshots below show the **redirect to `/login`** because the docs | |
| > capture run was unauthenticated. With a real `exo_token` in | |
| > `localStorage`, the same route renders the layout described below. | |
| | Desktop | Mobile | | |
| |---------|--------| | |
| |  |  | | |
| --- | |
| ## Layout | |
| ``` | |
| ┌─ Header ──────────────────────────────────────────────┐ | |
| │ EXOCORE • CPU 4 % · RAM 42 % · 14:22:01 │ | |
| │ Avatar ⟶ Profile · Leaderboard · ⚙ Account · Logout │ | |
| ├─ Welcome card ────────────────────────────────────────┤ | |
| │ Hi {nickname}, plan: FREE / PRO / OWNER │ | |
| │ Plan-upgrade button (opens PlansModal) │ | |
| ├─ Stats row ───────────────────────────────────────────┤ | |
| │ Projects · Active · CPU · RAM (live ticking) │ | |
| ├─ Project Nodes ───────────────────────────────────────┤ | |
| │ Grid of ProjectNodeCard (open · run · archive) │ | |
| │ + "Show all" toggle if > 6 │ | |
| ├─ Quick Actions ───────────────────────────────────────┤ | |
| │ ▢ Project Nodes · ⚙ Account · ☁ Cloud Backups · … │ | |
| ├─ Social grid ─────────────────────────────────────────┤ | |
| │ GitHub · Drive · Discord · X · Donations … │ | |
| └───────────────────────────────────────────────────────┘ | |
| ``` | |
| ## State machine | |
| `activeView` only swaps two top-level views: | |
| | Value | What renders | | |
| |-------|--------------| | |
| | `'home'` | The composite layout above | | |
| | `'account'`| Inline `<Account />` settings sub-page | | |
| Everything else is a modal driven by booleans: | |
| | Flag | Modal component | What it does | | |
| |------|----------------|--------------| | |
| | `projectsOpen` | `FileManager` | Browse all projects + storage usage | | |
| | `gDriveOpen` | `GDriveManager` | OAuth-connect Google Drive, sync state | | |
| | `githubOpen` | `GithubManager` | OAuth-connect GitHub, browse repos | | |
| | `plansOpen` | `PlansModal` | Upgrade plan (free → pro / owner) | | |
| | `ownerPaymentsOpen`| `OwnerPaymentsPanel` | Owner-only revenue / pay-out view | | |
| | `headerMenuOpen` | Inline dropdown | Profile · Leaderboard · Account | | |
| | `dialog` | SweetAlert2 wrapper | Confirm / prompt / alert | | |
| ## Header chips | |
| - **Avatar** → `navigate(/u/${userData.username})` (own profile) | |
| - **Trophy** → `/leaderboard` | |
| - **Gear** → switches `activeView` to `'account'` | |
| - **Logout** → clears `exo_token`, navigates back to `/login` | |
| ## Stats card | |
| Powered by an interval that polls `/exocore/api/auth/userinfo` and the local | |
| `navigator.connection` API; falls back to mocked values (`stats = { cpu, ram }`) | |
| when the live numbers aren't available yet. | |
| ## Social grid | |
| A static array `SOCIAL_LINKS` with id `github`, `gdrive`, `discord`, `twitter`, | |
| `donate`, `youtube`. Rendered as **outbound** cards — clicking opens the org's | |
| public page (e.g. `https://github.com/Exocore-Organization`). Different from | |
| the in-app `social/SocialPanel` (chat / DM / posts) which is documented | |
| separately under [`../social/`](../social/README.md). | |
| ## Auth shape consumed | |
| ```ts | |
| type UserData = { | |
| username: string; // e.g. "@exocore" | |
| nickname: string; // "Costanos" | |
| email: string; | |
| plan: "free" | "pro" | "owner"; | |
| role: "user" | "mod" | "admin" | "owner"; | |
| xp: number; | |
| level: number; | |
| avatarUrl?: string; | |
| country?: string; | |
| // … plus payments / drive / github linked-account fields | |
| }; | |
| ``` | |