forked from coracle/flotilla
9df8cee501
Adopts the rewritten welshman API: the removed @welshman/util helpers (Profile/List/Room/Handler/Encryptable) are now Reader/Builder classes in @welshman/domain, and @welshman/app dropped its global singletons for an App instance + app.use(Plugin) registry. - src/app/welshman.ts is now the app bootstrap + session-state module (one shared App instance, multi-account sessions/login, app-wide reactive views) rather than a compat shim re-exporting the old globals. - Rewrote ~100 callers to use app.use(Plugin) directly (thunks, profiles, relays, rooms, zaps, tags, wot, feeds, sync); thunk helpers are now thunk methods. - Added @welshman/domain dependency. - Resolved residual gaps (storage hydration via plugin.onItem/wrapManager/Plaintext, relay-list mutators, search-relay list, outbox #d filter). Best-effort: no toolchain/linking available, so this is not build- or type-checked. Remaining judgment calls are flagged with TODO(welshman-migration). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BsMjvv7krpZeHK1Njeneru
35 lines
1.3 KiB
Svelte
35 lines
1.3 KiB
Svelte
<script lang="ts">
|
|
import {onMount} from "svelte"
|
|
import {max, gt, formatTimestampRelative} from "@welshman/lib"
|
|
import {COMMENT} from "@welshman/util"
|
|
import {load} from "@welshman/net"
|
|
import {deriveArray, deriveEventsById} from "@welshman/store"
|
|
import type {TrustedEvent} from "@welshman/util"
|
|
import {repository} from "@app/welshman"
|
|
import {deriveChecked} from "@app/notifications"
|
|
import Reply from "@assets/icons/reply-2.svg?dataurl"
|
|
import Icon from "@lib/components/Icon.svelte"
|
|
|
|
const {url, path, event}: {url: string; path: string; event: TrustedEvent} = $props()
|
|
|
|
const checked = deriveChecked(path)
|
|
const filters = [{kinds: [COMMENT], "#E": [event.id]}]
|
|
const replies = deriveArray(deriveEventsById({repository, filters}))
|
|
const lastActive = $derived(max([...$replies, event].map(e => e.created_at)))
|
|
|
|
onMount(() => {
|
|
load({relays: [url], filters})
|
|
})
|
|
</script>
|
|
|
|
<div class="flex-inline btn btn-neutral btn-xs gap-1 rounded-full">
|
|
<Icon icon={Reply} />
|
|
<span>{$replies.length} {$replies.length === 1 ? "reply" : "replies"}</span>
|
|
</div>
|
|
<div class="btn btn-neutral btn-xs relative rounded-full">
|
|
{#if gt(lastActive, $checked)}
|
|
<div class="h-2 w-2 rounded-full bg-primary"></div>
|
|
{/if}
|
|
Active {formatTimestampRelative(lastActive)}
|
|
</div>
|