// --------------------------------------------------------------------------- // DataProvider interface — abstraction over real API vs. in-memory demo store // --------------------------------------------------------------------------- // Types are imported from the API modules (the actual source of truth for hooks). // --------------------------------------------------------------------------- import type { CreateResidenceRequest, UpdateResidenceRequest, ResidenceResponse, MyResidenceResponse, ResidenceSummaryResponse, ShareCodeResponse, SharePackageResponse, GenerateShareCodeRequest, ResidenceUserResponse, TasksReportResponse, MessageResponse as ResidenceMessageResponse, } from '@/lib/api/residences'; import type { CreateTaskRequest, UpdateTaskRequest, TaskResponse, KanbanResponse, CompletionResponse, CreateCompletionRequest, MessageResponse as TaskMessageResponse, } from '@/lib/api/tasks'; import type { CreateContractorRequest, UpdateContractorRequest, ContractorResponse, ToggleFavoriteResponse, ContractorTaskResponse, } from '@/lib/api/contractors'; import type { DocumentListParams, CreateDocumentRequest, UpdateDocumentRequest, DocumentResponse, MessageResponse as DocMessageResponse, } from '@/lib/api/documents'; import type { StaticDataResponse } from '@/lib/api/lookups'; import type { NotificationListResponse, UnreadCountResponse, NotificationPreferencesResponse, UpdatePreferencesRequest, } from '@/lib/api/notifications'; import type { SubscriptionStatusResponse, FeatureBenefitResponse, UpgradeTriggerResponse, } from '@/lib/api/subscription'; import type { UserResponse } from '@/lib/api/auth'; // Unified MessageResponse (all API modules define the same shape) type MessageResponse = ResidenceMessageResponse | TaskMessageResponse | DocMessageResponse; // --------------------------------------------------------------------------- // Domain-split interface // --------------------------------------------------------------------------- export interface DataProvider { basePath: string; residences: { list(): Promise; get(id: number): Promise; create(data: CreateResidenceRequest): Promise; update(id: number, data: UpdateResidenceRequest): Promise; delete(id: number): Promise; getMyResidences(): Promise; getSummary(): Promise; }; tasks: { list(days?: number): Promise; get(id: number): Promise; create(data: CreateTaskRequest): Promise; update(id: number, data: UpdateTaskRequest): Promise; delete(id: number): Promise; getByResidence(residenceId: number, days?: number): Promise; getCompletions(taskId: number): Promise; createCompletion(data: CreateCompletionRequest): Promise; createCompletionWithImages( data: { task_id: number; notes?: string; actual_cost?: number; completed_at?: string }, images: File[], ): Promise; markInProgress(id: number): Promise; cancel(id: number): Promise; uncancel(id: number): Promise; archive(id: number): Promise; unarchive(id: number): Promise; quickComplete(id: number): Promise; }; contractors: { list(): Promise; get(id: number): Promise; create(data: CreateContractorRequest): Promise; update(id: number, data: UpdateContractorRequest): Promise; delete(id: number): Promise; toggleFavorite(id: number): Promise; getTasks(id: number): Promise; }; documents: { list(params?: DocumentListParams): Promise; listWarranties(): Promise; get(id: number): Promise; create(data: CreateDocumentRequest): Promise; createWithFile(data: CreateDocumentRequest, file: File): Promise; update(id: number, data: UpdateDocumentRequest): Promise; delete(id: number): Promise; }; lookups: { getStaticData(): Promise; }; sharing: { getShareCode(residenceId: number): Promise<{ share_code: ShareCodeResponse | null }>; generateShareCode(residenceId: number, data?: GenerateShareCodeRequest): Promise; generateSharePackage(residenceId: number, data?: GenerateShareCodeRequest): Promise; getResidenceUsers(residenceId: number): Promise; removeUser(residenceId: number, userId: number): Promise; joinWithCode(data: { code: string }): Promise; generateTasksReport(residenceId: number, email?: string): Promise; }; notifications: { list(limit?: number, offset?: number): Promise; getUnreadCount(): Promise; getPreferences(): Promise; updatePreferences(data: UpdatePreferencesRequest): Promise; markAsRead(id: number): Promise; markAllAsRead(): Promise; }; subscription: { getStatus(): Promise; getFeatureBenefits(): Promise; getUpgradeTriggers(): Promise; }; auth: { getCurrentUser(): Promise; /** * Real mode: drives the Ory Kratos browser logout flow (clears the * session cookie and navigates the browser). Demo mode: a no-op. */ logout(): Promise; }; } // Re-export types that hooks/consumers will need export type { CreateResidenceRequest, UpdateResidenceRequest, CreateTaskRequest, UpdateTaskRequest, CreateCompletionRequest, CreateContractorRequest, UpdateContractorRequest, CreateDocumentRequest, UpdateDocumentRequest, DocumentListParams, UpdatePreferencesRequest, };