[skip ci]
* perf(reader): Cut Chapter Open Latency and Reading-Time Re-Renders
Opening a chapter blocked the first paint on work that is not needed to
show text, and mounted several heavy subtrees while that work was running.
Load path (useChapter):
- Render the chapter as soon as its text is ready. Resolving the next and
previous chapter (two full-scan queries, plus a plugin page fetch over
the network at a page boundary) now runs after the chapter is on screen
and is pushed into the WebView instead of being baked into its HTML.
- Read downloaded chapters with a single native call instead of
exists() + readFile(), and start that read in parallel with the
database lookup instead of after it.
- Cache render-ready (sanitized) HTML, so prefetched chapters skip
sanitize-html entirely, and prefetch when the JS thread is idle rather
than in the middle of the current load.
- Drop failed loads from the cache so a retry actually retries.
- Guard every load with a generation id, keep getChapter and friends
referentially stable, and defer history/last-read writes off the
critical path.
Mounting:
- The chapter drawer (a list of every chapter) and the settings sheet
(a tab view that enumerates TTS engines and voices) are mounted on
first use instead of at reader open; the sheet's tabs are lazy.
- The loading skeleton shimmers its first lines only instead of
animating a full screen of gradient views.
While reading:
- Progress and mark-as-read writes keep the chapter array identity when
nothing changed, and a chapter is marked read (and pushed to the
tracker) once instead of on every progress report.
- Drawer rows are a memoized component with stable props, the drawer
stylesheet is memoized, and the WebView document is built once per
chapter instead of on every reader re-render.
Also fixes the drawer's loading branch, which compared a ref object to
undefined and was therefore unreachable, and guards page-reader
transitions against a not-yet-resolved neighbour.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac6DNTqrKqsQjbdMSmU3nm
* perf(reader): Stop Double-Parsing the Chapter and Cut Per-Frame Work
Follow-up to the previous pass, mostly inside the reader document itself.
Chapter open:
- The chapter body was written back into the DOM on every open. The
document already arrives with the chapter parsed, so unless bionic
reading or paragraph-spacing removal is on, that re-parsed and
re-laid-out the whole chapter (and restarted image loads) for nothing.
It now only writes when the transformed markup actually differs.
- The reading position was restored from `window.load` via
`document.fonts.ready`, both of which wait for every image in the
chapter - measured at ~1.5s with a single slow image, during which the
reader sat at the top of the chapter. It is now restored once the
chapter is parsed and styled (~100ms in the same scenario) with an
instant scroll, and corrected afterwards if fonts or images changed the
height - but only while the reader is still where it was put, so it
cannot yank the page from under someone already reading.
While reading:
- The scrollbar and the footer percentage each had their own unthrottled
scroll listener recomputing the same ratio; they now share one
listener coalesced to a frame. The footer clock no longer ticks state
when the footer is hidden.
- Reading time is persisted without rebuilding the in-memory chapter
list. It was rebuilt every few seconds for a field no screen renders -
the statistics screen aggregates it from the database - and on Fabric
react-navigation deliberately does not freeze the screen below the
focused one, so it re-rendered the novel screen's chapter list too.
- `hidden` moved into its own context. It flips on every tap on the page,
and a context value change re-renders all consumers, so the WebView,
drawer, appbar and searchbar were all re-rendering for a flag only the
reader screen reads.
- `openPage` no longer re-queries the chapter list when the requested
page is already open, which the drawer does on every mount.
Smaller: the battery level is read asynchronously instead of through two
synchronous native calls per chapter, the sanitizer options object is
built once instead of per chapter, the general settings tab draws its
dozen fixed rows directly instead of virtualising them, and the reader
settings hook stops allocating a new settings object per render.
Verified the document changes by loading the real reader assets in
Chromium: position restored before load, no body rewrite when no
transform applies, both scroll indicators driven by the shared listener,
progress still reported, transforms still applied and reverted, and the
post-load correction only firing on an untouched reader.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ac6DNTqrKqsQjbdMSmU3nm
* perf(reader): Optimize Search Functionality with Caching and Batch Processing
---------
Co-authored-by: Claude <noreply@anthropic.com>
* feat(reader): add search button and search input for word search
* fix(reader): make keyboard close on hideHeader
* chore(reader): format reader files
* chore(strings): regenerate string types
* feat(reader): add chapter word search
* fix(reader): improve chapter search reliability
* fix(reader): hide ReaderFooter when search is open
* fix(reader): add support for search in bionic reading mode
* fix(reader): localize chapter search placeholder
* feat(reader): block short word search queries
* feat(reader): make android back button exit search
* feat(reader): add exception for special character search
* refactor(reader): split chapter search script from core
* feat(downloads): make chapter download cooldown configurable
The chapter download service used a hard-coded 1s sleep between
sequential chapter writes. That worked as a polite default but is
either too long for users with patient sources or too short for
sources that 429 on tight loops. Surface the value as a single
global setting instead.
- AppSettings.chapterDownloadCooldownMs (optional, ms)
- getChapterDownloadCooldownMs(): synchronous fallback used by the
background task runner; returns the historical 1000ms when the
user has not configured an override (no regression on upgrade)
- downloadChapter.ts: sleep(getChapterDownloadCooldownMs()) replaces
the previous hard-coded sleep(1000)
- New "Chapter download cooldown" entry in General Settings, placed
directly above "Disable haptic feedback". Tapping opens a modal
that takes seconds (decimal allowed) and writes back as ms
- The input is sanitised on every keystroke to digits + a single
decimal point so paste / hardware keyboard input cannot smuggle
in non-numeric characters
- Reset writes the default explicitly so the user sees feedback
even when the override happened to equal the default
* feat(downloads): warn about source rate limits in cooldown modal
Per review feedback (#1834): the cooldown modal should make the
trade-off explicit so users don't lower the value below what their
sources can take. Add a single error-coloured line under the input.
fix(native-file): prevent crash when unlinking missing files
NativeFileSpec.unlink is codegened as a void-returning TurboModule
method, which dispatches asynchronously on the mqt_v_native thread.
Throwing "File does not exist" there bypasses every JS try/catch and
surfaces as a fatal AndroidRuntime exception, killing the process.
Make unlink idempotent (POSIX rm -f semantics): no-op when the path
does not exist. The Downloads "delete all" and individual delete
flows previously crashed whenever a chapter row had isDownloaded=true
while its on-disk folder had already been removed (e.g. after backup
restore or external cleanup). The same fix also protects useNovel,
pluginManager, fetch, epub/import, backup/local, backup/utils, and
AdvancedTab call sites that share the same native handler.
- patches/@rock-js__plugin-metro@0.12.12.patch: wrap absolute paths
in pathToFileURL() so dynamic imports work on Windows
- pnpm-workspace.yaml: register the patch and pin nodeLinker: hoisted
- pnpm-lock.yaml: lock the patched version with hash
- android/settings.gradle: invoke npx.cmd on Windows for rock autolink
* use new ids
* refactor in appearance settings
* fix lint
* remove setThemeMode from handleThemeSelect
* fix type logic
* use context for theme
* shorten animation
* adjusted LanguagePickerModal
* Fix Accent Color picker
* fix bottom navigation coloring
* log error instead of crashing when no theme context is available
The plugin row sits inside a react-native-gesture-handler Swipeable but
used the React Native Pressable, whose JS responder lost mouse-derived
tap events on WSA. Switch to the gesture-handler Pressable so taps share
the same responder system as the surrounding Swipeable.
* fix: Apply active filters to chapter count display (Closes#1793)
getChapterCount was always returning the total count regardless of
the active filter. When filtering by unread/downloaded/bookmarked,
the count shown in the novel header stayed the same as the total.
Added an optional filter parameter to getChapterCount and pass the
current settingsFilter from useNovel so the displayed count matches
the filtered chapter list.
* fix lint warning and add tests for filtered chapter count
- Use settingsFilter instead of novelSettings.filter in useNovel
to fix the react-hooks/exhaustive-deps warning
- Add tests for getChapterCount with filter parameter
- Update chapterFilterToSQL mock in test setup to actually apply
filter conditions so filtered count tests work correctly
* init
* Change from react-native-dotenv to react-native-config as dotenv leaks
env variables that set mmkv in test mode.
* upgrade debs
* upgrade mmkv
* fix db migration for new app builds
* update reanimated
* fix tests
* fix lint
* cleanup
* Update JumpToChapterModal.tsx
* fix settings.gradle
* first attempt
* first attempt
* added first useNovel tests
* more tests
* more tests
* resolved all test issues
* added test-utils
* add a few component tests
* add TESTIGN.md
* add testing gh action
* fixed minor issues
* fixed minor issues
Replace expo-notifications based TTS controls with a native
NativeTTSMediaControl TurboModule using Android's MediaSessionCompat
and MediaStyle notification. This provides proper media integration
with lock screen controls, cover art display, and seekbar.
- Add NativeTTSMediaControl Kotlin TurboModule with MediaSession
- Support Prev, Rewind, Play/Pause, Next notification buttons
- Show novel cover as notification album art
- Add seekbar with seek-to-element support
- Replace MMKV polling with NativeEventEmitter for instant response
- Add rewind and seekTo methods to TTS in core.js
- Clean up expo-notifications TTS setup from App.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* added .jj to .gitignore
* chore: Add drizzle-orm and drizzle-kit dependencies to package.json and pnpm-lock.yaml
* update debs
* Edit configs
* create drizzle schema
* generate drizzle migration
* db manager stuff
* Delete unused files
* Update DB Manager
* Rework CategoryQueries and related
* rewrite chapterQueries
* Type safety for chapter order and filter
* Better filter handling
* added queue
* added back database triggers
* Refactor HistoryQueries and LibraryQueries
* fix type issues
* refactor StatsQueries
* refactor NovelQueries
* renamed schemas
* refactor more db calls
* refactor libraryUpdateQueries
* removed deprecated code
* added extracted queries
* fix updates screen issue
* change to op-sqlite
* Update manager.ts
* Update RepositoryQueries
* update packages
* Update NovelQueries
* Update CategoryQueries.ts
* db testing environment v1 (AI)
* Refactor App component to use Suspense for loading state and update database initialization logic. Change drizzle-orm version to 0.45.1 and adjust related database queries for improved error handling and async operations. Clean up unused code and update types for better type safety.
* updated tests
* change db location to default expo-sqlite location
* fix async/sync bugs
* resolve rebase problems
* Added tests for db creation + migration
* update drizzle
* add missing journals to migrations.js
* wrap testDbManager in Proxy to be async
* add db initialization test
* fix lint errors
* improved dbManager.batch function
* remove unused file
* fix rebase conflicts
* use getColumns instead of getTableColumns
* fix lint errors
* fix release build not being able to start
* remove disable lint rule
* improved useLiveQuery
* Resolve issue with the db queue constructor options
* Fix database query issues in library and stats
- Add missing await to all stats query functions
- Remove unnecessary type casts on query results
- Fix downloaded-only filter to use gt(0) instead of eq(1)
---------
Co-authored-by: CD-Z <github.verify097@passmail.com>
LegendList's extraData only included downloadingChapterIds, so chapter
items weren't re-rendered when selection state changed via long press.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Decouple selection state from renderScene via SelectionContext to prevent
all TabView tabs from re-rendering on every selection toggle. Extract
LibraryNovelItem as a memo-wrapped component with stable callbacks and
primitive props so only affected items re-render. Replace O(n) array
lookups with Set-based O(1) checks throughout. Memoize all inline
closures, list furniture, and style objects. Fix library[index] bug that
used the wrong array for "Update Category" menu action.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes initial render height jump by adding initialLayout with window dimensions to TabView. Removes shadow flash on tab switch by setting elevation to 0 and adding consistent border styling.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Optimize Novel screen components with useCallback, useMemo, and memo to prevent unnecessary re-renders
- Replace download queue array iteration with downloadingChapterIds Set for O(1) lookups
- Add loading shimmer to chapter count display (replaces "Loading..." text)
- Fix state mutation bug in useNovel updateChapter (now creates new array)
- Refactor ChapterItem API (onDeleteChapter, onDownloadChapter props for better stability)
- Track download completion via useEffect to update chapter isDownloaded state
- Fix pagination control logic and improve spacing
- Remove unnecessary local state in ChapterDownloadButtons
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Synchronous TurboModule methods throwing IOException (FileNotFoundException)
crash the app process before JS catch blocks execute. Wrap file I/O in
try/catch to convert IOException to Exception for proper bridge serialization,
breaking the crash loop caused by stale tasks in the MMKV queue.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace expo StorageAccessFramework.readAsStringAsync with NativeFile
copyFile+readFile to properly handle content:// URIs from DocumentPicker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use content:// URI directly instead of copying to cache directory, which
could be cleaned up by the system before the background import task runs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Unclosed Response objects leaked HTTP connections and memory buffers,
causing OOM crashes when batch-downloading chapters with images.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* updated debs
* Jump to chapter now loads not preloaded chapters
* chapter drawer scrolls to current chapter
* Load new chapters when reaching end of chapter drawer
* fix JumpToChapterModal rebase
* fix Chapter drawer current chapter position detection
---------
Co-authored-by: CD-Z <github.verify097@passmail.com>
This is a cherry-pick from @IstarVin’s PR #1558. Thanks for the fix and for contributing. I cherry-picked it for the next release since the original PR had merge conflicts.
feat(tts): refactor reading logic and add new settings (voice, speed, pitch, auto page advance)
- Improved how TTS reads page content for smoother playback
- Added settings for voice selection, speed, and pitch control
- Added auto page advance support
- Added scroll-to-top behavior after advancing pages
- Updated UI to expose new TTS configuration options
[skip ci]
* Improve ‘remove extra paragraphs’ feature
* fix lint
* fix little mistake
* lil edit of code comment
* a little bit faster regex
* forgot to add final \s*
* fix not being able to change from chapter drawer
* add UpdatesContext
* fix library search
* Add Switch for plugin settings
* improved BrowseScreen rendering time
* improved rendering time further
* fix download button
* Fixed "Continue Reading" button
The lastRead chapter object that the "Continue Reading" button uses for everything is now updated on entering and leaving the chapter, instead of never updating when information changes.
* Fixed bookmark button not saving state
Done by passing the bookmark state down from the parent.
* Fixed bug caused by my own code
More thorough testing revealed that lastRead did not update properly on chapter switch
* Fixed issue that rendered previous fix ineffective
The original fix caused a new bug when changing chapters, and fixing that caused some of the old bugs to return. It should now be completely fixed.
---------
Co-authored-by: orionduffy <45501204+orionduffy@users.noreply.github.com>
When you try to create a backup file on Android 11+ device you get this error
/storage/emulated/0/h/inreader_backup_YYYY-MM-DD_HH_mm.json: open failed: EPERM (Operation not permitted)
in android file system you can't use the char ' : '
so lnreader file name:
"Inreader_backup_YYYY-MM-DD_HH:mm.json"
you can't write it as a file.
so i edit it to looks like
"Inreader_backup_YYYY-MM-DD_HH_mm.json"
* fix: "Add tag" entry does not add tags correctly if there is at least 1 tag
* fix: "Add tag" entry allows to add empty tags when there is at least 1 tag
* Added plugin settings
* Get plugin settings from plugin.
* Added multi language option
* Translate multi string
---------
Co-authored-by: nyagami <hoangquan05112002@gmail.com>
* Faster and less laggy global search
- Memoise each row in the search results page
- Limit number of concurrent searches (has setting, defaults to 5 sources at once)
- Load sources in the same order as they show in menu so from the user's pov it loads in faster
- Cancel search when u close global search
- Made the order of sources that are still loading follow the sorted order so theres less popin
- Added setting to remove animations from the loading placeholders
- Pause global search if u open a sub window (eg opening a novel)
- Change no results color to look less active
* Cancel previous global search when starting another
* Dont clear global search on unfocus
* Better place the image in preview
The preview has to.. preview decently:
1. the image is too big (screen space taken)
2. in raw-chapter-text mode the img link is HUGE and one has to scroll a lot.
* Better place the image preview V2
* feat: ServiceManager & import multiple epub files
* Fix: merge chapter based on index of toc in file list
* notifcation when jobs get done
* Fix epub: only read table of content in navmap
* add update library to service manager
* add drive backup/restore to service manager
* add self host backup/restore to service manager
* add migrate novel to service manager
* add download chapter to service manager
* clean up
* Volume scrolling fix
the scrolling by volume button right now scrolls 100% of the screen, which hides text when scrolled so, the commit is just changing the the scrolling to 50%.
* typo
* 50% to 75% scroll
---------
Co-authored-by: Ridi <ridi.culous.progger@gmail.com>
* github action:
- custom apk:
- packet name with git commit id
- app name with git commit id
- cached `npm install`
- update actions versions
* About page:
- Version based on package.json
- added git hash to the version if not Stable
- RELEASE_DATE, GIT_HASH, BUILD_TYPE created at build time from setEnvFile.cjs
- special BUILD_TYPE for github actions
- Version modal copy on click
- removed versionUtils
* expo-clipboard instead of react-native clipboard
* buildRelease Release instead of Debug ^^'
Gihtub Actions => Github Action
* replace native Navigation bar by expo-navigation-bar
* fix fullscreen logic
* fix: navigation button color
* fix: navigation color when theme changed
* fix: status bar color on full screen mode
* 40 is too large
* no 40 is acceptable :)
* refactor setBarColor
* refactor: rename setStatusBarColor
* no padding for landscape mode
* fix: read by paragraph and empty string
* add voice picker modal
* add tts voice picker for preview
* fix: tts for bionic reading
* stop speak when get out of reader
* search voice
* temporary fix: original font
* fix: start & resume
* fix: close context menu on copy
* Fix arabic alignment and language list order
- Left-to-Right for arabic language with u200e
- Fix alpabethic order
* Cleanup
---------
Co-authored-by: Rajarshee Chatterjee <rajarshee.adm@gmail.com>
* fix: always create novelDir
* fix: download new chapters
* update novel totalPages if refreshNovelMetadata is off
* fix: updateChapter logic
* fix: insertId could be -1
* beta host
* Refactor: url -> path (#944)
* refactor: url -> pathr
* fix: pluginId
* page support (#947)
* add new fields
* minor fix
* pages for novel
* render novel pages with drawer
* support real paginated novels
* descending novel chapter list
* update when has new latest chapter
* set hasUpdate for all pages after update
* fix: insert pageIndex
* fix: refreshChapters
* minor refactor: pageIndex
* fix: update page logic
* fix: order by pageIndex
* refactor: Chapter.pageindex -> index (position in page)
* Revert "refactor: Chapter.pageindex -> index (position in page)"
This reverts commit 109298e0ccfa4a0d3d369087e05cb6f307a786b4.
* refactor: pageindex -> position
* fix: reader drawer
* temporary fix migration
* fix: Serialize plugins into one file (#949)
* serialize plugins into one file
* fix typo
* Fix: insertChapters (#950)
* Fix: re-renders in novel screen(#951)
* remove unnecessary wrap
* fix: add local novel back to local category
* fix: use variables for default states
* fix: do not re-render when no FAB
* close drawer if pages length = 1
* add Portal.Host
* Cheaper useNovel hook (#952)
* fix: using pure state for novel and chapters
* fix: remove latestChapter mmkv hook
* shorter key
* fix: bookmark
* fix: save chapter progress in db
* minor refactor: chapterProgressElement
* Fix: Error/Empty actions (#956)
* fix: reader error handler
* fix: opacity for novel summary
* fix: library empty view
* fix: upsert and pages logic
* fix: update novel logic
* fix: import epub
* fix: plugin site in global search
* fix: scrollbar font size
* minor fix
* add remote zip/unzip
* reimplement: remote backup
* fix: close backup request
* get response for remote zip
* add zip drive backup
* add zip drive restore
* fix: categories are not restored
* change scope to drive.file
* add description for backup action
* refactor: Backup types
* fix: not allow to delete local category
* fix: throw github cache issue
* refactor: use english key
* minor: native language details
* add translatable strings
* fix: wrong version checker, update lastused
* fix: only show update dialog if newer version
* fix: remove chapter id in chapter item
* fix: date in chapter drawer
* fix: decode uri for local epub
* fix: simpler SetCategoriesModal
* fix: not allow local as default
* fix: no delay on selfhost backup/restore
* add exports variable
* fix: remove pinned and lasteUsed after uninstall
* fix: language filter for installed plugin
* create index for Chapter in novelId
* reorder headers parame in fetchApi
* remove Language from plugin libs
* fix: not backup empty cover
* feat: backup app version
* fix: chapter index
* feat: checkAppVersion when restoring
* update: using normal exports instead of default
move fetchFile into fetch.ts
* defaultCoverUri -> defaultCover
* fetch prev&next chapter and text at the same time.
* typescript for Main and Reader (and some related screens)
* fix: update time order
* feat: three dots button for browse
* fix: reader got wrong minscroll
* remove unused package drawer
* fix: seekbar bottom position
* add data-set in script (Reader)
* feat: remote backup (novel, category)
* feat: full backup
* fix: throw when downloading without installed plugin
* update: using websocket to tranfer data
* remote restore
* error handler for restore
* normalize code by recursion
* Not backuping tracker.
Because users can share their backup.
And tracker setting cotains their own token.
* fix: not create .nomedia in download dir
* fix: 2 children have same key in filter input
* fix: 2 children have same key in Picker Item
* remove AsyncStorage, disable hermes
* init
* update logic
* update libs for plugins
* move interface to types
* refactor, add language type
* small refactor of languages
* getPlugin
* update alias
* collect plugin on launch
* update interface Plugin
* move lang to PluginItem
* implement install plugins
* fix plugins reference
* fix fetching logic
* fix empty list
* refactor Browscreen
* implement searchNovels
* refactor plugin reducer
* try to remove old sources
* try to refactor
* tabview with theme, remove rn-fetch-blob
* update lib for plugin, temp fix for browse
* try to replace source by plugin in db
* many updates
* update db
* fix queries error
* update db
* update db
* update History table
* update db types
* format table name
* rename service
* rename field
* refactor interfaces
* update constrait
* update novel queries
* update constrait
* update novel and category queries
* more flexible category
* update library queris
* create category trigger, add constraints
* sync variables name with js rule :(
* setup database 90%
* updates queries
* queries to add novel to lib
* remove delete updates => delete download
* minor
* app work 20%
* query default one time
* createdb first
* remove 90% sources
* fix library queries
* temporary fix
* remove all source
* remove old languages constant
* update trigger
* update types
* refactor types, update trigger, refactor queries
* at least can go to novel screen
* update novel redux
* can go to novel screen
* remove generator
* change sourceId to pluginId
* can read chapter :(
* minor fix
* can use history screen
* unique key in historyscreen
* remove never use hook
* at least can use reader
* minor
* fix download queries
* fix history and chapterDrawer doenst need setNovel
* fix last read
* update click heart to follow novel
* insertNovel
* long press novels in library,
* change default category by move up
* update edit category, fix foreign constrait
* loading before get novel done
* fix categories were added.
Dont know why trigger didnt work.
So I decide to use normal queries
* fix errors when edit infos
* shorter init plugin
* fix stats screen
* minor fix for seekbar
* set re-request, fix download chapter
* hard fix:), maybe refactor it later
* must use sum to count :D
* update query
* fix migrate screen
* minor fix
* fix migrate screen and global search display
* minor
* quick fix for update screen
* update plugin props
* lol :D
* Backup work now.
But need to install plugins
* restore error backup
* If get novel without chapters. Fetch it again
* if all error novels are restored, remove error file
* minor fix
* remove never used packages.
* Complete plugin feature. Bump to RN 0.69.
I will write a changelog soon
* fetchFile for app side
* Fix: transparent bottem sheet, undefined index.
hideNavigationBar causes transparent bottem sheet (still opening but invisible.
Hope to find an actual fix later
* newUpdateDialog without markdown
* fix: Browse plugins behaviors
* fix: reader screen crashs when plugin is not installed
* Minor fix: undefined variables when updating
* minor fix: fetchFile return base64
* only update newversion
* fix: buildReleas succesfully but app crashes when opening.
from: https://github.com/facebook/react-native/issues/34114
* fix: webview send correct body height
* Refactor: remove HistoryTable.
remove PluginStatus
* Refactor: Migrate Update and History into Chapter.
- remove nerver used hook: useChapter
* fix: edit categories modal in novel screen
* minor: LL date format
* minor: remove html2text lib
* minor: migrate inlibrary novel
* Migrate novel and clean up
* small fix for migrate function
* Database Diagram
* optimise: O(1) to determine if lastread is read
* fix: position could be undefined
* refactor: change prop name. postion.position -> postion.offsetY
* fix filter
* fix: missing param in parseChapterNumber
* not a good fix, but it works xD
* fix: Text trunct almost title, should find a better fix later.
* enable feature: migrate from browse screen
* add data-plugin-id tag
* no `ghost` novel (which has no category)
* minor fix: detele all novel categories when removing novel form lib
* minor: deleteDownloadsSnackbar
* edit warning
* add chapter tag on preview
* add id for plugin, novel, chapter. smaller padding
* Use BottomSheetModal
* implement cookies bypass
* default language filter
* change default user agent
* shorter langue native name
* missing NOVEL_ERROR
* add filterInputs
* correct spelling :)
* add dayjs
* minor: remove console.log
* update site for pluginItem
* update icon,
* minor: remove unnecessary things
2023-05-08 07:09:20 +05:30
1261 changed files with 123338 additions and 78327 deletions
description:You can find your LNReader version in **More → About**.
placeholder:|
Example: "1.1.18"
Example: "2.1.0"
validations:
required:true
@@ -86,9 +86,9 @@ body:
required:true
- label:I have written a short but informative title.
required:true
- label:If this is an issue with a source, I should be opening an issue in the [sources repository](https://github.com/lnreader/lnreader-sources/issues/new/choose).
- label:If this is an issue with a plugin, I should be opening an issue in the [plugins repository](https://github.com/lnreader/lnreader-plugins/issues/new/choose).
required:true
- label:I have updated the app to version **[1.1.18](https://github.com/lnreader/lnreader/releases/latest)**.
- label:I have updated the app to version **[2.1.0](https://github.com/lnreader/lnreader/releases/latest)**.
required:true
- label:I will fill out all of the requested information in this form.
- label:I have written a short but informative title.
required:true
- label:If this is an issue with a source, I should be opening an issue in the [sources repository](https://github.com/LNReader/lnreader-sources/issues/new/choose).
- label:If this is an issue with a source, I should be opening an issue in the [sources repository](https://github.com/lnreader/lnreader-sources/issues/new/choose).
required:true
- label:I have updated the app to version **[1.1.18](https://github.com/LNReader/lnreader/releases/latest)**.
- label:I have updated the app to version **[2.1.0](https://github.com/lnreader/lnreader/releases/latest)**.
required:true
- label:I will fill out all of the requested information in this form.
### SDK Location not found. Define location with an ANDROID_SDK_ROOT environment variable. (expo modules error)
If you're on windows, you'll need to edit your system (system wide)/user (just you) environment variables. You'll want to add an environment variable named **ANDROID_SDK_ROOT** (legacy env variable name) and **ANDROID_HOME** that points to your android studio's sdk location. It'll most likely look something like this:
C:\Users\\**Username**\AppData\Local\Android\Sdk (copy paste this into the box)
Delete your node_modules folder, invalidate caches and restart in android studio and restart your machine. Follow the steps again in the [setup section](./CONTRIBUTING.md#setup).
### '.' is not recognized as an internal or external command, operable program or batch file. (npm run buildRelease error)
Run this line in the terminal instead: ```cd android ; ./gradlew clean ; ./gradlew assembleRelease```
The first time, this will download and set up all required tools, which can take considerable time. Subsequent entries will be much faster. You will also see a message about "Setting up writable Android SDK..." which only happens once.
## Development Workflow
Once inside the `nix develop` shell, all tools are available.
### 1. Start Metro Bundler
Open a new terminal or run in the background:
```bash
pnpm run dev:start
```
### 2. Physical Device Development
1. **Connect Device**: Enable USB debugging on your Android device and connect it via USB.
2. **Verify Device**:
```bash
adb devices
```
3. **Mirror Screen (Optional)**:
```bash
scrcpy # Mirrors screen, provides control
scrcpy -s <device_serial> # If multiple devices connected
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.