Pin joined relays at top of list

This commit is contained in:
Jonathan Staab 2022-12-02 05:03:16 -08:00
parent b7195dc37f
commit e87c6d6a03

View File

@ -1,5 +1,6 @@
<script> <script>
import {fly} from 'svelte/transition' import {fly} from 'svelte/transition'
import {find, identity, whereEq, reject} from 'ramda'
import {fuzzy} from "src/util/misc" import {fuzzy} from "src/util/misc"
import Input from "src/partials/Input.svelte" import Input from "src/partials/Input.svelte"
import {dispatch} from "src/state/dispatch" import {dispatch} from "src/state/dispatch"
@ -8,8 +9,10 @@
let q = "" let q = ""
let search let search
let data
$: search = fuzzy($knownRelays || [], {keys: ["name", "description", "url"]}) $: data = reject(r => $relays.includes(r.url), $knownRelays || [])
$: search = fuzzy(data, {keys: ["name", "description", "url"]})
const join = url => dispatch("relay/join", url) const join = url => dispatch("relay/join", url)
@ -29,16 +32,28 @@
<i slot="before" class="fa-solid fa-search" /> <i slot="before" class="fa-solid fa-search" />
</Input> </Input>
<div class="flex flex-col gap-6 overflow-auto flex-grow -mx-6 px-6"> <div class="flex flex-col gap-6 overflow-auto flex-grow -mx-6 px-6">
{#each $relays.map(url => find(whereEq({url}), $knownRelays)).filter(identity) as relay}
<div class="flex gap-2 justify-between">
<div>
<strong>{relay.name || relay.url}</strong>
<p class="text-light">{relay.description || ''}</p>
</div>
<a class="underline cursor-pointer" on:click={() => leave(relay.url)}>
Leave
</a>
</div>
{/each}
{#if $relays.length > 0}
<div class="pt-2 mb-2 border-b border-solid border-medium" />
{/if}
{#each search(q).slice(0, 10) as relay} {#each search(q).slice(0, 10) as relay}
<div class="flex gap-2 justify-between"> <div class="flex gap-2 justify-between">
<div> <div>
<strong>{relay.name || relay.url}</strong> <strong>{relay.name || relay.url}</strong>
<p class="text-light">{relay.description || ''}</p> <p class="text-light">{relay.description || ''}</p>
</div> </div>
<a <a class="underline cursor-pointer" on:click={() => join(relay.url)}>
class="underline cursor-pointer" Join
on:click={() => $relays.includes(relay.url) ? leave(relay.url) : join(relay.url)}>
{$relays.includes(relay.url) ? "Leave" : "Join"}
</a> </a>
</div> </div>
{/each} {/each}