chore(release): v0.4.13 (versionCode 40) — waitlist retry queue (#166)

* chore(release): v0.4.13 (versionCode 40) — waitlist retry queue reaches users

Ships 2f81d34 (#165): failed waitlist signups are persisted on-device and
retried on app foreground instead of silently falling back to mailto.
Until this Play release, no user is running that fix.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix(waitlist): stamp the app version into the mailto escape hatch

AGE-100 asks for the post-release mailto count "split by app version where the
mail body allows it". It did not allow it: the body was "Sign me up!\n\nEmail: x"
and nothing else, so a mail from an unreachable pre-v0.4.8 sideload is byte-identical
to one from a current build whose retry queue leaked. Those two readings have
opposite meanings — the first is the known permanent cohort, the second is a defect.

Now the escape hatch appends "App: OpenCode Mobile v<version>" (app.json, same
source Sentry uses). Absence of the line == pre-v0.4.13 build. waitlist.ts stays
free of react-native/JSON imports; the screen injects the version.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

---------

Co-authored-by: engineer <engineer@macbookpro.lan>
Co-authored-by: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Den
2026-08-14 02:02:53 -07:00
committed by GitHub
parent 2f81d34200
commit af7da46c0f
10 changed files with 67 additions and 10 deletions

View File

@@ -23,6 +23,11 @@ import { buildAuth } from "../../src/lib/auth"
import { AnalyticsEvent, track } from "../../src/lib/analytics"
import { submitWaitlistSignup, buildWaitlistMailtoUrl, needsManualEscapeHatch, type QueuedSignup } from "../../src/lib/waitlist"
import { flushPendingSignups, queuePendingSignup, readPendingSignups, dropPendingSignup } from "../../src/lib/waitlist-queue-storage"
import appJson from "../../app.json"
// Same read as sentry.ts: app.json is the single source of the user-visible
// version (package.json/gradle are kept in parity by `npm run check:versions`).
const APP_VERSION = (appJson as { expo?: { version?: string } }).expo?.version ?? "unknown"
export default function AddConnectionScreen() {
const colorScheme = useColorScheme()
@@ -281,7 +286,7 @@ export default function AddConnectionScreen() {
// Last-resort, user-initiated only. Never opened automatically.
const openWaitlistMailto = async (email: string) => {
try {
await Linking.openURL(buildWaitlistMailtoUrl(email))
await Linking.openURL(buildWaitlistMailtoUrl(email, APP_VERSION))
} catch {
Alert.alert(t("connection.add.waitlist.alertTitle"), t("connection.add.waitlist.noMailAppMessage"))
}