Release v1.5.0 - #129
Merged
Merged
Conversation
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).
Bump to v1.5.0 + What's New card
Muawiya-contact
added a commit
that referenced
this pull request
Sep 5, 2026
Merge pull request #129 from Coding-Moves/develop
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
apiservicehttps://api-production-f3a9f.up.railway.app/reset-passwordto Supabase → Auth → Redirect URLsIn-app What's New card covers the user-facing features (features-only per #97).