Files
stack/apps/web/src/lib/api/events.ts
Jason Woltje 75cc65a531
Some checks failed
ci/woodpecker/push/web Pipeline failed
feat(web): wire calendar page to real API data
Replace mock events with live fetchEvents() calls. Update EventFilters
to match backend QueryEventsDto (startFrom/startTo), pass workspaceId
via header, add MosaicSpinner loading state, design-token error/empty
states, and cancelled-flag cleanup pattern matching the dashboard.

Refs #467

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 21:49:57 -06:00

58 lines
1.6 KiB
TypeScript

/**
* Event API Client
* Handles event-related API requests
*/
import type { Event } from "@mosaic/shared";
import { apiGet, type ApiResponse } from "./client";
export interface EventFilters {
/** Filter events starting from this date (inclusive) */
startFrom?: Date;
/** Filter events starting up to this date (inclusive) */
startTo?: Date;
/** Filter by project ID */
projectId?: string;
/** Filter by all-day events */
allDay?: boolean;
/** Page number (1-based) */
page?: number;
/** Items per page (max 100) */
limit?: number;
}
/**
* Fetch events with optional filters
*
* @param workspaceId - Workspace ID sent via X-Workspace-Id header
* @param filters - Optional query parameter filters
*/
export async function fetchEvents(workspaceId?: string, filters?: EventFilters): Promise<Event[]> {
const params = new URLSearchParams();
if (filters?.startFrom) {
params.append("startFrom", filters.startFrom.toISOString());
}
if (filters?.startTo) {
params.append("startTo", filters.startTo.toISOString());
}
if (filters?.projectId) {
params.append("projectId", filters.projectId);
}
if (filters?.allDay !== undefined) {
params.append("allDay", String(filters.allDay));
}
if (filters?.page !== undefined) {
params.append("page", String(filters.page));
}
if (filters?.limit !== undefined) {
params.append("limit", String(filters.limit));
}
const queryString = params.toString();
const endpoint = queryString ? `/api/events?${queryString}` : "/api/events";
const response = await apiGet<ApiResponse<Event[]>>(endpoint, workspaceId);
return response.data;
}