- 15 Jul, 2025 3 commits
-
-
📱 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 -
🚀 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 -
🐛 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
-
- 14 Jul, 2025 9 commits
-
-
⚽ t0ng7u committed -
✨ - Add greetingVisible state to control animation trigger - Implement fade-in effect with 1-second smooth transition - Set 100ms delay before animation starts - Apply opacity transition from 0 to 1 using ease-in-out timing - Enhance user experience with smooth visual feedback on page load The greeting message now appears with an elegant fade-in animation, transitioning from transparent to fully visible over 1 second, providing better visual appeal and user engagement.
t0ng7u committed -
✨ - Fix uptime service card bottom spacing by removing flex layout - Replace IconRotate with IconSend for request count to better represent semantic meaning - Add skeleton loading placeholders for all dashboard statistics with 500ms minimum duration - Unify avgRPM and avgTPM calculation with consistent NaN handling - Standardize skeleton usage across HeaderBar and Detail components with active animations - Remove unnecessary empty wrapper elements in skeleton implementations - Remove gradient styling from system name in header The changes improve user experience with consistent loading states, better semantic icons, and eliminate visual layout issues in the dashboard cards.
t0ng7u committed -
💄 - Remove flex layout from uptime service card to eliminate bottom spacing - Remove flex-1 and mt-auto classes that caused unnecessary stretching - Replace IconRotate with IconSend for request count to better represent the semantic meaning - Legend now sits directly below content instead of being pushed to bottom Fixes the visual issue where uptime service availability card had unwanted white space at the bottom when content was minimal.
t0ng7u committed -
Xyfacai committed
-
✨ Add a dedicated backend endpoint to clone an existing channel (including its key) and replace all previous front-end cloning logic with a single API call. Backend • controller/channel.go – add CopyChannel: safely clone a channel, reset balance/usage, append name suffix, preserve key, create abilities, return new ID. – supports optional query params: `suffix`, `reset_balance`. • router/api-router.go – register POST /api/channel/copy/:id (secured by AdminAuth). • model interaction uses BatchInsertChannels to ensure transactional integrity. Frontend • ChannelsTable.js – simplify copySelectedChannel: call /api/channel/copy/{id} and refresh list. – remove complex field-manipulation & key-fetching logic. – improved error handling. Security & stability • All cloning done server-side; sensitive key never exposed to client. • Route inherits existing admin middleware. • Graceful JSON responses with detailed error messages.t0ng7u committed -
🚀 * Added an “Jump” (`ExternalLink`) tag to each API entry that opens the URL in a new tab * Placed “Speed Test” and “Jump” tags on the same line as the route * Route is left-aligned; tags are right-aligned and wrap to next line when space is insufficient * Inserted `<Divider />` between API items to improve visual separation * Tweaked flex gaps and utility classes for consistent spacing and readability
t0ng7u committed -
🍎 t0ng7u committed -
🐛 * Refactored the render logic of the **Channel** column * Wrapped tooltip around the first `Tag` only to restore hover behavior when multi-key mode is enabled * Added i18n-friendly fallback (`t('未知渠道')`) for cases where `channel_name` is missing * Improves user experience for administrators by reliably showing channel names even with multiple keyst0ng7u committed
-
- 13 Jul, 2025 12 commits
-
-
🎨 t0ng7u committed -
🎨 Summary • Added visual model icons to dropdown options in both Token (`EditToken.js`) and Channel (`EditChannel.js`) editors. Details 1. Token Editor - Imported `getModelCategories` from helpers. - Re-built Model Limits option list to prepend the matching icon to each model label. 2. Channel Editor - Imported `getModelCategories`. - Extended model‐option construction to include icons, unifying behaviour with Token editor. - Maintained existing logic for merging origin options and user-selected models. Benefits • Provides immediate visual identification of model vendors. • Aligns UX with existing icon usage across the application, improving consistency and clarity. • No functional changes to data handling; purely UI/UX enhancement. Co-authored-by: [Your Name]
t0ng7u committed -
💄 Summary • Re-architect the status column to embed quota information directly inside the Tag suffix. • Consolidate rendering logic for clearer structure and easier maintenance. Details • Moved the quota Progress bar under the remaining / total text, inside `quotaSuffix`. • Added “Unlimited” label for tokens with `unlimited_quota`; hides Progress and Tooltip in this case. • Tightened vertical spacing with a flex container (`gap-[2px]`, `leading-none`) and removed extra wrappers; Progress now has zero top/bottom margin and full-width style. • Refactored variables: – Replaced `tagNode/bodyContent` with a single `content` node. – Wrapped `content` with Tooltip only when quota is limited. • Visual tweaks: – Applied `size='large'` to the Tag for better alignment. – Ensured consistent color via shared `getProgressColor`. • Deleted obsolete comments and redundant code. Result Improves readability of the component and delivers a cleaner, more compact quota display.
t0ng7u committed -
🔍 Changes: • `Form.Select` for “Model Limits” now supports in-dropdown searching (`filter` + `searchPosition='dropdown'`) enabling quick model lookup. • Removed `maxTagCount` to display all selected models without truncation. Benefit: simplifies selecting specific models when the list is large, improving usability during token creation/editing.
t0ng7u committed -
🎨 Improves the “Balance” column in `TokensTable`: • Re-styled progress bar: wider container (`w-[140px]`) and `showInfo` enabled to display percentage label. • Added `format={() => \`\${percent}%\`}` for precise percentage feedback. • Maintains dynamic color mapping (success / warning / danger) for clarity. Result: clearer, more informative visual representation of remaining token quota.t0ng7u committed -
🔄 Includes ChannelsTable, RedemptionsTable and UsersTable: • Refactor `refresh(page = activePage)` in all three tables so data reloads the requested (or current) page instead of forcing page 1. • On single-row deletion (and bulk deletion in ChannelsTable): – Refresh current page immediately. – If the refreshed page has no data and `activePage > 1`, automatically load the previous page to avoid blank views. • RedemptionsTable: corrected prior bug where `refresh` used `activePage - 1`. • Misc: removed outdated inline comments and aligned search / reset flows. Result: smoother UX—users stay on their working page, and pagination gracefully adjusts after deletions.
t0ng7u committed -
✨ Adds UI fallback in TokensTable “Available Models” column: • Tracks models already matched to a known vendor icon. • Collects unmatched models and renders a neutral “Other” avatar (labelled via `t('其他')`) with a tooltip listing the model names. • Removes previous generic fallback so every model is now either vendor-specific or grouped under “Other”. This improves clarity for users by explicitly indicating models from unrecognized providers rather than leaving them unlabelled.t0ng7u committed -
CaIon committed
-
🔄 - Included the `bun.lock` file in the Dockerfile to ensure consistent dependency installation during the build process.
CaIon committed -
🔄 - Updated `@astrojs/compiler`, `@babel/code-frame`, `@babel/compat-data`, `@babel/core`, `@babel/generator`, `@babel/helper-compilation-targets`, `@babel/helper-define-polyfill-provider`, `@babel/helper-module-imports`, `@babel/helper-module-transforms`, `@babel/plugin-transform-runtime`, `@babel/runtime`, and other related packages to earlier versions to ensure compatibility and stability. - Adjusted various dependencies within the `bun.lock` file to reflect these changes.
CaIon committed -
✨ - Introduced a new `bun.lock` file to track project dependencies and their versions. - Deleted the outdated `bun.lockb` file to streamline dependency management.
CaIon committed -
🔄 CaIon committed
-
- 12 Jul, 2025 10 commits
-
-
🎨 • Display remaining-quota percentage instead of used-quota in the Progress indicator - 100 % when quota is untouched, shown in green - Warn at ≤ 30 % (yellow) and at ≤ 10 % (red) - Hide internal label (`showInfo={false}`) and move the percentage text into the Tooltip - Switch Progress `size` to `small` for a lighter visual footprint • Update Tooltip to list used, remaining, total quota and the new percentage value • Uniformly set `size="small"` on all header Buttons and Form inputs within the table — enhances readability and keeps the main content centered UI/UX improvement only; no backend logic affected.t0ng7u committed -
🚑 Backend • `types/error.go` – Return empty string when receiver itself is `nil`. – If `Err` is `nil`, fall back to `errorCode` string to avoid calling `nil.Error()`. This prevents runtime panics when the error handler builds an OpenAI-style error response but the underlying `Err` field has not been set.
t0ng7u committed -
🐛 Backend • `model/channel.go` – On multi-key channel updates, recalculate `MultiKeySize` from the current key list. – If the request omits `key`, fetch existing keys from DB to avoid resetting the count to `0/0`. – Remove out-of-range entries from `MultiKeyStatusList` to keep data consistent. Frontend • `web/src/pages/Channel/EditChannel.js` – Vertex AI channels no longer require re-uploading a key file in edit mode. – When no new key is provided during editing, exclude the `key` field from the payload to prevent overwriting the stored value. These changes ensure that editing a channel no longer zeroes out the enabled key counter and that Vertex AI channels can be modified without mandatory key re-submission.
t0ng7u committed -
🐛 1. Recalculate `ChannelInfo.MultiKeySize` based on the current key list when a multi-key channel is updated. 2. Purge any indexes in `MultiKeyStatusList` that exceed the new key count to avoid stale or out-of-range data. This ensures the front-end display (`enabled x/x`) always reflects the real number of keys after users add or remove keys in edit mode.
t0ng7u committed -
# Conflicts: # web/src/components/table/LogsTable.js # web/src/i18n/locales/en.json # web/src/pages/Channel/EditChannel.js
t0ng7u committed -
✨ CaIon committed -
✨ CaIon committed -
feat: support xAI-search
Calcium-Ion committed -
✨ CaIon committed -
✨ CaIon committed
-
- 11 Jul, 2025 6 commits
-
-
🎨 The background utility class `bg-semi-color-bg-2` was unnecessary after recent design adjustments and unintentionally overrode intended styles. Removing it cleans up the markup and allows the footer to inherit the correct background from its parent containers. File affected: - web/src/components/layout/Footer.js Closes #1354
t0ng7u committed -
🐛 Previously, the tooltip that appears when more than one IP address is configured skipped the second IP (`ips.slice(2)`), so users could not see it unless they expanded the list in another way. Changed the slice start index to `1`, ensuring that **every IP after the first display tag** is included in the tooltip (`ips.slice(1).join(', ')`). File affected: - web/src/components/table/TokensTable.jst0ng7u committed -
⏱ Add custom validator to the `expired_time` DatePicker in `EditToken.js` to ensure that selected expiration timestamps are strictly in the future. - Introduce Promise-based validator that: • Rejects invalid date formats with a clear error message • Prevents past or current dates and shows “Expiration time cannot be earlier than the current time!” - Keeps support for the special “never expires” value (-1) - Blocks form submission until a valid future datetime is provided This change prevents accidental creation of already expired tokens and improves overall robustness of token management.
t0ng7u committed -
🎨 This commit overhauls the `TokensTable` component to deliver a cleaner, more intuitive experience. Key changes 1. Quota • Merged “Used” & “Remaining” into a single “Quota” column. • Uses a circular `Progress` with %-label; full details shown on tooltip. 2. Status • Tag now embeds a small `Switch` (prefixIcon) to enable/disable a token in-place. • Removed enable/disable actions from the old dropdown. 3. Columns & layout • Added dedicated “Group” column (moved from Status). • Added “Key” column: – Read-only `Input` styled like Home page base-URL field. – Masked value (`sk-abc********xyz`) by default. – Eye button toggles reveal/hide; Copy button copies full key (without modal). • Dropped “More” menu; Delete is now a direct button in the action area. 4. Model limits • Shows vendor icons inside an `AvatarGroup`; tooltip lists the exact models. 5. IP restriction • Displays first IP, extra count as “+N” Tag with tooltip. • Unlimited shows white Tag. 6. Cleanup / misc. • Removed unused helpers (`getQuotaPerUnit`), icons (`IconMore`, eye/copy duplicates, etc.). • Replaced legacy modal view of key with inline input behaviour. • Tweaked paddings, themes, sizes to align with design system. BREAKING CHANGE: Table column order & names have changed; update any tests or docs referencing the old structure.t0ng7u committed -
RedwindA committed
-
RedwindA committed
-