104 lines
4.5 KiB
JavaScript

import React, { useState, useEffect } from 'react';
import { Dialog } from 'primereact/dialog';
import axios from 'axios';
import { useSession } from 'next-auth/react';
import { useToast } from '@/hooks/useToast';
import { InputText } from 'primereact/inputtext';
import { ProgressSpinner } from 'primereact/progressspinner';
import GenericButton from '@/components/buttons/GenericButton';
import useWindowWidth from '@/hooks/useWindowWidth';
const Nip05Form = ({ visible, onHide }) => {
const [isProcessing, setIsProcessing] = useState(false);
const [existingNip05, setExistingNip05] = useState(null);
const [pubkey, setPubkey] = useState('');
const [name, setName] = useState('');
const windowWidth = useWindowWidth();
const { data: session, update } = useSession();
const { showToast } = useToast();
useEffect(() => {
if (session && session?.user && !session?.user?.platformNip05) {
setPubkey(session.user.pubkey || '');
setName(session.user.username || '');
} else if (session && session?.user && session?.user?.platformNip05) {
setExistingNip05(session.user.platformNip05);
setPubkey(session.user.platformNip05.pubkey || '');
setName(session.user.platformNip05.name || '');
}
}, [session]);
const handleNip05 = async () => {
setIsProcessing(true);
try {
let response;
const lowercaseName = name.toLowerCase();
if (existingNip05) {
response = await axios.put(`/api/users/${session.user.id}/nip05`, { pubkey, name: lowercaseName });
} else {
response = await axios.post(`/api/users/${session.user.id}/nip05`, { pubkey, name: lowercaseName });
}
if (!existingNip05 && response.status === 201) {
showToast('success', 'NIP-05 Claimed', 'Your NIP-05 has been claimed');
update();
onHide();
} else if (response.status === 200) {
showToast('success', 'NIP-05 updated', 'Your NIP-05 has been updated');
update();
onHide();
} else {
showToast('error', 'Error updating NIP-05', response.data.error);
}
} catch (error) {
console.error('Error claiming NIP-05:', error);
showToast('error', 'Error claiming NIP-05', error.message);
setIsProcessing(false);
}
};
const deleteNip05 = async () => {
setIsProcessing(true);
try {
const response = await axios.delete(`/api/users/${session.user.id}/nip05`);
if (response.status === 204) {
showToast('success', 'NIP-05 deleted', 'Your NIP-05 has been deleted');
update();
onHide();
} else {
showToast('error', 'Error deleting NIP-05', response.data.error);
}
} catch (error) {
console.error('Error deleting NIP-05:', error);
showToast('error', 'Error deleting NIP-05', error.message);
setIsProcessing(false);
}
};
return (
<Dialog header="NIP-05" visible={visible} onHide={onHide} style={{ width: windowWidth < 768 ? '100vw' : '60vw' }}>
{existingNip05 ? (
<p>Update your Pubkey and Name</p>
) : (
<p>Confirm your Pubkey and Name</p>
)}
<div className="flex flex-col gap-2 max-mob:min-w-[80vw] max-tab:min-w-[60vw] min-w-[40vw]">
<InputText placeholder="Pubkey" value={pubkey} onChange={(e) => setPubkey(e.target.value)} />
<InputText placeholder="Name" value={name} onChange={(e) => setName(e.target.value)} />
</div>
{!existingNip05 && (
<div className="flex flex-row justify-center mt-6">
{isProcessing ? <ProgressSpinner /> : <GenericButton severity="success" outlined className="mx-auto" label='Confirm' onClick={handleNip05} />}
</div>
)}
{existingNip05 && (
<div className="flex flex-row justify-center w-full mt-6 gap-4">
<GenericButton severity="success" outlined className="mx-auto" label="Update" onClick={handleNip05} />
<GenericButton severity="danger" outlined className="mx-auto" label="Delete" onClick={deleteNip05} />
</div>
)}
</Dialog>
);
};
export default Nip05Form;