diff --git a/src/app/shared/FeedControls.svelte b/src/app/shared/FeedControls.svelte index c908c2a7..25f045c1 100644 --- a/src/app/shared/FeedControls.svelte +++ b/src/app/shared/FeedControls.svelte @@ -12,7 +12,7 @@ import Toggle from "src/partials/Toggle.svelte" import Modal from "src/partials/Modal.svelte" import FeedForm from "src/app/shared/FeedForm.svelte" - import {feedLoader, displayPubkey} from "src/engine" + import {feedLoader, displayRelayUrl, displayPubkey} from "src/engine" export let value @@ -71,19 +71,15 @@ {/if} {#if feedType === FeedType.Relay} - On {quantify(feed[1], "relay")} + On {feed[1].length === 1 ? displayRelayUrl(feed[1][0]) : `${feed[1].length} relays`} {:else if feedType === FeedType.List} - From {quantify(feed.slice(1), "list")} - - {:else if feedType === FeedType.LOL} - - From {quantify(feed.slice(1), "list")} of lists + From {quantify(feed.slice(1).length, "list")} {:else if feedType === FeedType.DVM} - From {quantify(feed.slice(1), "DVM")} + From {quantify(feed.slice(1).length, "DVM")} {:else if feedType === FeedType.Filter} {#if feed.length > 2} diff --git a/src/app/shared/FeedForm.svelte b/src/app/shared/FeedForm.svelte index 3c72565f..c52ca05a 100644 --- a/src/app/shared/FeedForm.svelte +++ b/src/app/shared/FeedForm.svelte @@ -14,7 +14,7 @@ import Select from "src/partials/Select.svelte" import SearchSelect from "src/partials/SearchSelect.svelte" import FilterField from "src/app/shared/FilterField.svelte" - import {searchRelayUrls, displayRelayUrl} from "src/engine" + import {searchRelayUrls, searchListAddrs, displayListByAddress, displayRelayUrl} from "src/engine" export let feed export let onChange @@ -40,13 +40,10 @@ const onTypeChange = type => setAtCursor([type]) - const onRelayChange = urls => setAtCursor(urls, [1]) - const displayFeed = ([type, ...feed]) => switcherFn(type, { [FeedType.Filter]: () => quantify(feed.length, "filter"), [FeedType.List]: () => quantify(feed.length, "list"), - [FeedType.LOL]: () => quantify(feed.length, "list") + " of lists", [FeedType.DVM]: () => quantify(feed.length, "DVM"), [FeedType.Relay]: () => quantify(feed.slice(1).length, "feed") + " on " + quantify(feed[0].length, "relays"), @@ -68,8 +65,7 @@ Standard - List - List of lists + From lists Data vending machine Relays Union @@ -88,11 +84,11 @@ multiple value={feed[1] || []} search={$searchRelayUrls} - onChange={onRelayChange}> + onChange={urls => setAtCursor(urls, [1])}> {displayRelayUrl(item)} Select which relays you'd like to limit loading feeds from. - + {:else if feedType === FeedType.Filter} {#each current.slice(1) as filter, filterIdx ([current.length, filterIdx].join(':'))} {@const feedIdx = inc(filterIdx)} @@ -111,7 +107,19 @@ Add filter - {:else if feedType === FeedType.List}{:else if feedType === FeedType.LOL}{:else if feedType === FeedType.DVM}{/if} + {:else if feedType === FeedType.List} + + setAtCursor([FeedType.List, ...addrs])}> + {displayListByAddress(item)} + + Select which lists you'd like to view. + + {:else if feedType === FeedType.DVM} + {/if} {#each subFeeds as subFeed, i (displayFeed(subFeed) + i)} {displayFeed(subFeed)} @@ -133,7 +141,6 @@ addFeed(FeedType.Filter)}>Standard Feed addFeed(FeedType.List)}>List Feed - addFeed(FeedType.LOL)}>Lists of Lists addFeed(FeedType.DVM)}>DVM Feed diff --git a/src/app/util/feeds.ts b/src/app/util/feeds.ts index d80aad9a..7ed48a13 100644 --- a/src/app/util/feeds.ts +++ b/src/app/util/feeds.ts @@ -10,6 +10,7 @@ import { isContextAddress, decodeAddress, } from "@welshman/util" +import {Tracker} from "@welshman/net" import type {Feed, Loader} from "@welshman/feeds" import {FeedLoader as CoreFeedLoader, FeedType} from "@welshman/feeds" import {LOCAL_RELAY_URL, noteKinds, reactionKinds, repostKinds} from "src/util/nostr" @@ -68,13 +69,14 @@ export class FeedLoader { } const promises = [] + const tracker = new Tracker() // Use relays specified in feeds if (relays.length > 0) { - promises.push(load({filters, relays, onEvent})) + promises.push(load({filters, relays, tracker, onEvent})) } else { if (!this.opts.skipCache) { - promises.push(load({filters, relays: [LOCAL_RELAY_URL], onEvent})) + promises.push(load({filters, relays: [LOCAL_RELAY_URL], tracker, onEvent})) } if (!this.opts.skipNetwork) { @@ -85,7 +87,7 @@ export class FeedLoader { } for (const {relay, filters} of selections) { - promises.push(load({filters, relays: [relay], onEvent})) + promises.push(load({filters, relays: [relay], tracker, onEvent})) } } } diff --git a/src/app/views/ThreadDetail.svelte b/src/app/views/ThreadDetail.svelte index 8f52fa26..8c938629 100644 --- a/src/app/views/ThreadDetail.svelte +++ b/src/app/views/ThreadDetail.svelte @@ -40,9 +40,7 @@ {#if showAncestors} {#each $ancestors as ancestor (ancestor.id)} - - - + {/each} {:else if $ancestors.length > 0} ("address", [_lists, deletes], ([$l, $d]) => $l.filter(l => !$d.has(l.address)), @@ -23,3 +24,7 @@ export const userLists = derivedCollection("address", [lists, pubkey], ([$ return sortBy(getName, Array.from(m.values())) }) + +export const searchLists = lists.derived(getListSearch) + +export const searchListAddrs = searchLists.derived(search => term => pluck('address', search(term))) diff --git a/src/engine/lists/index.ts b/src/engine/lists/index.ts index 653fa859..fa7b5ec4 100644 --- a/src/engine/lists/index.ts +++ b/src/engine/lists/index.ts @@ -1,5 +1,6 @@ export * from "./model" export * from "./state" +export * from "./utils" export * from "./derived" export * from "./projections" export * from "./commands" diff --git a/src/engine/lists/utils.ts b/src/engine/lists/utils.ts new file mode 100644 index 00000000..e7c4bbe4 --- /dev/null +++ b/src/engine/lists/utils.ts @@ -0,0 +1,11 @@ +import {fuzzy} from "src/util/misc" +import type {List} from "./model" +import {_lists} from './state' + +export const displayList = (list: List) => list?.title || "" + +export const displayListByAddress = (address: string) => displayList(_lists.key(address).get()) + +export const getListSearch = ($lists: List[]): ((term: string) => List[]) => { + return fuzzy($lists, {keys: ["title", "description"]}) +} diff --git a/src/partials/SearchSelect.svelte b/src/partials/SearchSelect.svelte index 627c409a..97794d14 100644 --- a/src/partials/SearchSelect.svelte +++ b/src/partials/SearchSelect.svelte @@ -35,6 +35,7 @@ export const clearValue = () => { value = multiple ? [] : null + onChange?.(value) } export const clearTerm = () => { @@ -47,6 +48,7 @@ const remove = item => { value = multiple ? reject(equals(item), value) : null + onChange?.(value) } const select = item => { diff --git a/src/util/misc.ts b/src/util/misc.ts index e4be6a8e..41d70b03 100644 --- a/src/util/misc.ts +++ b/src/util/misc.ts @@ -88,11 +88,21 @@ export const createScroller = ( loadMore: () => Promise, {delay = 1000, threshold = 2000, reverse = false, element}: ScrollerOpts = {}, ) => { + const getScrollElement = () => { + let e = element + + while (e.parentElement && e.scrollTop === 0) { + e = e.parentElement + } + + return e + } + let done = false const check = async () => { // While we have empty space, fill it const {scrollY, innerHeight} = window - const {scrollHeight, scrollTop} = element + const {scrollHeight, scrollTop} = getScrollElement() const offset = Math.abs(scrollTop || scrollY) const shouldLoad = offset + innerHeight + threshold > scrollHeight
Select which relays you'd like to limit loading feeds from.
Select which lists you'd like to view.