84 lines
2.0 KiB
TypeScript
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,
|
|
}
|
|
}
|