lad-website/RESUME.md

219 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LAD Website — Session Resume Guide
**Last updated:** 2026-05-24
**Repo:** `https://gitea.sigd.net/chaulmark/lad-website`
**Local clone:** `/home/chaulmark/websites/lad-website`
**Last commit:** `523e812` (TODO.md added)
---
## Stack
| Layer | Technology | Notes |
|-------|-----------|-------|
| Frontend | Next.js 16, React 19.2, Tailwind CSS v4 | `/frontend/` |
| Backend | Express 5, TypeScript, MongoDB, Redis | `/backend/` |
| CMS (source) | Directus at `https://db.lad1908.org` | Read-only reference |
| Infra | Docker Compose + Nginx | `/docker-compose.yml` |
| Git host | Gitea at `gitea.sigd.net` | user: chaulmark |
---
## Brand Reference
| Item | Value |
|------|-------|
| Organization | Louisiana Association of the Deaf (LAD) |
| Founded | 1908 |
| Brand color | `#13AE3A` (green) |
| LAD logo | `https://db.lad1908.org/assets/5cdfa81d-ffc8-4cae-a178-5db3bfbaaeb8` |
| Deaf Focus logo | `https://db.lad1908.org/assets/c15110fe-d25a-4863-8e9c-055bfad3c710` |
| Primary contact | request@deaffocus.org / (225) 319-5586 |
| Scraped content | `LAD_CONTENT.md` in repo root |
---
## What Has Been Done
### Rebrand (complete)
- All "Olathe Club of the Deaf" / "OCD" references replaced with LAD in:
- `frontend/src/app/layout.tsx` — metadata, OpenGraph, Twitter card, metadataBase
- `frontend/src/components/organisms/Navigation.tsx` — org name, logo, nav links
- `frontend/src/components/organisms/Footer.tsx` — org name, tagline, copyright
- `frontend/src/app/about/page.tsx` — full about page copy
- `frontend/src/app/globals.css` — brand color switched from blue (`#1a56db`) to LAD green (`#13AE3A`) throughout: primary vars, gradients, CTA section, button shadows, dark theme, badge shadows
### Package Upgrades (complete)
- **Frontend:** Next.js 15→16, React 18→19.2.6, eslint-config-next updated, axios added
- **Backend:** Express 4→5, Mongoose 8→9, bcrypt 5→6, helmet 7→8, Zod 3→4
- **Breaking change fixed:** `frontend/src/app/api/uploads/[...path]/route.ts` — async params (Next.js 16 requirement)
- **Bug fixed:** `frontend/src/components/video/VideoPlayer.tsx` — broken absolute import path
- **Config fixed:** `frontend/next.config.js` — removed `experimental.serverActions`, added `db.lad1908.org` to remotePatterns, switched `images.domains` to `images.remotePatterns`
### New Pages (complete)
These pages were added and did not exist in the OCD template:
- `frontend/src/app/updates/page.tsx`
- `frontend/src/app/minutes/page.tsx`
- `frontend/src/app/deaf-focus/page.tsx`
### Content (complete — static)
All pages below have real LAD content hardcoded as static data. Content source: `LAD_CONTENT.md`.
| Page | File | Status |
|------|------|--------|
| Home | `app/page.tsx` | ✅ Announcement banner, real events, LAD copy |
| About | `app/about/page.tsx` | ✅ 201921 board, 10 affiliated orgs, history |
| Updates | `app/updates/page.tsx` | ✅ 13 real updates (20142022) |
| Events | `app/events/page.tsx` | ✅ 12 real events, 2 featured |
| Minutes | `app/minutes/page.tsx` | ✅ Public/members-only split, type badges |
| Deaf Focus | `app/deaf-focus/page.tsx` | ✅ All 6 articles + logo |
| Contact | `app/contact/page.tsx` | ⚠️ Still says "Olathe" — needs LAD info |
| Membership | `app/membership/page.tsx` | ⚠️ Still says "Olathe" — needs LAD info |
| Donate | `app/donate/page.tsx` | ⚠️ Still says "Olathe" — needs LAD info |
---
## What Still Needs To Be Done
### 1. Fix Remaining OCD-branded Pages (quick — ~30 min)
Three pages still have "Olathe Club of the Deaf" content. Just rebrand and fill with LAD info:
**`app/contact/page.tsx`**
- Replace metadata title/description
- Add real contact info:
- LAD general: info@lad1908.org (or use Deaf Focus contact below if LAD doesn't have a separate one)
- Deaf Focus interpreting: request@deaffocus.org
- Phone: (225) 319-5586
- Fax: (225) 308-4025
- Hours: MF 9am4pm
- Mailing address (unknown — not in scraped content)
- The `ContactForm` component already exists at `components/molecules/ContactForm.tsx`
**`app/membership/page.tsx`**
- Replace "Olathe" with LAD throughout
- LAD membership info (from scraped content): LAD is a nonprofit statewide org; membership gives voting rights, event access, advocacy support
- Membership fees/tiers unknown — not in scraped content; may need to ask client
**`app/donate/page.tsx`**
- Replace "Olathe" with LAD throughout
- LAD is a 501(c) nonprofit — donations are tax-deductible
- No specific donation platform/link found in scraped content; may need to ask client
### 2. Verify Build (critical — do this first in new session)
The build has never been run since the upgrades. Do this before anything else:
```bash
cd /home/chaulmark/websites/lad-website/frontend
npm run build
```
Known potential issues:
- TypeScript errors in admin pages (they use `useParams()` hook which should be fine, but worth checking)
- Any remaining OCD strings that TypeScript or ESLint might catch
- The `lint` script was changed from `next lint` to `eslint .` — make sure ESLint config is correct
### 3. Wire Dynamic Content (medium effort — decision required)
Currently Updates, Events, Minutes, and Deaf Focus are static arrays in the page files. There are two options:
**Option A: Pull from Directus API directly (simpler)**
- `https://db.lad1908.org/items/updates` — 69 items
- `https://db.lad1908.org/items/events` — 78 items
- `https://db.lad1908.org/items/minutes` — 101 items
- `https://db.lad1908.org/items/deaffocus` — 6 items
- Use `fetch()` in Next.js Server Components with `revalidate` for caching
- Pro: No backend setup needed, always live data
- Con: Dependent on client's Directus instance staying up
**Option B: Import into local MongoDB backend (more control)**
- The backend already has models for Events, Documents (Minutes), Videos, Members
- Would need a one-time import script to seed MongoDB from Directus
- Admin panel can then manage content going forward
- Pro: Self-contained, admin panel works
- Con: More setup, data gets out of sync if client updates Directus
**Recommendation:** Option A for now (Directus is already live and maintained by client), Option B later once the admin panel is configured.
### 4. Admin Panel (medium effort)
The admin panel exists at `/admin` with full CRUD for:
- Members (`/admin/members`)
- Documents (`/admin/documents`) — this maps to Minutes
- Videos (`/admin/videos`) — relevant for Deaf Focus
- Events (`/admin/events`)
What needs doing:
- Verify admin login works (backend auth middleware is in `backend/src/middleware/auth.ts`)
- Set up initial admin credentials (JWT-based auth — check `backend/src/middleware/auth.ts`)
- Test document/event upload flows with LAD content
- The backend connects to MongoDB — needs a running MongoDB instance (handled by Docker Compose)
### 5. Deploy to Production
When ready, deploy to production server at `10.4.0.205`:
- The Gitea webhook + friday-bot pipeline is already wired for other sites
- LAD website is not yet added to `webhook-listener/server.py`'s `REPO_CONFIG`
- Will need: domain name, Caddy reverse proxy entry on 10.4.0.205, Docker Compose up
---
## File Structure Reference
```
lad-website/
├── frontend/
│ ├── src/
│ │ ├── app/
│ │ │ ├── layout.tsx ✅ LAD metadata
│ │ │ ├── page.tsx ✅ Homepage
│ │ │ ├── globals.css ✅ Green theme
│ │ │ ├── about/page.tsx ✅ Board + orgs
│ │ │ ├── updates/page.tsx ✅ 13 updates
│ │ │ ├── events/page.tsx ✅ 12 events
│ │ │ ├── minutes/page.tsx ✅ Public/members split
│ │ │ ├── deaf-focus/page.tsx ✅ 6 articles
│ │ │ ├── contact/page.tsx ⚠️ Needs LAD info
│ │ │ ├── membership/page.tsx ⚠️ Needs LAD info
│ │ │ ├── donate/page.tsx ⚠️ Needs LAD info
│ │ │ └── admin/ (full CRUD panel)
│ │ └── components/
│ │ ├── organisms/Navigation.tsx ✅ Logo + nav
│ │ ├── organisms/Footer.tsx ✅ LAD footer
│ │ ├── molecules/Hero.tsx
│ │ ├── molecules/ContactForm.tsx
│ │ └── video/VideoPlayer.tsx ✅ Fixed import
│ ├── next.config.js ✅ remotePatterns updated
│ └── package.json ✅ Next.js 16, React 19.2
├── backend/
│ ├── src/
│ │ ├── models/ (Member, Event, Document, Video)
│ │ ├── controllers/ (full CRUD)
│ │ ├── routes/ (REST API)
│ │ └── middleware/auth.ts (JWT)
│ └── package.json ✅ Express 5, Mongoose 9
├── LAD_CONTENT.md ✅ All scraped content
├── TODO.md ✅ Summary task list
└── RESUME.md ✅ This file
```
---
## Environment / Shell Notes
- **EDQUOT issue:** The shell has had recurring disk quota problems from Chrome cache in previous sessions. If bash commands fail silently (exit code 1 with no output), disk quota is likely the cause.
- **Workaround used:** Route all command output to files (`cmd > ~/output.txt 2>&1`) then read the file. This bypasses the broken stdout pipe.
- **Root cause:** `~/old-hermes.tar.bz2` was a 1.3GB archive that was truncated to free space. If quota hits again, check `~/.npm/_cacache`, `~/.cache/tracker3`, and `~/.config/chrome-cdp-profile` for large files.
- **Gitea token:** `fe17b49600550ff548627e133155ed29b2dcec77` (embedded in remote URL)
---
## How to Resume
1. Open a fresh terminal (clears the EDQUOT shell state)
2. `cd ~/websites/lad-website`
3. `git log --oneline -5` — confirm you're at `523e812` or later
4. `cd frontend && npm run build` — verify build passes
5. Fix contact/membership/donate pages (see section above)
6. Decide on Directus vs MongoDB for dynamic content