section: Feature User — Foundation | prio: P0 | est: 4h
Pourquoi
Le store user est séparé du store auth. SocialGate est le composant central qui protège toutes les fonctionnalités sociales sans dupliquer la logique.
Acceptance Criteria
- Zustand store
useUserStore : profile, contacts, roles, isProfileComplete (username_set && ACTIVE), isSocialReady (isProfileComplete && !isDeleted), requiresPhoneCompletion — JAMAIS de token ici
- Schemas Zod :
UsernameSchema (^[a-z0-9_-]{3,30}$), UpdateProfileSchema, ActivateSellerSchema, ActivateServiceProviderSchema
- Queries TanStack :
useMyProfile, usePublicProfile(username) (staleTime: 5min), useMyRoles, useContacts(status, pagination), useUsernameAvailability(username) (debounce 400ms, enabled quand >= 3 chars)
- Mutations TanStack :
useSetUsername, useUpdateProfile, useActivateRole, useDeactivateRole, useSendContactRequest, useAcceptContact, useRefuseContact, useBlockContact, useUpdateAlias, useAvatarUpload, useSoftDeleteUser
- SocialGate hook
useSocialGate : retourne {isSocialReady, requiresUsername, openGate(feature)} — si !isSocialReady : déclenche modal "Définissez votre pseudo pour accéder à {feature}" avec bouton → /profile/username
- SocialGateGuard HOC wrappant tout composant nécessitant un profil social
- Tous les types TypeScript inférés depuis Zod + types API
Fichiers
src/features/user/
├── model/user.store.ts + user.types.ts + user.schemas.ts
├── api/user.api.ts + user.queries.ts
├── lib/useSocialGate.ts + SocialGateGuard.tsx
└── index.ts
Scale
SocialGate centralisé = zéro duplication de logique dans tous les composants marketplace.
section: Feature User — Foundation | prio: P0 | est: 4h
Pourquoi
Le store user est séparé du store auth. SocialGate est le composant central qui protège toutes les fonctionnalités sociales sans dupliquer la logique.
Acceptance Criteria
useUserStore:profile,contacts,roles,isProfileComplete(username_set && ACTIVE),isSocialReady(isProfileComplete && !isDeleted),requiresPhoneCompletion— JAMAIS de token iciUsernameSchema(^[a-z0-9_-]{3,30}$),UpdateProfileSchema,ActivateSellerSchema,ActivateServiceProviderSchemauseMyProfile,usePublicProfile(username)(staleTime: 5min),useMyRoles,useContacts(status, pagination),useUsernameAvailability(username)(debounce 400ms, enabled quand >= 3 chars)useSetUsername,useUpdateProfile,useActivateRole,useDeactivateRole,useSendContactRequest,useAcceptContact,useRefuseContact,useBlockContact,useUpdateAlias,useAvatarUpload,useSoftDeleteUseruseSocialGate: retourne{isSocialReady, requiresUsername, openGate(feature)}— si !isSocialReady : déclenche modal "Définissez votre pseudo pour accéder à {feature}" avec bouton → /profile/usernameFichiers
Scale
SocialGate centralisé = zéro duplication de logique dans tous les composants marketplace.