import {useEffect, useState} from 'react' import {Globe, Loader2, RefreshCw, Trash2} from 'lucide-react' import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' import {deleteS3BucketWebsite, getS3BucketWebsite, putS3BucketWebsite} from '@/api/cloudProxyClient' import {useAccountId} from '@/lib/accountStore' import type {CloudResource, S3BucketWebsiteConfiguration} from '@/types/resource' interface S3BucketWebsitePanelProps { resource?: CloudResource runtimeReachable: boolean } export function S3BucketWebsitePanel({resource, runtimeReachable}: S3BucketWebsitePanelProps) { const queryClient = useQueryClient() const accountId = useAccountId() const [mode, setMode] = useState<'index' | 'redirect'>('index') const [indexDocument, setIndexDocument] = useState('index.html') const [errorDocument, setErrorDocument] = useState('') const [hostName, setHostName] = useState('') const [protocol, setProtocol] = useState<'http' | 'https' | ''>('') const [confirmDisable, setConfirmDisable] = useState(false) const queryKey = ['s3-bucket-website', accountId, resource?.id] const websiteQuery = useQuery({ queryKey, queryFn: ({signal}) => getS3BucketWebsite('aws', resource?.id ?? '', signal), enabled: Boolean(resource) && runtimeReachable, }) useEffect(() => { const configuration = websiteQuery.data if (!configuration) { setMode('index') setIndexDocument('index.html') setErrorDocument('') setHostName('') setProtocol('') return } setMode(configuration.mode) if (configuration.mode === 'index') { setIndexDocument(configuration.indexDocument) setErrorDocument(configuration.errorDocument ?? '') } else { setHostName(configuration.hostName) setProtocol(configuration.protocol ?? '') } }, [websiteQuery.data, resource?.id]) const saveMutation = useMutation({ mutationFn: (configuration: S3BucketWebsiteConfiguration) => putS3BucketWebsite('aws', resource?.id ?? '', configuration), onSuccess: () => { void queryClient.invalidateQueries({queryKey}) }, }) const deleteMutation = useMutation({ mutationFn: () => deleteS3BucketWebsite('aws', resource?.id ?? ''), onSuccess: () => { setConfirmDisable(false) void queryClient.setQueryData(queryKey, null) void queryClient.invalidateQueries({queryKey}) }, }) if (!resource || resource.service !== 'storage' || resource.type !== 'bucket') return null const endpoint = `http://${resource.name}.s3-website-${resource.region ?? 'us-east-1'}.localhost:4566` const configuration = mode === 'index' ? {mode, indexDocument: indexDocument.trim(), errorDocument: errorDocument.trim() || null} : {mode, hostName: hostName.trim(), protocol: protocol || null} const canSave = !saveMutation.isPending && (mode === 'index' ? Boolean(configuration.indexDocument) : Boolean(configuration.hostName)) return

Static website hosting

{websiteQuery.data ? 'Enabled' : 'Not configured'}

Website endpoint: {endpoint}

{websiteQuery.isLoading &&

Loading website configuration...

} {websiteQuery.isError &&

{websiteQuery.error instanceof Error ? websiteQuery.error.message : 'Unable to load website configuration.'}

}
{ event.preventDefault() if (canSave) saveMutation.mutate(configuration) }}> {mode === 'index' ? <> : <> }
{saveMutation.isError &&

{saveMutation.error instanceof Error ? saveMutation.error.message : 'Unable to save website configuration.'}

} {websiteQuery.data && (confirmDisable ?
Disable static website hosting?
: )} {deleteMutation.isError &&

{deleteMutation.error instanceof Error ? deleteMutation.error.message : 'Unable to disable website hosting.'}

}
}