Files
sub2api/frontend/src/composables/useBatchImageAccess.ts
T

84 lines
2.0 KiB
TypeScript

import { computed, ref } from 'vue'
import { keysAPI } from '@/api/keys'
import { useAuthStore } from '@/stores/auth'
import type { ApiKey } from '@/types'
const loaded = ref(false)
const loading = ref(false)
const hasAllowedBatchImageKey = ref(false)
let pendingLoad: Promise<boolean> | null = null
const pageSize = 100
function keyAllowsBatchImage(key: ApiKey): boolean {
return (
key.status === 'active' &&
key.group?.platform === 'gemini' &&
key.group?.allow_batch_image_generation === true
)
}
async function loadBatchImageAccess(force = false): Promise<boolean> {
const authStore = useAuthStore()
if (!authStore.isAuthenticated) {
loaded.value = true
hasAllowedBatchImageKey.value = false
return false
}
if (loaded.value && !force) {
return hasAllowedBatchImageKey.value
}
if (pendingLoad && !force) {
return pendingLoad
}
loading.value = true
pendingLoad = (async () => {
let page = 1
while (true) {
const response = await keysAPI.list(page, pageSize, {
status: 'active',
sort_by: 'created_at',
sort_order: 'desc'
})
if ((response.items || []).some(keyAllowsBatchImage)) {
hasAllowedBatchImageKey.value = true
loaded.value = true
return true
}
if (page >= response.pages || (response.items || []).length === 0) {
hasAllowedBatchImageKey.value = false
loaded.value = true
return false
}
page += 1
}
})()
.catch(() => {
hasAllowedBatchImageKey.value = false
loaded.value = true
return false
})
.finally(() => {
loading.value = false
pendingLoad = null
})
return pendingLoad
}
export function useBatchImageAccess() {
const canUseBatchImage = computed(() => hasAllowedBatchImageKey.value)
return {
canUseBatchImage,
batchImageAccessLoaded: computed(() => loaded.value),
batchImageAccessLoading: computed(() => loading.value),
refreshBatchImageAccess: loadBatchImageAccess,
}
}