Skip to content

Release v1.5.0 - #129

Merged
Muawiya-contact merged 22 commits into
mainfrom
develop
Sep 5, 2026
Merged

Release v1.5.0#129
Muawiya-contact merged 22 commits into
mainfrom
develop

Conversation

@Muawiya-contact

Copy link
Copy Markdown
Member

Release v1.5.0 — JS-only, ships over the air on the production channel (runtimeVersion stays 1.3.0; no new APK).

What's in it

On merge to main, release.yml will

  1. Publish production + preview OTA → installed apps auto-update to 1.5.0
  2. Cut the v1.5.0 tag + GitHub Release (auto-generated notes)
  3. Dispatch release-apk.yml — runtimeVersion unchanged, so with Fix APK native-gating: JS-only releases no longer rebuild the APK #120's fix it should now skip the APK rebuild

⚠️ Ops for #112 (forgot-password) to work in production

  1. Set SUPABASE_ANON_KEY on the Railway api service
  2. Add https://api-production-f3a9f.up.railway.app/reset-password to Supabase → Auth → Redirect URLs

In-app What's New card covers the user-facing features (features-only per #97).

Merge pull request #118 from Coding-Moves/develop
…ersion

The gate reads the previous runtimeVersion out of the apk-latest release
notes with a regex whose [0-9.]* class greedily swallowed the period that
ends the sentence ("runtimeVersion: 1.3.0. JS updates…"), yielding
"1.3.0.". That never equals the clean "1.3.0" from app.config.js, so
every JS-only release looked native and rebuilt the APK needlessly
(v1.4.1 did exactly this).

Anchor the capture on a trailing digit so the period is left out, and
drop the period right after the version in the notes as a second guard.
Fix APK native-gating: JS-only releases no longer rebuild the APK
Supabase emails a recovery link; it needs somewhere to land so the user can
set a new password. Mirroring the existing /confirmed web landing (the app is
native, so there is no web app), this serves a small dark-themed page that:

- reads the recovery session from the URL fragment (implicit flow), which the
  browser never sends to the server, so the access token stays client-side;
- posts the new password to Supabase's PUT /auth/v1/user with the public anon
  key + the recovery bearer token;
- validates length/match, surfaces expired-link and error states, and clears
  the spent token from history on success.

Adds a public SUPABASE_ANON_KEY setting (already shipped in the app bundle) for
the page to use; when it is unset the route serves a clear 'unavailable' page
rather than a form that can't submit.
resetPassword() sends a Supabase recovery email whose link lands on the
backend /reset-password page. The sign-in screen gets a 'Forgot password?'
link (sign-in mode only) that emails a reset to the address already typed.

The confirmation is deliberately neutral — 'if an account exists…' — because
Supabase returns success regardless of whether the email is registered, and
the UI must not become an account-enumeration oracle.
- Build the 'reset unavailable' page from its own template instead of
  string-replacing substrings of _CONFIRMED, which silently no-oped (and
  showed 'Email confirmed ✓') if that copy ever changed.
- Surface Supabase failures reported in the query string as well as the
  fragment, so an expired/invalid link shows the real reason.
- Drop a dead .replace(/+/g,' ') — URLSearchParams already decodes '+'.
…122)

An empty EXPO_PUBLIC_API_BASE_URL made redirectTo the relative
'/reset-password', which isn't a valid Supabase redirect. Fall back to the
project's Site URL in that case instead of sending a broken redirect.
Forgot Password: reset flow at sign-in (#112)
The category chip and like badge shared one flex-wrap row, so on a narrow
card a long category label pushed the heart onto a second line for some
concepts but not others — the icon appeared to jump between cards.

Give the like badge its own row beneath the category chip (as the issue
suggests) so its position is identical on every card, and left-align the
column so the badge hugs its content.
Add scaleFont() + FONT_SCALE (0.9) to the theme and wrap every fontSize and
lineHeight through it, so the app's text is uniformly ~10% smaller and can be
retuned from a single constant. Sizes keep their original readable numbers in
the code; scaleFont rounds to the nearest half-point (e.g. 16->14.5, 28->25,
smallest 11->10) so everything stays crisp and legible.
…125)

Text shrank ~10% via scaleFont but the 35 Ionicons/AnimatedFlame size props
stayed put, leaving icons proportionally large. Add scaleIcon() (same
FONT_SCALE, rounded to whole pixels) and route every icon size through it, so
the whole UI scales together from one lever.
History heart alignment (#121) + app-wide ~10% smaller text
…#123)

Turn the static 'Made by Coding Moves' footer into interactive links and add a
support section:
- Footer: 'Built with ❤️ by Coding Moves' -> github.com/Coding-Moves, with a
  'Developed by @Muawiya-contact' subline -> the developer's GitHub.
- Feedback & support: 'Contact us' opens the mail client prefilled with the
  app version in the subject, and 'Report an issue on GitHub' opens issues/new.

Links use React Native's Linking.openURL (best-effort). The version in the
mailto subject and the hero are read from expo-constants, so they track the
shipped version automatically.
openURL swallowed every rejection, so tapping Contact/links on a device with
no handler (e.g. no mail app) did nothing. Now it surfaces an alert with the
destination — the email address or the URL — so the tap is never a dead end.
About screen: clickable branding, attribution & feedback (#123)
History and Saved rows only carry a concept's name/topic, so reopening one
needs its body. This returns the published concept (summary + example + topic)
by slug, with other users' like_count (the client adds the viewer's own, like
the daily and state endpoints), or 404 if there's no such concept.
- conceptApi.fetchConcept(slug) loads a full concept from the new endpoint.
- ConceptDetailScreen renders the concept via the existing ConceptCard +
  ConceptActions (so like/save/share work there too), with a loading state and
  an offline/not-found fallback to the bundled catalog.
- Wrap the bottom tabs in a root stack so the detail modal can be presented
  above them from both History and Profile.
…#124)

- Tapping a History row or a Saved concept opens the detail modal for it.
- History now shows only the last 10 learned concepts (subtitle updated to
  match); the rows are display-only (no nested toggles), so a card tap can't
  collide with an inner control.
- Profile's navigation is now composite so it can reach the root modal.
… (review of #127)

- Add integration tests for get_concept_out: returns the body with only other
  users' likes (excludes the viewer's own), and None for an unknown slug.
- Export a single CONCEPTS_BY_ID from data/concepts and import it in the three
  screens instead of each rebuilding the same map.
- Type HistoryScreen's navigation as a CompositeNavigationProp (tab + root
  stack) to match how it's actually used, mirroring ProfileScreen.
Interactive History/Saved cards + concept detail + 10-item feed (#124)
JS-only release (runtimeVersion stays 1.3.0, ships over the air). Highlights:
forgot-password reset, tap-to-reopen History/Saved concepts, About screen
links. Polish (smaller text, card alignment) is intentionally left off the
card per the features-only policy (#97).

@Muawiya-contact Muawiya-contact left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

@Muawiya-contact
Muawiya-contact merged commit b2a6dbb into main Sep 5, 2026
1 check passed
Muawiya-contact added a commit that referenced this pull request Sep 5, 2026
Merge pull request #129 from Coding-Moves/develop
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.

1 participant