Multiple features and improvements: Reports/Rapportage API: - Created REST API endpoints: /api/reports (GET/POST), /api/reports/[id] (GET/PATCH/DELETE) - Added /api/reports/classify endpoint for AI classification - Supabase migrations: reports table + RLS policies - Server utilities: api-client.ts for DRY fetch logic - Type definitions: lib/types/report.ts with Zod schemas - Removed old rapportage-modal component (replaced by split-view) Speech Recorder Refactor: - Moved speech-recorder from intake-specific to shared components/ - Updated treatment-advice-form to use new location - Updated intake actions for speech functionality UI Components (shadcn): - Added dialog, dropdown-menu, toast, toaster components - Added use-toast hook for toast notifications Documentation: - Reorganized docs/release/ → docs/reports/ for better structure - Archived old specs to docs/specs/archive/ - Added screening-system.mdx documentation - Added rapportage-split-view-design.md - Added UI screenshots for troubleshooting Dependencies: - Updated package.json and pnpm-lock.yaml - Regenerated database.types.ts from Supabase 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import { headers, cookies } from 'next/headers';
|
|
|
|
export function getBaseUrl(): string {
|
|
if (process.env.NEXT_PUBLIC_APP_URL) {
|
|
return process.env.NEXT_PUBLIC_APP_URL;
|
|
}
|
|
|
|
try {
|
|
const headersList = headers();
|
|
const host = headersList.get('host');
|
|
const protocol = headersList.get('x-forwarded-proto') || 'http';
|
|
if (host) {
|
|
return `${protocol}://${host}`;
|
|
}
|
|
} catch {
|
|
// Ignore header errors
|
|
}
|
|
|
|
return 'http://localhost:3000';
|
|
}
|
|
|
|
export async function getCookieHeader(): Promise<string> {
|
|
try {
|
|
const cookieStore = await cookies();
|
|
return cookieStore
|
|
.getAll()
|
|
.map((cookie) => `${cookie.name}=${cookie.value}`)
|
|
.join('; ');
|
|
} catch {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
export async function authFetch(input: string | URL, init: RequestInit = {}) {
|
|
const cookieHeader = await getCookieHeader();
|
|
const headersObj = new Headers(init.headers);
|
|
|
|
if (cookieHeader && !headersObj.has('cookie')) {
|
|
headersObj.set('cookie', cookieHeader);
|
|
}
|
|
|
|
return fetch(input, {
|
|
...init,
|
|
headers: headersObj,
|
|
});
|
|
}
|