1. 18 Jul, 2025 7 commits
    • ️ refactor: modularize TokensTable component into maintainable architecture · 67df60e7
      - Split monolithic 922-line TokensTable.js into modular components:
        * useTokensData.js: Custom hook for centralized state and logic management
        * TokensColumnDefs.js: Column definitions and rendering functions
        * TokensTable.jsx: Pure table component for rendering
        * TokensActions.jsx: Actions area (add, copy, delete tokens)
        * TokensFilters.jsx: Search form component with keyword and token filters
        * TokensDescription.jsx: Description area with compact mode toggle
        * index.jsx: Main orchestrator component
      
      - Features preserved:
        * Token status management with switch controls
        * Quota progress bars and visual indicators
        * Model limitations display with vendor avatars
        * IP restrictions handling and display
        * Chat integrations with dropdown menu
        * Batch operations (copy, delete) with confirmations
        * Key visibility toggle and copy functionality
        * Compact mode for responsive layouts
        * Search and filtering capabilities
        * Pagination and loading states
      
      - Improvements:
        * Better separation of concerns
        * Enhanced reusability and testability
        * Simplified maintenance and debugging
        * Consistent modular architecture pattern
        * Performance optimizations with useMemo
        * Backward compatibility maintained
      
      This refactoring follows the same successful pattern used for LogsTable, MjLogsTable, and TaskLogsTable, significantly improving code maintainability while preserving all existing functionality.
      t0ng7u committed
    • ️ refactor: restructure TaskLogsTable into modular component architecture · baffe556
      Refactor the monolithic TaskLogsTable component (802 lines) into a modular,
      maintainable architecture following the established pattern from LogsTable
      and MjLogsTable refactors.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split large single file into focused, single-responsibility components
      - Introduced custom hook `useTaskLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented modal components for user interactions
      
      ### 📁 New Structure
      ```
      web/src/components/table/task-logs/
      ├── index.jsx                       # Main page component orchestrator
      ├── TaskLogsTable.jsx              # Pure table rendering component
      ├── TaskLogsActions.jsx            # Actions area (task records + compact mode)
      ├── TaskLogsFilters.jsx            # Search form component
      ├── TaskLogsColumnDefs.js          # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx    # Column visibility settings
          └── ContentModal.jsx           # Content viewer for JSON data
      
      web/src/hooks/task-logs/
      └── useTaskLogsData.js             # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🎨 Task-Specific Features Preserved
      - All task type rendering with icons (MUSIC, LYRICS, video generation)
      - Platform-specific rendering (Suno, Kling, Jimeng) with distinct colors
      - Progress indicators for task completion status
      - Video preview links for successful video generation tasks
      - Admin-only columns for channel information
      - Status rendering with appropriate colors and icons
      
      ### 🔧 Technical Details
      - Centralized all business logic in `useTaskLogsData` custom hook
      - Extracted comprehensive column definitions with Lucide React icons
      - Split complex UI into focused components (table, actions, filters, modals)
      - Maintained responsive design patterns for mobile compatibility
      - Preserved admin permission handling for restricted features
      - Optimized spacing and layout (reduced gap from 4 to 2 for better density)
      
      ### 🎮 Platform Support
      - **Suno**: Music and lyrics generation with music icons
      - **Kling**: Video generation with video icons
      - **Jimeng**: Video generation with distinct purple styling
      
      ### 🐛 Fixes
      - Improved component prop passing patterns
      - Enhanced type safety through better state management
      - Optimized rendering performance with proper memoization
      - Streamlined export pattern using `export { default }`
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • ️ refactor: restructure MjLogsTable into modular component architecture · 51695bef
      Refactor the monolithic MjLogsTable component (971 lines) into a modular,
      maintainable architecture following the same pattern as LogsTable refactor.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split large single file into focused, single-responsibility components
      - Introduced custom hook `useMjLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented specialized modal components for Midjourney-specific features
      
      ### 📁 New Structure
      ```
      web/src/components/table/mj-logs/
      ├── index.jsx                    # Main page component orchestrator
      ├── MjLogsTable.jsx             # Pure table rendering component
      ├── MjLogsActions.jsx           # Actions area (banner + compact mode)
      ├── MjLogsFilters.jsx           # Search form component
      ├── MjLogsColumnDefs.js         # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx # Column visibility settings
          └── ContentModal.jsx        # Content viewer (text + image preview)
      
      web/src/hooks/mj-logs/
      └── useMjLogsData.js            # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🎨 Midjourney-Specific Features Preserved
      - All task type rendering with icons (IMAGINE, UPSCALE, VARIATION, etc.)
      - Status rendering with appropriate colors and icons
      - Image preview functionality for generated artwork
      - Progress indicators for task completion
      - Admin-only columns for channel and submission results
      - Banner notification system for callback settings
      
      ### 🔧 Technical Details
      - Centralized all business logic in `useMjLogsData` custom hook
      - Extracted comprehensive column definitions with Lucide React icons
      - Split complex UI into focused components (table, actions, filters, modals)
      - Maintained responsive design patterns for mobile compatibility
      - Preserved admin permission handling for restricted features
      
      ### 🐛 Fixes
      - Improved component prop passing patterns
      - Enhanced type safety through better state management
      - Optimized rendering performance with proper memoization
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • ️ refactor: restructure LogsTable into modular component architecture · acf6ec93
      Refactor the monolithic LogsTable component (1453 lines) into a modular,
      maintainable architecture following the channels table pattern.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split single large file into focused, single-responsibility components
      - Introduced custom hook `useLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented modal components for user interactions
      
      ### 📁 New Structure
      ```
      web/src/components/table/usage-logs/
      ├── index.jsx                    # Main page component orchestrator
      ├── LogsTable.jsx               # Pure table rendering component
      ├── LogsActions.jsx             # Actions area (stats + compact mode)
      ├── LogsFilters.jsx             # Search form component
      ├── LogsColumnDefs.js           # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx # Column visibility settings
          └── UserInfoModal.jsx       # User information display
      
      web/src/hooks/logs/
      └── useLogsData.js              # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🔧 Technical Details
      - Preserved all existing functionality and user experience
      - Maintained backward compatibility through existing import path
      - Centralized all business logic in `useLogsData` custom hook
      - Extracted column definitions to separate module with render functions
      - Split complex UI into focused components (table, actions, filters, modals)
      
      ### 🐛 Fixes
      - Fixed Semi UI component import issues (`Typography.Paragraph`)
      - Resolved module export dependencies
      - Maintained consistent prop passing patterns
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • 🚀 feat(web/channels): Deep modular refactor of Channels table · 217c657e
      1. Split monolithic `ChannelsTable` (2200+ LOC) into focused components
         • `channels/index.jsx` – composition entry
         • `ChannelsTable.jsx` – pure `<Table>` rendering
         • `ChannelsActions.jsx` – bulk & settings toolbar
         • `ChannelsFilters.jsx` – search / create / column-settings form
         • `ChannelsTabs.jsx` – type tabs
         • `ChannelsColumnDefs.js` – column definitions & render helpers
         • `modals/` – BatchTag, ColumnSelector, ModelTest modals
      
      2. Extract domain hook
         • Moved `useChannelsData.js` → `src/hooks/channels/useChannelsData.js`
           – centralises state, API calls, pagination, filters, batch ops
           – now exports `setActivePage`, fixing tab / status switch errors
      
      3. Update wiring
         • All sub-components consume data via `useChannelsData` props
         • Adjusted import paths after hook relocation
      
      4. Clean legacy file
         • Legacy `components/table/ChannelsTable.js` now re-exports new module
      
      5. Bug fixes
         • Tab switching, status filter & tag aggregation restored
         • Column selector & batch actions operate via unified hook
      
      This commit completes the first phase of modularising the Channels feature, laying groundwork for consistent, maintainable table architecture across the app.
      t0ng7u committed
    • 🗑️ refactor(table): remove custom `formatPageText` from all table components · eac90f67
      Eliminated the manual `formatPageText` function that previously rendered
      pagination text (e.g. “第 {{start}} - {{end}} 条,共 {{total}} 条”) in each
      Table. Pagination now relies on the default Semi UI text or the global
      i18n configuration, reducing duplication and making future language
      updates centralized.
      
      Why
      ---
      * Keeps table components cleaner and more maintainable.
      * Ensures pagination text automatically respects the app-wide i18n
        settings without per-component overrides.
      t0ng7u committed
    • 🎉 feat(i18n): integrate Semi UI LocaleProvider with dynamic i18next language support · 9496156d
      Add Semi UI internationalization to the project by wrapping the root
      component tree with `LocaleProvider`. A new `SemiLocaleWrapper`
      component maps the current `i18next` language code to the corresponding
      Semi locale (currently `zh_CN` and `en_GB`) and falls back to Chinese
      when no match is found.
      
      Key changes
      -----------
      1. web/src/index.js
         • Import `LocaleProvider`, `useTranslation`, and Semi locale files.
         • Introduce `SemiLocaleWrapper` to determine `semiLocale` from
           `i18next.language` using a concise prefix-based mapping.
         • Wrap `PageLayout` with `SemiLocaleWrapper` inside the existing
           `ThemeProvider`.
      
      2. Ensures that all Semi components automatically display the correct
         language when the app language is switched via i18next.
      
      BREAKING CHANGE
      ---------------
      Applications embedding this project must now ensure that `i18next`
      initialization occurs before React render so that `LocaleProvider`
      receives the correct initial language.
      t0ng7u committed
  2. 17 Jul, 2025 15 commits
  3. 16 Jul, 2025 2 commits
  4. 15 Jul, 2025 15 commits
    • refactor: layout logic to enhance front-end responsiveness · 31adc393
      Merge pull request #1377 from QuantumNous/refactor/layout
      同語 committed
    • 🧹 refactor(PageLayout): remove unused state variables · bf6e1bed
      Removed unused `userState` and `statusState` bindings from `PageLayout.js`
      while retaining their dispatch functions for authentication and status
      management. Confirmed correct use of array destructuring to skip the
      unused toggle function returned by `useSidebarCollapsed`.
      
      This change introduces no functional differences and solely improves
      readability and maintainability.
      t0ng7u committed
    • 🐛 fix: SSR hydration mismatch in mobile detection & clean up sidebar style · 409a3eac
      - Added a server-snapshot fallback (`() => false`) to `useIsMobile` to ensure
        consistent results between server-side rendering and the browser, preventing
        hydration mismatches.
      - Removed a redundant ternary in `PageLayout` sidebar styles, replacing
        `isMobile ? 'fixed' : 'fixed'` with a single `'fixed'` value for clarity.
      
      These changes improve SSR reliability and tidy up inline styles without
      affecting runtime functionality.
      t0ng7u committed
    • 🎨 feat(sidebar): replace custom collapse button with Semi UI Button · 94e0c0d8
      * Replaced the handmade collapse/expand div with Semi UI `<Button>`
        * Uses `theme="outline"` and `type="tertiary"` for outlined style
        * Shows icon + text when sidebar is expanded, icon-only when collapsed
      * Added `iconOnly` prop and dynamic padding to remove extra text area in collapsed state
      * Ensured full-width layout with consistent padding for both states
      * Updated imports to include `Button` from `@douyinfe/semi-ui`
      * Maintains tooltip content for accessibility and better UX
      t0ng7u committed
    • ️ refactor(auth, ui): simplify Loading component & optimize OAuth2Callback flow · 7ee3a7d6
      * Removed `prompt` prop from `Loading` and switched to built-in Spin indicator with default size `small`
      * Dropped overlay background to make the spinner more reusable
      * Replaced custom text span; callers can now supply tip via their own UI if needed
      * Cleaned up `OAuth2Callback`:
        - Eliminated unused state/variables
        - Added MAX_RETRIES with incremental back-off
        - Centralized error handling via try/catch
        - Streamlined navigation logic on success/failure
        - Updated imports to match new Loading signature
      
      BREAKING CHANGE: `Loading` no longer accepts a `prompt` prop. Update all invocations accordingly.
      t0ng7u committed
    • feat(HeaderBar): ensure skeleton shows ≥500 ms and waits for real status data · a3f098c5
      The header’s skeleton screen now remains visible for at least 500 ms and
      only disappears after `/api/status` has successfully populated
      `StatusContext`.
      
      Changes include:
      • Added `loadingStartRef` to record the mount time.
      • Reworked loading effect to compute the remaining delay based on the
        elapsed time and the presence of real status data.
      • Removed the previous fixed‐timer logic, preventing premature content
        rendering and improving perceived loading consistency across pages.
      t0ng7u committed
    • 📱 feat(ui): auto-close sidebar on mobile after menu navigation · c4718a1e
      Adds a smoother mobile experience by automatically closing the sidebar
      drawer once a menu item is tapped.
      
      ### Details
      * SiderBar
        * Introduce `onNavigate` prop and invoke it on every `<Link>` click.
        * Remove unused `useIsMobile` hook and related `isMobile` variable.
      * PageLayout
        * Pass `onNavigate` callback to `SiderBar` that sets `drawerOpen` to
          `false` when on mobile, ensuring the sidebar collapses after
          navigation.
      
      This eliminates the “isMobile declared but never used” warning and
      aligns the behaviour of the sidebar with common mobile UX expectations.
      t0ng7u committed
    • 💄 style(layout): add horizontal padding to top-offset divs for consistent spacing · 527b9966
      Replaced every instance of
      <div className="mt-[64px]">
      with
      <div className="mt-[64px] px-2">
      to provide uniform horizontal padding across pages. No functional changes—visual layout improvement only.
      t0ng7u committed
    • 🖌️ feat(ui): always show colorful console banner for NewAPI in every environment · eab06767
      Add a branded console log to `web/src/index.js` that prints:
      
      “We  NewAPI  Github: https://github.com/QuantumNous/new-api”
      
      Changes include:
      • Remove the `NODE_ENV` guard so the banner appears in both development and production.
      • Increase font size to 24 px and keep “NewAPI” in bold green for stronger branding.
      
      This is a purely visual/developer-experience enhancement—no runtime behavior is affected.
      t0ng7u committed
    • 🔧 chore(router): enable React Router v7 future flags to suppress warnings · 9c36aaa2
      Add `future` prop to `BrowserRouter` in `web/src/index.js` with
      `v7_startTransition` and `v7_relativeSplatPath` turned on.
      This opts the app into upcoming React Router v7 behavior, removes
      console warnings, and readies the codebase for a smoother future upgrade.
      
      No runtime behavior changes; developer-experience improvement only.
      t0ng7u committed
    • 📱 refactor(web): remove legacy isMobile util and migrate to useIsMobile hook · edb4f2f6
      BREAKING CHANGE:
      helpers/utils.js no longer exports `isMobile()`.
      Any external code that relied on this function must switch to the `useIsMobile` React hook.
      
      Summary
      -------
      1. Deleted the obsolete `isMobile()` function from helpers/utils.js.
      2. Introduced `MOBILE_BREAKPOINT` constant and `matchMedia`-based detection for non-React contexts.
      3. Reworked toast positioning logic in utils.js to rely on `matchMedia`.
      4. Updated render.js:
         • Removed isMobile import.
         • Added MOBILE_BREAKPOINT detection in `truncateText`.
      5. Migrated every page/component to the `useIsMobile` hook:
         • Layout: HeaderBar, PageLayout, SiderBar
         • Pages: Home, Detail, Playground, User (Add/Edit), Token, Channel, Redemption, Ratio Sync
         • Components: ChannelsTable, ChannelSelectorModal, ConflictConfirmModal
      6. Purged all remaining `isMobile()` calls and legacy imports.
      7. Added missing `const isMobile = useIsMobile()` declarations where required.
      
      Benefits
      --------
      • Unifies mobile detection with a React-friendly hook.
      • Eliminates duplicated logic and improves maintainability.
      • Keeps non-React helpers lightweight by using `matchMedia` directly.
      t0ng7u committed
    • 🚀 feat(frontend): add robust boolean handling across settings pages · 0480d43b
      Summary
      -------
      1. Introduced a reusable `toBoolean` utility (`web/src/helpers/boolean.js`) that converts
         strings (`'true'/'false'`, `'1'/'0'`), numbers, and native booleans to a proper boolean.
      2. Re-exported `toBoolean` via `web/src/helpers/index.js` for simple one-line imports.
      
      Refactors
      ---------
      • Systematically replaced all legacy `item.value === 'true'` checks with `toBoolean(item.value)` in
        the following components:
        – `SystemSetting.js`
        – `OperationSetting.js`
        – `PaymentSetting.js`
        – `RatioSetting.js`
        – `RateLimitSetting.js`
        – `ModelSetting.js`
        – `DrawingSetting.js`
        – `DashboardSetting.js`
        – `ChatsSetting.js`
      
      • Unified import statements to
        `import { …, toBoolean } from '../../helpers';`
        removing redundant `../../helpers/boolean` paths.
      
      Why
      ---
      SQLite sometimes returns `1/0` or boolean literals instead of the string `'true'/'false'`, causing
      checkbox states to reset on page reload. The new utility guarantees consistent boolean parsing,
      fixing the issue across all environments (SQLite, MySQL, etc.) while improving code clarity.
      t0ng7u committed
    • 🐛 fix: multi-key channel sync and Vertex-AI key-upload edge cases · 3425b6eb
      Backend
      1. controller/channel.go
         • Always hydrate `ChannelInfo` from DB in `UpdateChannel`, keeping `IsMultiKey` true so `MultiKeySize` is recalculated.
      
      2. model/channel.go
         • getKeys(): accept both newline-separated keys and JSON array (`[ {...}, {...} ]`).
         • Update(): reuse new parser-logic to recalc `MultiKeySize`; prune stale indices in `MultiKeyStatusList`.
      
      Frontend
      1. pages/Channel/EditChannel.js
         • `handleVertexUploadChange`
           – Reset `vertexErroredNames` on every change so the “ignored files” prompt always re-appears.
           – In single-key mode keep only the last file; in batch mode keep all valid files.
           – Parse files, display “以下文件解析失败,已忽略:…”.
         • Batch-toggle checkbox
           – When switching from batch→single while multiple files are present, show a confirm dialog and retain only the first file (synchronises state, form and local caches).
         • On opening the “new channel” side-sheet, clear `vertexErroredNames` to restore error prompts.
      
      Result
      • “已启用 x/x” count updates immediately after editing multi-key channels.
      • Vertex-AI key upload works intuitively: proper error feedback, no duplicated files, and safe down-switch from batch to single mode.
      t0ng7u committed
  5. 14 Jul, 2025 1 commit