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)