Show relays in feedcontrols

This commit is contained in:
Jonathan Staab 2023-10-11 11:10:17 -07:00
parent 4dff9898c2
commit 1b71ae5dab
10 changed files with 70 additions and 36 deletions

View File

@ -10,6 +10,8 @@
- [x] Fix notification badge for non-accepted conversations
- [x] Add WoT help information
- [x] Add WoT threshold setting
- [x] Show relays in feed controls
- [x] Exclude angle brackets from url regex
# 0.3.10

View File

@ -1,8 +1,9 @@
<script lang="ts">
import {isNil, reverse} from "ramda"
import {onMount} from "svelte"
import {memoize, parseQueryString} from "src/util/misc"
import {memoize} from "src/util/misc"
import type {HistoryItem} from "src/util/router"
import {decodeQueryString, decodeRouteParams} from "src/util/router"
import Modal from "src/partials/Modal.svelte"
import About from "src/app/views/About.svelte"
import Apps from "src/app/views/Apps.svelte"
@ -214,22 +215,11 @@
menuIsOpen.set(false)
}
const getProps = ({config, path, params, route}: HistoryItem) => {
const data = {...config.context, ...params}
const queryParams = parseQueryString(path)
// Prefer decoding route params. If there's an overload, ignore query params to avoid
// route param injection for anything other than white-listed decoders
for (const [k, serializer] of Object.entries(route.serializers || {})) {
const v = params[k] || queryParams[k]
if (v) {
Object.assign(data, serializer.decode(v))
}
}
return data
}
const getProps = (item: HistoryItem) => ({
...item.config.context,
...decodeQueryString(item),
...decodeRouteParams(item),
})
let scrollY

View File

@ -111,7 +111,7 @@ export const asRelay = {
export const asFilter = {
encode: encodeFilter,
decode: decodeAs(name, decodeFilter),
decode: decodeAs("filter", decodeFilter),
}
export const asChannelId = {

View File

@ -14,7 +14,7 @@
import {compileFilter, searchableRelays, getRelaysFromFilters} from "src/engine"
export let relays = []
export let filter = {} as DynamicFilter
export let filter: DynamicFilter = {}
export let hideControls = false
export let onEvent = null
@ -82,7 +82,7 @@
{/if}
{#if !hideControls}
<FeedControls {filter}>
<FeedControls {filter} {relays}>
<slot name="controls" slot="controls" />
</FeedControls>
{/if}

View File

@ -16,9 +16,17 @@
import PersonMultiSelect from "src/app/shared/PersonMultiSelect.svelte"
import {router} from "src/app/router"
import type {DynamicFilter, Topic, Person} from "src/engine"
import {follows, searchTopics, derivePerson, displayPubkey} from "src/engine"
import {
follows,
displayRelays,
urlToRelay,
searchTopics,
derivePerson,
displayPubkey,
} from "src/engine"
export let filter
export let relays
type Kind = {
kind: number
@ -201,13 +209,19 @@
<i class="fa fa-sliders cursor-pointer p-2" on:click={open} />
<slot name="controls" />
</div>
{#if parts.length > 0}
{#if parts.length > 0 || relays.length > 0}
<div class="mb-2 mr-2 inline-block py-1">Showing notes:</div>
{/if}
{#each parts as { keys, label }}
<Chip class="mb-2 mr-2 inline-block" onClick={keys ? () => removePart(keys) : null}
>{label}</Chip>
<Chip class="mb-2 mr-2 inline-block" onClick={keys ? () => removePart(keys) : null}>
{label}
</Chip>
{/each}
{#if relays.length > 0}
<Chip class="mb-2 mr-2 inline-block">
Found on {displayRelays(relays.map(urlToRelay), 2)}
</Chip>
{/if}
</div>
{#if modal}

View File

@ -15,6 +15,7 @@
let promise: Promise<Event> = defer()
onMount(() => {
console.log($$props)
promise = dereferenceNote($$props)
})
</script>

View File

@ -16,6 +16,8 @@ const annotateEvent = eid => ({
export const decodeEvent = entity => {
entity = fromNostrURI(entity)
console.log(entity)
let type, data
try {
;({type, data} = nip19.decode(entity))

View File

@ -1,6 +1,6 @@
import {nip19} from "nostr-tools"
import {sortBy, pluck, uniq, nth, prop, last} from "ramda"
import {chain, first, tryFunc} from "hurdak"
import {chain, displayList, first, tryFunc} from "hurdak"
import {fuzzy, stripProto} from "src/util/misc"
import {fromNostrURI, findReplyId, findRootId, Tags} from "src/util/nostr"
import type {Event} from "src/engine/events/model"
@ -56,6 +56,9 @@ export const relayIsLowQuality = (url: string) =>
export const displayRelay = ({url}: Relay) => last(url.split("://"))
export const displayRelays = (relays: Relay[], max = 3) =>
displayList(relays.map(displayRelay), "and", max)
export const getRelaySearch = $relays => fuzzy($relays, {keys: ["url", "name", "description"]})
export const getSearchableRelays = ($relays: Relay[]) => {

View File

@ -101,7 +101,7 @@ export const parseContent = ({content, tags = []}: {content: string; tags?: stri
const parseUrl = () => {
const raw = first(
text.match(/^([a-z\+:]{2,30}:\/\/)?[^\(\)\s]+\.[a-z]{2,6}[^\s]*[^"'\.!?,:\s]/gi)
text.match(/^([a-z\+:]{2,30}:\/\/)?[^<>\(\)\s]+\.[a-z]{2,6}[^\s]*[^<>"'\.!?,:\s]/gi)
)
// Skip url if it's just the end of a filepath

View File

@ -40,7 +40,7 @@ export type HistoryItem = {
}
}
const asPath = (...parts: string[]) => {
export const asPath = (...parts: string[]) => {
let path = parts.filter(identity).join("/")
if (path && !path.startsWith("/")) {
@ -50,6 +50,36 @@ const asPath = (...parts: string[]) => {
return path
}
export const decodeQueryString = ({path, route}: HistoryItem) => {
const queryParams = parseQueryString(path)
const data = {}
for (const [k, serializer] of Object.entries(route.serializers || {})) {
const v = queryParams[k]
if (v) {
Object.assign(data, serializer.decode(v))
}
}
return data
}
export const decodeRouteParams = ({params, route}: HistoryItem) => {
const data = {...params}
for (const [k, serializer] of Object.entries(route.serializers || {})) {
const v = params[k]
if (v) {
Object.assign(data, serializer.decode(v))
}
}
return data
}
type RouterExtensionParams = {
path: string
queryParams?: Record<string, any>
@ -221,15 +251,7 @@ export class Router {
}
from(historyItem) {
const [path, qs] = historyItem.path.split("?")
let ext = this.at(path)
if (qs) {
ext = ext.qp(parseQueryString(qs || ""))
}
return ext
return this.at(first(historyItem.path.split("?"))).qp(decodeQueryString(historyItem))
}
fromCurrent() {