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.
96 lines
3.0 KiB
96 lines
3.0 KiB
import type { NDKEvent } from "@nostr-dev-kit/ndk"; |
|
import { writable, type Unsubscriber, type Writable } from "svelte/store" |
|
import { ndk } from "./ndk"; |
|
import type { User } from "$lib/components/users/type"; |
|
import { ensureUser } from "./users"; |
|
import { type PRFull, full_defaults } from "$lib/components/prs/type"; |
|
|
|
let pr_kind: number = 318; |
|
|
|
export let selected_pr_full: Writable<PRFull> = writable({ ...full_defaults }); |
|
|
|
let selected_repo_id: string = ""; |
|
let selected_pr_id: string = ""; |
|
let pr_summary_author_unsubsriber: Unsubscriber | undefined; |
|
|
|
export let ensurePRFull = (repo_id: string, pr_id: string) => { |
|
if (selected_pr_id == pr_id) return; |
|
if (pr_id == "") return selected_pr_full.set({ ...full_defaults }); |
|
|
|
selected_repo_id = repo_id; |
|
selected_pr_id = pr_id; |
|
|
|
selected_pr_full.update(full => { |
|
return { |
|
...full, |
|
summary: { |
|
...full.summary, |
|
id: pr_id, |
|
repo_id: repo_id, |
|
loading: true, |
|
}, |
|
loading: true, |
|
}; |
|
}); |
|
if (pr_summary_author_unsubsriber) pr_summary_author_unsubsriber(); |
|
pr_summary_author_unsubsriber = undefined; |
|
|
|
let sub = ndk.subscribe({ |
|
ids: [pr_id], |
|
limit: 1, |
|
}); |
|
|
|
sub.on("event", (event: NDKEvent) => { |
|
try { |
|
if (event.kind == pr_kind |
|
&& event.getMatchingTags("r").find(t => t[1] === `r-${repo_id}`) |
|
&& event.id == pr_id |
|
) { |
|
|
|
selected_pr_full.update(full => { |
|
return { |
|
...full, |
|
pr_event: event, |
|
summary: { |
|
...full.summary, |
|
title: event.tagValue("name") || "", |
|
created_at: event.created_at, |
|
comments: 0, |
|
author: { |
|
hexpubkey: event.pubkey, |
|
loading: true, |
|
npub: "", |
|
}, |
|
loading: false, |
|
} |
|
}; |
|
}); |
|
|
|
pr_summary_author_unsubsriber = ensureUser(event.pubkey).subscribe((u: User) => { |
|
selected_pr_full.update(full => { |
|
return { |
|
...full, |
|
summary: { |
|
...full.summary, |
|
author: event.pubkey == u.hexpubkey ? u : full.summary.author, |
|
} |
|
}; |
|
}); |
|
}); |
|
} |
|
} catch { } |
|
}); |
|
|
|
sub.on("eose", () => { |
|
selected_pr_full.update(full => { |
|
return { |
|
...full, |
|
summary: { |
|
...full.summary, |
|
loading: false, |
|
}, |
|
loading: false, |
|
}; |
|
}); |
|
}); |
|
}
|
|
|