Skip to content

Conversation

@Y-RyuZU
Copy link
Owner

@Y-RyuZU Y-RyuZU commented Jul 16, 2025

Summary

  • Implemented TX016 Translation Backup System with session-based backup functionality
  • Converted translation history display from cards to table format with sorting
  • Removed backup and UI settings sections from settings dialog as requested

Changes

  • ✅ Translation backup system with automatic session ID generation
  • ✅ Translation history table with sorting capabilities
  • ✅ Full i18n support for translation types and statuses
  • ✅ Improved dialog sizing and table overflow handling
  • ✅ Settings dialog cleanup (removed BackupSettings and UISettings)
  • ✅ Fixed all TypeScript and ESLint errors
  • ✅ All tests passing (52 Bun, 108 Jest, 31 E2E tests)

Test Results

  • TypeScript: No errors
  • Bun tests: 52 passed
  • Jest tests: 108 passed
  • E2E tests: 31 passed, 2 skipped

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added translation history dialog for viewing detailed session histories and translation statistics.
    • Introduced granular progress tracking for quests, guidebooks, and custom files during translation.
    • Enhanced translation settings to support provider-specific API keys with improved UI grouping and hints.
  • Improvements

    • Expanded and refined localization coverage in English and Japanese, including new error messages, hints, and UI labels.
    • Improved translation progress tracking, reporting, and summary updates for better feedback and accuracy.
    • Enhanced translation UI with better feedback, error prevention during active translations, and improved visual differentiation for file and quest types.
    • Limited debug logging and improved error handling in translation services.
    • Migrated legacy API key configuration to provider-specific keys with backward compatibility.
  • Bug Fixes

    • Fixed hydration mismatches in theme toggle and settings dialogs by ensuring translation readiness and client-side mounting.
  • Refactor

    • Simplified backup system to automatic backups during translation; removed interactive backup management features and related settings.
    • Streamlined internal state management and progress logic for translation components.
    • Removed all backup management commands and UI; focused on backup creation and translation session metadata.
    • Refactored language file extraction to delegate format detection.
  • Chores/Tests

    • Added comprehensive end-to-end and integration tests for backup and translation summary flows.
    • Removed obsolete backup management tests.
  • Removed

    • Deleted backup management dialog and related configuration from user interface and settings.

Y-RyuZU and others added 11 commits July 15, 2025 06:26
- Remove code duplication in minecraft/mod.rs by refactoring extract_lang_files_from_archive to use extract_lang_files_from_archive_with_format
- Improve error handling for API key configuration errors in translation-service.ts
- Add conditional debug logging (only in development) in translation-service.ts
- Fix progress tracking inconsistency in mods-tab.tsx by passing incrementCompletedMods to runTranslationJobs

These changes improve code maintainability, error handling, and debug output management based on CodeRabbit's automated review feedback.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- Add automatic backup creation for SNBT files before translation
- Add automatic backup of resource packs after mods translation
- Create translation summary JSON files for each session
- Add Translation History dialog to view past translation sessions
- Remove complex backup management features for simplicity
- Integrate backup calls into translation workflow
- Add comprehensive integration and E2E tests

Fixes #12

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- Replace card-based layout with table for better scalability
- Add sortable columns for session date, language, items, and success rate
- Add visual progress bars for success rate display
- Improve performance with optimized data loading
- Add responsive table design with proper spacing
- Update i18n keys for new table headers
- Update E2E tests to match new table structure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- Increase dialog width to 90vw for better display of multiple columns
- Improve responsive height with viewport-based sizing (60vh)
- Add proper i18n support for all column headers
- Enhance translation details display with better layout
- Add new i18n keys for improved localization
- Update column widths for better content distribution
- Improve visual hierarchy in expanded session details

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
- Increase dialog width to 95vw for better table visibility
- Convert translation details from cards to sortable table format
- Add comprehensive i18n support for translation types and statuses
- Move history button from settings to main header for better accessibility
- Remove redundant "Translation Details" header text
- Add horizontal scrolling support for wide tables
- Add separate API key fields for each LLM provider (OpenAI, Anthropic, Google)
- Improve settings UI with grouped configuration sections
- Add better loading states and hydration handling
- Update translation service to use provider-specific keys
- Enhance API key visibility toggle and validation
- Prevent tab switching during active translation with error toast
- Add better hydration handling to prevent SSR mismatches
- Improve loading states and mounted state management
- Add translation progress debugging in development mode
- Enhance error handling and user feedback
- Remove obsolete e2e backup system test file
- Update progress store tests and implementation
- Refactor backup service and config service
- Improve i18n service reliability
- Clean up unused imports and code
- Remove BackupSettings and UISettings sections from settings dialog
- Fix React hooks order issue in LLMSettings component
- Add missing mock handlers for logging commands in E2E tests
- Move console.log statements to development-only mode
- Remove duplicate progress callbacks to prevent redundant updates
- Fix ESLint warnings for unused parameters

This simplifies the settings interface by removing unused sections
and improves code quality with better error handling and cleaner logs.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@coderabbitai
Copy link

coderabbitai bot commented Jul 16, 2025

Walkthrough

This update implements a major simplification of the backup system, removing all backup management features except for backup creation and translation session tracking. The backup UI and related configuration are replaced with static informational content. The translation system now supports provider-specific API keys, with migration logic for legacy configs. Progress tracking is expanded for quests, guidebooks, and custom files, and translation history is now viewable through a new dialog. Localization files are updated for new features and improved variable syntax. Extensive test updates and additions reflect these changes.

Changes

File(s) Change Summary
public/locales/en/common.json, public/locales/ja/common.json Expanded and corrected localization strings: added backup, translation history, error, and UI entries; updated variable syntax to double braces.
src-tauri/src/backup.rs Replaced full backup management with minimal backup creation and translation session summary tracking; added new commands for sessions and summaries.
src-tauri/src/lib.rs Removed backup management commands; added new backup and translation session commands to Tauri handler.
src-tauri/src/minecraft/mod.rs Simplified language file extraction by delegating to a helper function.
src/__tests__/e2e/backup-system-e2e.test.ts, src/lib/services/__tests__/backup-integration.test.ts Added comprehensive end-to-end and integration tests for backup and translation summary flows.
src/lib/services/__tests__/backup-service.bun.test.ts Removed tests for deleted backup management features, retaining only backup creation tests.
src/lib/services/backup-service.ts Removed all backup management methods except backup creation; refactored backup ID generation.
src/lib/services/config-service.ts Added migration from legacy API key to provider-specific keys; updated config serialization logic.
src/lib/services/translation-runner.ts Added key-based progress tracking and backend summary updates; refined progress increment logic.
src/lib/services/translation-service.ts Restricted debug logs to development; improved API key error handling; removed progress callback.
src/lib/store/index.ts Added progress tracking for quests, guidebooks, and custom files; updated state and methods.
src/lib/store/__tests__/progress-store.jest.test.ts Updated tests for new progress propagation and clamping logic.
src/lib/types/config.ts Removed backup config; introduced provider-specific API keys; updated interfaces and defaults.
src/components/settings/backup-settings.tsx Simplified to a static informational card; removed all interactive backup config UI and logic.
src/components/settings/llm-settings.tsx Added UI and logic for provider-specific API keys; reorganized UI; improved state handling.
src/components/settings/settings-dialog.tsx Removed UISettings and BackupSettings from settings dialog; added translation readiness logic.
src/components/layout/main-layout.tsx Switched from history dialog to new translation history dialog component.
src/components/ui/backup-dialog.tsx Deleted file: removed backup management dialog and all related UI.
src/components/ui/translation-history-dialog.tsx Added new dialog to view translation session histories and details.
src/components/ui/completion-dialog.tsx Ensured translation type is localized before displaying in status messages.
src/components/tabs/common/translation-tab.tsx Removed chunk progress setters; improved API key selection; streamlined state resets and logging.
src/components/tabs/custom-files-tab.tsx Added custom file-level progress tracking; improved file type rendering.
src/components/tabs/guidebooks-tab.tsx Added guidebook-level progress tracking and improved scanning logic.
src/components/tabs/mods-tab.tsx Simplified chunk counting; added session-based backup after translation.
src/components/tabs/quests-tab.tsx Added quest-level progress tracking; improved backup and output logic; enhanced type rendering.
src/components/theme/theme-toggle.tsx Added translation readiness and mounting state for consistent rendering.
src/app/page.tsx Made tab switching controlled; blocked tab changes during translation; ensured translation readiness for UI.
src/lib/i18n.ts Enabled basic HTML node support in translations; added debug mode; minor hook refactor.

Sequence Diagram(s)

Translation Session with Minimal Backup and Progress Tracking

sequenceDiagram
    participant User
    participant UI
    participant Store
    participant TranslationRunner
    participant TauriBackend
    participant FileSystem

    User->>UI: Initiate Translation
    UI->>Store: Reset translation state, progress counters
    UI->>TauriBackend: Generate session ID, create logs directory
    UI->>TauriBackend: backup_snbt_files (for quests)
    TauriBackend->>FileSystem: Copy SNBT files to session backup
    UI->>TranslationRunner: Start translation jobs
    loop For each job
        TranslationRunner->>Store: setProgress (key-based)
        TranslationRunner->>TauriBackend: update_translation_summary (job metadata)
    end
    UI->>TauriBackend: backup_resource_pack (after translation)
    TauriBackend->>FileSystem: Copy resource pack to session backup
    UI->>Store: Update progress and completion status
Loading

Viewing Translation History

sequenceDiagram
    User->>UI: Open Translation History Dialog
    UI->>TauriBackend: list_translation_sessions
    TauriBackend->>FileSystem: Scan logs/localizer for session folders
    TauriBackend-->>UI: Return session list
    User->>UI: Expand session details
    UI->>TauriBackend: get_translation_summary (for session)
    TauriBackend->>FileSystem: Read session summary JSON
    TauriBackend-->>UI: Return translation summary
    UI->>User: Display session stats and details
Loading

Poem

🐇✨
The backup bunnies took a leap,
From complex chores to tasks so neat.
Now sessions tracked, and keys are new,
With progress bars for every crew!
History shines, the clutter’s gone,
The carrot path is clear and long.
Hop on—translation marches on!

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

src/components/ui/translation-history-dialog.tsx

Oops! Something went wrong! :(

ESLint: 9.31.0

ESLint couldn't find the plugin "eslint-plugin-react-hooks".

(The package "eslint-plugin-react-hooks" was not found when loaded as a Node module from the directory "".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install eslint-plugin-react-hooks@latest --save-dev

The plugin "eslint-plugin-react-hooks" was referenced from the config file in " » eslint-config-next/core-web-vitals » /node_modules/.pnpm/[email protected][email protected][email protected]/node_modules/eslint-config-next/index.js".

If you still can't figure out the problem, please see https://eslint.org/docs/latest/use/troubleshooting.

src/components/settings/llm-settings.tsx

Oops! Something went wrong! :(

ESLint: 9.31.0

ESLint couldn't find the plugin "eslint-plugin-react-hooks".

(The package "eslint-plugin-react-hooks" was not found when loaded as a Node module from the directory "".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install eslint-plugin-react-hooks@latest --save-dev

The plugin "eslint-plugin-react-hooks" was referenced from the config file in " » eslint-config-next/core-web-vitals » /node_modules/.pnpm/[email protected][email protected][email protected]/node_modules/eslint-config-next/index.js".

If you still can't figure out the problem, please see https://eslint.org/docs/latest/use/troubleshooting.

src/components/settings/backup-settings.tsx

Oops! Something went wrong! :(

ESLint: 9.31.0

ESLint couldn't find the plugin "eslint-plugin-react-hooks".

(The package "eslint-plugin-react-hooks" was not found when loaded as a Node module from the directory "".)

It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:

npm install eslint-plugin-react-hooks@latest --save-dev

The plugin "eslint-plugin-react-hooks" was referenced from the config file in " » eslint-config-next/core-web-vitals » /node_modules/.pnpm/[email protected][email protected][email protected]/node_modules/eslint-config-next/index.js".

If you still can't figure out the problem, please see https://eslint.org/docs/latest/use/troubleshooting.

  • 1 others
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (4)
src/lib/services/config-service.ts (1)

153-154: Consider using class name instead of this in static context.

Using this in static methods can be confusing. Consider using the class name for clarity.

Apply this fix:

-      this.config = this.migrateApiKeys(this.config);
+      this.config = ConfigService.migrateApiKeys(this.config);
src/components/ui/translation-history-dialog.tsx (1)

312-328: Optimize sorting with useMemo

The sorted sessions array is recalculated on every render, which could impact performance with large datasets.

Add this import at the top of the file:

-import React, { useState, useEffect, useCallback } from 'react';
+import React, { useState, useEffect, useCallback, useMemo } from 'react';

Then optimize the sorting:

-  const sortedSessions = [...sessions].sort((a, b) => {
+  const sortedSessions = useMemo(() => {
+    return [...sessions].sort((a, b) => {
     const { field, direction } = sortConfig;
     const multiplier = direction === 'asc' ? 1 : -1;
     
     switch (field) {
       case 'sessionId':
         return (a.timestamp.getTime() - b.timestamp.getTime()) * multiplier;
       case 'language':
         return a.language.localeCompare(b.language) * multiplier;
       case 'totalTranslations':
         return (a.totalTranslations - b.totalTranslations) * multiplier;
       case 'successRate':
         return (a.successRate - b.successRate) * multiplier;
       default:
         return 0;
     }
-  });
+    });
+  }, [sessions, sortConfig]);
src/lib/store/index.ts (1)

273-353: Consider refactoring repetitive progress tracking methods

The quest, guidebook, and custom files progress methods follow identical patterns. Consider creating a generic progress tracking factory to reduce code duplication and improve maintainability.

You could create a helper function to generate these methods:

const createProgressMethods = (type: 'Quest' | 'Guidebook' | 'CustomFiles') => {
  const lowerType = type.charAt(0).toLowerCase() + type.slice(1);
  const pluralType = lowerType + 's';
  
  return {
    [`setTotal${type}s`]: (total: number) => set({ [`total${type}s`]: Math.max(0, total || 0) }),
    [`setCompleted${type}s`]: (completed: number) => set({ [`completed${type}s`]: Math.max(0, completed || 0) }),
    [`incrementCompleted${type}s`]: () => set((state) => {
      const newCompleted = Math.min(state[`completed${type}s`] + 1, state[`total${type}s`]);
      const rawProgress = state[`total${type}s`] > 0 ? (newCompleted / state[`total${type}s`] * 100) : 0;
      const boundedProgress = Math.max(0, Math.min(100, Math.round(rawProgress)));
      
      return {
        [`completed${type}s`]: newCompleted,
        wholeProgress: boundedProgress
      };
    }),
    [`update${type}Progress`]: (completed: number, total: number) => set(() => {
      const validTotal = Math.max(1, total || 1);
      const validCompleted = Math.max(0, Math.min(completed || 0, validTotal));
      const rawProgress = (validCompleted / validTotal) * 100;
      const boundedProgress = Math.max(0, Math.min(100, Math.round(rawProgress)));
      
      return {
        [`completed${type}s`]: validCompleted,
        [`total${type}s`]: validTotal,
        wholeProgress: boundedProgress
      };
    })
  };
};

This would significantly reduce the code size and make it easier to maintain consistency across all progress tracking methods.

src-tauri/src/backup.rs (1)

314-317: Consider more robust session ID validation

The current validation only checks length and underscore position. Consider using a regex pattern to ensure the format is exactly YYYY-MM-DD_HH-MM-SS.

-                    // Simple validation: check if it matches YYYY-MM-DD_HH-MM-SS format
-                    if name_str.len() == 19 && name_str.chars().nth(10) == Some('_') {
-                        sessions.push(name_str.to_string());
-                    }
+                    // Validate session ID format: YYYY-MM-DD_HH-MM-SS
+                    let session_id_regex = regex::Regex::new(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$").unwrap();
+                    if session_id_regex.is_match(name_str) {
+                        sessions.push(name_str.to_string());
+                    }

Note: This would require adding the regex crate to your dependencies.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 782234e and 89d5bee.

📒 Files selected for processing (30)
  • public/locales/en/common.json (7 hunks)
  • public/locales/ja/common.json (7 hunks)
  • src-tauri/src/backup.rs (2 hunks)
  • src-tauri/src/lib.rs (2 hunks)
  • src-tauri/src/minecraft/mod.rs (1 hunks)
  • src/__tests__/e2e/backup-system-e2e.test.ts (1 hunks)
  • src/app/page.tsx (6 hunks)
  • src/components/layout/main-layout.tsx (2 hunks)
  • src/components/settings/backup-settings.tsx (1 hunks)
  • src/components/settings/llm-settings.tsx (3 hunks)
  • src/components/settings/settings-dialog.tsx (2 hunks)
  • src/components/tabs/common/translation-tab.tsx (7 hunks)
  • src/components/tabs/custom-files-tab.tsx (4 hunks)
  • src/components/tabs/guidebooks-tab.tsx (4 hunks)
  • src/components/tabs/mods-tab.tsx (4 hunks)
  • src/components/tabs/quests-tab.tsx (7 hunks)
  • src/components/theme/theme-toggle.tsx (1 hunks)
  • src/components/ui/backup-dialog.tsx (0 hunks)
  • src/components/ui/completion-dialog.tsx (1 hunks)
  • src/components/ui/translation-history-dialog.tsx (1 hunks)
  • src/lib/i18n.ts (2 hunks)
  • src/lib/services/__tests__/backup-integration.test.ts (1 hunks)
  • src/lib/services/__tests__/backup-service.bun.test.ts (1 hunks)
  • src/lib/services/backup-service.ts (3 hunks)
  • src/lib/services/config-service.ts (4 hunks)
  • src/lib/services/translation-runner.ts (7 hunks)
  • src/lib/services/translation-service.ts (6 hunks)
  • src/lib/store/__tests__/progress-store.jest.test.ts (4 hunks)
  • src/lib/store/index.ts (6 hunks)
  • src/lib/types/config.ts (3 hunks)
💤 Files with no reviewable changes (1)
  • src/components/ui/backup-dialog.tsx
🧰 Additional context used
🧬 Code Graph Analysis (8)
src/components/layout/main-layout.tsx (1)
src/components/ui/translation-history-dialog.tsx (1)
  • TranslationHistoryDialog (247-426)
src/components/theme/theme-toggle.tsx (3)
src/lib/i18n.ts (1)
  • useAppTranslation (46-49)
src/components/ui/dropdown-menu.tsx (4)
  • DropdownMenu (242-242)
  • DropdownMenuTrigger (244-244)
  • DropdownMenuContent (245-245)
  • DropdownMenuItem (248-248)
src/components/ui/button.tsx (1)
  • Button (59-59)
src/components/settings/settings-dialog.tsx (2)
src/lib/i18n.ts (1)
  • useAppTranslation (46-49)
src/lib/store/index.ts (1)
  • useAppStore (102-399)
src/lib/services/backup-service.ts (1)
src/lib/types/minecraft.ts (1)
  • TranslationTargetType (8-8)
src/lib/services/config-service.ts (1)
src/lib/types/config.ts (1)
  • AppConfig (28-39)
src-tauri/src/minecraft/mod.rs (1)
src/lib/types/minecraft.ts (1)
  • LangFile (33-40)
src/components/settings/llm-settings.tsx (7)
src/lib/i18n.ts (1)
  • useAppTranslation (46-49)
src/components/ui/card.tsx (4)
  • Card (80-80)
  • CardHeader (80-80)
  • CardTitle (80-80)
  • CardContent (80-80)
src/components/ui/select.tsx (5)
  • Select (175-175)
  • SelectTrigger (183-183)
  • SelectValue (184-184)
  • SelectContent (176-176)
  • SelectItem (178-178)
src/components/ui/input.tsx (1)
  • Input (21-21)
src/lib/types/config.ts (2)
  • DEFAULT_MODELS (17-17)
  • DEFAULT_API_CONFIG (186-190)
src/components/ui/textarea.tsx (1)
  • Textarea (18-18)
src/lib/types/llm.ts (2)
  • DEFAULT_SYSTEM_PROMPT (121-137)
  • DEFAULT_USER_PROMPT (143-149)
src/lib/services/translation-service.ts (2)
src-tauri/src/logging.rs (1)
  • error (145-147)
src/lib/utils/token-counter.ts (1)
  • estimateTokens (45-77)
🪛 Biome (1.9.4)
src/components/settings/backup-settings.tsx

[error] 13-13: Unexpected empty object pattern.

(lint/correctness/noEmptyPattern)

src/lib/services/config-service.ts

[error] 154-154: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 154-154: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 154-154: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

src/__tests__/e2e/backup-system-e2e.test.ts

[error] 69-69: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)


[error] 79-79: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)


[error] 86-86: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)


[error] 89-89: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

The declaration is defined in this switch clause:

Unsafe fix: Wrap the declaration in a block.

(lint/correctness/noSwitchDeclarations)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Build - x86_64-unknown-linux-gnu
  • GitHub Check: Build - x86_64-apple-darwin
  • GitHub Check: Build - x86_64-pc-windows-msvc
  • GitHub Check: Build - aarch64-apple-darwin
  • GitHub Check: Security Scan
🔇 Additional comments (68)
src/components/layout/main-layout.tsx (1)

4-4: Clean component replacement looks good.

The refactoring from HistoryDialog to TranslationHistoryDialog is consistent and well-executed. The import statement and component usage are both updated, and the props interface remains identical.

Also applies to: 40-43

src/components/ui/completion-dialog.tsx (1)

70-86: Excellent localization improvement.

The translation of translationType before using it in status messages is a great enhancement. This ensures that type names like "mods" or "quests" are properly localized using the tabs.${translationType} pattern instead of being passed as raw English strings.

src/components/settings/settings-dialog.tsx (1)

6-6: Good hydration mismatch prevention implementation.

The addition of mounted state and conditional rendering based on both mounted and ready flags effectively prevents hydration mismatches. The fallback to the static 'Settings' string ensures consistent rendering between server and client.

Also applies to: 18-18, 23-27, 91-91

src/lib/i18n.ts (1)

32-38: Good i18n enhancements.

The addition of HTML node support with carefully selected allowed tags (br, strong, i) enables richer formatted translations while maintaining security. The debug mode toggle for development is appropriate, and the hook refactoring maintains backward compatibility.

Also applies to: 47-48

src/components/theme/theme-toggle.tsx (1)

18-29: Excellent hydration mismatch prevention pattern.

The implementation of conditional translation variables based on mounted and ready state is well-executed. Pre-computing the translation strings and using fallback English text prevents hydration mismatches while maintaining accessibility. The pattern is consistently applied across all translated strings in the component.

Also applies to: 37-37, 42-42, 45-45, 48-48

src/lib/services/__tests__/backup-service.bun.test.ts (1)

1-183: Test simplification aligns with the backup system refactoring.

The removal of backup management test suites (listing, restoring, deleting, pruning) and retention of only backup creation tests is consistent with the TX016 specification for a simplified backup system. The remaining test coverage is comprehensive for the reduced functionality.

src/components/tabs/mods-tab.tsx (1)

135-268: Excellent implementation of session-based backup functionality.

The session management improvements are well-structured:

  • Progress tracking reset is comprehensive
  • Session ID generation and directory creation follow best practices
  • The backup operation after translation completion has appropriate error handling that prevents backup failures from affecting the translation result

The simplified total chunks calculation is cleaner than the previous approach.

src/app/page.tsx (2)

52-60: Good UX: Preventing tab switches during active translation.

The implementation correctly blocks tab changes when a translation is in progress and provides clear feedback to users through localized error messages.


23-27: Proper hydration mismatch prevention.

The implementation correctly handles SSR/client hydration by:

  1. Tracking mounted state to differentiate server vs client rendering
  2. Checking both mounted and ready before rendering translations
  3. Providing English fallbacks to ensure content visibility

This prevents the common Next.js hydration errors when using client-side i18n.

Also applies to: 46-46, 82-82, 92-92, 102-102, 112-112

src-tauri/src/lib.rs (1)

11-14: Command interface correctly updated for simplified backup system.

The Tauri command updates properly reflect the TX016 specification:

  • Removed all backup lifecycle management commands
  • Added focused commands for SNBT/resource pack backup creation
  • Added translation session metadata commands

This aligns with the shift from full backup management to session-based backup creation.

Also applies to: 117-124

src/components/tabs/custom-files-tab.tsx (1)

306-317: Nice visual enhancement for file type differentiation.

The styled badges with distinct colors for JSON and SNBT files improve the user experience. The implementation properly includes dark mode support and uses semantic color choices.

src-tauri/src/minecraft/mod.rs (2)

500-500: Good parameter name improvement.

Changing _mod_id to mod_id correctly reflects that the parameter is now being used in the function call.


503-505: Excellent refactoring to reduce code duplication.

The delegation to extract_lang_files_from_archive_with_format eliminates duplicate logic while maintaining the same interface. This makes the code more maintainable and follows the DRY principle.

src/components/settings/backup-settings.tsx (2)

21-21: Translation keys simplified appropriately.

The removal of fallback strings from translation keys is consistent with the component's transition to a static informational display.

Also applies to: 24-24


27-33: Component simplification aligns with system design.

The transition from interactive backup settings to static informational content is consistent with the simplified backup system described in the PR objectives.

src/components/tabs/guidebooks-tab.tsx (5)

25-28: Good addition of granular progress tracking.

Adding guidebook-level progress tracking (setTotalGuidebooks, setCompletedGuidebooks, incrementCompletedGuidebooks) provides more detailed progress information to users.


60-67: Improved relative path calculation.

The addition of "mods/" prefix removal handles edge cases better and provides cleaner path display in the UI.


104-104: Good addition of consistent sorting.

Sorting targets alphabetically ensures consistent processing order and improves user experience.


109-112: Well-integrated progress tracking initialization.

The guidebook-level progress counters are properly reset and initialized before starting translation jobs.


184-184: Correctly wired progress callback.

Using incrementCompletedGuidebooks for whole progress tracking aligns with the granular progress tracking system.

src/lib/services/config-service.ts (2)

288-312: Excellent migration logic for API key backward compatibility.

The migration function properly handles the transition from legacy single apiKey to provider-specific apiKeys while maintaining backward compatibility.


324-329: Good backward compatibility in conversion functions.

Maintaining both legacy api_key and new api_keys fields ensures smooth transitions between old and new configuration formats.

Also applies to: 372-383

src/lib/services/translation-service.ts (4)

139-147: Excellent logging optimization for production.

Wrapping debug and development-specific logging in process.env.NODE_ENV === 'development' checks reduces noise in production while maintaining helpful debugging information during development.

Also applies to: 601-603, 605-607, 614-616, 622-624, 626-628, 646-648, 655-658, 694-696


889-892: Enhanced API key error detection.

Adding more error patterns ("Invalid API Key", "Unauthorized", "401") provides better error detection for API key issues across different providers.


894-895: Improved error handling for API key issues.

Throwing errors immediately for API key configuration problems prevents unnecessary retries and provides faster feedback to users.


956-957: Good removal of duplicate progress updates.

Removing the onProgress callback invocation prevents duplicate progress updates, as mentioned in the comment. This aligns with the centralized progress handling in translation-runner.ts.

public/locales/ja/common.json (5)

37-38: Variable syntax update looks correct.

The change from single braces {language} to double braces {{language}} is consistent with modern i18n libraries and matches the English version. This ensures proper variable interpolation.


41-44: Good addition of provider-specific hints and advanced settings.

The new hint keys for API keys and models with provider-specific context will improve user experience by providing relevant guidance.


84-105: Comprehensive backup settings localization.

The new backup configuration section provides clear Japanese translations for all backup-related settings. The terminology is consistent and user-friendly.


217-243: Well-structured translation history section.

The history section includes comprehensive keys for the new translation history dialog, with proper Japanese translations for statuses and types.


262-262: Verify variable syntax consistency.

The progress size string uses the new double-brace syntax consistently with other updated strings.

src/lib/services/backup-service.ts (4)

2-5: Clear documentation of the simplified scope.

The header comment effectively explains the reduced functionality and references the TX016 specification, which helps future maintainers understand the intentional simplification.


120-120: Method name change improves clarity.

The rename from generateBackupId to generateFullBackupId better describes the method's purpose of generating a complete backup ID with all details.


153-159: Simplified public method for testing.

Making generateBackupId public and simplified while keeping the full implementation private is a good design for testability.


164-168: Robust backup ID generation.

The full backup ID generation includes proper sanitization of the source name and comprehensive timestamp formatting. This ensures unique and valid backup identifiers.

src/components/tabs/common/translation-tab.tsx (7)

165-173: Good development-only logging.

Restricting debug logging to development mode prevents unnecessary console output in production while maintaining useful debugging information during development.


192-199: Proper state clearing before scanning.

Clearing existing targets, filter text, and results before scanning ensures a clean state and prevents confusion from stale data.


251-252: Immediate state reset improves UX.

Resetting translation state immediately at the start of translation provides better user feedback and prevents UI inconsistencies.


274-277: Robust API key selection logic.

The provider-specific API key selection with fallback to the generic API key ensures compatibility with both old and new configuration formats.


292-295: Good removal of duplicate progress handling.

The comment clearly explains why the progress callback was removed, preventing duplicate updates since progress is now handled by the translation runner.


528-556: Enhanced scanning UI with proper animations.

The detailed loading state with animated spinner, progress dots, and informative text provides excellent user feedback during the scanning process.


572-574: Development-only duplicate detection.

Restricting duplicate ID warnings to development mode prevents unnecessary console spam in production while maintaining useful debugging information.

src/components/tabs/quests-tab.tsx (7)

27-31: Quest-level progress tracking integration.

The addition of quest-specific progress tracking state variables properly integrates with the expanded progress model.


44-46: Proper state clearing before scanning.

Clearing existing targets before scanning ensures a clean state and prevents duplicate or stale entries.


61-61: Improved filename extraction.

Using both forward and backward slashes in the regex pattern ensures proper filename extraction across different operating systems.

Also applies to: 88-88


145-153: Session management for translation tracking.

The session ID generation and logs directory creation provide proper tracking and organization for translation sessions.


155-170: Proper SNBT backup implementation.

The backup logic correctly filters FTB quests with SNBT files and handles backup failures gracefully without interrupting translation.


223-223: Correct progress tracking alignment.

Using incrementCompletedQuests for whole progress tracking aligns with the quest-level progress model while maintaining chunk-level tracking for real-time updates.


327-348: Enhanced quest type rendering.

The visual distinction between FTB quests, Better Quest direct mode, and other Better Quests with color-coded badges improves user experience and clarity.

src/lib/services/__tests__/backup-integration.test.ts (6)

1-17: Proper test setup and mocking.

The Jest configuration and Tauri API mocking is correctly set up to test the backup integration without requiring the actual Tauri environment.


19-54: Comprehensive SNBT backup testing.

Tests cover both successful backup scenarios and failure handling, ensuring the backup system is robust and doesn't interrupt translation on failures.


75-94: Translation summary update testing.

The tests verify that translation summaries are properly updated after each job, which is crucial for the translation history functionality.


132-191: Translation history dialog integration.

Tests cover session listing, summary retrieval, and error handling for the translation history dialog, ensuring proper integration with the backend.


193-226: Session ID consistency verification.

Testing that the same session ID is used throughout a translation batch ensures proper tracking and organization of translation sessions.


228-255: Backup service integration testing.

The test verifies that backup IDs are generated with the correct format and timestamp, ensuring consistency with the backup system expectations.

src/lib/store/__tests__/progress-store.jest.test.ts (2)

36-68: Test updates accurately reflect the new progress store behavior.

The updated test expectations correctly validate the new behavior where:

  • Negative/null/undefined values now reset to 0 instead of maintaining current progress
  • Backward progress is prevented during active translation (except when resetting to 0)
  • Progress can move freely when not translating

These changes align well with the broader refactoring of the progress tracking system.


111-146: Chunk-level progress correctly decoupled from wholeProgress updates.

The test updates appropriately verify that incrementCompletedChunks and updateProgressTracking no longer automatically update wholeProgress. This decoupling provides better control over progress reporting across different translation types (mods, quests, guidebooks, custom files).

Also applies to: 221-225

src/lib/types/config.ts (2)

39-39: Backup configuration removal aligns with system simplification.

The removal of the backup property from AppConfig is consistent with the PR's objective to simplify the backup system by removing backup management features.


41-62: Excellent migration strategy for provider-specific API keys.

The implementation provides a smooth transition path:

  • Legacy apiKey is deprecated but retained for backward compatibility
  • New apiKeys structure supports multiple providers (OpenAI, Anthropic, Google)
  • Proper initialization in DEFAULT_CONFIG ensures no runtime errors

This approach allows existing configurations to continue working while encouraging migration to the new structure.

Also applies to: 144-149

src/components/settings/llm-settings.tsx (2)

72-81: Proper state management in change handlers.

The handleProviderChange function and all other change handlers correctly create new config objects before updating state, avoiding mutations. The legacy apiKey synchronization ensures backward compatibility.

Also applies to: 180-185


96-99: Excellent UI improvements and localization support.

The component enhancements are well-implemented:

  • Translation readiness check prevents rendering issues
  • getProviderDisplayName helper provides localized provider names
  • UI reorganization with grouped sections improves user experience
  • Provider-specific hints guide users effectively

The visual hierarchy with bordered sections and clear headings makes the settings more intuitive.

Also applies to: 102-113, 121-282

src/__tests__/e2e/backup-system-e2e.test.ts (1)

146-311: Comprehensive E2E test coverage for the backup system.

The test suite thoroughly validates the simplified backup functionality:

  • SNBT and resource pack backup flows
  • Translation summary creation and updates
  • Session history retrieval and statistics
  • Complete translation workflow integration
  • Backup service integration with proper mocking

The tests effectively verify both file system operations and data integrity, providing confidence in the backup system implementation.

src/lib/services/translation-runner.ts (3)

65-108: Well-implemented key-based progress tracking.

The progress tracking enhancement provides accurate, granular progress updates:

  • Progress resets to 0 at job start for clear user feedback
  • Key-based calculation gives precise progress percentages
  • Dual progress tracking (individual file via setProgress and job-level via progress property) maintains consistency
  • Proper bounds checking with Math.round for integer percentages

This implementation significantly improves the user experience by showing realistic progress based on actual work completed.


152-176: Robust translation summary update implementation.

The session metadata update is well-implemented:

  • Only executes when sessionId is provided
  • Correctly calculates translation statistics from completed chunks
  • Proper error handling ensures summary update failures don't interrupt translation
  • Uses backend command for persistent storage

The integration with the new minimal backup system provides valuable translation history tracking.


178-191: Thoughtful handling of final progress states.

The completion logic properly handles different progress tracking scenarios:

  • Ensures completed jobs show 100% progress for clear user feedback
  • Maintains backward compatibility by checking if incrementWholeProgress differs from incrementCompletedMods
  • Supports both mod-level and whole progress increments for different translation types

This flexibility allows the same runner to work with various translation tabs (mods, quests, guidebooks, custom files).

src/lib/store/index.ts (1)

171-183: Progress reset logic improvements look good

The changes to allow progress resetting are well-implemented and properly documented. The logic correctly handles:

  • Individual file progress reset in setProgress
  • Overall progress reset in setWholeProgress when not translating or explicitly setting to 0
public/locales/en/common.json (1)

37-38: Consistent variable syntax standardization

Good job standardizing the variable placeholder syntax to use double braces {{}} throughout the localization file. This improves consistency and prevents potential parsing issues.

Also applies to: 262-262

src-tauri/src/backup.rs (1)

141-157: LGTM! Efficient recursive directory copy implementation

The copy_dir_all function correctly handles recursive directory copying with proper error propagation.

Comment on lines 63 to 71
// Parse session ID to Date object
const parseSessionId = (id: string): Date => {
const match = id.match(/(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})/);
if (match) {
const [, year, month, day, hour, minute, second] = match;
return new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second));
}
return new Date();
};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Handle invalid session ID format gracefully

The parseSessionId function returns the current date when the regex doesn't match, which could be misleading and cause incorrect sorting behavior.

 const parseSessionId = (id: string): Date => {
   const match = id.match(/(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})/);
   if (match) {
     const [, year, month, day, hour, minute, second] = match;
     return new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(minute), parseInt(second));
   }
-  return new Date();
+  // Return a very old date for invalid IDs so they sort to the bottom
+  return new Date(0);
 };
🤖 Prompt for AI Agents
In src/components/ui/translation-history-dialog.tsx around lines 63 to 71, the
parseSessionId function currently returns the current date if the session ID
format is invalid, which can cause misleading results. Instead, modify the
function to handle invalid formats more explicitly by returning null or throwing
an error, and update the calling code to handle this case gracefully to avoid
incorrect sorting or processing.

Comment on lines 378 to 409
// Read existing summary or create new one
let mut summary = if summary_path.exists() {
let content = fs::read_to_string(&summary_path)
.map_err(|e| format!("Failed to read existing summary: {}", e))?;

serde_json::from_str::<TranslationSummary>(&content)
.map_err(|e| format!("Failed to parse existing summary: {}", e))?
} else {
TranslationSummary {
lang: target_language.clone(),
translations: Vec::new(),
}
};

// Add new translation entry
let entry = TranslationEntry {
translation_type,
name,
status,
keys: format!("{}/{}", translated_keys, total_keys),
};

summary.translations.push(entry);

// Write updated summary back to file
let json = serde_json::to_string_pretty(&summary)
.map_err(|e| format!("Failed to serialize summary: {}", e))?;

fs::write(&summary_path, json)
.map_err(|e| format!("Failed to write summary file: {}", e))?;

Ok(())
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add file locking to prevent race conditions

The current implementation could lose data if multiple translation processes update the same session summary simultaneously. Consider adding file locking or using atomic file operations.

You could use file locking or atomic writes. Here's an approach using atomic file operations:

+    use std::fs::OpenOptions;
+    use std::io::Write;
+    
     // Write updated summary back to file
     let json = serde_json::to_string_pretty(&summary)
         .map_err(|e| format!("Failed to serialize summary: {}", e))?;
     
-    fs::write(&summary_path, json)
-        .map_err(|e| format!("Failed to write summary file: {}", e))?;
+    // Write to temporary file first
+    let temp_path = summary_path.with_extension("tmp");
+    fs::write(&temp_path, json)
+        .map_err(|e| format!("Failed to write temporary summary file: {}", e))?;
+    
+    // Atomically rename temporary file to final path
+    fs::rename(&temp_path, &summary_path)
+        .map_err(|e| format!("Failed to rename summary file: {}", e))?;

This ensures that the file update is atomic and prevents partial writes or data corruption.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Read existing summary or create new one
let mut summary = if summary_path.exists() {
let content = fs::read_to_string(&summary_path)
.map_err(|e| format!("Failed to read existing summary: {}", e))?;
serde_json::from_str::<TranslationSummary>(&content)
.map_err(|e| format!("Failed to parse existing summary: {}", e))?
} else {
TranslationSummary {
lang: target_language.clone(),
translations: Vec::new(),
}
};
// Add new translation entry
let entry = TranslationEntry {
translation_type,
name,
status,
keys: format!("{}/{}", translated_keys, total_keys),
};
summary.translations.push(entry);
// Write updated summary back to file
let json = serde_json::to_string_pretty(&summary)
.map_err(|e| format!("Failed to serialize summary: {}", e))?;
fs::write(&summary_path, json)
.map_err(|e| format!("Failed to write summary file: {}", e))?;
Ok(())
// Read existing summary or create new one
let mut summary = if summary_path.exists() {
let content = fs::read_to_string(&summary_path)
.map_err(|e| format!("Failed to read existing summary: {}", e))?;
serde_json::from_str::<TranslationSummary>(&content)
.map_err(|e| format!("Failed to parse existing summary: {}", e))?
} else {
TranslationSummary {
lang: target_language.clone(),
translations: Vec::new(),
}
};
// Add new translation entry
let entry = TranslationEntry {
translation_type,
name,
status,
keys: format!("{}/{}", translated_keys, total_keys),
};
summary.translations.push(entry);
// Write updated summary back to file
use std::fs::OpenOptions;
use std::io::Write;
let json = serde_json::to_string_pretty(&summary)
.map_err(|e| format!("Failed to serialize summary: {}", e))?;
// Write to temporary file first
let temp_path = summary_path.with_extension("tmp");
fs::write(&temp_path, json)
.map_err(|e| format!("Failed to write temporary summary file: {}", e))?;
// Atomically rename temporary file to final path
fs::rename(&temp_path, &summary_path)
.map_err(|e| format!("Failed to rename summary file: {}", e))?;
Ok(())
🤖 Prompt for AI Agents
In src-tauri/src/backup.rs around lines 378 to 409, the code reads and writes
the summary file without any locking, which can cause race conditions and data
loss if multiple processes update simultaneously. To fix this, implement file
locking before reading and writing the summary file or use atomic file
operations by writing the updated content to a temporary file and then
atomically renaming it to the summary path. This ensures updates are atomic and
prevents partial writes or corruption.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

♻️ Duplicate comments (1)
src-tauri/src/backup.rs (1)

378-409: Race condition still present despite previous review

The file read-modify-write operation in update_translation_summary can still cause data loss if multiple processes update the same session summary simultaneously. This is the same critical issue identified in the previous review.

The atomic file operation solution from the previous review should be implemented:

+    use std::fs::OpenOptions;
+    use std::io::Write;
+    
     // Write updated summary back to file
     let json = serde_json::to_string_pretty(&summary)
         .map_err(|e| format!("Failed to serialize summary: {e}"))?;
     
-    fs::write(&summary_path, json)
-        .map_err(|e| format!("Failed to write summary file: {e}"))?;
+    // Write to temporary file first
+    let temp_path = summary_path.with_extension("tmp");
+    fs::write(&temp_path, json)
+        .map_err(|e| format!("Failed to write temporary summary file: {e}"))?;
+    
+    // Atomically rename temporary file to final path
+    fs::rename(&temp_path, &summary_path)
+        .map_err(|e| format!("Failed to rename summary file: {e}"))?;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 89d5bee and d12e953.

📒 Files selected for processing (3)
  • src-tauri/src/backup.rs (2 hunks)
  • src-tauri/src/lib.rs (2 hunks)
  • src-tauri/src/minecraft/mod.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src-tauri/src/minecraft/mod.rs
  • src-tauri/src/lib.rs
🧰 Additional context used
🪛 GitHub Actions: PR Validation
src-tauri/src/backup.rs

[error] 190-190: Clippy lint 'needless_borrows_for_generic_args': the borrowed expression implements the required traits; suggestion to change '&source' to 'source'.


[error] 192-192: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change '&format!("Failed to backup SNBT file {}: {e}", file_path)' to '&format!("Failed to backup SNBT file {file_path}: {e}")'.


[error] 205-205: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change '&format!("SNBT file not found for backup: {}", file_path)' to '&format!("SNBT file not found for backup: {file_path}")'.


[error] 212-212: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change '&format!("SNBT backup completed: {} files backed up", backed_up_count)' to '&format!("SNBT backup completed: {backed_up_count} files backed up")'.


[error] 227-227: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change '&format!("Backing up resource pack: {}", pack_path)' to '&format!("Backing up resource pack: {pack_path}")'.


[error] 234-234: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'return Err(format!("Resource pack not found: {}", pack_path))' to 'return Err(format!("Resource pack not found: {pack_path}"))'.


[error] 257-257: Clippy lint 'needless_borrows_for_generic_args': the borrowed expression implements the required traits; suggestion to change '&source' to 'source'.


[error] 302-302: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to read logs directory: {}", e)' to 'format!("Failed to read logs directory: {e}")'.


[error] 305-305: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to read directory entry: {}", e)' to 'format!("Failed to read directory entry: {e}")'.


[error] 340-342: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Translation summary not found for session: {}", session_id)' to 'format!("Translation summary not found for session: {session_id}")'.


[error] 348-348: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to read summary file: {}", e)' to 'format!("Failed to read summary file: {e}")'.


[error] 351-351: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to parse summary JSON: {}", e)' to 'format!("Failed to parse summary JSON: {e}")'.


[error] 358-367: Clippy lint 'too_many_arguments': function 'update_translation_summary' has 8 arguments but the limit is 7.


[error] 375-375: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to create session directory: {}", e)' to 'format!("Failed to create session directory: {e}")'.


[error] 382-382: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to read existing summary: {}", e)' to 'format!("Failed to read existing summary: {e}")'.


[error] 385-385: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to parse existing summary: {}", e)' to 'format!("Failed to parse existing summary: {e}")'.


[error] 398-398: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("{}/{}", translated_keys, total_keys)' to 'format!("{translated_keys}/{total_keys}")'.


[error] 405-405: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to serialize summary: {}", e)' to 'format!("Failed to serialize summary: {e}")'.


[error] 407-407: Clippy lint 'uninlined_format_args': variables can be used directly in the format! string; suggestion to change 'format!("Failed to write summary file: {}", e)' to 'format!("Failed to write summary file: {e}")'.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build - x86_64-pc-windows-msvc
🔇 Additional comments (1)
src-tauri/src/backup.rs (1)

141-157: LGTM: Well-implemented recursive directory copy function

The copy_dir_all helper function is correctly implemented with proper error handling and recursive directory traversal.

Comment on lines +358 to +367
pub async fn update_translation_summary(
minecraft_dir: String,
session_id: String,
translation_type: String,
name: String,
status: String,
translated_keys: i32,
total_keys: i32,
target_language: String,
) -> Result<(), String> {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Reduce function parameters to meet Clippy requirements

The function has 8 parameters but Clippy limits it to 7. Consider creating a parameter struct to group related parameters.

+#[derive(Debug)]
+pub struct TranslationUpdateParams {
+    pub translation_type: String,
+    pub name: String,
+    pub status: String,
+    pub translated_keys: i32,
+    pub total_keys: i32,
+    pub target_language: String,
+}
+
 #[tauri::command]
 pub async fn update_translation_summary(
     minecraft_dir: String,
     session_id: String,
-    translation_type: String,
-    name: String,
-    status: String,
-    translated_keys: i32,
-    total_keys: i32,
-    target_language: String,
+    params: TranslationUpdateParams,
 ) -> Result<(), String> {

Then update the function body to use params.translation_type, params.name, etc.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pub async fn update_translation_summary(
minecraft_dir: String,
session_id: String,
translation_type: String,
name: String,
status: String,
translated_keys: i32,
total_keys: i32,
target_language: String,
) -> Result<(), String> {
#[derive(Debug)]
pub struct TranslationUpdateParams {
pub translation_type: String,
pub name: String,
pub status: String,
pub translated_keys: i32,
pub total_keys: i32,
pub target_language: String,
}
#[tauri::command]
pub async fn update_translation_summary(
minecraft_dir: String,
session_id: String,
params: TranslationUpdateParams,
) -> Result<(), String> {
🧰 Tools
🪛 GitHub Actions: PR Validation

[error] 358-367: Clippy lint 'too_many_arguments': function 'update_translation_summary' has 8 arguments but the limit is 7.

🤖 Prompt for AI Agents
In src-tauri/src/backup.rs around lines 358 to 367, the function
update_translation_summary has 8 parameters, exceeding Clippy's recommended
limit of 7. To fix this, define a struct that groups related parameters
together, such as translation_type, name, status, translated_keys, total_keys,
and target_language. Then change the function signature to accept this struct as
a single parameter instead of multiple individual parameters. Update the
function body to access these values through the struct fields, for example,
params.translation_type, params.name, etc.

Y-RyuZU added 2 commits July 16, 2025 12:59
- Remove unused props from BackupSettings component
- Fix config mutation by using useEffect in LLMSettings
- Add block scopes in e2e test switch cases
- Improve parseSessionId error handling for invalid dates
- Add keyboard accessibility to expandable table rows
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/__tests__/e2e/backup-system-e2e.test.ts (1)

67-106: Fix variable scope issues in switch cases.

Variables declared in switch cases can be accessed by other cases, potentially causing bugs. Wrap each case with variable declarations in blocks.

 switch (command) {
   case 'generate_session_id':
     return sessionId;
     
   case 'backup_snbt_files': {
     // Simulate SNBT backup
     const backupDir = path.join(args.sessionPath, 'backup', 'snbt_original');
     await fs.mkdir(backupDir, { recursive: true });
     for (const file of args.files) {
       const fileName = path.basename(file);
       await fs.writeFile(path.join(backupDir, fileName), 'original content');
     }
     return;
   }
     
   case 'backup_resource_pack': {
     // Simulate resource pack backup
     const packBackupDir = path.join(args.sessionPath, 'backup', 'resource_pack');
     await fs.mkdir(packBackupDir, { recursive: true });
     await fs.writeFile(path.join(packBackupDir, 'pack.mcmeta'), '{}');
     return;
   }
     
   case 'update_translation_summary': {
     // Simulate summary update
     const summaryPath = path.join(logsDir, 'localizer', args.sessionId, 'translation_summary.json');
     await fs.mkdir(path.dirname(summaryPath), { recursive: true });
     
     let summary = { lang: args.targetLanguage, translations: [] };
     try {
       const existing = await fs.readFile(summaryPath, 'utf-8');
       summary = JSON.parse(existing);
     } catch {}
     
     summary.translations.push({
       type: args.translationType,
       name: args.name,
       status: args.status,
       keys: `${args.translatedKeys}/${args.totalKeys}`
     });
     
     await fs.writeFile(summaryPath, JSON.stringify(summary, null, 2));
     return;
   }
🧹 Nitpick comments (1)
src/components/settings/backup-settings.tsx (1)

24-24: Consider removing the fallback text for consistency.

The translation key has a fallback text, but other translation calls in the component don't. For consistency and to ensure proper localization coverage, consider removing the fallback.

-{t('settings.backup.simpleBackupDescription', 'Backups are created automatically during translation. Original files are preserved before translation, and results are saved after completion.')}
+{t('settings.backup.simpleBackupDescription')}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7607761 and 1554dc8.

📒 Files selected for processing (4)
  • src/__tests__/e2e/backup-system-e2e.test.ts (1 hunks)
  • src/components/settings/backup-settings.tsx (1 hunks)
  • src/components/settings/llm-settings.tsx (3 hunks)
  • src/components/ui/translation-history-dialog.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/components/ui/translation-history-dialog.tsx
  • src/components/settings/llm-settings.tsx
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/components/settings/backup-settings.tsx (2)
src/lib/i18n.ts (1)
  • useAppTranslation (46-49)
src/components/ui/card.tsx (5)
  • Card (80-80)
  • CardHeader (80-80)
  • CardTitle (80-80)
  • CardDescription (80-80)
  • CardContent (80-80)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Build - x86_64-unknown-linux-gnu
  • GitHub Check: Build - x86_64-pc-windows-msvc
  • GitHub Check: Build - aarch64-apple-darwin
  • GitHub Check: Build - x86_64-apple-darwin
  • GitHub Check: Validate PR
  • GitHub Check: Security Scan
🔇 Additional comments (4)
src/components/settings/backup-settings.tsx (2)

7-7: Function signature properly simplified.

Good fix! The component signature now correctly reflects that it doesn't accept any props, addressing the previous review comment about empty object destructuring.


21-27: Static content implementation is clean and appropriate.

The simplified implementation aligns well with the PR's objective to remove interactive backup configuration UI. The static informational content clearly communicates the automatic backup behavior to users.

src/__tests__/e2e/backup-system-e2e.test.ts (2)

49-147: Test setup and structure are well-designed.

The test suite provides comprehensive coverage of the simplified backup system with proper mocking, setup, and cleanup. The mock implementation covers all necessary Tauri commands and simulates realistic file system operations.


149-314: Excellent test coverage for backup system functionality.

The test cases comprehensively cover all aspects of the backup system:

  • SNBT and resource pack backup flows
  • Translation summary management
  • Translation history retrieval
  • Complete end-to-end workflows
  • Service integration testing

The tests properly validate file system side effects and verify expected behavior.

@Y-RyuZU Y-RyuZU merged commit 601ba91 into main Jul 16, 2025
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants