React
Access organization membership data for the current user
useOrganizationMemberships()
import { useOrganizationMemberships } from '@snipextt/wacht';
import { useOrganizationMemberships } from '@snipextt/wacht'; function MembershipList() { const { organizationMemberships, loading, refetch } = useOrganizationMemberships(); if (loading) { return <div>Loading memberships...</div>; } return ( <div> <h2>Your Organization Memberships</h2> {organizationMemberships?.map(membership => ( <div key={membership.id}> <h3>{membership.organization.name}</h3> <p>Role: {membership.role.name}</p> <p>Joined: {new Date(membership.created_at).toLocaleDateString()}</p> </div> ))} <button onClick={refetch}>Refresh</button> </div> ); }
const { refetch } = useOrganizationMemberships(); await refetch();
interface OrganizationMembershipWithOrganization { id: string; organization: Organization; role: OrganizationRole; user: User; created_at: string; updated_at: string; } interface Organization { id: string; name: string; description?: string; image_url?: string; created_at: string; updated_at: string; } interface OrganizationRole { id: string; name: string; permissions: string[]; }
function OrganizationSwitcher() { const { organizationMemberships, loading } = useOrganizationMemberships(); const { activeOrganization } = useActiveOrganization(); const { switchOrganization } = useSession(); if (loading) { return <div>Loading...</div>; } return ( <select value={activeOrganization?.id || ''} onChange={(e) => switchOrganization(e.target.value)} > <option value="">Personal Workspace</option> {organizationMemberships?.map(membership => ( <option key={membership.id} value={membership.organization.id}> {membership.organization.name} </option> ))} </select> ); }
function MembershipDetails() { const { organizationMemberships, loading, refetch } = useOrganizationMemberships(); const [selectedMembership, setSelectedMembership] = useState(null); if (loading) { return <div>Loading memberships...</div>; } return ( <div className="membership-manager"> <div className="membership-list"> <h2>Your Organizations</h2> {organizationMemberships?.map(membership => ( <div key={membership.id} className={`membership-card ${selectedMembership?.id === membership.id ? 'selected' : ''}`} onClick={() => setSelectedMembership(membership)} > <h3>{membership.organization.name}</h3> <span className="role-badge">{membership.role.name}</span> </div> ))} </div> {selectedMembership && ( <div className="membership-details"> <h2>Membership Details</h2> <dl> <dt>Organization</dt> <dd>{selectedMembership.organization.name}</dd> <dt>Role</dt> <dd>{selectedMembership.role.name}</dd> <dt>Permissions</dt> <dd> <ul> {selectedMembership.role.permissions.map(permission => ( <li key={permission}>{permission}</li> ))} </ul> </dd> <dt>Member Since</dt> <dd>{new Date(selectedMembership.created_at).toLocaleDateString()}</dd> </dl> </div> )} <button onClick={refetch} className="refresh-button"> Refresh Memberships </button> </div> ); }
function PermissionGate({ permission, children }) { const { organizationMemberships } = useOrganizationMemberships(); const { activeOrganization } = useActiveOrganization(); const hasPermission = useMemo(() => { if (!activeOrganization || !organizationMemberships) return false; const membership = organizationMemberships.find( m => m.organization.id === activeOrganization.id ); return membership?.role.permissions.includes(permission) || false; }, [organizationMemberships, activeOrganization, permission]); if (!hasPermission) { return <div>You don't have permission to view this content.</div>; } return children; } // Usage <PermissionGate permission="admin"> <AdminPanel /> </PermissionGate>
useActiveOrganization()
useOrganizationList()