Skip to content

release: promote development → main (2026-06-23T14:29:25Z) - #106

Merged
therajanmaurya merged 11 commits into
mainfrom
development
Jun 23, 2026
Merged

release: promote development → main (2026-06-23T14:29:25Z)#106
therajanmaurya merged 11 commits into
mainfrom
development

Conversation

@therajanmaurya

Copy link
Copy Markdown
Collaborator

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.

MobileByteLabsCommunity and others added 11 commits June 20, 2026 19:16
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
@therajanmaurya
therajanmaurya merged commit be41dfb into main Jun 23, 2026
7 of 9 checks passed
@vercel

vercel Bot commented Jun 23, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
pay-craft Ready Ready Preview, Comment Jun 23, 2026 2:29pm

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 03515476-422c-4f09-a5cb-98678ef5d207

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch development

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants