Community

{#if online}
{/if}
{#if online}
online as {slsk.username} · Soulseek
{:else if slsk.connection === "connecting"}
signing in…
{/if}
{#if !online}
Sign in to Soulseek
The network's rooms, its people and, next, its music. Your account is kept on this phone only.
{ if (e.key === "Enter") signIn(); }} />
{#if slsk.loginError}
{slsk.loginError}
{/if} {#if slsk.savedUser && slsk.hasPassword && slsk.connection === "offline"} {/if}
No account? Soulseek makes one from the first sign-in with a new name.
Spaces, holdings and the sealed inbox come later on the phone. They live on the private layer; the network side is here first.
{:else}
{#each [["rooms", "Rooms"], ["chat", "Chat"], ["buddies", "Buddies"]] as [k, l] (k)} {/each}
{#if tab === "rooms"} {#if joinedNames.length}

Joined · {joinedNames.length}

{#each joinedNames as name (name)} {@const r = slsk.joined[name]} {@const last = r.messages[r.messages.length - 1]} {/each} {/if}

Rooms · {slsk.rooms.length} on the server

{#if !slsk.rooms.length}
Asking the server for its rooms…
{:else if slsk.rooms.length > 8}
(roomQ = e.currentTarget.value)} type="search" placeholder="Find a room" autocomplete="off" autocapitalize="off" spellcheck="false" aria-label="Find a room" /> {#if roomQ}{/if}
{#if roomQ}
{roomsMatching.length} of {slsk.rooms.length} rooms
{/if} {/if} {#each otherRooms as r (r.name)} {/each} {#if roomsMatching.length > roomCap}
{/if} {:else if tab === "chat"} {#if !threads.length}
No conversations yet.A name in a room, or a buddy, opens one.
{/if} {#each threads as t (t.u)} {/each} {:else if tab === "buddies"} {#if !buddies.length}
No buddies on this account yet.Hold a name in a room to add one, or look one up above.
{/if} {#each buddies as b (b.u)} {/each} {/if}
{/if}