link.ts raw
1 import { TSearchParams } from '@/types'
2 import { Event, nip19 } from 'nostr-tools'
3 import { getNoteBech32Id } from './event'
4
5 export const toHome = () => '/'
6 export const toNote = (eventOrId: Event | string) => {
7 if (typeof eventOrId === 'string') return `/notes/${eventOrId}`
8 const nevent = getNoteBech32Id(eventOrId)
9 return `/notes/${nevent}`
10 }
11 export const toNoteList = ({
12 hashtag,
13 search,
14 domain,
15 kinds
16 }: {
17 hashtag?: string
18 search?: string
19 domain?: string
20 kinds?: number[]
21 }) => {
22 const path = '/notes'
23 const query = new URLSearchParams()
24 if (hashtag) query.set('t', hashtag.toLowerCase())
25 if (kinds?.length) {
26 kinds.forEach((k) => query.append('k', k.toString()))
27 }
28 if (search) query.set('s', search)
29 if (domain) query.set('d', domain)
30 return `${path}?${query.toString()}`
31 }
32 export const toProfile = (userId: string) => {
33 if (userId.startsWith('npub') || userId.startsWith('nprofile')) return `/users/${userId}`
34 const npub = nip19.npubEncode(userId)
35 return `/users/${npub}`
36 }
37 export const toProfileList = ({ search, domain }: { search?: string; domain?: string }) => {
38 const path = '/users'
39 const query = new URLSearchParams()
40 if (search) query.set('s', search)
41 if (domain) query.set('d', domain)
42 return `${path}?${query.toString()}`
43 }
44 export const toFollowingList = (pubkey: string) => {
45 const npub = nip19.npubEncode(pubkey)
46 return `/users/${npub}/following`
47 }
48 export const toOthersRelaySettings = (pubkey: string) => {
49 const npub = nip19.npubEncode(pubkey)
50 return `/users/${npub}/relays`
51 }
52 export const toSearch = (params?: TSearchParams) => {
53 if (!params) return '/search'
54 const query = new URLSearchParams()
55 query.set('t', params.type)
56 query.set('q', params.search)
57 if (params.input) {
58 query.set('i', params.input)
59 }
60 return `/search?${query.toString()}`
61 }
62 export const toExternalContent = (id: string) => `/external-content?id=${encodeURIComponent(id)}`
63 export const toSettings = () => '/settings'
64 export const toHelp = () => '/help'
65 export const toRelaySettings = (tag?: 'mailbox' | 'favorite-relays') => {
66 return '/settings/relays' + (tag ? '#' + tag : '')
67 }
68 export const toWallet = () => '/settings/wallet'
69 export const toPostSettings = () => '/settings/posts'
70 export const toGeneralSettings = () => '/settings/general'
71 export const toAppearanceSettings = () => '/settings/appearance'
72 export const toEmojiPackSettings = () => '/settings/emoji-packs'
73 export const toSystemSettings = () => '/settings/system'
74 export const toProfileEditor = () => '/profile-editor'
75 export const toRelay = (url: string) => `/relays/${encodeURIComponent(url)}`
76 export const toRelayReviews = (url: string) => `/relays/${encodeURIComponent(url)}/reviews`
77 export const toMuteList = () => '/mutes'
78 export const toRizful = () => '/rizful'
79 export const toBookmarks = () => '/bookmarks'
80 export const toFollowPack = (eventOrId: Event | string) => {
81 if (typeof eventOrId === 'string') return `/follow-packs/${eventOrId}`
82 const naddr = getNoteBech32Id(eventOrId)
83 return `/follow-packs/${naddr}`
84 }
85
86 export const toChachiChat = (relay: string, d: string) => {
87 return `https://chachi.chat/${relay.replace(/^wss?:\/\//, '').replace(/\/$/, '')}/${d}`
88 }
89 export const toNjump = (id: string) => `https://njump.me/${id}`
90 export const toLogin = () => '/login'
91 export const toLogout = () => '/logout'
92 export const toChatChannel = (channelId: string) => `/chat/${channelId}`
93 export const toDMConversation = (pubkey: string) => {
94 const npub = pubkey.startsWith('npub') ? pubkey : nip19.npubEncode(pubkey)
95 return `/dm/${npub}`
96 }
97