forked from coracle/flotilla
114 lines
3.0 KiB
TypeScript
114 lines
3.0 KiB
TypeScript
import type {Page} from "@sveltejs/kit"
|
|
import * as nip19 from "nostr-tools/nip19"
|
|
import {goto} from "$app/navigation"
|
|
import {nthEq, sleep} from "@welshman/lib"
|
|
import type {TrustedEvent} from "@welshman/util"
|
|
import {tracker} from "@welshman/app"
|
|
import {scrollToEvent} from "@lib/html"
|
|
import {identity} from "@welshman/lib"
|
|
import {
|
|
getTagValue,
|
|
DIRECT_MESSAGE,
|
|
DIRECT_MESSAGE_FILE,
|
|
MESSAGE,
|
|
THREAD,
|
|
EVENT_TIME,
|
|
} from "@welshman/util"
|
|
import {makeChatId, entityLink, decodeRelay, encodeRelay, userRoomsByUrl, ROOM} from "@app/state"
|
|
|
|
export const makeSpacePath = (url: string, ...extra: (string | undefined)[]) => {
|
|
let path = `/spaces/${encodeRelay(url)}`
|
|
|
|
if (extra.length > 0) {
|
|
path +=
|
|
"/" +
|
|
extra
|
|
.filter(identity)
|
|
.map(s => encodeURIComponent(s as string))
|
|
.join("/")
|
|
}
|
|
|
|
return path
|
|
}
|
|
|
|
export const makeChatPath = (pubkeys: string[]) => `/chat/${makeChatId(pubkeys)}`
|
|
|
|
export const makeRoomPath = (url: string, room: string) => `/spaces/${encodeRelay(url)}/${room}`
|
|
|
|
export const makeThreadPath = (url: string, eventId?: string) =>
|
|
makeSpacePath(url, "threads", eventId)
|
|
|
|
export const makeCalendarPath = (url: string, eventId?: string) =>
|
|
makeSpacePath(url, "calendar", eventId)
|
|
|
|
export const getPrimaryNavItem = ($page: Page) => $page.route?.id?.split("/")[1]
|
|
|
|
export const getPrimaryNavItemIndex = ($page: Page) => {
|
|
const urls = Array.from(userRoomsByUrl.get().keys())
|
|
|
|
switch (getPrimaryNavItem($page)) {
|
|
case "discover":
|
|
return urls.length + 2
|
|
case "spaces": {
|
|
const routeUrl = decodeRelay($page.params.relay)
|
|
|
|
return urls.findIndex(url => url === routeUrl) + 1
|
|
}
|
|
case "settings":
|
|
return urls.length + 3
|
|
default:
|
|
return 0
|
|
}
|
|
}
|
|
|
|
export const goToMessage = async (url: string, room: string | undefined, id: string) => {
|
|
await goto(room ? makeRoomPath(url, room) : makeSpacePath(url, "chat"))
|
|
await sleep(300)
|
|
|
|
return scrollToEvent(id)
|
|
}
|
|
|
|
export const goToEvent = async (event: TrustedEvent) => {
|
|
if (event.kind === DIRECT_MESSAGE || event.kind === DIRECT_MESSAGE_FILE) {
|
|
return await scrollToEvent(event.id)
|
|
}
|
|
|
|
const urls = Array.from(tracker.getRelays(event.id))
|
|
const room = getTagValue(ROOM, event.tags)
|
|
|
|
if (urls.length > 0) {
|
|
const url = urls[0]
|
|
|
|
if (event.kind === THREAD) {
|
|
return goto(makeThreadPath(url, event.id))
|
|
}
|
|
|
|
if (event.kind === EVENT_TIME) {
|
|
return goto(makeCalendarPath(url, event.id))
|
|
}
|
|
|
|
if (event.kind === MESSAGE) {
|
|
return goToMessage(url, room, event.id)
|
|
}
|
|
|
|
const kind = event.tags.find(nthEq(0, "K"))?.[1]
|
|
const id = event.tags.find(nthEq(0, "E"))?.[1]
|
|
|
|
if (id && kind) {
|
|
if (parseInt(kind) === THREAD) {
|
|
return goto(makeThreadPath(url, id))
|
|
}
|
|
|
|
if (parseInt(kind) === EVENT_TIME) {
|
|
return goto(makeCalendarPath(url, id))
|
|
}
|
|
|
|
if (parseInt(kind) === MESSAGE) {
|
|
return goToMessage(url, room, id)
|
|
}
|
|
}
|
|
}
|
|
|
|
window.open(entityLink(nip19.neventEncode({id: event.id, relays: urls})))
|
|
}
|