import { useCallback, useState } from 'react'
import type { PrivateShare } from './useSiteData'
export function usePrivateShares() {
const [shares, setShares] = useState<Record<string, PrivateShare[]>>({})
const [loading, setLoading] = useState<Record<string, boolean>>({})
const [justCreated, setJustCreated] = useState<{ siteId: string; url: string } | null>(null)
const fetchShares = useCallback(async (siteId: string) => {
setLoading((prev) => ({ ...prev, [siteId]: true }))
try {
const response = await fetch(`/api/user/private-sites/${siteId}/shares`)
const data = await response.json()
setShares((prev) => ({ ...prev, [siteId]: data.shares || [] }))
} catch (err) {
console.error('Failed to fetch share links:', err)
} finally {
setLoading((prev) => ({ ...prev, [siteId]: false }))
}
}, [])
const createShare = useCallback(
async (siteId: string, options: { label?: string; expiryMinutes?: number; audienceDid?: string } = {}) => {
try {
const response = await fetch(`/api/user/private-sites/${siteId}/shares`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(options),
})
const data = await response.json()
if (!data.success) throw new Error(data.error || 'Failed to create share link')
setJustCreated({ siteId, url: data.url })
await fetchShares(siteId)
return data.url as string
} catch (err) {
console.error('Create share error:', err)
alert(`Failed to create share link: ${err instanceof Error ? err.message : 'Unknown error'}`)
return null
}
},
[fetchShares],
)
const revokeShare = useCallback(
async (siteId: string, shareId: string) => {
try {
const response = await fetch(`/api/user/private-sites/${siteId}/shares/${shareId}`, { method: 'DELETE' })
const data = await response.json()
if (!data.success) throw new Error(data.error || 'Failed to revoke share link')
await fetchShares(siteId)
return true
} catch (err) {
console.error('Revoke share error:', err)
alert(`Failed to revoke share link: ${err instanceof Error ? err.message : 'Unknown error'}`)
return false
}
},
[fetchShares],
)
const clearJustCreated = useCallback(() => setJustCreated(null), [])
return { shares, loading, justCreated, fetchShares, createShare, revokeShare, clearJustCreated }
}