@@ -72,13 +80,14 @@
size="gigantic"
showAvatar={false}
disableTooltip
+ avatarSrc={data.ensData?.avatarUrl}
/>
- {#each Object.entries(socialLinkValues ?? {}) as [network, value]}
+ {#each Object.entries(socialLinkValues ?? {}) as [network, value] (value)}
{#if value}-
{/if}
diff --git a/src/routes/api/share-images/(pages)/[type]/[id]/+page.server.ts b/src/routes/api/share-images/(pages)/[type]/[id]/+page.server.ts
index fa868c5bc..6667139f4 100644
--- a/src/routes/api/share-images/(pages)/[type]/[id]/+page.server.ts
+++ b/src/routes/api/share-images/(pages)/[type]/[id]/+page.server.ts
@@ -11,12 +11,20 @@ import type {
ProjectQueryVariables,
OrcidQuery,
OrcidQueryVariables,
+ ProfileQuery,
} from './__generated__/gql.generated.js';
import filterCurrentChainData from '$lib/utils/filter-current-chain-data.js';
import { fetchEcosystem } from '../../../../../(pages)/app/(app)/ecosystems/[ecosystemId]/fetch-ecosystem.js';
import getOrcidDisplayName from '$lib/utils/orcids/display-name.js';
import { getRound } from '$lib/utils/rpgf/rpgf.js';
import { getWaveProgram } from '$lib/utils/wave/wavePrograms.js';
+import { resolveAccountIdToAddress } from '$lib/utils/sdk/utils/resolve-account-id-to-address';
+import formatAddress from '$lib/utils/format-address';
+import { JsonRpcProvider } from 'ethers';
+import { getMainnetProvider, resolveEnsProfile } from '$lib/stores/ens/ens';
+
+const currentNetworkProvider = new JsonRpcProvider(network.rpcUrl);
+const mainnetProvider = network.enableEns ? getMainnetProvider() : null;
function isShareImageType(value: string): value is ShareImageType {
return Object.values(ShareImageType).includes(value as ShareImageType);
@@ -102,7 +110,7 @@ async function loadProjectData(f: typeof fetch, projectUrl: string) {
? [
{
icon: 'DripList',
- label: `${chainData.splits.dependencies.length} dependencie${chainData.splits.dependencies.length === 1 ? '' : 's'}`,
+ label: `${chainData.splits.dependencies.length} dependenc${chainData.splits.dependencies.length === 1 ? 'y' : 'ies'}`,
},
]
: [],
@@ -230,6 +238,87 @@ async function loadRpgfRoundData(f: typeof fetch, id: string) {
};
}
+async function loadProfileData(f: typeof fetch, universalAccountId: string) {
+ const resolution = await resolveAccountIdToAddress(
+ universalAccountId,
+ currentNetworkProvider,
+ mainnetProvider,
+ network.chainId,
+ );
+
+ let address: string;
+
+ switch (resolution.type) {
+ case 'success':
+ address = resolution.address;
+ break;
+ case 'driver-account':
+ if (resolution.driver === 'nft') {
+ throw error(404, 'Universal account ID is Drip List');
+ }
+
+ if (resolution.driver === 'repo') {
+ throw error(404, 'Universal account ID is Project');
+ }
+
+ throw error(404, 'Not Found');
+ case 'ens-not-resolved':
+ throw error(404, 'ENS not resolvable');
+ case 'not-found':
+ default:
+ throw error(404, 'Not Found');
+ }
+
+ const profileQuery = gql`
+ query Profile($address: String!, $chains: [SupportedChain!]) {
+ userByAddress(address: $address, chains: $chains) {
+ account {
+ driver
+ address
+ accountId
+ }
+ chainData {
+ chain
+ support {
+ __typename
+ }
+ }
+ }
+ }
+ `;
+
+ const [userRes, ensProfile] = await Promise.all([
+ query(profileQuery, { address, chains: [network.gqlName] }, fetch),
+ resolveEnsProfile(address, currentNetworkProvider, mainnetProvider, network.chainId),
+ ]);
+
+ const { userByAddress } = userRes as ProfileQuery;
+
+ if (!userByAddress) {
+ return null;
+ }
+
+ const chainData = filterCurrentChainData(userByAddress.chainData);
+
+ return {
+ bgColor: '#5555FF',
+ type: '',
+ headline: ensProfile?.ensName ?? formatAddress(address),
+ avatarSrc: ensProfile?.avatarUrl ?? null,
+ stats: [
+ {
+ icon: 'Ethereum',
+ label: formatAddress(address),
+ },
+ {
+ icon: 'Heart',
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ label: `${(chainData as any)?.support?.length ?? 0} Supporter${(chainData as any)?.support?.length === 1 ? '' : 's'}`,
+ },
+ ],
+ };
+}
+
const LOAD_FNS = {
[ShareImageType.WAVE_PROGRAM]: loadWaveProgramData,
[ShareImageType.PROJECT]: loadProjectData,
@@ -237,6 +326,7 @@ const LOAD_FNS = {
[ShareImageType.ECOSYSTEM]: loadEcosystemData,
[ShareImageType.ORCID]: loadOrcidData,
[ShareImageType.RPGF_ROUND]: loadRpgfRoundData,
+ [ShareImageType.PROFILE]: loadProfileData,
} as const;
export const load = async ({ params }) => {
diff --git a/src/routes/api/share-images/(pages)/[type]/[id]/+page.svelte b/src/routes/api/share-images/(pages)/[type]/[id]/+page.svelte
index 0446f6c6c..34884061a 100644
--- a/src/routes/api/share-images/(pages)/[type]/[id]/+page.svelte
+++ b/src/routes/api/share-images/(pages)/[type]/[id]/+page.svelte
@@ -1,5 +1,7 @@