flotilla/src/app/components/GoalSummary.svelte

55 lines
1.9 KiB
Svelte
Raw Normal View History

2025-07-07 22:28:36 +00:00
<script lang="ts">
import {now, DAY, uniq, sum} from "@welshman/lib"
import type {Zap, TrustedEvent} from "@welshman/util"
import {getTagValue, fromMsats, ZAP_RESPONSE} from "@welshman/util"
2025-11-20 23:54:06 +00:00
import {deriveItemsByKey, deriveArray} from "@welshman/store"
2025-07-07 22:28:36 +00:00
import {repository, getValidZap} from "@welshman/app"
2025-09-10 22:26:39 +00:00
import Bolt from "@assets/icons/bolt.svg?dataurl"
2025-07-07 22:28:36 +00:00
import Icon from "@lib/components/Icon.svelte"
import ZapButton from "@app/components/ZapButton.svelte"
type Props = {
2025-10-06 18:23:19 +00:00
url?: string
2025-07-07 22:28:36 +00:00
event: TrustedEvent
2025-10-06 18:23:19 +00:00
class?: string
2025-07-07 22:28:36 +00:00
}
2025-10-06 18:23:19 +00:00
const {url, event, ...props}: Props = $props()
2025-07-07 22:28:36 +00:00
2025-11-20 23:54:06 +00:00
const zaps = deriveArray(
deriveItemsByKey<Zap>({
repository,
getKey: zap => zap.response.id,
filters: [{kinds: [ZAP_RESPONSE], "#e": [event.id]}],
eventToItem: (response: TrustedEvent) => getValidZap(response, event),
}),
)
2025-07-07 22:28:36 +00:00
const goalAmount = parseInt(getTagValue("amount", event.tags) || "0")
const zapAmount = $derived(fromMsats(sum($zaps.map(zap => zap.invoiceAmount))))
const contributorsCount = $derived(uniq($zaps.map(zap => zap.request.pubkey)).length)
const daysOld = Math.ceil((now() - event.created_at) / DAY)
</script>
2025-10-06 18:23:19 +00:00
<div class="flex flex-col gap-8 {props.class}">
2025-07-07 22:28:36 +00:00
<div class="flex gap-8">
<div>
<p class="text-xl text-primary">{zapAmount} sats</p>
<p class="text-sm opacity-75">funded of {goalAmount} sats</p>
</div>
<div>
<p class="text-xl">{contributorsCount}</p>
<p class="text-sm opacity-75">{contributorsCount === 1 ? "contributor" : "contributors"}</p>
</div>
<div>
<p class="text-xl">{daysOld}</p>
<p class="text-sm opacity-75">{daysOld === 1 ? "day" : "days"} old</p>
</div>
</div>
<progress class="progress" value={zapAmount} max={goalAmount}></progress>
<ZapButton {url} {event} class="button button-primary lg:m-auto lg:px-20">
2025-09-10 22:26:39 +00:00
<Icon icon={Bolt} />
2025-07-07 22:28:36 +00:00
Contribute to this goal
</ZapButton>
</div>