Commit Graph

1249 Commits

Author SHA1 Message Date
Rajarshee Chatterjee a16ec87631 perf: Optimize Novel Covers, Lists, and Chapter Groups 2026-07-24 11:15:35 +05:30
Rajarshee Chatterjee dfd620aa29 feat: Standardize Dialogs with Material 3 Patterns 2026-07-23 23:05:53 +05:30
Rajarshee Chatterjee a5a6e8326f chore: Update @legendapp/list to 3.3.3 2026-07-23 22:08:26 +05:30
Rajarshee Chatterjee 7f48a8ba82 refactor: Improve Plugins Screen UX and Code 2026-07-23 21:44:01 +05:30
Rajarshee Chatterjee ae34d7b4ec feat: Add Dynamic Preview APK Metadata 2026-07-23 10:07:36 +05:30
Rajarshee Chatterjee 44c8e54ed8 feat: Add Dynamic Material Theme Colors (Closes #1863) 2026-07-23 09:10:48 +05:30
Ecasept 4a4208e336 feat: Add Time-Tracking Toggle and Inactivity Timeout (#1890)
* feat: implement on-off switch and inactivity timeout for time-tracking

* chore: remove stray console.log
2026-07-23 09:10:14 +05:30
CD-Z d2385b8dc2 Update build.yml 2026-07-23 00:08:46 +02:00
Rajarshee Chatterjee 9babe1676d refactor: Remove React Native Background Actions Manifest Customization 2026-07-22 23:59:11 +05:30
Rajarshee Chatterjee 8c38f499e4 chore: Update AppState Test Setup And pnpm Configuration 2026-07-22 23:54:22 +05:30
Ecasept 89c43c1eef feat: Implement Time Tracking and Statistics (#1886) 2026-07-22 23:30:38 +05:30
Patrick Loser c3c891cea0 refactor: Migrate to Expo Managed Workflow (#1885)
* enable predictive back gesture

* upgrade to rn 85

* remove deprecated

* added timeout to theme switch

* fix plugin items hit registration

* fix SearchbarV2 hit registration

* fix loading spinner

* migrated to expo

* migrated to expo

* Fix reader footer animation

* working again

* added icons back

* added splashscreen

* clean up

* nitro epub

* fix

* remove .env.local from git tracking

* fix rn background actions not working

* moving custom permissions to app.json

* more cleanup

* fix epub import

* remove unused deps

* Further cleanup for gradle build types

* Update build.yml

* ignore android/ and ios/ as they are generated by CNG

* fix lint

* Delete ios directory

* Delete android directory

* fix lint

* fix test mocks

* update packages

* update eslint

* fix ThemeProvider placement

* fix test and lint

* Add BackgroundTask native module

* Add NativeFile changes

* first round of fixing compatibility issues

* added types for native modules
2026-07-22 23:29:53 +05:30
Rajarshee Chatterjee e4cf64a112 refactor: Migrate Background Tasks to Native Android Scheduling (#1889)
* refactor: Restructure Application Architecture

* feat: Support Batched Downloads And EPUB Imports

* feat: Add Download Checkpoint Recovery
2026-07-22 09:21:18 +05:30
Luigi 3e1e211098 feat: Add Address Bar in WebView (#1870) 2026-07-19 19:25:58 +05:30
Ecasept 02b6b9848f fix: Prevent WebView Reset When Reader Settings Change (#1884)
fix: reader being reset when reader settings change
2026-07-19 19:23:10 +05:30
Shisii 71da09ed44 feat(reader): Add Current Chapter Search (#1877)
* 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
2026-07-19 19:22:40 +05:30
Rajarshee Chatterjee 4404494ec9 fix(database): Repair Migration History For Scanlator Column 2026-07-19 19:21:19 +05:30
Luigi 98a2a1d725 feat: Implement Scanlator Filtering (#1864)
* feat: implement scanlator filtering

* fix test
2026-07-15 16:42:35 +05:30
Palloxin 788f6cede7 fix: Prevent Table Overflow and Clean Up CSS (#1876) (#1876) 2026-07-13 16:11:50 +05:30
Rajarshee Chatterjee 7abee71ac3 test: Generate Debug Environment Variables In Testing Workflow 2026-07-13 16:03:02 +05:30
Rajarshee Chatterjee 52d5c99c46 fix: Order EPUB Chapters Across Paginated Pages (Closes #1762) 2026-07-02 01:27:44 +05:30
Rajarshee Chatterjee 93bc5e5e4b fix: Handle Missing MAL List Entries and Null Progress (Closes #1875) 2026-07-02 01:27:44 +05:30
Jeon JaeHyeong 5d996f1388 feat(downloads): Make Chapter Download Cooldown Configurable (#1834)
* 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.
2026-07-01 16:39:56 +05:30
Palloxin bbb2645a6f chore: Clean Reader Preview Content (#1867)
* Remove pointless break-lines (just use soft wrap to view this file)

* Encase the table in a div
2026-07-01 12:46:30 +05:30
Vikas Movva 54fedc2f53 fix(tts): Remove Leading and Trailing Quotes from Normalized Text (#1869) 2026-07-01 12:35:13 +05:30
Palloxin e8c5550256 perf: Optimize Regex for Removing Extra Paragraph Spacing (#1872) 2026-07-01 12:32:28 +05:30
Ali Hamza Malik 57b9d41b5c fix(service): Correct Notification Throttle Logic in ServiceManager.setMeta (#1873)
fix(service): correct notification throttle in ServiceManager.setMeta
2026-07-01 12:30:57 +05:30
Jeon JaeHyeong 34be7a1234 fix(native-file): prevent fatal crash when unlinking missing files (#1832)
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.
2026-05-24 10:41:17 +05:30
Jeon JaeHyeong 60f42ed624 chore(build): patch @rock-js/plugin-metro for Windows compatibility (#1830)
- 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
2026-05-24 10:40:24 +05:30
Anthony Truong 25c93afabe fix(reader): restore saved chapter progress from db if available (#1850) 2026-05-24 10:38:23 +05:30
Gaurav Tupe 2cd5a97ee8 fix: await database operations inside transactions (#1845)
fix:await db write operations in transactions
2026-05-10 19:31:30 +02:00
Patrick Loser 8f47e8fd1e Theme switcher refactor (#1839)
* 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
2026-05-07 20:25:47 +02:00
Patrick Loser eafa545b2a Use novel refactor (#1838)
* init

* feat: add zustand dependency and persistence key contract

* refactor: extract bootstrap data loading into reusable service

* refactor: move chapter mutations into store-ready action helpers

* feat: add zustand novel store with cache and core actions

* refactor: bridge novel persistence contracts for migration safety

* refactor: migrate NovelScreen domain flows to zustand selectors

* refactor: migrate NovelScreenList to selector-based store access

* refactor: move reader chapter flows onto store boundaries

* refactor: decouple useNovelSettings from broad context domain state

* refactor: align migrateNovel with stable persistence contracts

* refactor: cut novel-reader consumers to store-only context boundary

* refactor: retire legacy useNovel and route cache cleanup export

* test: update suites for store-only context boundary cutover

* test: modernize store-era mocks and add contract coverage

* test: finalize Task-15 sweep—remove dead useNovelData and lint clear mocksContract

Final validation confirms mock-contract test suite clean and target file deletion verified with zero stale references in src/ scope.

* remove imports from NovelScreen

* reworked ai output

* improvements

* implemented synchronus novel and chapter fetch

* refactor tests

* fix db tests

* Update remaining tests.

* Harden chapter actions and bootstrap flows

* Only count filtered chapters

* improved chapter insert speed by optimizing triggers

* Improved the batching function

* Added drizzle support to dbManager.batch

* removed better-sqlite3 for testing

* fix tests

* Update updateNovelChapters fucntion

* reverse read filter

* fix snackbar

* fixed page bottomsheet

* resolved paged novels showing wrong chapter number on opening

* use openPage instead of setPageIndex in chapterDrawer

* fix lint & tests

* fix type issues

* fix various smaller issues

* updated novel restore

* Delete tsconfig.tsbuildinfo
2026-05-06 16:55:55 +02:00
Jeon JaeHyeong b680a07750 fix(browse): use gesture-handler Pressable in PluginListItem (#1828)
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.
2026-05-03 10:37:52 +02:00
Jeon JaeHyeong 2a919ec0f9 chore: gitignore tsconfig.tsbuildinfo build cache (#1829)
* chore: ignore *.tsbuildinfo build cache

* chore: stop tracking tsconfig.tsbuildinfo build cache
2026-05-03 10:37:08 +02:00
Definisi 01596c045a fix: Apply active filters to chapter count display (Closes #1793) (#1797)
* 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
2026-04-13 20:39:48 +02:00
Patrick Loser 3de93c5c09 feat: migrate from rn community cli to rock (#1812)
* migrate to rock

* Update build.yml

* Update build.yml again and changed build.gradle

* fixed actions build crash

* add flashlist to avoid bottomsheet crash

* fix Novelscreen filter highlight

* upload artifact

* update rock config

* update build.yml apk path

* update rock.config again

* Test env file

* Update build.yml

* remove react-native-config

* Update to use split apk and enable custom rock provider paths.

* added upload artifact

* remove split apk

* remove test env
2026-04-13 20:37:47 +02:00
Patrick Loser 306f5b27e2 fix: install the right version of hermes compiler
* install the correct version of the hermes compiler

* update node version of gh workflows
2026-04-06 13:59:13 +02:00
Patrick Loser 06f0f66e3e fix: Add hermes-compiler dev dep 2026-04-05 22:40:21 +02:00
Patrick Loser 64921a054e feat: Expo 55 upgrade
* 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
2026-04-05 21:39:52 +02:00
Rajarshee Chatterjee 44e035ad38 chore: Update Translations (#1683)
* New translations strings.json (Polish)
[ci skip]

* New translations strings.json (Arabic)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Arabic)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (Russian)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Arabic)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (Russian)
[ci skip]

* New translations strings.json (Romanian)
[ci skip]

* New translations strings.json (French)
[ci skip]

* New translations strings.json (Spanish)
[ci skip]

* New translations strings.json (Afrikaans)
[ci skip]

* New translations strings.json (Catalan)
[ci skip]

* New translations strings.json (Czech)
[ci skip]

* New translations strings.json (Danish)
[ci skip]

* New translations strings.json (Greek)
[ci skip]

* New translations strings.json (Finnish)
[ci skip]

* New translations strings.json (Hebrew)
[ci skip]

* New translations strings.json (Hungarian)
[ci skip]

* New translations strings.json (Italian)
[ci skip]

* New translations strings.json (Japanese)
[ci skip]

* New translations strings.json (Korean)
[ci skip]

* New translations strings.json (Dutch)
[ci skip]

* New translations strings.json (Norwegian)
[ci skip]

* New translations strings.json (Polish)
[ci skip]

* New translations strings.json (Portuguese)
[ci skip]

* New translations strings.json (Albanian)
[ci skip]

* New translations strings.json (Serbian (Cyrillic))
[ci skip]

* New translations strings.json (Swedish)
[ci skip]

* New translations strings.json (Turkish)
[ci skip]

* New translations strings.json (Ukrainian)
[ci skip]

* New translations strings.json (Chinese Traditional)
[ci skip]

* New translations strings.json (Vietnamese)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Hindi)
[ci skip]

* New translations strings.json (Assamese)
[ci skip]

* New translations strings.json (Odia)
[ci skip]

* New translations strings.json (Chinese Simplified)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Indonesian)
[ci skip]

* New translations strings.json (Korean)
[ci skip]

* New translations strings.json (German)
[ci skip]

* New translations strings.json (Russian)
[ci skip]

* New translations strings.json (Portuguese, Brazilian)
[ci skip]
2026-03-12 08:15:12 +05:30
Patrick Loser 1803cd071d feat: Add testing support for react code (#1763)
* 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
2026-02-25 14:51:46 +01:00
Patrick Loser e4d7ba306b fix: Safety level may not be changed inside a transaction error (#1758) 2026-02-24 12:22:46 +01:00
Rajarshee Chatterjee cc0428752b feat: Replace TTS Notifications with Android MediaSession Controls (Closes #1711)
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>
2026-02-20 09:15:54 +05:30
Patrick Loser b8c177bc55 refactor: Migrate to Drizzle and op-sqlite (#1735)
* 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>
2026-02-20 01:17:01 +05:30
Rajarshee Chatterjee 7083c51dea fix: Include selectedIds in Chapter List extraData for Selection Highlight (Closes #1750)
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>
2026-02-19 01:37:33 +05:30
tomsLt0 f0693204e1 fix: Improve Next Chapter Selection Logic (#1744)
improve next chapter selection logic
2026-02-19 01:18:17 +05:30
Rajarshee Chatterjee 3f8071e48e chore: Release v2.0.3 v2.0.3 2026-02-18 22:31:06 +05:30
Rajarshee Chatterjee a1c5350e8e fix: Miscellaneous UI Tweaks 2026-02-12 21:23:40 +05:30
Rajarshee Chatterjee 8f237909d5 feat: Show First Unread Chapter in ReadButton and FAB When No Last Read
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:19:52 +05:30