mirror of
https://github.com/coracle-social/coracle.git
synced 2024-09-29 00:10:52 +00:00
Show relays in feedcontrols
This commit is contained in:
parent
4dff9898c2
commit
1b71ae5dab
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -111,7 +111,7 @@ export const asRelay = {
|
||||
|
||||
export const asFilter = {
|
||||
encode: encodeFilter,
|
||||
decode: decodeAs(name, decodeFilter),
|
||||
decode: decodeAs("filter", decodeFilter),
|
||||
}
|
||||
|
||||
export const asChannelId = {
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -15,6 +15,7 @@
|
||||
let promise: Promise<Event> = defer()
|
||||
|
||||
onMount(() => {
|
||||
console.log($$props)
|
||||
promise = dereferenceNote($$props)
|
||||
})
|
||||
</script>
|
||||
|
@ -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))
|
||||
|
@ -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[]) => {
|
||||
|
@ -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
|
||||
|
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user