release: promote development → main (2026-06-23T14:29:25Z) - #106
Conversation
The publish pipeline shipped 2.0.3 instead of the declared 2.1.0 because publish.yml pinned mbl-actionhub @v1.0.12 — which only auto-patch-bumps off Maven Central / GitHub Releases and never reads gradle.properties. Bumped the reusable workflow to @v1.9.1 (which supports gradle.properties resolution) and set version-source: gradle-properties + gradle-properties-key: paycraft.version, so future publishes ship exactly the version declared in gradle.properties (currently 2.1.0). The actionhub's sanity check (resolved must be > Maven latest) keeps it safe.
Bump mbl-actionhub @v1.0.12 -> @v1.9.1 + version-source: gradle-properties + gradle-properties-key: paycraft.version, so publish ships the declared paycraft.version (2.1.0) instead of auto-patch-bumping (which shipped 2.0.3).
…-props ci(publish): resolve version from gradle.properties (ship 2.1.0)
publish-kmp-library.yml@v1.9.1 declares a bump-after-release job requesting pull-requests: write. The caller only granted contents: write, so the reusable workflow failed to compile (startup_failure) even though the bump job is default-off — job permissions are validated at startup regardless of if:.
ci(publish): grant pull-requests: write (fix v1.9.1 startup_failure)
…nsumer paywall (2.1.1) Root cause: the paywall rendered config non-reactively, so dashboard edits never surfaced in consumer apps without a cold relaunch (and the modal hero wasn't even config-driven — it used a hardcoded i18n string). - PayCraft: back suiteConfig with a MutableStateFlow; expose `suiteConfigFlow` (StateFlow) + add `refreshConfig()` to force a fresh /config fetch on demand. - PayCraftPaywall: modal hero title + subtitle are now config-driven (PaywallDto heroTitle/heroSubtitle) and read via collectAsState → the modal RECOMPOSES when the cloud fetch (or refreshConfig) publishes a dashboard change. Click-handler reads stay snapshot (correct at click time). - PayCraftPremiumBanner: falls back to suiteConfigFlow (collectAsState) when no LocalPayCraftConfig is provided, so the banner is reactive too. - bump 2.1.0 → 2.1.1. Verified end-to-end on-device: Playwright set the prod dashboard hero to "…E2E-OK2"; reels-downloader (composite 2.1.1) recomposed its paywall modal to match; Maestro asserts ".*E2E-OK2.*" visible. All 180 cmp-paycraft tests pass.
…(config parity) PayCraftPaywall (the modal reels uses) ignored two dashboard fields: - isPopular was hardcoded false in toBillingPlans → MOST POPULAR badge never showed and popular_plan_sku was ignored. Now wired: isPopular = dto.sku == popularPlanSku. - value_props weren't rendered. Now renders the same ValuePropList the BrandedStackTemplate uses, so the consumer paywall + dashboard show value props identically. (Discounts/trial already flow through BillingPlan.) Closes the dashboard-preview ↔ consumer parity gap on the SDK side. 180 tests pass.
…/country detection Theme: - Paywall + Settings banner derive brand color from dashboard primary_color via PaywallDto.effectiveThemeOverride (merges primary_color into theme_jsonb); applied reactively so a dashboard edit recolors both surfaces without a cold relaunch. Content (dashboard-driven): - Banner title/subtitle/CTA/restore + value_props now read from config (string-res fallback). - Footer RESTORE label + privacy/terms URLs use dedicated PaywallDto columns. Branding icon override: - New rememberHeroIconOverride/parseHeroIconPath renders dashboard hero_icon_svg (inline 24x24 path data) via multiplatform PathParser; default PayCraft icon fallback. Wired into v1 PayCraftPaywallHeader + v2 PaywallHeroIcon. Currency/country (single deciding point): - New CurrencyResolver + PayCraft.activeRegion/activeCountry/activeCurrency. - PlatformInfo.country added to all 7 platforms; Android uses SIM/network country (Google Play signal), not the language locale, so an en-GB phone with an Indian SIM bills in INR. - Country re-resolved at config-fetch time to dodge the androidx-startup Context race when the host starts Koin via koin-androidx-startup. - All providers key off one activeCurrency with a shared deterministic fallback; price and every checkout link can no longer diverge. Reactive ViewModel: - Config-first ordering in applySuiteConfig fixes the empty-paywall cold-start race. - Default popular-plan selection re-resolves on each config refresh. Tests: CurrencyResolver, EffectiveThemeOverride, SuiteConfigFlowOrdering, HeroIconOverride.
…ploy - observability: drop Sentry (@sentry/nextjs) + Linear fan-out; add Google Analytics (GA4 gtag via NEXT_PUBLIC_GA_ID — public, no vault secret); server telemetry → structured console logs (lib/telemetry.ts) - paycraft.ai: deterministic dashboard assistant (no paid AI) — brain/engine/ metrics, chat + floating bubble, /api/ai/ask, sidebar entry - deploy: harden /paycraft-deploy — dashboard typecheck gate, pending-migration detection + destructive-op scan + pre-push schema backup + post-push verify, edge-function /config smoke; fix 3.5-phase range arithmetic - secrets: drop sentry-dsn/-auth-token + linear-api-key from Vercel sync (18→15) - support-to-linear edge fn: keep Resend auto-reply, remove Linear + edge Sentry - gitignore machine-local infra/deploy/.state/
…hboard-region-currency feat(paywall): fully dashboard-automated paywall + region-based currency
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Auto-opened by /paycraft-deploy Phase 4 PROMOTE.
Source: origin/development @ b2e959e
Target: origin/main @ a4f2cae
Diff: 11 commits
This PR is fast-forward-only — main is kept as an exact replica of development at promote time. No manual edits should land on main.