- Use CliUrls.WwwAbpIo instead of hardcoded abp.io host/URL in the
401/403 license hint, so dev/staging environments show the right URL
- Include server-provided RemoteServiceErrorResponse details (e.g. Code:
LicenseExpired) in the CliUsageException message when available
Previous Scriban-escape pass only matched single-line `{{ ... }}` blocks
and missed the two multi-line ones in BookStoreNavigator and
BottomTabNavigator (the Stack.Screen / Tab.Screen `options={{ ... }}`
props). Linter still failed on docs/en/tutorials/mobile/react-native/index.md#L363.
Wraps both multi-line objects with the same `{%{{{ ... }}}%}` escape, taking
the total escape count to 15/15 balanced and leaving no naked JSX
double-braces in the file.
Scriban treats `{{ ... }}` inside markdown as a template expression and
chokes on the comma inside JSX style props (e.g.
`contentContainerStyle={{ flexGrow: 1, paddingBottom: 96 }}`).
Wraps every literal JSX `{{ ... }}` occurrence with the
`{%{{{ ... }}}%}` escape used elsewhere in the docs, covering the 13 sites
spread across the DataList, AbpSelect, BookStoreNavigator,
BottomTabNavigator and CreateUpdateBookForm code blocks. Pure docs change,
no semantic effect on the rendered tutorial.
Reported by the markdown linter:
index.md:161:43: error: [ScribanParseError] Invalid token found `,`.
- Narrow GetAbpRemoteServiceErrorAsync catch to JSON deserialization
exceptions (System.Text.Json + Newtonsoft) so OOM and other runtime
errors are no longer swallowed
- Dispose HttpResponseMessage in DownloadSourceCodeContentAsync via
finally block, matching the pattern used by sibling methods
- Use generic EnsureSuccessfulHttpResponseAsync for user-supplied
TemplateSource downloads so non-abp.io 401/403 responses don't show
a misleading abp.io license hint
- Add tests for Newtonsoft JsonException handling and non-JSON exception
propagation
Asserting GetType() == typeof(Exception) locks the test to the base
type. The remaining message assertions already cover the intent of
ensuring the underlying JSON parse error does not surface.
Replaces the seven Paper-era TODO placeholders with fresh -new.png captures
from the modernized template (BottomTab + NativeWind). Drops the
'book-list-with-author' shot since the author column is already visible in
'book-list-new.png'.
Captures: book-store-menu-item-new, book-list-new, create-book-new,
update-book-new, delete-book-alert-new, create-author-new,
authors-in-book-form-new.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Drop manual HttpResponseMessage dispose in DownloadSourceCodeContentAsync,
consistent with Volo.Abp.Http.Client.ClientProxyBase and ASP.NET Core OAuth
handlers (default HttpCompletionOption.ResponseContentRead does not need
manual disposal)
- Fix "occured" -> "occurred" typos in two log lines
- Remove unused using Microsoft.Extensions.Options from test
The old tutorial was built around connectToRedux + Paper + DrawerNavigator
plus a DataList and AbpSelect that no longer ship with the template (PRs
#4635 and #4679 in volosoft/abp-studio cleared and re-themed the React
Native template). The whole document is rewritten so each code block
matches the bookstore-react-native-mongodb sample one-to-one.
Major changes from the previous version:
- Replaces 'add to DrawerNavigator' with 'add to BottomTabNavigator' (the new
default navigation_type).
- Walks through building NativeWind-based DataList and AbpSelect components
before using them in the screens.
- Drops connectToRedux / createAppConfigSelector() in favor of useDispatch +
useSelector(appConfigSelector).
- Keeps Paper TextInput only (the only Paper component the template still
uses); everything else is Pressable + className.
- Backend setup is intentionally short (endpoint + permission summary +
pointer to the Web Application Tutorial) - the focus is the RN side.
- Existing screenshot file paths kept with a TODO marker so they can be
refreshed once the new UI is captured.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- RemoteServiceExceptionHandler: catch all non-cancellation exceptions
during error response deserialization (was only catching Newtonsoft
JsonReaderException, but the active serializer throws System.Text.Json
JsonException, leaking '<' is an invalid start of a value to users)
- AbpIoSourceCodeStore: wrap 401/403 responses from abp.io endpoints in
CliUsageException with login + license hint, so users get an actionable
message instead of HTML-as-JSON parse failure
- Add unit tests for RemoteServiceExceptionHandler covering HTML body,
valid JSON error, 5xx, and OperationCanceledException propagation
Expand the React UI section to state that ABP 10.4 makes React a first-class modern template option, explain the in-solution React app plus ABP Admin Console approach, list the core tooling (Vite, TypeScript, TanStack Router/Query, Axios, Zod, React Hook Form, Tailwind CSS, shadcn/ui, Vitest), and note creation via the --modern flag or ABP Studio. Rename and expand the ABP Studio AI Agent section to 'ABP Agent', describe its three modes (Agent, Plan, Ask) and capabilities (solution-aware coding, build/run tasks, proxies, migrations, runtime inspection), and highlight workflow integrations (runner, task runner, Git/GitHub, AI commit messages, ABP-aware code review). Add the upgrade-abp-packages.png asset used by the post.
Add two demo GIFs (abp-agent-code-generation.gif and abp-agent-ai-review.gif) to the ABP Studio AI Agent announcement and embed them in the markdown article under docs/en/Community-Articles/2026-05-12-Introducing-Abp-Studio-Ai-Agent to illustrate code generation and AI review flows.