feat(contributions): rewrite server config as preset-based helpers

This commit is contained in:
Jennie Robinson Faber 2026-04-19 18:12:44 +01:00
parent 03eee45cbd
commit 55af652263
2 changed files with 98 additions and 39 deletions

View file

@ -1,28 +1,29 @@
// Server-side contribution config
export const CONTRIBUTION_TIERS = {
FREE: { value: "0", amount: 0, label: "$0 - I need support right now", tier: "free" },
SUPPORTER: { value: "5", amount: 5, label: "$5 - I can contribute", tier: "supporter" },
MEMBER: { value: "15", amount: 15, label: "$15 - I can sustain the community", tier: "member" },
ADVOCATE: { value: "30", amount: 30, label: "$30 - I can support others too", tier: "advocate" },
CHAMPION: { value: "50", amount: 50, label: "$50 - I want to sponsor multiple members", tier: "champion" },
// Server-side contribution config.
// Parallel to app/config/contributions.js but also hosts getHelcimPlanId,
// which is server-only (depends on runtime config).
export const CONTRIBUTION_PRESETS = [
{ amount: 0, label: "I need support right now" },
{ amount: 5, label: "I can contribute" },
{ amount: 15, label: "I can sustain the community" },
{ amount: 30, label: "I can support others too" },
{ amount: 50, label: "I want to sponsor multiple members" },
]
export const requiresPayment = (amount) => amount > 0
export const isValidContributionAmount = (amount) =>
Number.isInteger(amount) && amount >= 0
export const getGuidanceLabel = (amount) => {
if (amount === null || amount === undefined) return null
const n = Number(amount)
if (!Number.isFinite(n) || n < 0) return null
const match = CONTRIBUTION_PRESETS.findLast(p => p.amount <= n)
return match?.label ?? null
}
export const getContributionOptions = () => Object.values(CONTRIBUTION_TIERS)
export const getValidContributionValues = () => Object.values(CONTRIBUTION_TIERS).map(t => t.value)
export const getContributionTierByValue = (value) =>
Object.values(CONTRIBUTION_TIERS).find(t => t.value === value)
export const requiresPayment = (value) => (getContributionTierByValue(value)?.amount ?? 0) > 0
export const isValidContributionValue = (value) => getValidContributionValues().includes(value)
export const getPaidContributionTiers = () =>
Object.values(CONTRIBUTION_TIERS).filter(t => t.amount > 0)
export function getTierAmount(tier, cadence = 'monthly') {
const base = parseFloat(tier.amount)
return cadence === 'annual' ? base * 10 : base
}
// Cadence-keyed plan-id lookup. Throws via createError at call site if env missing;
// this helper just returns the raw runtime-config value.
// Cadence-keyed plan-id lookup. Unrelated to the tier concept.
export function getHelcimPlanId(cadence) {
const config = useRuntimeConfig()
if (cadence === 'annual') return config.helcimAnnualPlanId || null