69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
import { useState, useEffect } from 'react'
|
||
import { atproto, collections } from '../api/atproto.js'
|
||
import { getApiConfig } from '../utils/pds.js'
|
||
import { env } from '../config/env.js'
|
||
import { getErrorMessage, logError } from '../utils/errorHandler.js'
|
||
|
||
export function useAdminData() {
|
||
const [adminData, setAdminData] = useState({
|
||
did: '',
|
||
profile: null,
|
||
records: [],
|
||
apiConfig: null
|
||
})
|
||
const [langRecords, setLangRecords] = useState([])
|
||
const [commentRecords, setCommentRecords] = useState([])
|
||
const [loading, setLoading] = useState(true)
|
||
const [error, setError] = useState(null)
|
||
const [retryCount, setRetryCount] = useState(0)
|
||
|
||
useEffect(() => {
|
||
loadAdminData()
|
||
}, [])
|
||
|
||
const loadAdminData = async () => {
|
||
try {
|
||
setLoading(true)
|
||
setError(null)
|
||
|
||
const apiConfig = getApiConfig(`https://${env.pds}`)
|
||
const did = await atproto.getDid(env.pds, env.admin)
|
||
const profile = await atproto.getProfile(apiConfig.bsky, did)
|
||
|
||
// Load all data in parallel
|
||
const [records, lang, comment] = await Promise.all([
|
||
collections.getBase(apiConfig.pds, did, env.collection),
|
||
collections.getLang(apiConfig.pds, did, env.collection),
|
||
collections.getComment(apiConfig.pds, did, env.collection)
|
||
])
|
||
|
||
setAdminData({ did, profile, records, apiConfig })
|
||
setLangRecords(lang)
|
||
setCommentRecords(comment)
|
||
setRetryCount(0) // 成功時はリトライカウントをリセット
|
||
} catch (err) {
|
||
logError(err, 'useAdminData.loadAdminData')
|
||
setError(getErrorMessage(err))
|
||
|
||
// 自動リトライ(最大3回)
|
||
if (retryCount < 3) {
|
||
setTimeout(() => {
|
||
setRetryCount(prev => prev + 1)
|
||
loadAdminData()
|
||
}, Math.pow(2, retryCount) * 1000) // 1s, 2s, 4s
|
||
}
|
||
} finally {
|
||
setLoading(false)
|
||
}
|
||
}
|
||
|
||
return {
|
||
adminData,
|
||
langRecords,
|
||
commentRecords,
|
||
loading,
|
||
error,
|
||
retryCount,
|
||
refresh: loadAdminData
|
||
}
|
||
} |