mirror of
https://github.com/coracle-social/coracle.git
synced 2024-09-19 19:46:42 +00:00
Make the forced-relay experience more seamless, split modal routes out
This commit is contained in:
parent
30a5ab3e94
commit
096e4c5b42
@ -1,12 +1,10 @@
|
|||||||
# Current
|
# Current
|
||||||
|
|
||||||
- [ ] Fix cursor
|
|
||||||
- [ ] Image classification
|
- [ ] Image classification
|
||||||
- https://github.com/bhky/opennsfw2
|
- https://github.com/bhky/opennsfw2
|
||||||
|
|
||||||
# Core
|
# Core
|
||||||
|
|
||||||
- [ ] Key login should accept bech32 and hex
|
|
||||||
- [ ] Make mutes private
|
- [ ] Make mutes private
|
||||||
- [ ] Write multi-relay pagination into paravel and open source it
|
- [ ] Write multi-relay pagination into paravel and open source it
|
||||||
- https://github.com/nostr-protocol/nips/pull/408
|
- https://github.com/nostr-protocol/nips/pull/408
|
||||||
|
@ -94,6 +94,7 @@ const Meta = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const forceUrls = (import.meta.env.VITE_FORCE_RELAYS || "").split(",").filter(identity)
|
const forceUrls = (import.meta.env.VITE_FORCE_RELAYS || "").split(",").filter(identity)
|
||||||
|
const forceRelays = forceUrls.map(url => ({url, write: true}))
|
||||||
|
|
||||||
const countRelay = forceUrls[0] || "wss://rbr.bio"
|
const countRelay = forceUrls[0] || "wss://rbr.bio"
|
||||||
|
|
||||||
@ -402,6 +403,7 @@ export default {
|
|||||||
Config,
|
Config,
|
||||||
Meta,
|
Meta,
|
||||||
forceUrls,
|
forceUrls,
|
||||||
|
forceRelays,
|
||||||
defaultUrls,
|
defaultUrls,
|
||||||
disconnect,
|
disconnect,
|
||||||
getQuality,
|
getQuality,
|
||||||
|
@ -28,6 +28,7 @@ export const initializeRelayList = async () => {
|
|||||||
await relays.patch(pool.defaultUrls.map(objOf("url")))
|
await relays.patch(pool.defaultUrls.map(objOf("url")))
|
||||||
|
|
||||||
// Load relays from nostr.watch via dufflepud
|
// Load relays from nostr.watch via dufflepud
|
||||||
|
if (pool.forceUrls.length === 0) {
|
||||||
try {
|
try {
|
||||||
const url = import.meta.env.VITE_DUFFLEPUD_URL + "/relay"
|
const url = import.meta.env.VITE_DUFFLEPUD_URL + "/relay"
|
||||||
const json = await fetchJson(url)
|
const json = await fetchJson(url)
|
||||||
@ -36,6 +37,7 @@ export const initializeRelayList = async () => {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
warn("Failed to fetch relays list", e)
|
warn("Failed to fetch relays list", e)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pubkey relays
|
// Pubkey relays
|
||||||
|
@ -47,7 +47,9 @@ const settings = derived(profile, prop("settings"))
|
|||||||
const roomsJoined = derived(profile, prop("rooms_joined")) as Readable<string>
|
const roomsJoined = derived(profile, prop("rooms_joined")) as Readable<string>
|
||||||
const lastChecked = derived(profile, prop("last_checked")) as Readable<Record<string, number>>
|
const lastChecked = derived(profile, prop("last_checked")) as Readable<Record<string, number>>
|
||||||
const petnames = derived(profile, prop("petnames")) as Readable<Array<Array<string>>>
|
const petnames = derived(profile, prop("petnames")) as Readable<Array<Array<string>>>
|
||||||
const relays = derived(profile, prop("relays")) as Readable<Array<Relay>>
|
const relays = derived(profile, p =>
|
||||||
|
pool.forceRelays.length > 0 ? pool.forceRelays : p.relays
|
||||||
|
) as Readable<Array<Relay>>
|
||||||
const mutes = derived(profile, prop("mutes")) as Readable<Array<[string, string]>>
|
const mutes = derived(profile, prop("mutes")) as Readable<Array<[string, string]>>
|
||||||
const lists = derived(profile, prop("lists")) as Readable<Array<MyEvent>>
|
const lists = derived(profile, prop("lists")) as Readable<Array<MyEvent>>
|
||||||
|
|
||||||
|
@ -3,85 +3,20 @@
|
|||||||
import {menuIsOpen} from "src/app/state"
|
import {menuIsOpen} from "src/app/state"
|
||||||
import {modal} from "src/partials/state"
|
import {modal} from "src/partials/state"
|
||||||
import Modal from "src/partials/Modal.svelte"
|
import Modal from "src/partials/Modal.svelte"
|
||||||
import Content from "src/partials/Content.svelte"
|
import ModalRoutes from "src/app/ModalRoutes.svelte"
|
||||||
import Spinner from "src/partials/Spinner.svelte"
|
|
||||||
import ChatEdit from "src/app/views/ChatEdit.svelte"
|
|
||||||
import LoginConnect from "src/app/views/LoginConnect.svelte"
|
|
||||||
import LoginPrivKey from "src/app/views/LoginPrivKey.svelte"
|
|
||||||
import LoginPubKey from "src/app/views/LoginPubKey.svelte"
|
|
||||||
import Onboarding from "src/app/views/Onboarding.svelte"
|
|
||||||
import NoteCreate from "src/app/views/NoteCreate.svelte"
|
|
||||||
import NoteZap from "src/app/views/NoteZap.svelte"
|
|
||||||
import NoteDetail from "src/app/views/NoteDetail.svelte"
|
|
||||||
import PersonFeed from "src/app/views/PersonFeed.svelte"
|
|
||||||
import PersonList from "src/app/shared/PersonList.svelte"
|
|
||||||
import PersonProfileInfo from "src/app/views/PersonProfileInfo.svelte"
|
|
||||||
import PersonShare from "src/app/views/PersonShare.svelte"
|
|
||||||
import TopicFeed from "src/app/views/TopicFeed.svelte"
|
|
||||||
import ListList from "src/app/views/ListList.svelte"
|
|
||||||
import ListSelect from "src/app/views/ListSelect.svelte"
|
|
||||||
import ListEdit from "src/app/views/ListEdit.svelte"
|
|
||||||
import RelayAdd from "src/app/views/RelayAdd.svelte"
|
|
||||||
|
|
||||||
const {stack} = modal
|
const {stack} = modal
|
||||||
|
|
||||||
|
$: nonVirtual = $stack.filter(m => !m.virtual)
|
||||||
|
|
||||||
const closeModal = async () => {
|
const closeModal = async () => {
|
||||||
modal.pop()
|
modal.pop()
|
||||||
menuIsOpen.set(false)
|
menuIsOpen.set(false)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#each $stack as m}
|
{#each nonVirtual as m}
|
||||||
{#if !m.virtual}
|
<Modal virtual={false} onEscape={!m.noEscape && m === last($stack) ? closeModal : null}>
|
||||||
<Modal virtual={false} onEscape={m.noEscape || m !== last($stack) ? null : closeModal}>
|
<ModalRoutes {m} />
|
||||||
{#if m.type === "note/detail"}
|
|
||||||
{#key m.note.id}
|
|
||||||
<NoteDetail {...m} invertColors />
|
|
||||||
{/key}
|
|
||||||
{:else if m.type === "note/create"}
|
|
||||||
<NoteCreate pubkey={m.pubkey} nevent={m.nevent} />
|
|
||||||
{:else if m.type === "note/zap"}
|
|
||||||
<NoteZap note={m.note} />
|
|
||||||
{:else if m.type === "relay/add"}
|
|
||||||
<RelayAdd url={m.url} />
|
|
||||||
{:else if m.type === "onboarding"}
|
|
||||||
<Onboarding stage={m.stage} />
|
|
||||||
{:else if m.type === "room/edit"}
|
|
||||||
<ChatEdit {...m} />
|
|
||||||
{:else if m.type === "login/privkey"}
|
|
||||||
<LoginPrivKey />
|
|
||||||
{:else if m.type === "login/pubkey"}
|
|
||||||
<LoginPubKey />
|
|
||||||
{:else if m.type === "login/connect"}
|
|
||||||
<LoginConnect />
|
|
||||||
{:else if m.type === "person/feed"}
|
|
||||||
<PersonFeed pubkey={m.pubkey} />
|
|
||||||
{:else if m.type === "person/info"}
|
|
||||||
<PersonProfileInfo person={m.person} />
|
|
||||||
{:else if m.type === "person/share"}
|
|
||||||
<PersonShare person={m.person} />
|
|
||||||
{:else if m.type === "person/follows"}
|
|
||||||
<PersonList type="follows" pubkey={m.pubkey} />
|
|
||||||
{:else if m.type === "person/followers"}
|
|
||||||
<PersonList type="followers" pubkey={m.pubkey} />
|
|
||||||
{:else if m.type === "topic/feed"}
|
|
||||||
{#key m.topic}
|
|
||||||
<TopicFeed topic={m.topic} />
|
|
||||||
{/key}
|
|
||||||
{:else if m.type === "list/list"}
|
|
||||||
<ListList />
|
|
||||||
{:else if m.type === "list/select"}
|
|
||||||
<ListSelect item={m.item} />
|
|
||||||
{:else if m.type === "list/edit"}
|
|
||||||
<ListEdit list={m.list} />
|
|
||||||
{:else if m.type === "message"}
|
|
||||||
<Content size="lg">
|
|
||||||
<div class="text-center">{m.message}</div>
|
|
||||||
{#if m.spinner}
|
|
||||||
<Spinner delay={0} />
|
|
||||||
{/if}
|
|
||||||
</Content>
|
|
||||||
{/if}
|
|
||||||
</Modal>
|
</Modal>
|
||||||
{/if}
|
|
||||||
{/each}
|
{/each}
|
||||||
|
72
src/app/ModalRoutes.svelte
Normal file
72
src/app/ModalRoutes.svelte
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Content from "src/partials/Content.svelte"
|
||||||
|
import Spinner from "src/partials/Spinner.svelte"
|
||||||
|
import ChatEdit from "src/app/views/ChatEdit.svelte"
|
||||||
|
import LoginConnect from "src/app/views/LoginConnect.svelte"
|
||||||
|
import LoginPrivKey from "src/app/views/LoginPrivKey.svelte"
|
||||||
|
import LoginPubKey from "src/app/views/LoginPubKey.svelte"
|
||||||
|
import Onboarding from "src/app/views/Onboarding.svelte"
|
||||||
|
import NoteCreate from "src/app/views/NoteCreate.svelte"
|
||||||
|
import NoteZap from "src/app/views/NoteZap.svelte"
|
||||||
|
import NoteDetail from "src/app/views/NoteDetail.svelte"
|
||||||
|
import PersonFeed from "src/app/views/PersonFeed.svelte"
|
||||||
|
import PersonList from "src/app/shared/PersonList.svelte"
|
||||||
|
import PersonProfileInfo from "src/app/views/PersonProfileInfo.svelte"
|
||||||
|
import PersonShare from "src/app/views/PersonShare.svelte"
|
||||||
|
import TopicFeed from "src/app/views/TopicFeed.svelte"
|
||||||
|
import ListList from "src/app/views/ListList.svelte"
|
||||||
|
import ListSelect from "src/app/views/ListSelect.svelte"
|
||||||
|
import ListEdit from "src/app/views/ListEdit.svelte"
|
||||||
|
import RelayAdd from "src/app/views/RelayAdd.svelte"
|
||||||
|
|
||||||
|
export let m
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if m.type === "note/detail"}
|
||||||
|
{#key m.note.id}
|
||||||
|
<NoteDetail {...m} invertColors />
|
||||||
|
{/key}
|
||||||
|
{:else if m.type === "note/create"}
|
||||||
|
<NoteCreate pubkey={m.pubkey} nevent={m.nevent} />
|
||||||
|
{:else if m.type === "note/zap"}
|
||||||
|
<NoteZap note={m.note} />
|
||||||
|
{:else if m.type === "relay/add"}
|
||||||
|
<RelayAdd url={m.url} />
|
||||||
|
{:else if m.type === "onboarding"}
|
||||||
|
<Onboarding stage={m.stage} />
|
||||||
|
{:else if m.type === "room/edit"}
|
||||||
|
<ChatEdit {...m} />
|
||||||
|
{:else if m.type === "login/privkey"}
|
||||||
|
<LoginPrivKey />
|
||||||
|
{:else if m.type === "login/pubkey"}
|
||||||
|
<LoginPubKey />
|
||||||
|
{:else if m.type === "login/connect"}
|
||||||
|
<LoginConnect />
|
||||||
|
{:else if m.type === "person/feed"}
|
||||||
|
<PersonFeed pubkey={m.pubkey} />
|
||||||
|
{:else if m.type === "person/info"}
|
||||||
|
<PersonProfileInfo person={m.person} />
|
||||||
|
{:else if m.type === "person/share"}
|
||||||
|
<PersonShare person={m.person} />
|
||||||
|
{:else if m.type === "person/follows"}
|
||||||
|
<PersonList type="follows" pubkey={m.pubkey} />
|
||||||
|
{:else if m.type === "person/followers"}
|
||||||
|
<PersonList type="followers" pubkey={m.pubkey} />
|
||||||
|
{:else if m.type === "topic/feed"}
|
||||||
|
{#key m.topic}
|
||||||
|
<TopicFeed topic={m.topic} />
|
||||||
|
{/key}
|
||||||
|
{:else if m.type === "list/list"}
|
||||||
|
<ListList />
|
||||||
|
{:else if m.type === "list/select"}
|
||||||
|
<ListSelect item={m.item} />
|
||||||
|
{:else if m.type === "list/edit"}
|
||||||
|
<ListEdit list={m.list} />
|
||||||
|
{:else if m.type === "message"}
|
||||||
|
<Content size="lg">
|
||||||
|
<div class="text-center">{m.message}</div>
|
||||||
|
{#if m.spinner}
|
||||||
|
<Spinner delay={0} />
|
||||||
|
{/if}
|
||||||
|
</Content>
|
||||||
|
{/if}
|
@ -7,7 +7,7 @@ import {writable} from "svelte/store"
|
|||||||
import {max, omit, pluck, sortBy, find, slice, propEq} from "ramda"
|
import {max, omit, pluck, sortBy, find, slice, propEq} from "ramda"
|
||||||
import {createMap, doPipe, first} from "hurdak/lib/hurdak"
|
import {createMap, doPipe, first} from "hurdak/lib/hurdak"
|
||||||
import {warn} from "src/util/logger"
|
import {warn} from "src/util/logger"
|
||||||
import {hash} from "src/util/misc"
|
import {hash, sleep} from "src/util/misc"
|
||||||
import {now, timedelta} from "src/util/misc"
|
import {now, timedelta} from "src/util/misc"
|
||||||
import {Tags, isNotification, userKinds} from "src/util/nostr"
|
import {Tags, isNotification, userKinds} from "src/util/nostr"
|
||||||
import {findReplyId} from "src/util/nostr"
|
import {findReplyId} from "src/util/nostr"
|
||||||
@ -227,10 +227,26 @@ export const loadAppData = async pubkey => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const login = (method, key) => {
|
export const login = async (method, key) => {
|
||||||
keys.login(method, key)
|
keys.login(method, key)
|
||||||
|
|
||||||
|
if (pool.forceUrls.length > 0) {
|
||||||
|
modal.replace({
|
||||||
|
type: "message",
|
||||||
|
message: "Logging you in...",
|
||||||
|
spinner: true,
|
||||||
|
noEscape: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
sleep(1500),
|
||||||
|
network.loadPeople([user.getPubkey()], {force: true, kinds: userKinds}),
|
||||||
|
])
|
||||||
|
|
||||||
|
navigate("/notes")
|
||||||
|
} else {
|
||||||
modal.push({type: "login/connect", noEscape: true})
|
modal.push({type: "login/connect", noEscape: true})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const mergeParents = (notes: Array<DisplayEvent>) => {
|
export const mergeParents = (notes: Array<DisplayEvent>) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user