From 6714eac7e016117bc5497f75d5a7ff7c9b96a311 Mon Sep 17 00:00:00 2001 From: Jonathan Staab Date: Tue, 7 Mar 2023 17:16:33 -0600 Subject: [PATCH] Add new onboarding workflow --- ROADMAP.md | 2 + src/App.svelte | 6 +- src/app/index.ts | 11 +-- src/partials/PersonInfo.svelte | 48 +++++++++++ src/partials/RelayCard.svelte | 82 +++++++++++++++++++ .../RelayCardSimple.svelte | 0 src/routes/Login.svelte | 8 +- src/views/login/ConnectUser.svelte | 2 +- src/views/login/SignUp.svelte | 44 ---------- src/views/notes/NoteCreate.svelte | 2 +- src/views/onboarding/Onboarding.svelte | 81 ++++++++++++++++++ .../onboarding/OnboardingComplete.svelte | 27 ++++++ src/views/onboarding/OnboardingFollows.svelte | 72 ++++++++++++++++ src/views/onboarding/OnboardingIntro.svelte | 24 ++++++ src/views/onboarding/OnboardingKey.svelte | 41 ++++++++++ src/views/onboarding/OnboardingRelays.svelte | 81 ++++++++++++++++++ src/views/person/PersonInfo.svelte | 50 +++-------- src/views/relays/RelayCard.svelte | 77 ++++------------- 18 files changed, 498 insertions(+), 160 deletions(-) create mode 100644 src/partials/PersonInfo.svelte create mode 100644 src/partials/RelayCard.svelte rename src/{views/relays => partials}/RelayCardSimple.svelte (100%) delete mode 100644 src/views/login/SignUp.svelte create mode 100644 src/views/onboarding/Onboarding.svelte create mode 100644 src/views/onboarding/OnboardingComplete.svelte create mode 100644 src/views/onboarding/OnboardingFollows.svelte create mode 100644 src/views/onboarding/OnboardingIntro.svelte create mode 100644 src/views/onboarding/OnboardingKey.svelte create mode 100644 src/views/onboarding/OnboardingRelays.svelte diff --git a/ROADMAP.md b/ROADMAP.md index 4b69894b..83d29eb6 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,5 +1,7 @@ # Current +- [ ] Collapse relaycard and relaycardsimple? + - [ ] Go over onboarding process, suggest some good relays for newcomers - [ ] Submit blog post with new onboarding process built in - [ ] Fix hover on notes in modal diff --git a/src/App.svelte b/src/App.svelte index 92771e9d..b9bd0b42 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -55,7 +55,7 @@ import ConnectUser from "src/views/login/ConnectUser.svelte" import PrivKeyLogin from "src/views/login/PrivKeyLogin.svelte" import PubKeyLogin from "src/views/login/PubKeyLogin.svelte" - import SignUp from "src/views/login/SignUp.svelte" + import Onboarding from "src/views/onboarding/Onboarding.svelte" import NoteCreate from "src/views/notes/NoteCreate.svelte" import NoteDetail from "src/views/notes/NoteDetail.svelte" import PersonList from "src/views/person/PersonList.svelte" @@ -244,8 +244,8 @@ {:else if $modal.type === 'relay/add'} - {:else if $modal.type === 'signUp'} - + {:else if $modal.type === 'onboarding'} + {:else if $modal.type === 'room/edit'} {:else if $modal.type === 'login/privkey'} diff --git a/src/app/index.ts b/src/app/index.ts index 0ddca6fb..7223ff4b 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,8 +1,8 @@ import type {DisplayEvent} from 'src/util/types' -import {navigate} from 'svelte-routing' import {omit, sortBy} from 'ramda' import {createMap, ellipsize} from 'hurdak/lib/hurdak' import {renderContent} from 'src/util/html' +import {sleep} from 'src/util/misc' import {displayPerson, findReplyId} from 'src/util/nostr' import {getUserFollows} from 'src/agent/social' import {getUserReadRelays} from 'src/agent/relays' @@ -14,6 +14,9 @@ import {routes, modal, toast} from 'src/app/ui' export const loadAppData = async pubkey => { if (getUserReadRelays().length > 0) { + // Delay since this gets in the way of quickly loading feeds very often + await sleep(5000) + await Promise.all([ alerts.listen(pubkey), network.loadPeople(getUserFollows()), @@ -27,12 +30,6 @@ export const login = (method, key) => { modal.set({type: 'login/connect', noEscape: true}) } -export const signup = privkey => { - keys.login('privkey', privkey) - - navigate('/notes/follows') -} - export const renderNote = (note, {showEntire = false}) => { let content diff --git a/src/partials/PersonInfo.svelte b/src/partials/PersonInfo.svelte new file mode 100644 index 00000000..4ba5102e --- /dev/null +++ b/src/partials/PersonInfo.svelte @@ -0,0 +1,48 @@ + + + +
+
+
+
+

{displayPerson(person)}

+ {#if person.verified_as} +
+ + {last(person.verified_as.split('@'))} +
+ {/if} +
+ {#if removePetname} + removePetname(person))}> + Following + + {/if} + {#if addPetname} + addPetname(person))}> + Follow + + {/if} +
+

+ {@html renderContent(ellipsize(person.kind0?.about || '', 140))} +

+
+
diff --git a/src/partials/RelayCard.svelte b/src/partials/RelayCard.svelte new file mode 100644 index 00000000..93273da4 --- /dev/null +++ b/src/partials/RelayCard.svelte @@ -0,0 +1,82 @@ + + +
+
+
+ + + {last(relay.url.split('://'))} + + {showStatus = false}} + on:mouseover={() => {showStatus = true}} + class="w-2 h-2 rounded-full bg-medium cursor-pointer" + class:bg-medium={message === 'Not connected'} + class:bg-danger={quality <= 0.3 && message !== 'Not connected'} + class:bg-warning={between(0.3, 0.7, quality)} + class:bg-success={quality > 0.7}> + + +
+ {#if removeRelay} + + {/if} + {#if addRelay} + + {/if} +
+ {#if relay.description} +

{relay.description}

+ {/if} + +
diff --git a/src/views/relays/RelayCardSimple.svelte b/src/partials/RelayCardSimple.svelte similarity index 100% rename from src/views/relays/RelayCardSimple.svelte rename to src/partials/RelayCardSimple.svelte diff --git a/src/routes/Login.svelte b/src/routes/Login.svelte index b7417db1..d13e6fa8 100644 --- a/src/routes/Login.svelte +++ b/src/routes/Login.svelte @@ -1,8 +1,10 @@ diff --git a/src/views/login/ConnectUser.svelte b/src/views/login/ConnectUser.svelte index 3fdceee8..0b47be74 100644 --- a/src/views/login/ConnectUser.svelte +++ b/src/views/login/ConnectUser.svelte @@ -9,7 +9,7 @@ import Spinner from 'src/partials/Spinner.svelte' import Input from 'src/partials/Input.svelte' import Heading from 'src/partials/Heading.svelte' - import RelayCardSimple from 'src/views/relays/RelayCardSimple.svelte' + import RelayCardSimple from 'src/partials/RelayCardSimple.svelte' import Anchor from 'src/partials/Anchor.svelte' import Modal from 'src/partials/Modal.svelte' import {getUserReadRelays} from 'src/agent/relays' diff --git a/src/views/login/SignUp.svelte b/src/views/login/SignUp.svelte deleted file mode 100644 index b7e93d3e..00000000 --- a/src/views/login/SignUp.svelte +++ /dev/null @@ -1,44 +0,0 @@ - - - - - Create an Account -

- Don't have a nostr account? We've created a brand new private key for you below. - Make sure to click to copy and store it somewhere safe - this is your account's password! -

-
-
- - -
- Log In -
-

- Note that sharing your private key directly is not recommended, instead you should use - a compatible browser extension to securely store your key. -

-
- diff --git a/src/views/notes/NoteCreate.svelte b/src/views/notes/NoteCreate.svelte index bf4e4ea3..c83d13da 100644 --- a/src/views/notes/NoteCreate.svelte +++ b/src/views/notes/NoteCreate.svelte @@ -11,7 +11,7 @@ import ImageInput from "src/partials/ImageInput.svelte" import Preview from "src/partials/Preview.svelte" import Input from "src/partials/Input.svelte" - import RelayCardSimple from "src/views/relays/RelayCardSimple.svelte" + import RelayCardSimple from "src/partials/RelayCardSimple.svelte" import Content from "src/partials/Content.svelte" import Modal from "src/partials/Modal.svelte" import Heading from 'src/partials/Heading.svelte' diff --git a/src/views/onboarding/Onboarding.svelte b/src/views/onboarding/Onboarding.svelte new file mode 100644 index 00000000..b15a873c --- /dev/null +++ b/src/views/onboarding/Onboarding.svelte @@ -0,0 +1,81 @@ + + +{#key stage} +
+ {#if stage === 'intro'} + + {:else if stage === 'key'} + + {:else if stage === 'relays'} + + {:else if stage === 'follows'} + + {:else} + + {/if} +
+{/key} diff --git a/src/views/onboarding/OnboardingComplete.svelte b/src/views/onboarding/OnboardingComplete.svelte new file mode 100644 index 00000000..ea265814 --- /dev/null +++ b/src/views/onboarding/OnboardingComplete.svelte @@ -0,0 +1,27 @@ + + + + Welcome to Nostr +

+ You’re all set! If have any questions, or need any help, just ask. Your fellow + nostriches are always happy to lend a hand. +

+ Get on Nostr + {#if loading} + + {/if} +
diff --git a/src/views/onboarding/OnboardingFollows.svelte b/src/views/onboarding/OnboardingFollows.svelte new file mode 100644 index 00000000..64a320e0 --- /dev/null +++ b/src/views/onboarding/OnboardingFollows.svelte @@ -0,0 +1,72 @@ + + + + + Find Your People +

+ To get you started, we’ve added some interesting people to your follow list. + You can update your follows list at any time. +

+ modal.set({type: 'onboarding', stage: 'complete'})}> + Continue + +
+
+ +

Your follows

+
+ {#if follows.length === 0} +
+ + No follows selected +
+ {:else} + + {#each follows as pubkey} + + {/each} + + {/if} +
+ +

Other people

+
+ + + + {#each search(q).slice(0, 50) as person (person.pubkey)} + + {/each} +
diff --git a/src/views/onboarding/OnboardingIntro.svelte b/src/views/onboarding/OnboardingIntro.svelte new file mode 100644 index 00000000..f6af8a1e --- /dev/null +++ b/src/views/onboarding/OnboardingIntro.svelte @@ -0,0 +1,24 @@ + + + + Create an Account +

+ New to Nostr? Click here or watch the video + below for a crash course on what it is, and how to use it. +

+
diff --git a/src/views/onboarding/OnboardingKey.svelte b/src/views/onboarding/OnboardingKey.svelte new file mode 100644 index 00000000..b05ace4c --- /dev/null +++ b/src/views/onboarding/OnboardingKey.svelte @@ -0,0 +1,41 @@ + + + + Generate a Key +

+ Your private key is your password, and gives you total control over your Nostr account. + We've generated a fresh one for you below – store it somewhere safe! +

+
+ + +
+

+ Avoid pasting your key into too many apps and websites. Instead, use + a compatible browser extension to + securely store your key. +

+
diff --git a/src/views/onboarding/OnboardingRelays.svelte b/src/views/onboarding/OnboardingRelays.svelte new file mode 100644 index 00000000..372bfed1 --- /dev/null +++ b/src/views/onboarding/OnboardingRelays.svelte @@ -0,0 +1,81 @@ + + + + + Get Connected +

+ Nostr is a protocol, not a platform. This means that you choose where to store your + data. Select your preferred storage relays below, or click "continue" to use some + reasonable defaults. You can change your selection any time. +

+ modal.set({type: 'onboarding', stage: 'follows'})}> + Continue + +
+
+ +

Your relays

+
+ {#if relays.length === 0} +
+ + No relays connected +
+ {:else} +
+ {#each relays as relay (relay.url)} + + {/each} +
+ {/if} +
+ +

Other relays

+
+ + + + {#each (search(q) || []).slice(0, 50) as relay (relay.url)} + + {/each} + + Showing {Math.min($knownRelays.length - relays.length, 50)} + of {$knownRelays.length - relays.length} known relays + +
diff --git a/src/views/person/PersonInfo.svelte b/src/views/person/PersonInfo.svelte index 22592907..c38d93fb 100644 --- a/src/views/person/PersonInfo.svelte +++ b/src/views/person/PersonInfo.svelte @@ -1,55 +1,25 @@ - -
-
-
-
-

{displayPerson(person)}

- {#if person.verified_as} -
- - {last(person.verified_as.split('@'))} -
- {/if} -
- {#if $petnamePubkeys.includes(person.pubkey)} - user.removePetname(person.pubkey))}> - Following - - {:else} - addPetname(person.pubkey))}> - Follow - - {/if} -
-

- {@html renderContent(ellipsize(person.kind0?.about || '', 140))} -

-
-
+ diff --git a/src/views/relays/RelayCard.svelte b/src/views/relays/RelayCard.svelte index 48f44532..91bc6819 100644 --- a/src/views/relays/RelayCard.svelte +++ b/src/views/relays/RelayCard.svelte @@ -1,12 +1,9 @@ -
-
-
- - - {last(relay.url.split('://'))} - - {showStatus = false}} - on:mouseover={() => {showStatus = true}} - class="w-2 h-2 rounded-full bg-medium cursor-pointer" - class:bg-medium={message === 'Not connected'} - class:bg-danger={quality <= 0.3 && message !== 'Not connected'} - class:bg-warning={between(0.3, 0.7, quality)} - class:bg-success={quality > 0.7}> - - -
- {#if joined} - {#if $relays.length > 1} - - {/if} - {:else} - - {/if} -
- {#if relay.description} -

{relay.description}

- {/if} - {#if joined && showControls && $canPublish} -
-
+ 1 && canPublish ? removeRelay : null}> +
+ {#if showControls && $canPublish} Publish to this relay? user.setRelayWriteCondition(relay.url, !relay.write)} /> + {/if}
- {/if} -
+