diff --git a/src/Card.svelte b/src/Card.svelte index 4d8c35a0a..ffb36b4b6 100644 --- a/src/Card.svelte +++ b/src/Card.svelte @@ -1,18 +1,30 @@ -
+
- + {#if profile} + + {:else if seed} + + {seed.emoji} + + {/if}
- {#if profile.name} - {formatName(profile.name, config)} - {:else} - {formatAddress(profile.address)} + {#if profile} + {#if profile.name} + {formatName(profile.name, config)} + {:else} + {formatAddress(profile.address)} + {/if} + {:else if seed} + {seed.host} {/if}
- {#if members.length > 0} - {members.length} member(s) - {:else} - {formatAddress(profile.address)} + {#if profile} + {#if members.length > 0} + {members.length} member(s) + {:else} + {formatAddress(profile.address)} + {/if} + {:else if numberOfProjects} + {numberOfProjects} project(s) {/if}
diff --git a/src/Cards.svelte b/src/Cards.svelte index f3cebb51c..9db8ebaea 100644 --- a/src/Cards.svelte +++ b/src/Cards.svelte @@ -4,10 +4,12 @@ import Card from '@app/Card.svelte'; import type { Org } from '@app/base/orgs/Org'; import type { Config } from '@app/config'; + import type { Seed } from '@app/base/seeds/Seed'; export let config: Config; export let orgs: Org[] = []; export let profiles: Profile[] = []; + export let seeds: Seed[] = []; const orgMembers: Record = {}; @@ -52,7 +54,11 @@ {/each} - {#if !orgs.length && !profiles.length} + {#each seeds as seed} + + {/each} + + {#if !orgs.length && !profiles.length && !seeds.length} {/if}
diff --git a/src/base/home/Index.svelte b/src/base/home/Index.svelte index 47760f812..9b77832d8 100644 --- a/src/base/home/Index.svelte +++ b/src/base/home/Index.svelte @@ -7,6 +7,7 @@ import Message from '@app/Message.svelte'; import Cards from '@app/Cards.svelte'; import { setOpenGraphMetaTag } from '@app/utils'; + import { Seed } from '@app/base/seeds/Seed'; export let config: Config; @@ -24,8 +25,12 @@ ? Profile.getMulti(config.users.pinned, config) : Promise.resolve([]); - const getEntities = Promise.all([getUsers, getOrgs]).then(([users, orgs]) => { - return { users, orgs }; + const getSeeds = Object.keys(config.seeds.pinned).length > 0 + ? Seed.lookupMulti(Object.keys(config.seeds.pinned), config) + : Promise.resolve([]); + + const getEntities = Promise.all([getUsers, getOrgs, getSeeds]).then(([users, orgs, seeds]) => { + return { users, orgs, seeds }; }); const viewMore = () => { @@ -88,6 +93,14 @@ {:then entities} + {#if entities.seeds.length} +
+ Explore seed nodes on the Radicle network. +
+ +
There are no seed nodes.
+
+ {/if} {#if entities.orgs.length || entities.users.length}
Explore orgs and users on the Radicle network. diff --git a/src/base/seeds/Seed.ts b/src/base/seeds/Seed.ts index ed07c16d0..59c9949ef 100644 --- a/src/base/seeds/Seed.ts +++ b/src/base/seeds/Seed.ts @@ -24,6 +24,7 @@ export class Seed { link: { host: string; id: string; port: number }; version?: string; + emoji: string; constructor(seed: { host: string; @@ -58,6 +59,13 @@ export class Seed { assert(isDomain(git), `invalid seed git host ${git}`); } + const meta = cfg.seeds.pinned[seed.host]; + if (meta) { + this.emoji = meta.emoji; + } else { + this.emoji = "🌱"; + } + // The `git` and `api` keys being more specific take // precedence over the `host`, if available. api = api ?? seed.host; @@ -117,4 +125,8 @@ export class Seed { version: info.version, }, cfg); } + + static async lookupMulti(hostnames: string[], cfg: Config): Promise { + return await Promise.all(hostnames.map(h => Seed.lookup(h, cfg))); + } } diff --git a/src/base/seeds/View.svelte b/src/base/seeds/View.svelte index f1808e87c..323520ed3 100644 --- a/src/base/seeds/View.svelte +++ b/src/base/seeds/View.svelte @@ -78,7 +78,7 @@
- {host} 🌱 + {host} {seed.emoji}
diff --git a/src/config.json b/src/config.json index 87ffeab61..e03bf324e 100644 --- a/src/config.json +++ b/src/config.json @@ -26,6 +26,19 @@ "cloudhead.radicle.eth" ] }, + "seeds": { + "pinned": { + "willow.radicle.garden": { + "emoji": "🪵" + }, + "pine.radicle.garden": { + "emoji": "🌲" + }, + "maple.radicle.garden": { + "emoji": "🍁" + } + } + }, "safe": { "api": "https://safe-transaction.gnosis.io", "viewer": "https://gnosis-safe.io/app/#/safes" diff --git a/src/config.ts b/src/config.ts index 947c38024..57137ea73 100644 --- a/src/config.ts +++ b/src/config.ts @@ -32,6 +32,7 @@ export class Config { reverseRegistrar: { address: string }; orgs: { subgraph: string; contractHash: string; pinned: string[] }; users: { pinned: string[] }; + seeds: { pinned: Record }; gasLimits: { createOrg: number }; provider: ethers.providers.JsonRpcProvider; signer: ethers.Signer & TypedDataSigner | WalletConnectSigner | null; @@ -108,6 +109,7 @@ export class Config { this.reverseRegistrar = cfg.reverseRegistrar; this.orgs = cfg.orgs; this.users = cfg.users; + this.seeds = cfg.seeds; this.safe = cfg.safe; this.safe.client = this.safe.api ? new SafeServiceClient(this.safe.api)