1. 01 Jul, 2025 6 commits
  2. 28 Jun, 2025 3 commits
  3. 27 Jun, 2025 16 commits
  4. 26 Jun, 2025 7 commits
    • 🐛 fix(redemptions-table): correct initial page index and pagination state · 0cad369f
      Summary:
      The redemption list occasionally displayed an invalid range such as “Items -9 - 0” and failed to highlight page 1 after a refresh. This was caused by the table being initialized with `currentPage = 0`.
      
      Changes:
      • update `useEffect` to load data starting from page 1 instead of page 0
      • refactor `loadRedemptions` to accept `page` (default 1) and sanitize backend‐returned pages (`<= 0` coerced to 1)
      • keep other logic unchanged
      
      Impact:
      Pagination text and page selection now show correct values on first load or refresh, eliminating negative ranges and ensuring the first page is properly highlighted.
      t0ng7u committed
    • 🐛 fix(redemptions-table): show loading indicator while refetching data · 256b9a9f
      Previously, the table did not enter the loading state after performing actions such as deleting, enabling, or disabling a redemption code. This caused a brief period where the UI appeared unresponsive while awaiting the backend response.
      
      Changes made:
      • Added `setLoading(true)` at the beginning of `loadRedemptions` to activate the loading spinner whenever data is (re)fetched.
      • Added an explanatory code comment to clarify the intent.
      
      This improves user experience by clearly indicating that the system is processing and prevents confusion during data refresh operations.
      t0ng7u committed
    • 🎁 refactor(ui/redemption): migrate EditRedemption page to Semi Form & enhance UX · f2dd64a3
      SUMMARY
      • Re-implemented `web/src/pages/Redemption/EditRedemption.js` with Semi Form components, removing legacy local-state handling.
      • Added `formApiRef` for centralized control; external “Submit” button now triggers `formApi.submitForm()`.
      • Replaced `Input/AutoComplete/DatePicker` etc. with `<Form.*>` fields, leveraging built-in validation & accessibility.
      • Field validations:
        – `name` (create only), `quota`, `count` → required with localized messages.
      • Expiration-time flow:
        – Default value `null` (no more 1970-01-01).
        – When loading data, convert 0 → null, timestamp → Date.
        – On submit, Date → unix seconds; empty → 0.
      • Responsive grid layout (`Row/Col`) for tidy alignment.
      • Added helpful `showClear` & full-width styling for inputs; quota presets retained.
      • Cleaned unused imports & handlers; fixed linter issues.
      
      RESULT
      The Redemption form now benefits from higher performance, clearer validation, and a cleaner codebase consistent with Semi Design best practices.
      t0ng7u committed
    • refactor(ui/token): migrate EditToken page to Semi Form API and polish UX · 0900f43c
      SUMMARY
      • Re-implemented `EditToken.js` with Semi Form components, eliminating manual state handling and reducing re-renders.
      • Added grid-based layout; “Expiration Time” selector now sits inline with quick-set buttons for consistent alignment on desktop & mobile.
      • Introduced dedicated “Quota”, “Access”, “Model Limits”, and “Group” cards for clearer field grouping.
      • Reworked model-limit interaction: single multi-select list replaces checkbox toggle; backend flag `model_limits_enabled` is now inferred automatically.
      • Applied required validation rules to critical fields (`name`, `remain_quota`, `group`, `expired_time`, `tokenCount`) with localized messages.
      • Enabled dynamic option loading for models & groups; default auto-group honoured.
      • Added unlimited-quota switch, quota presets, and helpful extraText/tooltips.
      • Removed obsolete `handleInputChange` & `setUnlimitedQuota` helpers; formApi now manages all data flow.
      • Cleaned imports (e.g., dropped unused `IconUserGroup`), fixed linter errors, and updated submit logic to use `formApi.submitForm()`.
      
      RESULT
      The token creation/editing experience is faster, more accessible, and easier to maintain, fully aligned with Semi Design best practices.
      t0ng7u committed
    • fix: ratelimit style error · 8d34c572
      tbphp committed
    • 🎨 style: unify card header UI, switch to Avatar icons & remove oversized props · f80eb958
      Summary
      • Replaced gradient header blocks with compact, neutral headers wrapped in `Avatar` across the following pages:
        - Channel / EditChannel.js
        - Channel / EditTagModal.js
        - Redemption / EditRedemption.js
        - Token / EditToken.js
        - User / EditUser.js
        - User / AddUser.js
      
      Details
      1. Added `Avatar` import and substituted raw icon elements, assigning semantic colors (`blue`, `green`, `purple`, `orange`, etc.) and consistent 16 px icons for a cleaner look.
      2. Removed gradient backgrounds, decorative “blur-ball” shapes, and extra paddings from header containers to achieve a tight, flat design.
      3. Stripped all `size="large"` attributes from `Button`, `Input`, `Select`, `DatePicker`, `AutoComplete`, and `Avatar` components, allowing default sizing for better visual density.
      4. Eliminated redundant `bodyStyle` background overrides in some `SideSheet` components.
      5. No business logic touched; all changes are purely presentational.
      
      Result
      The editing and creation dialogs now share a unified, compact style consistent with the latest design language, improving readability and user experience without altering functionality.
      t0ng7u committed
  5. 25 Jun, 2025 8 commits
    • 🔒 style: Hide registration link when Self-Use Mode is enabled · a976d9d3
      • Add conditional rendering (`!status.self_use_mode_enabled`) to LoginForm
      • Suppress “Don't have an account? Register” CTA in self-hosted scenarios
      • Keeps UI clean and prevents unintended user sign-ups under self-use mode
      • No impact on regular multi-user deployments
      t0ng7u committed
    • 🐛 fix(auth): prevent duplicate “session expired” toast on login · 12756671
      Login Form used to display the message “未登录或登录已过期,请重新登录” twice
      because the `useEffect` that inspects the `expired` query parameter was
      re-executed on every re-render (e.g. language change or React StrictMode’s
      double-mount in development).
      
      ### What's changed
      • **LoginForm.js** – `useEffect` that shows the toast now has an empty
        dependency array so it runs only once on initial mount.
      • Reviewed **PasswordResetConfirm.js**, **PasswordResetForm.js** and
        **RegisterForm.js** and confirmed they do not contain the same issue;
        no changes were required.
      
      ### Impact
      Users now see the “session expired” notification exactly once, removing
      confusion and improving the overall UX.
      t0ng7u committed
    • 🐛 fix(auth): restore proper state & context destructuring in Login- and Register-forms · dabd9a9a
      Why
      Clicking the “Continue” button on the login page no longer triggered the submission logic. The issue was introduced when `useState`/`useContext` hooks were destructured incorrectly, breaking the setter reference and omitting required values.
      
      What’s changed
      • **LoginForm.js**
        – Re-added setter in `useSearchParams` (`[searchParams, setSearchParams]`).
        – Corrected order of destructuring for `inputs` so `username`/`password` are available after hooks.
        – Switched `useContext` to `[userState, userDispatch]` for consistency.
      
      • **RegisterForm.js**
        – Adopted `[userState, userDispatch]` from `UserContext` to mirror LoginForm and retain full state access.
      
      Outcome
      Login button now successfully invokes `handleSubmit`, and both auth components have consistent, fully-featured hook destructuring, preventing runtime errors and ensuring future state usage is straightforward.
      t0ng7u committed
    • 💫 feat(ui): introduce dispersed blur-ball background to all auth views · 06b7b595
      This commit refreshes the visual design of the authentication pages and aligns them with the Home banner style.
      
      Details
      • LoginForm.js / RegisterForm.js / PasswordResetForm.js / PasswordResetConfirm.js
        – Wrap top-level container with `relative overflow-hidden` to provide a positioning context.
        – Inject two decorative blur balls:
          ▸ Indigo ball on the top-right (`blur-ball-indigo`).
          ▸ Teal ball on the middle-left (`blur-ball-teal`).
        – Disabled the default X-axis transform on the indigo ball to keep the ball anchored to the corner.
        – Removed redundant `mt-[64px]` from the outer container and shifted it to the inner wrapper to maintain vertical rhythm without affecting the background placement.
      
      Result
      The auth screens now feature subtle, non-intrusive atmospheric gradients in the top-right and mid-left corners, offering a cohesive look & feel across the application without obstructing the main content.
      t0ng7u committed
    • 🐛 fix(auth): prevent initial render flicker & clean up state usage · 8fb5cb66
      • LoginForm / RegisterForm now initialise `status` directly from localStorage,
        avoiding a post-mount state update that caused a UI flash between OAuth
        options and email/username forms.
      
      • Move Turnstile configuration into a dedicated effect that depends on
        `status`, ensuring setState is not called during rendering.
      
      • Remove unused `setStatus` setter to resolve ESLint “declared but never read”
        warnings.
      
      • Minor refactors: reorder hooks, de-duplicate navigate/context variables and
        streamline state destructuring for improved readability.
      t0ng7u committed
    • feat: 优化分页组件 · b206a7c6
      Xiangyuan-liu committed