mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-30 16:23:31 +00:00
92 lines
3.3 KiB
TypeScript
92 lines
3.3 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { computed, ref } from 'vue'
|
|
import adminComplianceAPI, { type AdminComplianceStatus } from '@/api/admin/compliance'
|
|
import { getLocale } from '@/i18n'
|
|
|
|
const FALLBACK_ZH_PHRASE = '我已阅读、理解并同意 Sub2API 部署与运营合规承诺'
|
|
const FALLBACK_EN_PHRASE = 'I have read, understood, and agree to the Sub2API Deployment and Operation Compliance Commitment'
|
|
|
|
export const useAdminComplianceStore = defineStore('adminCompliance', () => {
|
|
const status = ref<AdminComplianceStatus | null>(null)
|
|
const loading = ref(false)
|
|
const submitting = ref(false)
|
|
const initialized = ref(false)
|
|
const forceVisible = ref(false)
|
|
|
|
const required = computed(() => status.value?.required === true)
|
|
const shouldShow = computed(() => required.value || forceVisible.value)
|
|
const currentLocale = computed(() => getLocale())
|
|
const expectedPhrase = computed(() => {
|
|
if (currentLocale.value === 'zh') {
|
|
return status.value?.ack_phrase_zh || FALLBACK_ZH_PHRASE
|
|
}
|
|
return status.value?.ack_phrase_en || FALLBACK_EN_PHRASE
|
|
})
|
|
|
|
async function fetchStatus(): Promise<AdminComplianceStatus> {
|
|
loading.value = true
|
|
try {
|
|
const nextStatus = await adminComplianceAPI.getStatus()
|
|
status.value = nextStatus
|
|
initialized.value = true
|
|
forceVisible.value = nextStatus.required
|
|
return nextStatus
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
async function accept(phrase: string): Promise<AdminComplianceStatus> {
|
|
submitting.value = true
|
|
try {
|
|
const nextStatus = await adminComplianceAPI.accept({
|
|
phrase,
|
|
language: currentLocale.value
|
|
})
|
|
status.value = nextStatus
|
|
forceVisible.value = nextStatus.required
|
|
return nextStatus
|
|
} finally {
|
|
submitting.value = false
|
|
}
|
|
}
|
|
|
|
function requireAcknowledgement(partialStatus?: Partial<AdminComplianceStatus>): void {
|
|
status.value = {
|
|
required: true,
|
|
version: partialStatus?.version || status.value?.version || 'v2026.06.10',
|
|
document_path_zh: partialStatus?.document_path_zh || status.value?.document_path_zh || 'docs/legal/admin-compliance.zh.md',
|
|
document_path_en: partialStatus?.document_path_en || status.value?.document_path_en || 'docs/legal/admin-compliance.en.md',
|
|
document_url_zh: partialStatus?.document_url_zh || status.value?.document_url_zh || 'https://github.com/Wei-Shaw/sub2api/blob/main/docs/legal/admin-compliance.zh.md',
|
|
document_url_en: partialStatus?.document_url_en || status.value?.document_url_en || 'https://github.com/Wei-Shaw/sub2api/blob/main/docs/legal/admin-compliance.en.md',
|
|
ack_phrase_zh: partialStatus?.ack_phrase_zh || status.value?.ack_phrase_zh || FALLBACK_ZH_PHRASE,
|
|
ack_phrase_en: partialStatus?.ack_phrase_en || status.value?.ack_phrase_en || FALLBACK_EN_PHRASE,
|
|
acknowledgement: status.value?.acknowledgement
|
|
}
|
|
initialized.value = true
|
|
forceVisible.value = true
|
|
}
|
|
|
|
function reset(): void {
|
|
status.value = null
|
|
loading.value = false
|
|
submitting.value = false
|
|
initialized.value = false
|
|
forceVisible.value = false
|
|
}
|
|
|
|
return {
|
|
status,
|
|
loading,
|
|
submitting,
|
|
initialized,
|
|
required,
|
|
shouldShow,
|
|
expectedPhrase,
|
|
fetchStatus,
|
|
accept,
|
|
requireAcknowledgement,
|
|
reset
|
|
}
|
|
})
|