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.
 
 
 
 
 

132 lines
3.8 KiB

<script lang="ts">
import { base_relays, ndk } from '$lib/stores/ndk'
import { NDKEvent, NDKRelaySet } from '@nostr-dev-kit/ndk'
import { issue_kind, repo_kind } from '$lib/kinds'
import { getUserRelays, logged_in_user, login } from '$lib/stores/users'
import type { RepoEvent } from '$lib/components/repo/type'
import { goto } from '$app/navigation'
import { nip19 } from 'nostr-tools'
export let repo_event: RepoEvent
let submitting = false
let submitted = false
let edit_mode = false
let title = ''
let content = ''
$: {
edit_mode = !submitted
}
let submit_attempted = false
async function sendIssue(title: string, content: string) {
submit_attempted = true
if (title.length < 10) return
if (!$logged_in_user) await login()
if (!$logged_in_user) return
let event = new NDKEvent(ndk)
event.kind = issue_kind
event.tags.push(['alt', `git repository issue: ${title}`])
if (repo_event.unique_commit) {
event.tags.push(['r', repo_event.unique_commit])
}
event.tags.push([
'a',
`${repo_kind}:${repo_event.maintainers[0]}:${repo_event.identifier}`,
repo_event.relays[0] || '',
'root',
])
repo_event.maintainers.forEach((m) => event.tags.push(['p', m]))
event.content = `${title}\n\n${content}`
submitting = true
let relays = [
...(repo_event.relays.length > 3
? repo_event.relays
: [...base_relays].concat(repo_event.relays)),
]
try {
event.sign()
} catch {
alert('failed to sign event')
}
try {
let user_relays = await getUserRelays($logged_in_user.hexpubkey)
relays = [
...relays,
...(user_relays.ndk_relays
? user_relays.ndk_relays.writeRelayUrls
: []),
]
} catch {
alert('failed to get user relays')
}
try {
let _ = await event.publish(NDKRelaySet.fromRelayUrls(relays, ndk))
submitting = false
submitted = true
setTimeout(() => {
goto(`/r/${repo_event.naddr}/issues/${nip19.noteEncode(event.id)}`)
}, 2000)
} catch {}
}
</script>
{#if edit_mode}
<div class="flex">
<div class="flex-grow">
<label class="form-control w-full">
<div class="label">
<span class="label-text text-sm">Title</span>
</div>
<input
type="text"
bind:value={title}
class="input-neutral input input-sm input-bordered mb-3 w-full border-warning"
class:border-warning={submit_attempted && title.length < 10}
placeholder="title"
/>
{#if submit_attempted && title.length < 10}
<div class="text-warning pr-3 text-sm align-middle">title must be at least 10 characters</div>
{/if}
</label>
<label class="form-control w-full">
<div class="label">
<span class="label-textarea text-sm">Description</span>
</div>
<textarea
disabled={submitting}
bind:value={content}
class="textarea textarea-secondary w-full"
placeholder="description"
rows="10"
></textarea>
</label>
<div class="flex items-center mt-2">
<div class="flex-auto"></div>
{#if submit_attempted && title.length < 10}
<div class="text-warning pr-3 text-sm align-middle">title must be at least 10 characters</div>
{/if}
<button
on:click={() => sendIssue(title, content)}
disabled={submitting || (submit_attempted && title.length < 10)}
class="btn btn-primary btn-sm"
>
{#if submitting}
Sending
{:else if !$logged_in_user}
Login before Sending
{:else}
Send
{/if}
</button>
</div>
</div>
</div>
{/if}
{#if submitted}
<div>sent going to issue!</div>
{/if}