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.
 
 
 
 
 

167 lines
5.2 KiB

<script lang="ts" context="module">
</script>
<script lang="ts">
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import { summary_defaults } from './type'
import { proposal_icon_path } from './icons'
import UserHeader from '../users/UserHeader.svelte'
import {
proposal_status_applied,
proposal_status_closed,
proposal_status_draft,
proposal_status_open,
} from '$lib/kinds'
import { issue_icon_path } from '../issues/icons'
import { aToNaddr, naddrToPointer } from '../repo/utils'
import { nip19 } from 'nostr-tools'
dayjs.extend(relativeTime)
export let type: 'issue' | 'proposal' = 'proposal'
export let {
title,
descritpion,
id,
repo_a,
comments,
status,
status_date,
author,
created_at,
loading,
} = summary_defaults
export let show_repo: boolean = false
export let repo_naddr_override: string | undefined = undefined
let short_title: string
let created_at_ago: string
$: {
if (title.length > 70) short_title = title.slice(0, 65) + '...'
else if (title.length == 0) short_title = 'Untitled'
else short_title = title
created_at_ago = created_at ? dayjs(created_at * 1000).fromNow() : ''
}
let repo_naddr = ''
let repo_identifier = ''
$: {
if (repo_a.length > 0) {
repo_naddr = repo_naddr_override || aToNaddr(repo_a) || ''
if (repo_naddr_override) {
repo_identifier = naddrToPointer(repo_naddr)?.identifier || ''
}
}
}
</script>
<li class="flex p-2 pt-4 {!loading ? 'cursor-pointer hover:bg-base-200' : ''}">
<!-- <figure class="p-4 pl-0 text-color-primary"> -->
<!-- http://icon-sets.iconify.design/octicon/git-pull-request-16/ -->
{#if loading || !status}
<div class="skeleton h-5 w-5 flex-none pt-1"></div>
{:else if status === proposal_status_open}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
class="h-5 w-5 flex-none fill-success pt-1"
>
{#if type === 'proposal'}
<path d={proposal_icon_path.open_patch} />
{:else if type === 'issue'}
{#each issue_icon_path.open as p}
<path d={p} />
{/each}
{/if}
</svg>
{:else if status === proposal_status_closed}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
class="h-5 w-5 flex-none fill-neutral-content pt-1"
>
{#if type === 'proposal'}
<path d={proposal_icon_path.close} />
{:else if type === 'issue'}
{#each issue_icon_path.closed as p}
<path d={p} />
{/each}
{/if}
</svg>
{:else if status === proposal_status_draft}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
class="h-5 w-5 flex-none fill-neutral-content pt-1"
><path d={proposal_icon_path.draft} /></svg
>
{:else if status === proposal_status_applied}
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
class="h-5 w-5 flex-none fill-primary pt-1"
>
{#if type === 'proposal'}
<path d={proposal_icon_path.applied} />
{:else if type === 'issue'}
{#each issue_icon_path.resolved as p}
<path d={p} />
{/each}
{/if}
</svg>
{/if}
<a
href="/r/{repo_naddr}/{type}s/{nip19.noteEncode(id) || ''}"
class="ml-3 grow overflow-hidden text-xs text-neutral-content"
class:pointer-events-none={loading}
>
{#if loading}
<div class="skeleton h-5 w-60 flex-none pt-1"></div>
<div class="skeleton mb-1 mt-3 h-3 w-40 flex-none"></div>
{:else}
<div class="text-sm text-base-content">
{short_title}
</div>
<!-- <div class="text-xs text-neutral-content">
{description}
</div> -->
<ul class="pt-2">
{#if comments > 0}
<li class="mr-3 inline align-middle">
<!-- http://icon-sets.iconify.design/octicon/comment-16/ -->
<svg
xmlns="http://www.w3.org/2000/svg"
class="inline-block h-3 w-3 flex-none fill-base-content pt-0"
viewBox="0 0 16 16"
><path
d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"
/></svg
>
{comments}
</li>
{/if}
<li class="mr-3 inline">
opened {created_at_ago}
</li>
<li class="inline">
<UserHeader user={author} inline={true} size="xs" />
</li>
{#if show_repo && repo_identifier.length > 0}
<li class="ml-3 inline">
<a class="link-primary z-10" href="/r/{repo_naddr}">
{repo_identifier}
</a>
</li>
{/if}
</ul>
{/if}
</a>
<!-- <div class="flex-none text-xs pt-0 hidden md:block">
<div class="align-middle">
{#if loading}
<div class="skeleton w-10 h-10"></div>
{:else}
<Avatar />
{/if}
</div>
</div> -->
</li>