fix: show verified bytes for "Downloaded" instead of raw wire bytes#59
Merged
taylorcox75 merged 2 commits intoMar 14, 2026
Conversation
…ed display Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Investigate torrent download and upload discrepancy
fix: use Mar 14, 2026
completed instead of downloaded for "Downloaded" display
Copilot
AI
changed the title
fix: use
fix: show verified bytes for "Downloaded" instead of raw wire bytes
Mar 14, 2026
completed instead of downloaded for "Downloaded" display5e2bf98
into
copilot/review-plan-implementation-gaps
1 check passed
taylorcox75
added a commit
that referenced
this pull request
Mar 14, 2026
* Initial plan * Implement all 6 issues from IMPLEMENTATION_PLAN.md Issue 1: Alt speed limits shown in transfer screen with ALT badge Issue 2: Pause/resume button on torrent cards Issue 3: Full-width progress bar, percent+ETA in status line Issue 4: Pause-on-add syncs with server preference Issue 5: Expanded card view with detail rows Issue 6: Search bar reordered (Sort | Search | Add) Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * Address code review feedback: rename variable, extract helper, use async/await Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * Update IMPLEMENTATION_PLAN.md with completion status and remaining gaps Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * fix: downgrade @eslint/js from ^10.0.1 to ^9.18.0 to resolve ERESOLVE conflict with eslint 9.x Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * fix: show verified bytes for "Downloaded" instead of raw wire bytes (#59) * Initial plan * fix: use torrent.completed instead of torrent.downloaded for Downloaded display Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * merge PLAN.md and IMPLEMENTATION_PLAN.md into single consolidated document Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> * UX: state-colored progress bars, alt speed subtitle, Apple-style tags modal (#60) * Initial plan * Add TagsModal, show alt speed limits subtitle, progress bar already uses state colors Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
taylorcox75
added a commit
that referenced
this pull request
Mar 28, 2026
* Add comprehensive codebase improvement plan
Covers 5 categories across 40+ actionable items:
- Architectural improvements (feature-based structure, TanStack Query, API client)
- Maintainability (mega-component decomposition, i18n, tests, linting, error handling)
- Performance (memoization, FlashList, Reanimated migration, context optimization)
- Design gaps (7 critical bugs, accessibility, Android compat, type safety)
- Missing features (RSS, search, scheduling, notifications, API key auth, widgets)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Add v3 redesign vision document
Apollo/Things 3-inspired redesign plan covering:
- Honest critique of current UI (rainbow buttons, mixed design languages, no hierarchy)
- New design system (4 semantic colors, SF Pro typography, grouped inset lists)
- Screen-by-screen redesign for all 6 screens
- Interaction & motion design (springs, haptics, swipe gestures, native context menus)
- 7 specific 'wow factor' moments (shared element transitions, completion celebration, etc.)
- Phased implementation roadmap (4 phases, ~10 weeks)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Add v3 implementation risk register
Identifies specific landmines in the redesign plan:
- Onboarding is dead code (not wired up, no route gate)
- Color reduction would break the color picker contract + user overrides
- SF Symbols swap requires native deps (kills Expo Go workflow)
- 180+ relative imports make file restructuring high-risk
- Alert.prompt is used in 13 places (all broken on Android)
- FlashList + TorrentCard local state = recycling bugs
- Proposes safe 5-wave implementation order with golden rule
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Add AI agent maintainability guide
Identifies 9 problems that slow down AI coding agents:
- 10 files over 900 lines (settings.tsx is 1957 lines)
- No AGENTS.md or .cursorrules
- Untyped preferences bag (Record<string, any>)
- Zero tests (no verification loop)
- 7 duplicated code patterns
- Implicit contracts (string keys, no enums)
- No file-level documentation
- No path aliases (relative import errors)
- 15 dead/unused files wasting context window
Proposes top 5 actions ordered by impact-per-effort
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Consolidate into single PLAN.md for parallel agent execution
Replaces plan.md, v3-redesign.md, v3-risks.md, ai-maintainability.md
with a single PLAN.md organized into:
Phase 1 (AI infrastructure): 9 parallelizable tasks
- AGENTS.md, typed preferences, path aliases, bug fixes,
Alert.prompt→InputModal, deduplication, file headers, tests, linting
Phase 2 (UI redesign): 7 parallelizable tasks
- Design system, TorrentCard, torrent detail, swipe actions,
FAB removal, transfer screen, settings sub-screens
Phase 3 (architecture): 5 tasks
- Import migration, type safety, i18n, TanStack Query, dead code
Each task includes: files to read, files to modify, risks, acceptance criteria.
Appendices cover future features and risk quick-reference.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* PLAN.md: delete dead code (not move), enforce naming conventions
- Dead code files are deleted outright, not moved to _unused/. Git history preserves them.
- Added naming conventions section: PascalCase components, camelCase utils, kebab-case services, tests/ at root (not __tests__/)
- Explained (tabs) is Expo Router framework syntax, not a naming choice
- Updated AGENTS.md template and test task to match conventions
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Fix 10 gaps in PLAN.md that would break agent execution
Critical fixes:
1. Task 2.2 removed context menu with NO replacement — now specifies ActionMenu.tsx
(a bottom-anchored modal, no native modules needed)
2. Task 1.5 / 2.2 conflict — skip TorrentCard Alert.prompt fix (2.2 rewrites it)
3. Added missing Confetti hooks-in-loop fix (Task 1.4e)
4. Added missing ActionSheetIOS Android fix (Task 1.4f)
5. Added missing react-native-gesture-handler install (Task 1.4g)
6. Phase 2 tasks are NOT independent — added dependency graph
7. New code must use @/ aliases immediately (not wait for Task 3.1)
8. Settings sub-screens may need _layout.tsx for Expo Router
9. Task 1.7 scoped to files >200 lines only (was all 70 files)
10. Added QuickConnectPanel to Task 1.6 dedup (was only utility functions)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* PLAN.md: document Expo Router naming conventions ([hash], _layout)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Refine PLAN.md to resolve functional planning gaps
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Add PLAN.md review with 4 errors, 5 warnings, and 7 suggestions
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Simplify PLAN_REVIEW.md: remove items already fixed by prior agent
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Merge review findings: correct isNetworkError count, add 3 missing items
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* PLAN.md review: iOS-first scope + factual corrections
- iOS-first clarification:
- Task 1.4c removed (haptics iOS guard is intentional)
- Task 1.4f removed (ActionSheetIOS acceptable; also dead code)
- Alert.prompt critical rule softened to preference for InputModal
- expo-* packages (incl. expo-symbols) explicitly approved
- Native module risk updated: expo-* OK, third-party need approval
- Task 2.2 context menu note updated (no longer blocked)
- AGENTS.md Cursor Cloud instructions updated for iOS-first
- Factual corrections from codebase grep:
- Alert.prompt: 14 total (TorrentDetails has 6, not 5); Task 1.5 = 13 callsites
- react-native-gesture-handler: imported in 1 component, not 2
(DraggableTorrentList does not import it directly)
- ActionSheetIOS showTrackerMenu is dead code (never called from JSX)
— moved cleanup to Task 3.5
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.1: Create AGENTS.md for AI agent guidance
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.3: Add TypeScript path aliases (@/ prefix)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4a: Fix invalid backgroundColor string literal in _layout.tsx
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4b: Fix usesCleartextTraffic to boolean and remove trailing space from app name
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4d: Convert isRecoveringFromBackground from useRef to useState in TorrentContext
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.9: Add ESLint and Prettier configuration
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4e: Fix Rules of Hooks violation in Confetti.tsx — replace useRef-in-loop with useMemo
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4g: Add react-native-gesture-handler as explicit dependency
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.2: Add typed AppPreferences interface and update storage service
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.4h: Move @react-navigation/bottom-tabs from devDependencies to dependencies
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.5: Replace Alert.prompt with InputModal in [hash].tsx and TorrentDetails.tsx
- Added allowEmpty prop to InputModal to support '0' for unlimited values
- Replaced 7 Alert.prompt calls in app/torrent/[hash].tsx:
handleSetDownloadLimit, handleSetUploadLimit, handleSetCategory,
handleAddTags, handleRemoveTags, handleSetLocation, handleRenameTorrent
- Replaced 6 Alert.prompt calls in components/TorrentDetails.tsx:
handleAddCategory, handleShareLimit, handleSetLocation,
handleRenameTorrent (handleSetName), handleAddPeers, handleRenameFile
- Used keyboardType='numeric' for limit inputs
- Used allowEmpty for limit/category inputs that accept empty/zero
- Skipped TorrentCard.tsx (rewritten in Task 2.2)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.6: Create utils/server.ts with avatarColor, serverAddress, AVATAR_PALETTE
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.6: Create utils/torrent-state.ts with canonical getStateColor and getStateLabel
Reconciled from three diverged implementations:
- TorrentCard.tsx (switch-based, most complete — used as base)
- torrent/[hash].tsx (if-else chain, string-based matching)
- ExpandableTorrentCard.tsx (ternary chain, color only)
Colors passed as parameter to avoid hook dependency.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.6: Create components/QuickConnectPanel.tsx
Extracted the 'not connected' server list UI duplicated in both
index.tsx and transfer.tsx. Uses useTranslation() for all strings
(transfer.tsx had hardcoded English). Takes onConnect and onAddServer
callbacks.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.6: Extract isNetworkError helper in services/server-manager.ts
Replaced 3 duplicated inline network-error checks with a single
exported isNetworkError(error) function.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.6: Replace inline copies with imports from shared utilities
- index.tsx: Replaced inline avatarColor/serverAddress/AVATAR_PALETTE
and ~100 lines of quick-connect JSX with QuickConnectPanel
- transfer.tsx: Same — removed avatarColorT/serverAddressT and
~100 lines of quick-connect JSX
- [hash].tsx: Import getStateColor/getStateLabel from utils/torrent-state
- TorrentCard.tsx: Import getStateColor/getStateLabel from utils/torrent-state
- ExpandableTorrentCard.tsx: Import getStateColor from utils/torrent-state
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.8: Add unit tests for format utils, torrent state, and color theme manager
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 1.7: Add JSDoc file headers to complex source files
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.1: Update dark/light color defaults in ThemeContext
- Dark background: rgb(15,15,15) → #000000 (true black for OLED)
- Dark surface: #1C1C1E, surfaceOutline: #38383A
- Fix all invalid rgb() calls with alpha → proper rgba() format
- Map similar states to same visual color: stateMetadata/stateChecking/stateQueued → orange; statePaused/stateOther → gray
- Use iOS system colors (SF Symbols palette) for error/success/warning
- Update trueBlackColors to match new dark palette
- Clean up light mode: remove alpha from opaque colors, use iOS system colors
- Add hex passthrough to rgbaToHex for color picker compatibility
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.1: Add largeTitle and headline to typography scale
- largeTitle: 34pt Bold, lineHeight 41 (iOS large title style)
- headline: 17pt Semibold, lineHeight 22 (for torrent names, replaces 15pt)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.1: Simplify shadow presets
- Keep card and medium as active presets
- Zero out small, cardPressed, large (kept for backward compatibility)
- Keep filterActive, add TODO to source color from theme
- Document that shadows are invisible on dark backgrounds
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.2a: Create useTorrentActions hook and ActionMenu component
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.2b: Redesign TorrentCard with 4-line layout and React.memo
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.2c: Wire up ActionMenu and useTorrentActions in torrent list
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.6: Redesign transfer screen with grouped inset sections
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.3: Redesign torrent detail with grouped inset sections
Replace Quick Tools (5 colored buttons) + Advanced (16 rainbow buttons) layout
with iOS-style grouped inset list sections:
- Hero: torrent name (22pt), state dot + label, progress bar, ETA, size
- Actions: 3 outlined buttons (Pause/Resume, Recheck, Delete)
- GENERAL: Size, Downloaded, Uploaded, Ratio, Save Path, Category (OptionPicker),
Tags (InputModal), Remove Tags (InputModal)
- TRANSFER: DL/UL Speed, ETA, DL/UL Limit (InputModal)
- NETWORK: Seeds, Peers (tappable → peers modal), Availability
- CONTENT: Files, Trackers (navigation rows)
- ADVANCED: Priority (OptionPicker), Sequential DL / F-L Piece / Super Seed /
Force Start (toggles with Switch), Rename / Move to (InputModal), Reannounce
- DATES: Added, Completed, Last Activity
All 21 original actions remain accessible via toggle, picker, input, or nav rows.
Uses colors.surface/background/surfaceOutline for consistent theming.
No hardcoded colors. All modals use InputModal (not Alert.prompt).
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Redesign top-level settings as navigation hub
Break 1957-line settings.tsx into a ~269-line navigation hub.
Add app/settings/_layout.tsx with nested Stack for sub-screen routing.
Top-level shows connection status card and navigation rows to:
Servers, Appearance, Torrent Defaults, Notifications, Advanced, What's New, About.
App version displayed at bottom.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract appearance settings sub-screen
New app/settings/appearance.tsx with:
- Language picker
- Theme & Colors navigation (links to existing theme.tsx)
- Compact card view toggle
- Refresh interval setting
Uses useFocusEffect for data reloading, useTheme() for styling.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract torrent defaults sub-screen
New app/settings/torrent-defaults.tsx with:
- Default sort by/direction/filter pickers
- Pause on add, default save path, auto-categorize, first/last piece priority
- Categories management (add/delete) when connected
- Tags management (add/delete) when connected
Categories and tags shown only when isConnected.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract notifications sub-screen
New app/settings/notifications.tsx with:
- Toast/notification duration setting
- Haptic feedback toggle (with setHapticsEnabled integration)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract advanced settings sub-screen
New app/settings/advanced.tsx with:
- Connection timeout, API timeout, retry attempts
- Debug mode toggle with connectivity log integration
- View logs navigation
- Backup/restore (export/import settings)
- Danger zone: shutdown qBittorrent (when connected)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract servers sub-screen
New app/settings/servers.tsx with:
- SwipeableServerItem local component (extracted from settings.tsx)
- Server list with add/edit/delete via swipe
- Connect/disconnect per server
- Auto-connect to last server toggle
- Add server button in header
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.7: Extract what's new and about sub-screens
New app/settings/whats-new.tsx:
- Full changelog from CHANGELOG constant
- Formatted release dates, grouped by version
New app/settings/about.tsx:
- App version, React Native version, platform info
- qBittorrent server info (version, API, libtorrent, arch) when connected
- Community links (GitHub, issues, donate)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Fix headlineSmall → headline reference in theme.tsx
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.4: Add swipe actions (pause/resume, delete, force start) to torrent list
- Import Swipeable and RectButton from react-native-gesture-handler
- Add GestureHandlerRootView wrapper in _layout.tsx (required for gestures)
- Wrap each torrent card in Swipeable with three actions:
- Swipe left (short): Pause/Resume with amber/green background
- Swipe left (full): Delete with red background and confirmation alert
- Swipe right: Force start with blue background and lightning icon
- Add haptic feedback (medium) at swipe threshold via onSwipeableWillOpen
- Track open swipeable ref to auto-close previous when new one opens
- Swipe actions call torrentsApi directly (parameterized by torrent)
- Disable swipe in select mode
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 2.5: Replace FAB with header add button, remove scroll hide/show logic
- Remove Animated.View FAB element and its TouchableOpacity child
- Remove fabScale, isFabVisible refs and all Animated.timing calls for FAB
- Remove tab bar hide/show logic: isTabBarVisible ref, getTabBarStyle helper,
navigation.setOptions calls that toggled tab bar visibility
- Remove useNavigation import (no longer needed)
- Simplify handleScroll to header show/hide only (removed FAB + tab bar parts)
- Add '+' button in header area next to sort button (calls setShowAddModal)
- Remove handleAddTorrent wrapper (inlined into button onPress)
- Remove stale FAB styles (fab, fabTouchable) from StyleSheet
- Clean up stale comments referencing FAB
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.5: Delete 13 dead/unused component and route files
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in app/torrent/
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for logs screen
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in app/server/
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in app/settings/
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in app/_layout.tsx
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.5: Delete 13 dead code files and remove unused client fields
- csrfToken: removed property, setter (response interceptor), getter (getCsrfToken),
and logging references in auth.ts — token was captured but never sent
- apiTimeout: removed field storage in updateSettings and caller references
in _layout.tsx and advanced.tsx — value was stored but never read
- showTrackerMenu: removed dead function and ActionSheetIOS/Platform imports
from manage-trackers.tsx — function was never called from rendered JSX
- Updated AGENTS.md to reflect dead code cleanup completion
Note: The 13 dead code files were already deleted in commit f0cc829.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in components/
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate imports to @/ aliases in services/
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate all relative imports to @/ path aliases
Migrated remaining ../ imports in context/, hooks/, services/, i18n/,
and types/ directories to use @/ path aliases.
Directories completed in order:
app/(tabs)/ → app/torrent/ → app/server/ → app/settings/ →
app/ root → components/ → context/ → hooks/ → services/
16 files changed, 30 imports converted in this commit.
All relative ../ imports of shared modules are now eliminated.
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for torrent detail and trackers
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for torrents list screen
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Fix duplicate useTranslation import and add missing getErrorMessage import in [hash].tsx
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for settings screen
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.1: Migrate remaining import to @/ alias in types/preferences.ts
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for TorrentCard and torrent state labels
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for theme, server add/edit, manage-trackers
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for TorrentDetails component
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.2: Replace any types with proper TypeScript types across codebase
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for server add/edit forms and new locale keys
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: Sync all i18n keys to es, zh, fr, de locale files with English placeholders
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.3: i18n coverage for server add/edit screens
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.4: Add TanStack Query infrastructure
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.4: Migrate TransferContext to TanStack Query
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.4: Migrate TorrentContext to TanStack Query with rid-based sync
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.4: Migrate ServerContext to TanStack Query
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Task 3.4: Update AGENTS.md to reflect TanStack Query architecture
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Upgrade ESLint v8 → v9 with flat config, fix deprecation warnings
- Removed deprecated eslint v8, @typescript-eslint/parser, @typescript-eslint/eslint-plugin,
eslint-plugin-react (not needed for RN), eslint-plugin-react-hooks v4
- Installed eslint v9, @eslint/js, typescript-eslint, eslint-plugin-react-hooks v5,
eslint-config-prettier (current versions)
- Converted .eslintrc.js to eslint.config.js (ESLint v9 flat config format)
- Pre-existing code patterns set to warn (not error): react-hooks/refs,
immutability, purity, set-state-in-effect, preserve-caught-error
- 0 errors, 125 warnings (all pre-existing)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Add implementation plan for torrent display and controls improvements
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Update IMPLEMENTATION_PLAN with UI Fix Plan (post-refactor issues)
Co-authored-by: Taylor Cox <taylorcox75@gmail.com>
* Fix npm ERESOLVE conflict and consolidate planning docs (#58)
* Initial plan
* Implement all 6 issues from IMPLEMENTATION_PLAN.md
Issue 1: Alt speed limits shown in transfer screen with ALT badge
Issue 2: Pause/resume button on torrent cards
Issue 3: Full-width progress bar, percent+ETA in status line
Issue 4: Pause-on-add syncs with server preference
Issue 5: Expanded card view with detail rows
Issue 6: Search bar reordered (Sort | Search | Add)
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Address code review feedback: rename variable, extract helper, use async/await
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Update IMPLEMENTATION_PLAN.md with completion status and remaining gaps
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* fix: downgrade @eslint/js from ^10.0.1 to ^9.18.0 to resolve ERESOLVE conflict with eslint 9.x
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* fix: show verified bytes for "Downloaded" instead of raw wire bytes (#59)
* Initial plan
* fix: use torrent.completed instead of torrent.downloaded for Downloaded display
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* merge PLAN.md and IMPLEMENTATION_PLAN.md into single consolidated document
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* UX: state-colored progress bars, alt speed subtitle, Apple-style tags modal (#60)
* Initial plan
* Add TagsModal, show alt speed limits subtitle, progress bar already uses state colors
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Copilot/update torrent progress bar colors (#61)
* Initial plan
* Implement all 6 issues from IMPLEMENTATION_PLAN.md
Issue 1: Alt speed limits shown in transfer screen with ALT badge
Issue 2: Pause/resume button on torrent cards
Issue 3: Full-width progress bar, percent+ETA in status line
Issue 4: Pause-on-add syncs with server preference
Issue 5: Expanded card view with detail rows
Issue 6: Search bar reordered (Sort | Search | Add)
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Address code review feedback: rename variable, extract helper, use async/await
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Update IMPLEMENTATION_PLAN.md with completion status and remaining gaps
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* fix: downgrade @eslint/js from ^10.0.1 to ^9.18.0 to resolve ERESOLVE conflict with eslint 9.x
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Initial plan
* Add TagsModal, show alt speed limits subtitle, progress bar already uses state colors
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix merge conflict: remove IMPLEMENTATION_PLAN.md consolidated into PLAN.md (#62)
* Initial plan
* Fix merge conflict: delete IMPLEMENTATION_PLAN.md (consolidated into PLAN.md on base branch)
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix card view toggle semantics and resolve merge conflicts with cursor/codebase-improvement-plan-8686 (#63)
* Initial plan
* Initial plan for detailed torrent view fixes
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix detailed torrent view formatting and settings toggle logic
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Merge cursor/codebase-improvement-plan-8686 and resolve all conflicts
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Remove orphaned compactCardView locale keys
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Torrent detail: merge tag actions, category badge, reannounce icon, responsive toggles (#65)
* Initial plan
* Update torrent detail: merge tags UI, category badge, reannounce icon, optimistic toggles, toast on reannounce
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix toggle re-entry guards and remove dead handleRemoveTags handler
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Package update
* Fix alt-speed display, category/tags UI consistency, and reannounce animation feedback (#67)
* Initial plan
* Fix alt-speed display, category UI, and reannounce animation
- Issue 2: Fix alt-speed display showing Unlimited when a limit IS set.
getEffectiveLimit now passes dl/up_rate_limit directly (already reflects
alt limits when active). formatAltLimitLabel uses rate limits when alt
speed is on, prefs values when off.
- Issue 1: Replace Category Alert.alert with OptionPicker (same custom-modal
style as TagsModal). Both the Quick Actions button and the inline Category
button in the General Info section now call handleSetCategory -> OptionPicker.
Add New Category… is a special picker entry that opens InputModal.
- Issue 3: Add spinning Animated.View around the refresh icon on the
Reannounce button so users see visual confirmation when the action fires.
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix alt speed limit display; expand detailed torrent card stats (#68)
* Initial plan
* Fix speed limit display when alt speed ON; add more stats to detailed card view
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix alt speed limit unit display and add editable alt speed limits (#69)
* Initial plan
* Fix alt speed limit display; add UI to edit alternative speed limit values
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Fix alt upload limit never reading back from preferences after save (#70)
* Initial plan
* Fix alt upload limit not updating: use correct preferences key alt_ul_limit
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
* Add configurable full Add Torrent dialogue with settings and per-field visibility (#71)
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: taylorcox75 <10939863+taylorcox75@users.noreply.github.com>
Co-authored-by: Konstantin Bodnia <konstantin@bodnia.net>
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.
torrent.downloadedaccumulates all wire bytes received — including overhead and re-downloaded corrupt pieces — so it routinely exceedstotal_size(571 MB torrent showing 589 MB downloaded). The "Downloaded" label should reflect content actually on disk.Replaced
torrent.downloaded→torrent.completed(verified, written bytes; always ≤total_size) in all three display locations:TorrentCard.tsx—downloaded / totalsize line beneath the progress barapp/torrent/[hash].tsx— "Downloaded" row in the General section cardcomponents/TorrentDetails.tsx— "Downloaded" InfoRow in General Information tab✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.