working locally
This commit is contained in:
parent
4a35a785a7
commit
e3364bb86c
@ -64,7 +64,7 @@ export default function FeaturedLists() {
|
||||
</SectionHeader>
|
||||
<SectionContent className="sm:md-feed-cols relative flex flex-col gap-3">
|
||||
{processedEvents.map((e) => (
|
||||
<Link href={`/list/${e.encode()}`}>
|
||||
<Link key={e.id} href={`/list/${e.encode()}`}>
|
||||
<ListCard key={e.id} event={e} />
|
||||
</Link>
|
||||
))}
|
||||
|
@ -15,6 +15,7 @@ import {
|
||||
type NDKList,
|
||||
} from "@nostr-dev-kit/ndk";
|
||||
import { useNDK } from "../ndk";
|
||||
import { log } from "@/lib/utils";
|
||||
|
||||
export type SignerStoreItem = {
|
||||
signer: NDKPrivateKeySigner;
|
||||
@ -67,15 +68,19 @@ export default function SignerProvider({
|
||||
}
|
||||
|
||||
async function getSigner(list: NDKList): Promise<SignerStoreItem> {
|
||||
log("func", "getSigner");
|
||||
const id = list.encode();
|
||||
log("info", "list ID", id.toString());
|
||||
let item = signers.get(id);
|
||||
if (item) return item;
|
||||
log("info", "NO local signer");
|
||||
|
||||
let signer = await findEphemeralSigner(ndk!, ndk!.signer!, {
|
||||
associatedEventNip19: list.encode(),
|
||||
});
|
||||
|
||||
if (signer) {
|
||||
console.log(`found a signer for list ${list.title}`);
|
||||
log("info", `found a signer for list ${list.title}`, signer.toString());
|
||||
item = {
|
||||
signer: signer!,
|
||||
user: await signer.user(),
|
||||
@ -83,9 +88,9 @@ export default function SignerProvider({
|
||||
id,
|
||||
};
|
||||
} else {
|
||||
console.log(`no signer found for list ${list.title}`);
|
||||
log("info", `no signer found for list ${list.title}`);
|
||||
signer = NDKPrivateKeySigner.generate();
|
||||
console.log(`Signer generated ${JSON.stringify(signer)}`);
|
||||
log("info", "generated signer", signer.toString());
|
||||
item = {
|
||||
signer,
|
||||
user: await signer.user(),
|
||||
|
@ -13,6 +13,7 @@ import { getTagValues } from "@/lib/nostr/utils";
|
||||
import { NDKList } from "@nostr-dev-kit/ndk";
|
||||
import { saveEphemeralSigner } from "@/lib/actions/ephemeral";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { log } from "@/lib/utils";
|
||||
|
||||
const CreateListSchema = z.object({
|
||||
title: z.string(),
|
||||
@ -32,6 +33,7 @@ export default function CreateList() {
|
||||
const { currentUser, updateUser } = useCurrentUser();
|
||||
const { ndk } = useNDK();
|
||||
const { getSigner } = useSigner()!;
|
||||
|
||||
async function handleSubmit(data: CreateListType) {
|
||||
setIsLoading(true);
|
||||
const random = randomId();
|
||||
@ -60,7 +62,6 @@ export default function CreateList() {
|
||||
kind: 30001,
|
||||
tags: tags,
|
||||
});
|
||||
console.log("EVENT Created", event);
|
||||
if (event && getTagValues("subscriptions", event.tags)) {
|
||||
await getSigner(new NDKList(ndk, event.rawEvent()))
|
||||
.then((delegateSigner) =>
|
||||
@ -75,7 +76,9 @@ export default function CreateList() {
|
||||
}),
|
||||
)
|
||||
.then(
|
||||
(savedSigner) => savedSigner,
|
||||
(savedSigner) => {
|
||||
log("info", "savedSigner", savedSigner.toString());
|
||||
},
|
||||
// updateList(ndk!, event.rawEvent(), [
|
||||
// ["delegate", savedSigner.hexpubkey],
|
||||
// ]),
|
||||
|
@ -126,7 +126,6 @@ export default function ShortTextNoteModal() {
|
||||
slug: "list",
|
||||
options: lists
|
||||
.map((l) => {
|
||||
console.log("MApping", l);
|
||||
const title =
|
||||
getTagValues("title", l.tags) ??
|
||||
getTagValues("name", l.tags) ??
|
||||
|
@ -10,6 +10,7 @@ import NDK, {
|
||||
import { generateRandomString, encryptMessage, randomId } from "@/lib/nostr";
|
||||
import { unixTimeNowInSeconds } from "@/lib/nostr/dates";
|
||||
import { getTagsValues } from "@/lib/nostr/utils";
|
||||
import { log } from "@/lib/utils";
|
||||
|
||||
export async function createEvent(
|
||||
ndk: NDK,
|
||||
@ -19,6 +20,7 @@ export async function createEvent(
|
||||
tags: string[][];
|
||||
},
|
||||
) {
|
||||
log("func", "createEvent");
|
||||
try {
|
||||
const pubkey = await window.nostr?.getPublicKey();
|
||||
if (!pubkey || !window.nostr) {
|
||||
@ -29,14 +31,11 @@ export async function createEvent(
|
||||
pubkey,
|
||||
created_at: unixTimeNowInSeconds(),
|
||||
} as NostrEvent);
|
||||
console.log("eventToPublish ", eventToPublish);
|
||||
|
||||
const signed = await eventToPublish.sign();
|
||||
console.log("signed", signed);
|
||||
await eventToPublish.sign();
|
||||
await eventToPublish.publish();
|
||||
return eventToPublish;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
log("error", err);
|
||||
alert("An error has occured");
|
||||
return false;
|
||||
}
|
||||
@ -52,6 +51,7 @@ export async function createEventHandler(
|
||||
list?: NDKList,
|
||||
delegateSigner?: NDKPrivateKeySigner,
|
||||
) {
|
||||
log("func", "createEventHandler");
|
||||
const pubkey = await window.nostr?.getPublicKey();
|
||||
if (!pubkey || !window.nostr) {
|
||||
throw new Error("No public key provided!");
|
||||
@ -68,6 +68,7 @@ export async function createEventHandler(
|
||||
let publishedEvent: NDKEvent | null = null;
|
||||
// Check if is private event
|
||||
if (isPrivate) {
|
||||
log("info", "isPrivate");
|
||||
const rawEventString = JSON.stringify(eventToPublish.rawEvent());
|
||||
const passphrase = generateRandomString();
|
||||
const encryptedRawEventString = await encryptMessage(
|
||||
@ -76,7 +77,7 @@ export async function createEventHandler(
|
||||
);
|
||||
const signer = delegateSigner ?? ndk.signer!;
|
||||
const user = await signer.user();
|
||||
|
||||
log("info", "Signer", user.toString());
|
||||
const newEvent = new NDKEvent(ndk, {
|
||||
content: encryptedRawEventString,
|
||||
kind: 3745,
|
||||
@ -144,21 +145,6 @@ export async function createReaction(
|
||||
],
|
||||
});
|
||||
}
|
||||
export async function createList(
|
||||
ndk: NDK,
|
||||
title: string,
|
||||
description?: string,
|
||||
) {
|
||||
return createEvent(ndk, {
|
||||
content: "",
|
||||
kind: 30001,
|
||||
tags: [
|
||||
["name", title],
|
||||
["description", description ?? ""],
|
||||
["d", randomId()],
|
||||
],
|
||||
});
|
||||
}
|
||||
export async function deleteEvent(
|
||||
ndk: NDK,
|
||||
events: [["e", string] | ["a", `${number}:${string}:${string}`]],
|
||||
|
@ -9,6 +9,8 @@ import NDK, {
|
||||
} from "@nostr-dev-kit/ndk";
|
||||
import { getHashedKeyName } from "@/lib/nostr";
|
||||
import { z } from "zod";
|
||||
import { log } from "@/lib/utils";
|
||||
|
||||
const SignerSchema = z.object({
|
||||
key: z.string(),
|
||||
});
|
||||
@ -26,6 +28,7 @@ export async function findEphemeralSigner(
|
||||
mainSigner: NDKSigner,
|
||||
opts: IFindEphemeralSignerLookups,
|
||||
): Promise<NDKPrivateKeySigner | undefined> {
|
||||
log("func", "findEphemeralSigner");
|
||||
const filter: NDKFilter = { kinds: [2600 as number] };
|
||||
|
||||
if (opts.name) {
|
||||
@ -37,13 +40,11 @@ export async function findEphemeralSigner(
|
||||
);
|
||||
filter["#e"] = [hashedEventReference];
|
||||
}
|
||||
console.log("filter", filter);
|
||||
log("info", "filter", filter.toString());
|
||||
const event = await ndk.fetchEvent(filter);
|
||||
|
||||
if (event) {
|
||||
const decryptEventFunction = async (event: NDKEvent) => {
|
||||
await event.decrypt(await mainSigner.user());
|
||||
|
||||
const content = SignerSchema.parse(JSON.parse(event.content));
|
||||
return new NDKPrivateKeySigner(content.key as string);
|
||||
};
|
||||
@ -99,18 +100,18 @@ function generateContent(
|
||||
return JSON.stringify(content);
|
||||
}
|
||||
async function generateTags(mainSigner: NDKSigner, opts: ISaveOpts = {}) {
|
||||
log("func", "generateTags", opts.toString());
|
||||
const mainUser = await mainSigner.user();
|
||||
const tags = [
|
||||
["p", mainUser.pubkey],
|
||||
["client", "flockstr"],
|
||||
];
|
||||
|
||||
if (opts.associatedEvent) {
|
||||
const encodedEvent = opts.associatedEvent.encode();
|
||||
console.log("encodedEvent", encodedEvent);
|
||||
log("info", "encodedEvent", encodedEvent.toString());
|
||||
// TODO: This is trivially reversable; better to encrypt it or hash it with the pubkey
|
||||
const hashedEventReference = await getHashedKeyName(encodedEvent);
|
||||
console.log("hashedEventReference", hashedEventReference);
|
||||
log("info", "hashedEventReference", hashedEventReference.toString());
|
||||
tags.push(["e", hashedEventReference]);
|
||||
}
|
||||
|
||||
@ -127,6 +128,7 @@ export async function saveEphemeralSigner(
|
||||
targetSigner: NDKPrivateKeySigner,
|
||||
opts: ISaveOpts = {},
|
||||
) {
|
||||
log("func", "saveEphemeralSigner");
|
||||
// Determine current user signer
|
||||
const mainSigner = opts.mainSigner || ndk.signer;
|
||||
|
||||
@ -145,7 +147,7 @@ export async function saveEphemeralSigner(
|
||||
await event.publish();
|
||||
|
||||
// Update Ephemeral signers metadata
|
||||
console.log("Checking keyProfile", opts.keyProfile);
|
||||
log("info", "Checking keyProfile", opts.keyProfile?.toString());
|
||||
const user = await targetSigner.user();
|
||||
if (opts.keyProfile) {
|
||||
const event = new NDKEvent(ndk, {
|
||||
|
@ -13,6 +13,8 @@ import { getTagValues, getTagsAllValues } from "../nostr/utils";
|
||||
import { unixTimeNowInSeconds } from "../nostr/dates";
|
||||
import { createEvent } from "./create";
|
||||
import { findEphemeralSigner } from "@/lib/actions/ephemeral";
|
||||
import { log } from "@/lib/utils";
|
||||
|
||||
const fetchWithZod = createZodFetcher();
|
||||
const ZapEndpointResponseSchema = z.object({
|
||||
nostrPubkey: z.string(),
|
||||
@ -24,15 +26,14 @@ export async function sendZap(
|
||||
_event: NostrEvent,
|
||||
comment?: string,
|
||||
) {
|
||||
console.log("sendzap called", amount);
|
||||
log("func", "sendZap");
|
||||
const event = await new NDKEvent(ndk, _event);
|
||||
console.log("Event", event);
|
||||
log("info", event.toString());
|
||||
const pr = await event.zap(amount * 1000, comment);
|
||||
if (!pr) {
|
||||
console.log("No PR");
|
||||
log("info", "No PR");
|
||||
return;
|
||||
}
|
||||
console.log("PR", pr);
|
||||
const webln = await requestProvider();
|
||||
return await webln.sendPayment(pr);
|
||||
}
|
||||
@ -105,6 +106,7 @@ export async function updateListUsersFromZaps(
|
||||
tagId: string,
|
||||
event: NostrEvent,
|
||||
) {
|
||||
log("func", "updateListUsersFromZaps");
|
||||
const SECONDS_IN_MONTH = 2_628_000;
|
||||
const SECONDS_IN_YEAR = SECONDS_IN_MONTH * 365;
|
||||
const paymentEvents = await ndk.fetchEvents({
|
||||
@ -136,7 +138,6 @@ export async function updateListUsersFromZaps(
|
||||
paymentInvoice.zappee,
|
||||
event,
|
||||
);
|
||||
console.log("Is valid?", isValid);
|
||||
if (isValid) {
|
||||
validUsers.push([
|
||||
paymentInvoice.zappee,
|
||||
@ -148,15 +149,15 @@ export async function updateListUsersFromZaps(
|
||||
// Send old codes to user
|
||||
}
|
||||
}
|
||||
log("info", "New users", newUsers.toString());
|
||||
|
||||
await sendCodesToNewUsers(ndk, newUsers, tagId, event);
|
||||
|
||||
// Add self
|
||||
console.log("Adding self");
|
||||
// Add self;
|
||||
const selfIndex = validUsers.findIndex(([vu]) => vu === event.pubkey);
|
||||
if (selfIndex === -1) {
|
||||
validUsers.push([event.pubkey, "", "self", "4000000000"]);
|
||||
}
|
||||
console.log("Valid users", validUsers);
|
||||
return createEvent(ndk, {
|
||||
...event,
|
||||
kind: event.kind as number,
|
||||
@ -176,7 +177,9 @@ async function sendCodesToNewUsers(
|
||||
const signer = await findEphemeralSigner(ndk, ndk.signer!, {
|
||||
associatedEventNip19: new NDKEvent(ndk, event).encode(),
|
||||
});
|
||||
console.log("Signer", signer);
|
||||
log("func", "sendCodesToNewUsers");
|
||||
log("info", "Signer", signer?.toString());
|
||||
|
||||
if (!signer) return;
|
||||
const delegate = await signer.user();
|
||||
const messages = await ndk.fetchEvents({
|
||||
@ -189,7 +192,7 @@ async function sendCodesToNewUsers(
|
||||
await message.decrypt();
|
||||
codes.push([getTagValues("e", message.tags) ?? "", message.content]);
|
||||
}
|
||||
console.log("codes", codes);
|
||||
log("info", "codes", codes.toString());
|
||||
|
||||
for (const user of users) {
|
||||
for (const [event, code] of codes) {
|
||||
@ -203,7 +206,7 @@ async function sendCodesToNewUsers(
|
||||
],
|
||||
pubkey: delegate.pubkey,
|
||||
} as NostrEvent);
|
||||
console.log("Sending message");
|
||||
log("info", "sending message");
|
||||
await messageEvent.encrypt(new NDKUser({ hexpubkey: user }), signer);
|
||||
await messageEvent.sign(signer);
|
||||
await messageEvent.publish();
|
||||
|
@ -69,7 +69,7 @@ export default function useEvents({
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
log(debug, "error", `❌ nostr (${err})`);
|
||||
log("error", `❌ nostr (${err})`);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
|
@ -85,12 +85,23 @@ export function formatNumber(number: number) {
|
||||
} else return "not a number";
|
||||
}
|
||||
export function log(
|
||||
isOn: boolean | undefined,
|
||||
type: "info" | "error" | "warn",
|
||||
type: "info" | "error" | "warn" | "func",
|
||||
...args: unknown[]
|
||||
) {
|
||||
const isOn = true;
|
||||
if (!isOn) return;
|
||||
console[type](...args);
|
||||
const consoleType = type === "func" ? "info" : type;
|
||||
const items = [...args].map((a) => `%c${a}`);
|
||||
console[consoleType](
|
||||
...items,
|
||||
type === "info"
|
||||
? "color: aqua;"
|
||||
: type === "warn"
|
||||
? "color: yellow;"
|
||||
: type === "func"
|
||||
? "color: green;"
|
||||
: "color: red;",
|
||||
);
|
||||
}
|
||||
|
||||
export function validateUrl(value: string) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user