mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-05 08:42:02 +00:00
Fix bitcoin connect init bug, fix resource fetching and publishing flows in useNostr, added delete for drafts
This commit is contained in:
parent
a9a443fed1
commit
ff0a0facaf
@ -9,21 +9,24 @@ const Button = dynamic(
|
||||
}
|
||||
);
|
||||
|
||||
const BitcoinConnectButton = () => {
|
||||
let initialized = false;
|
||||
|
||||
useEffect(() => {
|
||||
const initializeBitcoinConnect = async () => {
|
||||
// Initialize Bitcoin Connect
|
||||
export async function initializeBitcoinConnect() {
|
||||
if (!initialized) {
|
||||
const { init } = await import('@getalby/bitcoin-connect-react');
|
||||
init({
|
||||
appName: "PlebDevs",
|
||||
filters: ["nwc"],
|
||||
showBalance: false
|
||||
});
|
||||
};
|
||||
initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
const BitcoinConnectButton = () => {
|
||||
useEffect(() => {
|
||||
initializeBitcoinConnect();
|
||||
}, []); // Empty dependency array to run only once on component mount
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Button onConnect={(provider) => {
|
||||
|
@ -3,6 +3,8 @@ import axios from 'axios';
|
||||
import { nip57, nip19 } from 'nostr-tools';
|
||||
import { NostrContext } from '@/context/NostrContext';
|
||||
import { lnurlEncode } from '@/utils/lnurl';
|
||||
import { parseEvent } from '@/utils/nostr';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
const defaultRelays = [
|
||||
"wss://nos.lol/",
|
||||
@ -340,37 +342,36 @@ export function useNostr() {
|
||||
const filter = [{ kinds: [30023, 30402], authors: [AUTHOR_PUBKEY] }];
|
||||
const hasRequiredTags = (tags) => {
|
||||
const hasPlebDevs = tags.some(([tag, value]) => tag === "t" && value === "plebdevs");
|
||||
// Check if 'resource' tag exists
|
||||
const hasResource = tags.some(([tag, value]) => tag === "t" && value === "resource");
|
||||
// Return true if both tags exist
|
||||
return hasPlebDevs && hasResource;
|
||||
};
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let resources = [];
|
||||
|
||||
const subscription = subscribe(
|
||||
filter,
|
||||
{
|
||||
onevent: (event) => {
|
||||
if (hasRequiredTags(event.tags)) {
|
||||
console.log('event:', event);
|
||||
resources.push(event);
|
||||
}
|
||||
},
|
||||
onerror: (error) => {
|
||||
console.error('Error fetching resources:', error);
|
||||
subscription?.close();
|
||||
resolve(resources);
|
||||
// Don't resolve here, just log the error
|
||||
},
|
||||
onclose: () => {
|
||||
resolve(resources);
|
||||
// Don't resolve here either
|
||||
},
|
||||
},
|
||||
2000 // Adjust the timeout value as needed
|
||||
);
|
||||
|
||||
// Set a timeout to resolve the promise after collecting events
|
||||
setTimeout(() => {
|
||||
subscription?.close();
|
||||
console.log('Resolving with resources:', resources);
|
||||
resolve(resources);
|
||||
}, 2000); // Adjust the timeout value as needed
|
||||
});
|
||||
@ -378,32 +379,33 @@ export function useNostr() {
|
||||
|
||||
const fetchWorkshops = useCallback(async () => {
|
||||
const filter = [{ kinds: [30023, 30402], authors: [AUTHOR_PUBKEY] }];
|
||||
console.log('filter:', filter);
|
||||
const hasRequiredTags = (tags) => {
|
||||
const hasPlebDevs = tags.some(([tag, value]) => tag === "t" && value === "plebdevs");
|
||||
|
||||
const hasWorkshop = tags.some(([tag, value]) => tag === "t" && value === "workshop");
|
||||
|
||||
return hasPlebDevs && hasWorkshop;
|
||||
};
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let workshops = [];
|
||||
|
||||
const subscription = subscribe(
|
||||
filter,
|
||||
{
|
||||
onevent: (event) => {
|
||||
console.log('Received workshop event:', event);
|
||||
if (hasRequiredTags(event.tags)) {
|
||||
console.log('Workshop event passed tag check, adding to workshops');
|
||||
workshops.push(event);
|
||||
} else {
|
||||
console.log('Workshop event did not pass tag check');
|
||||
}
|
||||
},
|
||||
onerror: (error) => {
|
||||
console.error('Error fetching workshops:', error);
|
||||
subscription?.close();
|
||||
resolve(workshops);
|
||||
// Don't resolve here, just log the error
|
||||
},
|
||||
onclose: () => {
|
||||
resolve(workshops);
|
||||
// Don't resolve here either
|
||||
},
|
||||
},
|
||||
2000 // Adjust the timeout value as needed
|
||||
@ -411,6 +413,7 @@ export function useNostr() {
|
||||
|
||||
setTimeout(() => {
|
||||
subscription?.close();
|
||||
console.log('Resolving with workshops:', workshops);
|
||||
resolve(workshops);
|
||||
}, 2000); // Adjust the timeout value as needed
|
||||
});
|
||||
@ -420,30 +423,30 @@ export function useNostr() {
|
||||
const filter = [{ kinds: [30023], authors: [AUTHOR_PUBKEY] }];
|
||||
const hasRequiredTags = (tags) => {
|
||||
const hasPlebDevs = tags.some(([tag, value]) => tag === "t" && value === "plebdevs");
|
||||
|
||||
const hasCourse = tags.some(([tag, value]) => tag === "t" && value === "course");
|
||||
|
||||
return hasPlebDevs && hasCourse;
|
||||
};
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let courses = [];
|
||||
|
||||
const subscription = subscribe(
|
||||
filter,
|
||||
{
|
||||
onevent: (event) => {
|
||||
console.log('Received course event:', event);
|
||||
if (hasRequiredTags(event.tags)) {
|
||||
console.log('Course event passed tag check, adding to courses');
|
||||
courses.push(event);
|
||||
} else {
|
||||
console.log('Course event did not pass tag check');
|
||||
}
|
||||
},
|
||||
onerror: (error) => {
|
||||
console.error('Error fetching courses:', error);
|
||||
subscription?.close();
|
||||
resolve(courses);
|
||||
// Don't resolve here, just log the error
|
||||
},
|
||||
onclose: () => {
|
||||
resolve(courses);
|
||||
// Don't resolve here either
|
||||
},
|
||||
},
|
||||
2000 // Adjust the timeout value as needed
|
||||
@ -451,6 +454,7 @@ export function useNostr() {
|
||||
|
||||
setTimeout(() => {
|
||||
subscription?.close();
|
||||
console.log('Resolving with courses:', courses);
|
||||
resolve(courses);
|
||||
}, 2000); // Adjust the timeout value as needed
|
||||
});
|
||||
@ -467,7 +471,11 @@ export function useNostr() {
|
||||
const userId = JSON.parse(user).id;
|
||||
|
||||
const payload = {
|
||||
|
||||
id: uuidv4(),
|
||||
user: {
|
||||
connect: { id: userId } // This is the correct way to connect to an existing user
|
||||
},
|
||||
noteId: id
|
||||
};
|
||||
|
||||
if (payload && payload.user) {
|
||||
@ -475,17 +483,8 @@ export function useNostr() {
|
||||
const response = await axios.post('/api/resources', payload);
|
||||
|
||||
if (response.status === 201) {
|
||||
try {
|
||||
const deleteResponse = await axios.delete(`/api/drafts/${resourceEvent.id}`);
|
||||
|
||||
if (deleteResponse.status === 204) {
|
||||
return true;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error deleting draft:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error creating resource:', error);
|
||||
return false;
|
||||
|
@ -72,12 +72,44 @@ export default function Details() {
|
||||
const { unsignedEvent, type } = await buildEvent(draft);
|
||||
|
||||
if (unsignedEvent) {
|
||||
await publishEvent(unsignedEvent, type);
|
||||
const published = await publishEvent(unsignedEvent, type);
|
||||
// if successful, delete the draft, redirect to profile
|
||||
if (published) {
|
||||
axios.delete(`/api/drafts/${draft.id}`)
|
||||
.then(res => {
|
||||
if (res.status === 204) {
|
||||
showToast('success', 'Success', 'Draft deleted successfully.');
|
||||
router.push(`/profile`);
|
||||
} else {
|
||||
showToast('error', 'Error', 'Failed to delete draft.');
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
} else {
|
||||
showToast('error', 'Error', 'Failed to broadcast resource. Please try again.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
if (draft) {
|
||||
await axios.delete(`/api/drafts/${draft.id}`)
|
||||
.then(res => {
|
||||
if (res.status === 204) {
|
||||
showToast('success', 'Success', 'Draft deleted successfully.');
|
||||
router.push(`/profile`);
|
||||
} else {
|
||||
showToast('error', 'Error', 'Failed to delete draft.');
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const publishEvent = async (event, type) => {
|
||||
const dTag = event.tags.find(tag => tag[0] === 'd')[1];
|
||||
@ -127,6 +159,8 @@ export default function Details() {
|
||||
published = await publishCourse(signedEvent);
|
||||
}
|
||||
|
||||
console.log('published:', published);
|
||||
|
||||
if (published) {
|
||||
// check if the event is published
|
||||
const publishedEvent = await fetchSingleEvent(signedEvent.id);
|
||||
@ -137,6 +171,7 @@ export default function Details() {
|
||||
// show success message
|
||||
showToast('success', 'Success', `${type} published successfully.`);
|
||||
// delete the draft
|
||||
console.log('draft:', draft);
|
||||
await axios.delete(`/api/drafts/${draft.id}`)
|
||||
.then(res => {
|
||||
if (res.status === 204) {
|
||||
@ -281,9 +316,10 @@ export default function Details() {
|
||||
</div>
|
||||
</div>
|
||||
<div className='w-[75vw] mx-auto flex flex-row justify-end mt-12'>
|
||||
<div className='w-[15vw] flex flex-row justify-between'>
|
||||
<Button onClick={() => router.push(`/draft/${draft?.id}/edit`)} label="Edit" severity='warning' outlined className="w-auto my-2" />
|
||||
<Button onClick={handleSubmit} label="Publish" severity='success' outlined className="w-auto my-2" />
|
||||
<div className='w-fit flex flex-row justify-between'>
|
||||
<Button onClick={handleSubmit} label="Publish" severity='success' outlined className="w-auto m-2" />
|
||||
<Button onClick={() => router.push(`/draft/${draft?.id}/edit`)} label="Edit" severity='warning' outlined className="w-auto m-2" />
|
||||
<Button onClick={handleDelete} label="Delete" severity='danger' outlined className="w-auto m-2 mr-0" />
|
||||
</div>
|
||||
</div>
|
||||
<div className='w-[75vw] mx-auto mt-12 p-12 border-t-2 border-gray-300 max-tab:p-0 max-mob:p-0 max-tab:max-w-[100vw] max-mob:max-w-[100vw]'>
|
||||
|
Loading…
x
Reference in New Issue
Block a user