Unify workspace dropdowns; Update layouts (#458)

Unified Account and Workspace drop-downs; Layout updates, now header lives within the PageBody component; Sidebars now use floating variant
This commit is contained in:
Giancarlo Buomprisco
2026-03-11 14:45:42 +08:00
committed by GitHub
parent ca585e09be
commit 4bc8448a1d
530 changed files with 14398 additions and 11198 deletions

View File

@@ -2,10 +2,12 @@
## Quick Reference
| Function | Import | Purpose |
|----------|--------|---------|
| `enhanceAction` | `@kit/next/actions` | Server actions with auth + validation |
| `enhanceRouteHandler` | `@kit/next/routes` | API routes with auth + validation |
| Function | Import | Purpose |
|-----------------------|-------------------------|------------------------------------|
| `authActionClient` | `@kit/next/safe-action` | Authenticated server actions |
| `publicActionClient` | `@kit/next/safe-action` | Public server actions (no auth) |
| `captchaActionClient` | `@kit/next/safe-action` | Server actions with CAPTCHA + auth |
| `enhanceRouteHandler` | `@kit/next/routes` | API routes with auth + validation |
## Guidelines
@@ -14,29 +16,78 @@
- Authorization via RLS, not application code
- Use `'use server'` at top of file
- Always validate with Zod schema
- Use `useAction` hook from `next-safe-action/hooks` in client components
## Skills
For detailed implementation patterns:
- `/server-action-builder` - Complete server action workflow
## Server Action Pattern
## Server Action Pattern (next-safe-action)
```typescript
'use server';
import { enhanceAction } from '@kit/next/actions';
import { authActionClient } from '@kit/next/safe-action';
export const myAction = enhanceAction(
async function (data, user) {
// data: validated, user: authenticated
// Authenticated action with schema validation
export const myAction = authActionClient
.schema(MySchema)
.action(async ({ parsedInput: data, ctx: { user } }) => {
// data: validated input, user: authenticated user
return { success: true };
},
{
auth: true,
schema: MySchema,
},
);
});
// Public action (no auth required)
import { publicActionClient } from '@kit/next/safe-action';
export const publicAction = publicActionClient
.schema(MySchema)
.action(async ({ parsedInput: data }) => {
return { success: true };
});
```
### Admin actions
Admin actions use a dedicated client in `@kit/admin`:
```typescript
import { adminActionClient } from '../utils/admin-action-client';
export const adminAction = adminActionClient
.schema(MySchema)
.action(async ({ parsedInput: data, ctx: { user } }) => {
// Only accessible to super admins
return { success: true };
});
```
## Client Component Pattern (useAction)
```typescript
'use client';
import { useAction } from 'next-safe-action/hooks';
import { myAction } from '../server/server-actions';
function MyComponent() {
const { execute, isPending, hasErrored, result } = useAction(myAction, {
onSuccess: ({ data }) => {
// Handle success
},
onError: ({ error }) => {
// Handle error
},
});
return (
<form onSubmit={(e) => { e.preventDefault(); execute(formData); }}>
{/* form fields */}
<button disabled={isPending}>Submit</button>
</form>
);
}
```
## Route Handler Pattern