forked from coracle/flotilla
Add amber support
This commit is contained in:
@@ -10,7 +10,7 @@
|
|||||||
import ProfileName from "@app/components/ProfileName.svelte"
|
import ProfileName from "@app/components/ProfileName.svelte"
|
||||||
import ProfileCircle from "@app/components/ProfileCircle.svelte"
|
import ProfileCircle from "@app/components/ProfileCircle.svelte"
|
||||||
import ProfileCircles from "@app/components/ProfileCircles.svelte"
|
import ProfileCircles from "@app/components/ProfileCircles.svelte"
|
||||||
import {makeChatPath} from '@app/routes'
|
import {makeChatPath} from "@app/routes"
|
||||||
|
|
||||||
export let id: string
|
export let id: string
|
||||||
export let pubkeys: string[]
|
export let pubkeys: string[]
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {nip19} from "nostr-tools"
|
import {nip19} from "nostr-tools"
|
||||||
import {ctx} from "@welshman/lib"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import FieldInline from "@lib/components/FieldInline.svelte"
|
import FieldInline from "@lib/components/FieldInline.svelte"
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {makeSecret, getNip07, Nip46Broker} from "@welshman/signer"
|
import {onMount} from "svelte"
|
||||||
|
import {makeSecret, getNip07, Nip46Broker, getNip55, Nip55Signer} from "@welshman/signer"
|
||||||
import {addSession, loadHandle, nip46Perms, type Session} from "@welshman/app"
|
import {addSession, loadHandle, nip46Perms, type Session} from "@welshman/app"
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import Tippy from "@lib/components/Tippy.svelte"
|
import Tippy from "@lib/components/Tippy.svelte"
|
||||||
@@ -86,11 +87,30 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const loginWithSigner = async (app: any) => {
|
||||||
|
const signer = new Nip55Signer(app.packageName)
|
||||||
|
const pubkey = await signer.getPubkey()
|
||||||
|
|
||||||
|
if (pubkey) {
|
||||||
|
await onSuccess({method: "nip55", pubkey, signer: app.packageName})
|
||||||
|
} else {
|
||||||
|
pushToast({
|
||||||
|
theme: "error",
|
||||||
|
message: "Something went wrong! Please try again.",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const loginWithKey = () => pushModal(LogInKey)
|
const loginWithKey = () => pushModal(LogInKey)
|
||||||
|
|
||||||
let username = ""
|
let username = ""
|
||||||
let domain = "nsec.app"
|
let domain = "nsec.app"
|
||||||
let loading = false
|
let loading = false
|
||||||
|
let signers: any[] = []
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
signers = await getNip55()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<form class="column gap-4" on:submit|preventDefault={loginWithNip46}>
|
<form class="column gap-4" on:submit|preventDefault={loginWithNip46}>
|
||||||
@@ -136,6 +156,12 @@
|
|||||||
Log in with Extension
|
Log in with Extension
|
||||||
</Button>
|
</Button>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#each signers as app}
|
||||||
|
<Button disabled={loading} class="btn btn-neutral" on:click={() => loginWithSigner(app)}>
|
||||||
|
<img src={app.iconUrl} alt={app.name} width="48" height="48" />
|
||||||
|
Log in with {app.name}
|
||||||
|
</Button>
|
||||||
|
{/each}
|
||||||
<Button disabled={loading} on:click={loginWithKey} class="btn btn-neutral">
|
<Button disabled={loading} on:click={loginWithKey} class="btn btn-neutral">
|
||||||
<Icon icon="key" />
|
<Icon icon="key" />
|
||||||
Log in with Key
|
Log in with Key
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {page} from "$app/stores"
|
import {page} from "$app/stores"
|
||||||
import {goto} from "$app/navigation"
|
|
||||||
import {displayRelayUrl} from "@welshman/util"
|
import {displayRelayUrl} from "@welshman/util"
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import Link from "@lib/components/Link.svelte"
|
import Link from "@lib/components/Link.svelte"
|
||||||
@@ -51,8 +50,6 @@
|
|||||||
showSettings = false
|
showSettings = false
|
||||||
}
|
}
|
||||||
|
|
||||||
const browseSpaces = () => goto("/discover")
|
|
||||||
|
|
||||||
const leaveSpace = () => pushModal(SpaceExit, {url: space})
|
const leaveSpace = () => pushModal(SpaceExit, {url: space})
|
||||||
|
|
||||||
const joinSpace = () => pushModal(SpaceJoin, {url: space})
|
const joinSpace = () => pushModal(SpaceJoin, {url: space})
|
||||||
@@ -85,16 +82,17 @@
|
|||||||
Go Back
|
Go Back
|
||||||
</Button>
|
</Button>
|
||||||
{:else if space}
|
{:else if space}
|
||||||
<p class="mb-4 text-2xl center gap-2">
|
<p class="center mb-4 gap-2 text-2xl">
|
||||||
<Icon icon="compass-big" size={7} />
|
<Icon icon="compass-big" size={7} />
|
||||||
<span class="text-primary">{displayRelayUrl(space)}</span>
|
<span class="text-primary">{displayRelayUrl(space)}</span>
|
||||||
</p>
|
</p>
|
||||||
<div class="grid sm:grid-cols-3 gap-2">
|
<div class="grid gap-2 sm:grid-cols-3">
|
||||||
<Link href={makeSpacePath(space, "threads")} class="btn btn-neutral">
|
<Link href={makeSpacePath(space, "threads")} class="btn btn-neutral">
|
||||||
<Icon icon="notes-minimalistic" /> Threads
|
<Icon icon="notes-minimalistic" /> Threads
|
||||||
</Link>
|
</Link>
|
||||||
<Link href={makeSpacePath(space)} class="btn btn-neutral">
|
<Link href={makeSpacePath(space)} class="btn btn-neutral">
|
||||||
<Icon icon="hashtag" /> {GENERAL}
|
<Icon icon="hashtag" />
|
||||||
|
{GENERAL}
|
||||||
</Link>
|
</Link>
|
||||||
{#each rooms as room, i (room)}
|
{#each rooms as room, i (room)}
|
||||||
<Link href={makeSpacePath(space, room)} class="btn btn-neutral">
|
<Link href={makeSpacePath(space, room)} class="btn btn-neutral">
|
||||||
@@ -109,7 +107,7 @@
|
|||||||
</Link>
|
</Link>
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
<div class="grid sm:grid-cols-2 gap-2">
|
<div class="grid gap-2 sm:grid-cols-2">
|
||||||
<Button on:click={addRoom} class="btn btn-primary">
|
<Button on:click={addRoom} class="btn btn-primary">
|
||||||
<Icon icon="add-circle" />
|
<Icon icon="add-circle" />
|
||||||
Create Room
|
Create Room
|
||||||
|
|||||||
@@ -1,27 +1,12 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {nip19} from "nostr-tools"
|
|
||||||
import {onMount} from "svelte"
|
import {onMount} from "svelte"
|
||||||
import {ago, append, first, sortBy, WEEK, ctx} from "@welshman/lib"
|
import {ago, append, first, sortBy, WEEK, ctx} from "@welshman/lib"
|
||||||
import {NOTE, getAncestorTags, getListTags, getPubkeyTagValues} from "@welshman/util"
|
import {NOTE, getAncestorTags} from "@welshman/util"
|
||||||
import type {Filter} from "@welshman/util"
|
import type {Filter} from "@welshman/util"
|
||||||
import {deriveEvents} from "@welshman/store"
|
import {deriveEvents} from "@welshman/store"
|
||||||
import {
|
import {repository, load, loadRelaySelections, formatTimestampRelative} from "@welshman/app"
|
||||||
repository,
|
|
||||||
load,
|
|
||||||
loadRelaySelections,
|
|
||||||
userFollows,
|
|
||||||
formatTimestamp,
|
|
||||||
formatTimestampRelative,
|
|
||||||
} from "@welshman/app"
|
|
||||||
import Link from "@lib/components/Link.svelte"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
|
||||||
import Button from "@lib/components/Button.svelte"
|
|
||||||
import Profile from "@app/components/Profile.svelte"
|
import Profile from "@app/components/Profile.svelte"
|
||||||
import ProfileInfo from "@app/components/ProfileInfo.svelte"
|
import ProfileInfo from "@app/components/ProfileInfo.svelte"
|
||||||
import Content from "@app/components/Content.svelte"
|
|
||||||
import ProfileDetail from "@app/components/ProfileDetail.svelte"
|
|
||||||
import {pushDrawer} from "@app/modal"
|
|
||||||
import {entityLink} from "@app/state"
|
|
||||||
|
|
||||||
export let pubkey
|
export let pubkey
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,11 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<PrimaryNavItem title="Settings" href="/settings/profile" prefix="/settings" class="tooltip-right">
|
<PrimaryNavItem
|
||||||
|
title="Settings"
|
||||||
|
href="/settings/profile"
|
||||||
|
prefix="/settings"
|
||||||
|
class="tooltip-right">
|
||||||
<Avatar src={$userProfile?.picture} class="!h-10 !w-10" />
|
<Avatar src={$userProfile?.picture} class="!h-10 !w-10" />
|
||||||
</PrimaryNavItem>
|
</PrimaryNavItem>
|
||||||
<PrimaryNavItem title="Threads" href="/network" class="tooltip-right">
|
<PrimaryNavItem title="Threads" href="/network" class="tooltip-right">
|
||||||
|
|||||||
@@ -3,9 +3,25 @@
|
|||||||
import {nip19} from "nostr-tools"
|
import {nip19} from "nostr-tools"
|
||||||
import {ctx, sleep, sortBy, flatten} from "@welshman/lib"
|
import {ctx, sleep, sortBy, flatten} from "@welshman/lib"
|
||||||
import {feedFromFilter} from "@welshman/feeds"
|
import {feedFromFilter} from "@welshman/feeds"
|
||||||
import {NOTE, displayProfile, getListTags, getPubkeyTagValues, displayPubkey, getAncestorTags} from "@welshman/util"
|
import {
|
||||||
|
NOTE,
|
||||||
|
displayProfile,
|
||||||
|
getListTags,
|
||||||
|
getPubkeyTagValues,
|
||||||
|
displayPubkey,
|
||||||
|
getAncestorTags,
|
||||||
|
} from "@welshman/util"
|
||||||
import {deriveEvents} from "@welshman/store"
|
import {deriveEvents} from "@welshman/store"
|
||||||
import {repository, userFollows, tagPubkey, follow, unfollow, deriveProfile, displayNip05, feedLoader} from "@welshman/app"
|
import {
|
||||||
|
repository,
|
||||||
|
userFollows,
|
||||||
|
tagPubkey,
|
||||||
|
follow,
|
||||||
|
unfollow,
|
||||||
|
deriveProfile,
|
||||||
|
displayNip05,
|
||||||
|
feedLoader,
|
||||||
|
} from "@welshman/app"
|
||||||
import {createScroller} from "@lib/html"
|
import {createScroller} from "@lib/html"
|
||||||
import {fly} from "@lib/transition"
|
import {fly} from "@lib/transition"
|
||||||
import Link from "@lib/components/Link.svelte"
|
import Link from "@lib/components/Link.svelte"
|
||||||
@@ -60,11 +76,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if getPubkeyTagValues(getListTags($userFollows)).includes(pubkey)}
|
{#if getPubkeyTagValues(getListTags($userFollows)).includes(pubkey)}
|
||||||
<button type="button" class="btn btn-neutral" on:click|preventDefault={() => unfollow(pubkey)}>
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-neutral"
|
||||||
|
on:click|preventDefault={() => unfollow(pubkey)}>
|
||||||
Unfollow
|
Unfollow
|
||||||
</button>
|
</button>
|
||||||
{:else}
|
{:else}
|
||||||
<button type="button" class="btn btn-primary" on:click|preventDefault={() => follow(tagPubkey(pubkey))}>
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-primary"
|
||||||
|
on:click|preventDefault={() => follow(tagPubkey(pubkey))}>
|
||||||
Follow
|
Follow
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import {nip19} from "nostr-tools"
|
|
||||||
import type {Page} from "@sveltejs/kit"
|
import type {Page} from "@sveltejs/kit"
|
||||||
import {userMembership, makeChatId, decodeRelay, encodeRelay, getMembershipUrls} from "@app/state"
|
import {userMembership, makeChatId, decodeRelay, encodeRelay, getMembershipUrls} from "@app/state"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import {nip19} from "nostr-tools"
|
|
||||||
import twColors from "tailwindcss/colors"
|
import twColors from "tailwindcss/colors"
|
||||||
import {get, derived} from "svelte/store"
|
import {get, derived} from "svelte/store"
|
||||||
import type {Maybe} from "@welshman/lib"
|
import type {Maybe} from "@welshman/lib"
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="btn btn-neutral h-[unset] flex flex-nowrap w-full text-left py-4 {$$props.class}">
|
<div class="btn btn-neutral flex h-[unset] w-full flex-nowrap py-4 text-left {$$props.class}">
|
||||||
<div class="flex flex-row items-start gap-1 flex-grow">
|
<div class="flex flex-grow flex-row items-start gap-1">
|
||||||
<div class="w-12 h-14 flex items-center flex-shrink-0">
|
<div class="flex h-14 w-12 flex-shrink-0 items-center">
|
||||||
<slot name="icon" />
|
<slot name="icon" />
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col gap-1">
|
<div class="flex flex-col gap-1">
|
||||||
<p class="text-lg text-bold pt-2">
|
<p class="text-bold pt-2 text-lg">
|
||||||
<slot name="title" />
|
<slot name="title" />
|
||||||
</p>
|
</p>
|
||||||
<p class="text-sm">
|
<p class="text-sm">
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-14 h-14 flex items-center justify-end">
|
<div class="flex h-14 w-14 items-center justify-end">
|
||||||
<Icon size={7} icon="alt-arrow-right" />
|
<Icon size={7} icon="alt-arrow-right" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
<div class="scroll-container max-h-screen flex-grow overflow-auto bg-base-200 pb-14 md:pb-0 {$$props.class}">
|
<div
|
||||||
|
class="scroll-container max-h-screen flex-grow overflow-auto bg-base-200 pb-14 md:pb-0 {$$props.class}">
|
||||||
<slot />
|
<slot />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ export const createScroller = ({
|
|||||||
let done = false
|
let done = false
|
||||||
|
|
||||||
const check = async () => {
|
const check = async () => {
|
||||||
const container = element.classList.contains('scroll-container')
|
const container = element.classList.contains("scroll-container")
|
||||||
? element
|
? element
|
||||||
: element.closest(".scroll-container")
|
: element.closest(".scroll-container")
|
||||||
|
|
||||||
|
|||||||
@@ -78,4 +78,3 @@ export function slideAndFade(
|
|||||||
export const conditionalTransition =
|
export const conditionalTransition =
|
||||||
(condition: any, transition: any) => (node: any, args?: any) =>
|
(condition: any, transition: any) => (node: any, args?: any) =>
|
||||||
condition ? transition(node, args) : null
|
condition ? transition(node, args) : null
|
||||||
|
|
||||||
|
|||||||
@@ -29,19 +29,21 @@
|
|||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="min-h-screen hidden md:hero">
|
<div class="hidden min-h-screen md:hero">
|
||||||
<div class="hero-content col-2 text-center">
|
<div class="col-2 hero-content text-center">
|
||||||
<p class="row-2 text-lg">
|
<p class="row-2 text-lg">
|
||||||
<Icon icon="info-circle" />
|
<Icon icon="info-circle" />
|
||||||
No conversation selected.
|
No conversation selected.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Click on a conversation in the sidebar, or <Button class="link" on:click={startChat}>start a new one</Button>.
|
Click on a conversation in the sidebar, or <Button class="link" on:click={startChat}
|
||||||
|
>start a new one</Button
|
||||||
|
>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="content col-2">
|
<div class="content col-2">
|
||||||
<div class="row-2 min-w-0 items-center flex-grow">
|
<div class="row-2 min-w-0 flex-grow items-center">
|
||||||
<label class="input input-bordered flex flex-grow items-center gap-2">
|
<label class="input input-bordered flex flex-grow items-center gap-2">
|
||||||
<Icon icon="magnifer" />
|
<Icon icon="magnifer" />
|
||||||
<input bind:value={term} class="grow" type="text" placeholder="Search for conversations..." />
|
<input bind:value={term} class="grow" type="text" placeholder="Search for conversations..." />
|
||||||
|
|||||||
@@ -121,7 +121,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div transition:slide={{delay: getDelay()}}>
|
<div transition:slide={{delay: getDelay()}}>
|
||||||
<SecondaryNavItem href={makeSpacePath(url)}>
|
<SecondaryNavItem href={makeSpacePath(url)}>
|
||||||
<Icon icon="hashtag" /> {GENERAL}
|
<Icon icon="hashtag" />
|
||||||
|
{GENERAL}
|
||||||
</SecondaryNavItem>
|
</SecondaryNavItem>
|
||||||
</div>
|
</div>
|
||||||
{#each rooms as room, i (room)}
|
{#each rooms as room, i (room)}
|
||||||
|
|||||||
Reference in New Issue
Block a user