import apiClient from './client'; export interface Family { id: string; name: string; shareCode: string; createdBy: string; subscriptionTier: string; members?: FamilyMember[]; } export interface FamilyMember { id: string; userId: string; familyId: string; role: 'parent' | 'caregiver' | 'viewer'; permissions: any; user?: { id: string; name: string; email: string; }; } export interface InviteMemberData { email: string; role: 'parent' | 'caregiver' | 'viewer'; } export interface JoinFamilyData { shareCode: string; } export const familiesApi = { // Create a new family createFamily: async (data: { name: string }): Promise => { const response = await apiClient.post('/api/v1/families', data); return response.data.data.family; }, // Get a specific family getFamily: async (familyId: string): Promise => { const response = await apiClient.get(`/api/v1/families/${familyId}`); return response.data.data.family; }, // Get family members getFamilyMembers: async (familyId: string): Promise => { const response = await apiClient.get(`/api/v1/families/${familyId}/members`); return response.data.data.members; }, // Invite a family member inviteMember: async (familyId: string, data: InviteMemberData): Promise => { const response = await apiClient.post(`/api/v1/families/invite?familyId=${familyId}`, data); return response.data.data.invitation; }, // Join a family using share code joinFamily: async (data: JoinFamilyData): Promise => { const response = await apiClient.post('/api/v1/families/join', data); return response.data.data.member; }, // Update member role updateMemberRole: async (familyId: string, userId: string, role: string): Promise => { const response = await apiClient.patch(`/api/v1/families/${familyId}/members/${userId}/role`, { role }); return response.data.data.member; }, // Remove a family member removeMember: async (familyId: string, userId: string): Promise => { await apiClient.delete(`/api/v1/families/${familyId}/members/${userId}`); }, // Generate a new share code for the family generateShareCode: async (familyId: string): Promise<{ code: string; expiresAt: Date }> => { const response = await apiClient.post(`/api/v1/families/${familyId}/share-code`); return response.data.data; }, // Generate role-based invite code generateRoleInviteCode: async ( familyId: string, role: 'parent' | 'caregiver' | 'viewer', expiryDays?: number ): Promise<{ code: string; expiresAt: Date; role: string }> => { const response = await apiClient.post(`/api/v1/families/${familyId}/invite-codes`, { role, expiryDays, }); return response.data.data; }, // Get all active role-based invite codes getRoleInviteCodes: async (familyId: string): Promise<{ parent?: { code: string; expiresAt: Date }; caregiver?: { code: string; expiresAt: Date }; viewer?: { code: string; expiresAt: Date }; }> => { const response = await apiClient.get(`/api/v1/families/${familyId}/invite-codes`); return response.data.data; }, // Join family with role-based invite code joinFamilyWithRoleCode: async (inviteCode: string): Promise => { const response = await apiClient.post('/api/v1/families/join-with-role', { inviteCode }); return response.data.data.member; }, // Revoke a role-based invite code revokeRoleInviteCode: async (familyId: string, role: 'parent' | 'caregiver' | 'viewer'): Promise => { await apiClient.delete(`/api/v1/families/${familyId}/invite-codes/${role}`); }, // Send email invite with role-based code sendEmailInvite: async ( familyId: string, email: string, role: 'parent' | 'caregiver' | 'viewer' ): Promise<{ code: string; expiresAt: Date; emailSent: boolean }> => { const response = await apiClient.post(`/api/v1/families/${familyId}/email-invite`, { email, role, }); return response.data.data; }, };