teqo/src/lib/campaignRoles.ts
Francisco Ignácio Fontoura Solla cf6ae6c47c Pass 2 W2: correcoes de fronteira lib/utilities e client boundary
- helpers puros movidos utilities->lib: slug, phone, wordStartFilter, voteEstimate (9 inversoes lib->utilities zeradas)
- chaves de consent em src/lib/campaignConsentKeys.ts (client-safe); campaignInvite/campaignConsent re-exportam; onda0ConsentTexts referencia as constantes
- 'server-only' em 21 loaders Payload/cache (CLI segue com --conditions=react-server)
- ciclo de tipos supporterListFilters <-> supporterUi quebrado (SupporterListFilterInput estrutural; sqlFilters idem)
- votePledgeData dividido: votePledgeViews (puro, client-safe) + votePledgeData (loaders, server-only) - padrao contract-module
- predicados de role client-safe em src/lib/campaignRoles.ts; access/shared deriva deles (fonte unica); nav.ts para de importar o barrel campaignAccess (casts 'as CampaignUser' eliminados)
2026-07-25 14:38:41 -03:00

18 lines
865 B
TypeScript

import type { CampaignUser } from '@/payload-types'
/**
* Client-safe campaign ROLE predicates — the single source for what each role
* label means. Server-side actor checks (`isCampaignStaff(user)` etc.) derive
* from these in `src/utilities/access/shared.ts`; client components (sidebar,
* nav) use the role-level predicates directly instead of importing the access
* barrel.
*/
export type CampaignRole = CampaignUser['role']
/** Staff = coordinator, advisor, or candidate. Leaders are not staff. */
export const isStaffCampaignRole = (role: CampaignRole): boolean =>
role === 'coordinator' || role === 'advisor' || role === 'candidate'
/** Coordinator or candidate — unrestricted scope (all municipalities, decisions). */
export const isUnrestrictedCampaignRole = (role: CampaignRole): boolean =>
role === 'coordinator' || role === 'candidate'