- 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)
18 lines
865 B
TypeScript
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'
|