You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
import { Button } from '@/components/ui/button' |
|
import { createRelayListDraftEvent } from '@/lib/draft-event' |
|
import { showPublishingFeedback, showSimplePublishSuccess, showPublishingError } from '@/lib/publishing-feedback' |
|
import { useNostr } from '@/providers/NostrProvider' |
|
import { TMailboxRelay } from '@/types' |
|
import { CloudUpload, Loader } from 'lucide-react' |
|
import { useState } from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import logger from '@/lib/logger' |
|
|
|
export default function SaveButton({ |
|
mailboxRelays, |
|
hasChange, |
|
setHasChange |
|
}: { |
|
mailboxRelays: TMailboxRelay[] |
|
hasChange: boolean |
|
setHasChange: (hasChange: boolean) => void |
|
}) { |
|
const { t } = useTranslation() |
|
const { pubkey, publish, updateRelayListEvent } = useNostr() |
|
const [pushing, setPushing] = useState(false) |
|
|
|
const save = async () => { |
|
if (!pubkey) return |
|
|
|
setPushing(true) |
|
try { |
|
const event = createRelayListDraftEvent(mailboxRelays) |
|
const result = await publish(event) |
|
|
|
// Read relayStatuses immediately before it might be deleted |
|
const relayStatuses = (result as any).relayStatuses |
|
|
|
await updateRelayListEvent(result) |
|
setHasChange(false) |
|
|
|
// Show publishing feedback |
|
if (relayStatuses && relayStatuses.length > 0) { |
|
showPublishingFeedback({ |
|
success: true, |
|
relayStatuses: relayStatuses, |
|
successCount: relayStatuses.filter((s: any) => s.success).length, |
|
totalCount: relayStatuses.length |
|
}, { |
|
message: t('Mailbox relays saved'), |
|
duration: 6000 |
|
}) |
|
} else { |
|
showSimplePublishSuccess(t('Mailbox relays saved')) |
|
} |
|
} catch (error) { |
|
logger.error('Failed to save relay list', { error }) |
|
// Show error feedback with relay statuses if available |
|
if (error instanceof Error && (error as any).relayStatuses) { |
|
const errorRelayStatuses = (error as any).relayStatuses |
|
showPublishingFeedback({ |
|
success: false, |
|
relayStatuses: errorRelayStatuses, |
|
successCount: errorRelayStatuses.filter((s: any) => s.success).length, |
|
totalCount: errorRelayStatuses.length |
|
}, { |
|
message: error.message || t('Failed to save relay list'), |
|
duration: 6000 |
|
}) |
|
} else { |
|
showPublishingError(error instanceof Error ? error : new Error(t('Failed to save relay list'))) |
|
} |
|
} finally { |
|
setPushing(false) |
|
} |
|
} |
|
|
|
return ( |
|
<Button className="w-full" disabled={!pubkey || pushing || !hasChange} onClick={save}> |
|
{pushing ? <Loader className="animate-spin" /> : <CloudUpload />} |
|
{t('Save')} |
|
</Button> |
|
) |
|
}
|
|
|