Merge branch 'main' of github.com:QuantumNous/new-api

This commit is contained in:
CaIon
2026-05-12 16:24:00 +08:00
6 changed files with 103 additions and 33 deletions
@@ -16,11 +16,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
For commercial licensing, please contact support@quantumnous.com
*/
import { useMemo } from 'react'
import { useQuery } from '@tanstack/react-query'
import { type ColumnDef } from '@tanstack/react-table'
import { useTranslation } from 'react-i18next'
import { useAuthStore } from '@/stores/auth-store'
import { getUserGroups } from '@/lib/api'
import { formatQuota, formatTimestampToDate } from '@/lib/format'
import { cn } from '@/lib/utils'
@@ -34,7 +32,6 @@ import {
import { DataTableColumnHeader } from '@/components/data-table'
import { GroupBadge } from '@/components/group-badge'
import { StatusBadge } from '@/components/status-badge'
import { getSystemOptions } from '@/features/system-settings/api'
import { API_KEY_STATUSES } from '../constants'
import { type ApiKey } from '../types'
import {
@@ -51,31 +48,9 @@ function getQuotaProgressColor(percentage: number): string {
}
function useGroupRatios(): Record<string, number> {
const isAdmin = useAuthStore((s) =>
Boolean(s.auth.user?.role && s.auth.user.role >= 10)
)
const { data: adminData } = useQuery({
queryKey: ['system-options-group-ratio'],
queryFn: getSystemOptions,
enabled: isAdmin,
staleTime: 5 * 60 * 1000,
select: (res) => {
if (!res.success || !res.data) return {}
const option = res.data.find((o) => o.key === 'GroupRatio')
if (!option?.value) return {}
try {
return JSON.parse(option.value) as Record<string, number>
} catch {
return {}
}
},
})
const { data: userGroupsData } = useQuery({
const { data } = useQuery({
queryKey: ['user-self-groups'],
queryFn: getUserGroups,
enabled: !isAdmin,
staleTime: 5 * 60 * 1000,
select: (res) => {
if (!res.success || !res.data) return {}
@@ -89,10 +64,7 @@ function useGroupRatios(): Record<string, number> {
},
})
return useMemo(
() => (isAdmin ? adminData : userGroupsData) ?? {},
[isAdmin, adminData, userGroupsData]
)
return data ?? {}
}
export function useApiKeysColumns(): ColumnDef<ApiKey>[] {
+6 -2
View File
@@ -88,8 +88,12 @@ export function loadMessages(): Message[] | null {
try {
const saved = localStorage.getItem(STORAGE_KEYS.MESSAGES)
if (saved) {
const parsed: Message[] = JSON.parse(saved)
const sanitized = sanitizeMessagesOnLoad(parsed)
const parsed: unknown = JSON.parse(saved)
if (!Array.isArray(parsed)) {
localStorage.removeItem(STORAGE_KEYS.MESSAGES)
return null
}
const sanitized = sanitizeMessagesOnLoad(parsed as Message[])
// Persist sanitized result to avoid re-sanitizing on subsequent loads
if (sanitized !== parsed) {
saveMessages(sanitized)