Sign in to share pet care
Family members can switch profiles and keep their own entries for pets, vet visits, medications, feeding, and weights.
import { useMemo, useState } from 'react'; import { useAuth, useCollection, useIdentity, useNotifications, usePresence } from '@deplixo/sdk'; import { PetList } from './components/PetList.jsx'; import { PetDetail } from './components/PetDetail.jsx'; // PROGRESS:sc_001:complete:Setting up pet care dashboard function App() { const { user: authUser, loading: authLoading, login, logout } = useAuth(); const { user: identityUser, loading: identityLoading } = useIdentity(); const { users: presenceUsers, update: updatePresence } = usePresence({ name: authUser?.name || identityUser?.name || 'Guest', email: authUser?.email || identityUser?.email || '' }); const { send: sendNotification } = useNotifications(); const { items: pets, loading, add, update, remove } = useCollection('pets', { personal: true }); const [selectedPetId, setSelectedPetId] = useState(null); const [activeFamilyMember, setActiveFamilyMember] = useState(() => ({ id: identityUser?.id || authUser?.id || 'me', name: authUser?.name || identityUser?.name || 'Me', email: authUser?.email || identityUser?.email || '' })); const familyMembers = useMemo(() => { const members = new Map(); const addMember = (member) => { if (!member?.id) return; members.set(member.id, { id: member.id, name: member.name || member.displayName || member.email || 'Family member', email: member.email || '' }); }; addMember(authUser); addMember(identityUser); addMember(activeFamilyMember); presenceUsers?.forEach(addMember); return Array.from(members.values()); }, [authUser, identityUser, activeFamilyMember, presenceUsers]); const currentMember = activeFamilyMember?.id ? familyMembers.find((member) => member.id === activeFamilyMember.id) || activeFamilyMember : familyMembers[0] || activeFamilyMember; const enrichedPets = useMemo(() => { return (pets || []).map((pet) => ({ ...pet, value: { ...pet.value, createdBy: pet.value?.createdBy || pet.createdBy || currentMember?.id, updatedBy: pet.value?.updatedBy || pet.updatedBy || currentMember?.id } })); }, [pets, currentMember]); const withOwner = (payload) => ({ ...payload, createdBy: currentMember?.id, createdByName: currentMember?.name, updatedBy: currentMember?.id, updatedByName: currentMember?.name }); const handleAuthAction = async () => { if (authUser) { await logout(); return; } await login(); }; const handleSwitchMember = (memberId) => { const next = familyMembers.find((member) => member.id === memberId); if (next) { setActiveFamilyMember(next); updatePresence?.({ name: next.name, email: next.email, activeMemberId: next.id }); sendNotification?.({ title: 'Active family member switched', message: `Now logging as ${next.name}` }); } }; const handleAddPet = async (pet) => add(withOwner(pet)); const handleUpdatePet = async (id, pet) => update(id, withOwner(pet)); const handleRemovePet = async (id) => remove(id); if (loading || authLoading || identityLoading) { return (
Loading your pets...
{selectedPet ? selectedPet.value.name : `Logged in as ${currentMember?.name || 'Guest'}`}
Family members can switch profiles and keep their own entries for pets, vet visits, medications, feeding, and weights.