33 lines
1,012 B
Markdown
33 lines
1,012 B
Markdown
|
|
# Routing
|
||
|
|
|
||
|
|
## Adding a New Route
|
||
|
|
|
||
|
|
Both steps are required — skipping step 1 causes a silent 404.
|
||
|
|
|
||
|
|
1. **Register in `app/routes.ts`** (do this first):
|
||
|
|
```typescript
|
||
|
|
route("admin/sports-seasons/:id/new-page", "routes/admin.sports-seasons.$id.new-page.tsx")
|
||
|
|
```
|
||
|
|
Nested admin routes go inside the `route("admin", ...)` array.
|
||
|
|
|
||
|
|
2. **Create the file** in `app/routes/` with the matching name.
|
||
|
|
|
||
|
|
3. Export `loader` / `action` as needed. TypeScript types are auto-generated via `react-router typegen`.
|
||
|
|
|
||
|
|
## File Naming Conventions
|
||
|
|
|
||
|
|
- `.` separates path segments: `leagues.$leagueId.settings.tsx` → `/leagues/:leagueId/settings`
|
||
|
|
- `$param` = dynamic segment
|
||
|
|
- `_index.tsx` = index route for a path
|
||
|
|
|
||
|
|
## Admin Routes
|
||
|
|
|
||
|
|
All admin routes are nested under `/admin` and require `isAdmin: true` on the user:
|
||
|
|
|
||
|
|
| Prefix | Area |
|
||
|
|
|---|---|
|
||
|
|
| `admin.sports.*` | Sports management |
|
||
|
|
| `admin.sports-seasons.*` | Sports seasons |
|
||
|
|
| `admin.templates.*` | Season templates |
|
||
|
|
| `admin.data-sync.tsx` | Data sync utilities |
|