diff --git a/app/pages/join.vue b/app/pages/join.vue
index fc1ae21..80bd80f 100644
--- a/app/pages/join.vue
+++ b/app/pages/join.vue
@@ -116,19 +116,19 @@
- Monthly Contribution
+ {{ cadence === 'annual' ? 'Annual Contribution' : 'Monthly Contribution' }}
Pay what you can
- $0 I need support right now
- - $5 I can contribute
+ - {{ cadence === 'annual' ? '$50/yr' : '$5/mo' }} I can contribute
-
- $15 I can sustain the community
+ {{ cadence === 'annual' ? '$150/yr' : '$15/mo' }} I can sustain the community
(suggested)
- - $30 I can support others too
+ - {{ cadence === 'annual' ? '$300/yr' : '$30/mo' }} I can support others too
-
- $50 I want to sponsor multiple
+ {{ cadence === 'annual' ? '$500/yr' : '$50/mo' }} I want to sponsor multiple
members
@@ -234,9 +234,39 @@
+
{{ cadence === 'annual' ? 'Annual' : 'Monthly' }} Contribution
{
+ const isAnnual = cadence.value === "annual";
+ return Object.values(CONTRIBUTION_TIERS).map((tier) => {
+ const base = tier.amount;
+ if (base === 0) return { value: tier.value, label: "$0" };
+ const amt = isAnnual ? base * 10 : base;
+ const suffix = isAnnual ? "/yr" : "/mo";
+ const hint = tier.value === "15" && !isAnnual ? " (suggested)" : "";
+ return { value: tier.value, label: `$${amt}${suffix}${hint}` };
+ });
+});
// Initialize composables
const {
@@ -585,6 +622,7 @@ const createSubscription = async (cardToken = null) => {
customerId: customerId.value,
customerCode: customerCode.value,
contributionTier: form.contributionTier,
+ cadence: cadence.value,
cardToken: cardToken,
},
});
@@ -863,6 +901,13 @@ onUnmounted(() => {
color: var(--text-faint);
}
+/* ---- CADENCE RADIOS ---- */
+.cadence-radios {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 10px;
+}
+
/* ---- CIRCLE RADIOS ---- */
.circle-radios {
display: grid;
diff --git a/app/pages/member/payment-setup.vue b/app/pages/member/payment-setup.vue
index b604e17..584a5be 100644
--- a/app/pages/member/payment-setup.vue
+++ b/app/pages/member/payment-setup.vue
@@ -128,7 +128,8 @@ const openModal = async () => {
await $fetch('/api/members/update-contribution', {
method: 'POST',
- body: { contributionTier: targetTier.value },
+ // cadence: annual upgrades go through /join; this page is monthly-only
+ body: { contributionTier: targetTier.value, cadence: 'monthly' },
});
await checkMemberStatus();