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.
186 lines
8.2 KiB
186 lines
8.2 KiB
<script lang="ts"> |
|
import { ndk } from "$lib/stores/ndk"; |
|
import { NDKEvent, NDKRelaySet, type NDKTag } from "@nostr-dev-kit/ndk"; |
|
import type { PRStatus } from "./type"; |
|
import { selected_pr_full } from "$lib/stores/PR"; |
|
import { load } from "../../../routes/repo/[repo_id]/+page"; |
|
import { patch_kind } from "$lib/kinds"; |
|
import { getLoggedInUserRelays, logged_in_user } from "$lib/stores/users"; |
|
import { selected_repo } from "$lib/stores/repo"; |
|
|
|
export let status: PRStatus = "Draft"; |
|
export let repo_id: string = ""; |
|
export let pr_id: string = ""; |
|
|
|
let loading = false; |
|
|
|
let edit_mode = false; |
|
$: { |
|
edit_mode = |
|
$logged_in_user !== undefined && repo_id === $selected_repo.repo_id; |
|
} |
|
|
|
async function changeStatus(new_status: PRStatus) { |
|
let event = new NDKEvent(ndk); |
|
event.kind = patch_kind; |
|
event.tags.push(["t", new_status]); |
|
event.tags.push(["e", pr_id]); |
|
event.tags.push(["r", `r-${repo_id}`]); |
|
loading = true; |
|
let relays = [...$selected_repo.relays]; |
|
try { |
|
event.sign(); |
|
} catch { |
|
alert("failed to sign event"); |
|
} |
|
try { |
|
let user_relays = await getLoggedInUserRelays(); |
|
relays = [ |
|
...relays, |
|
...(user_relays.ndk_relays |
|
? user_relays.ndk_relays.writeRelayUrls |
|
: []), |
|
// TODO: pr event pubkey relays |
|
]; |
|
} catch { |
|
alert("failed to get user relays"); |
|
} |
|
try { |
|
let res = await event.publish( |
|
NDKRelaySet.fromRelayUrls(relays, ndk), |
|
); |
|
selected_pr_full.update((pr_full) => { |
|
if (pr_full.summary.id !== pr_id) return pr_full; |
|
return { |
|
...pr_full, |
|
status: new_status, |
|
}; |
|
}); |
|
loading = false; |
|
} catch {} |
|
} |
|
</script> |
|
|
|
{#if loading} |
|
<div class="skeleton w-28 h-8 rounded-md"></div> |
|
{:else} |
|
<div class="dropdown"> |
|
<div |
|
tabIndex={0} |
|
role="button" |
|
class:btn-success={status === "Open"} |
|
class:btn-primary={status === "Merged"} |
|
class:btn-neutral={status === "Draft" || status === "Closed"} |
|
class:cursor-default={edit_mode} |
|
class="btn btn-success btn-sm mr-6 align-middle" |
|
> |
|
{#if status === "Open"} |
|
<!-- http://icon-sets.iconify.design/octicon/git-pull-request-16/ --> |
|
<svg |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 18 18" |
|
class="h-5 w-5 pt-1 flex-none fill-success-content" |
|
><path |
|
d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25m5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354M3.75 2.5a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5m0 9.5a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5m8.25.75a.75.75 0 1 0 1.5 0a.75.75 0 0 0-1.5 0" |
|
/> |
|
</svg> |
|
Open |
|
{:else if status === "Merged"} |
|
<!-- https://icon-sets.iconify.design/octicon/git-merge-16/ --> |
|
<svg |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 16 16" |
|
class="h-5 w-5 pt-1 flex-none fill-primary-content" |
|
><path |
|
d="M5.45 5.154A4.25 4.25 0 0 0 9.25 7.5h1.378a2.251 2.251 0 1 1 0 1.5H9.25A5.734 5.734 0 0 1 5 7.123v3.505a2.25 2.25 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.95-.218M4.25 13.5a.75.75 0 1 0 0-1.5a.75.75 0 0 0 0 1.5m8.5-4.5a.75.75 0 1 0 0-1.5a.75.75 0 0 0 0 1.5M5 3.25a.75.75 0 1 0 0 .005z" |
|
/></svg |
|
> |
|
Merged |
|
{:else if status === "Closed"} |
|
<!-- https://icon-sets.iconify.design/octicon/git-pull-request-closed-16/ --> |
|
<svg |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 16 16" |
|
class="h-5 w-5 pt-1 flex-none fill-neutral-content" |
|
><path |
|
d="M3.25 1A2.25 2.25 0 0 1 4 5.372v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.251 2.251 0 0 1 3.25 1m9.5 5.5a.75.75 0 0 1 .75.75v3.378a2.251 2.251 0 1 1-1.5 0V7.25a.75.75 0 0 1 .75-.75m-2.03-5.273a.75.75 0 0 1 1.06 0l.97.97l.97-.97a.748.748 0 0 1 1.265.332a.75.75 0 0 1-.205.729l-.97.97l.97.97a.751.751 0 0 1-.018 1.042a.751.751 0 0 1-1.042.018l-.97-.97l-.97.97a.749.749 0 0 1-1.275-.326a.749.749 0 0 1 .215-.734l.97-.97l-.97-.97a.75.75 0 0 1 0-1.06ZM2.5 3.25a.75.75 0 1 0 1.5 0a.75.75 0 0 0-1.5 0M3.25 12a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5m9.5 0a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5" |
|
/></svg |
|
> |
|
Closed |
|
{:else if status === "Draft"} |
|
<!-- https://icon-sets.iconify.design/octicon/git-pull-request-draft-16// --> |
|
<svg |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 16 16" |
|
class="h-5 w-5 pt-1 flex-none fill-neutral-content" |
|
><path |
|
d="M3.25 1A2.25 2.25 0 0 1 4 5.372v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.251 2.251 0 0 1 3.25 1m9.5 14a2.25 2.25 0 1 1 0-4.5a2.25 2.25 0 0 1 0 4.5M2.5 3.25a.75.75 0 1 0 1.5 0a.75.75 0 0 0-1.5 0M3.25 12a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5m9.5 0a.75.75 0 1 0 0 1.5a.75.75 0 0 0 0-1.5M14 7.5a1.25 1.25 0 1 1-2.5 0a1.25 1.25 0 0 1 2.5 0m0-4.25a1.25 1.25 0 1 1-2.5 0a1.25 1.25 0 0 1 2.5 0" |
|
/></svg |
|
> |
|
Draft |
|
{/if} |
|
{#if edit_mode} |
|
<svg |
|
xmlns="http://www.w3.org/2000/svg" |
|
viewBox="0 0 24 24" |
|
class="h-5 w-5s flex-none fill-success-content" |
|
><path |
|
fill="currentColor" |
|
d="M11.646 15.146L5.854 9.354a.5.5 0 0 1 .353-.854h11.586a.5.5 0 0 1 .353.854l-5.793 5.792a.5.5 0 0 1-.707 0" |
|
/></svg |
|
> |
|
{/if} |
|
</div> |
|
{#if edit_mode} |
|
<ul |
|
tabIndex={0} |
|
class="dropdown-content z-[1] menu p-2 ml-0 shadow bg-base-300 rounded-box w-52" |
|
> |
|
{#if status !== "Draft"} |
|
<li class="pl-0"> |
|
<button |
|
on:click={() => { |
|
changeStatus("Draft"); |
|
}} |
|
class="btn btn-neutral btn-sm mx-2 align-middle" |
|
>Draft</button |
|
> |
|
</li> |
|
{/if} |
|
{#if status !== "Open"} |
|
<li class="pl-0"> |
|
<button |
|
on:click={() => { |
|
changeStatus("Open"); |
|
}} |
|
class="btn btn-success btn-sm mx-2 align-middle" |
|
>Open</button |
|
> |
|
</li> |
|
{/if} |
|
{#if status !== "Merged"} |
|
<li class="pl-0"> |
|
<button |
|
on:click={() => { |
|
changeStatus("Merged"); |
|
}} |
|
class="btn btn-primary btn-sm mx-2 align-middle" |
|
>Merged</button |
|
> |
|
</li> |
|
{/if} |
|
{#if status !== "Closed"} |
|
<li class="pl-0"> |
|
<button |
|
on:click={() => { |
|
changeStatus("Closed"); |
|
}} |
|
class="btn btn-neutral btn-sm mx-2 align-middle" |
|
>Closed</button |
|
> |
|
</li> |
|
{/if} |
|
</ul> |
|
{/if} |
|
</div> |
|
{/if}
|
|
|