Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions src/components/Preview/Preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,16 @@ const Preview = ({ title, description, icon, banner, href }: PreviewProps) => {
fit="cover"
/>
<div className={styles.TextContainer}>
<h1>{title}</h1>
<p>{description}</p>
{href && (
<ArrowLink className={styles.Link} href={href} replace>
View Domain NFT
</ArrowLink>
{(title || description) && (
<>
<h1>{title}</h1>
<p>{description}</p>
{href && (
<ArrowLink className={styles.Link} href={href} replace>
View Domain NFT
</ArrowLink>
)}
</>
)}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { useCurrentDomain } from 'lib/providers/CurrentDomainProvider';
import Preview from 'components/Preview/Preview';

const PreviewContainer = () => {
const { domain, domainMetadata: metadata } = useCurrentDomain();
const { domain, domainMetadata: metadata, domainRaw } = useCurrentDomain();

if (!metadata || domain?.name === '') {
if (domain?.name === '') {
return <></>;
}

Expand All @@ -14,7 +14,7 @@ const PreviewContainer = () => {
description={metadata?.description}
icon={metadata?.previewImage ?? metadata?.image}
banner={metadata?.image_full ?? metadata?.image}
href={domain?.name && domain.name.split('wilder.')[1] + '?view=true'}
href={domainRaw && domainRaw + '?view=true'}
/>
);
};
Expand Down
157 changes: 89 additions & 68 deletions src/lib/hooks/useZnsDomain.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
/* eslint-disable react-hooks/exhaustive-deps */
import { DisplayParentDomain, Maybe, Metadata } from 'lib/types';
import { useEffect, useRef, useState } from 'react';
import { useCallback, useEffect, useRef, useState } from 'react';
import { useZnsSdk } from 'lib/hooks/sdk';
import { getMetadata } from 'lib/metadata';
import { Domain } from '@zero-tech/zns-sdk/lib/types';

export type UseZnsDomainReturn = {
loading: boolean;
Expand All @@ -11,84 +12,104 @@ export type UseZnsDomainReturn = {
domainMetadata: Maybe<Metadata>;
};

/**
* Changes an SDK subdomain type to dApp subdomain type
* This won't be needed when we properly integrate SDK types
* @param subdomains -
* @returns
*/
const formatSubdomains = (
subdomains: Domain[],
): {
owner: { id: string };
metadata: string;
minter: { id: string };
name: string;
id: string;
}[] => {
return subdomains.map((sub) => ({
id: sub.id,
metadata: sub.metadataUri,
minter: { id: sub.minter },
name: sub.name,
owner: { id: sub.owner },
}));
};

/**
* Changes an SDK domain type to dApp domain type
* This won't be needed when we properly integrate SDK types
* @param domain
* @returns
*/
const formatDomain = (domain: Domain): DisplayParentDomain => {
const formattedDomain = domain as any;

formattedDomain.metadata = formattedDomain.metadataUri;
delete formattedDomain.metadataUri;
formattedDomain.minter = { id: formattedDomain.minter };
formattedDomain.owner = { id: formattedDomain.owner };
formattedDomain.parent = { id: formattedDomain.parentId };
delete formattedDomain.parentId;
formattedDomain.lockedBy = { id: formattedDomain.lockedBy };

return formattedDomain;
};

export const useZnsDomain = (domainId: string): UseZnsDomainReturn => {
const { instance: sdk } = useZnsSdk();

const isMounted = useRef<boolean>();

const loadingDomainId = useRef<string | undefined>(undefined);
const loadingDomainId = useRef<string | undefined>();

const [loading, setLoading] = useState(true);
const [domain, setDomain] = useState<DisplayParentDomain | undefined>(
undefined,
);
const [domainMetadata, setDomainMetadata] =
useState<Maybe<Metadata>>(undefined);

// Get domain using SDK instead
const getDomainData = async () => {
loadingDomainId.current = domainId;

const [rawDomain, rawSubdomains] = await Promise.all([
sdk.getDomainById(domainId),
sdk.getSubdomainsById(domainId),
]);

// Check if domain ID has changed since the above API calls
// to prevent unwanted state changes
if (
loadingDomainId.current !== rawDomain.id ||
isMounted.current === false
) {
setLoading(false);
return;
}
const [domain, setDomain] = useState<DisplayParentDomain | undefined>();
const [domainMetadata, setDomainMetadata] = useState<Maybe<Metadata>>();

// TODO: Fetch this data from the SDK
const metadata = await getMetadata(rawDomain.metadataUri);

// We have currently only changed this hook to use the SDK internally
// The types in the SDK have changed from what we had previously
// so the data needs to be formatted. This should be changed
// to handle the new data type
// This will be changed in next iteration
const formattedDomain = rawDomain as any;
formattedDomain.metadata = formattedDomain.metadataUri;
formattedDomain.minter = { id: formattedDomain.minter };
formattedDomain.owner = { id: formattedDomain.owner };
formattedDomain.parent = { id: formattedDomain.parentId };
formattedDomain.lockedBy = { id: formattedDomain.lockedBy };

delete formattedDomain.parentId;
const formattedSubdomains = rawSubdomains.map((sub) => ({
id: sub.id,
metadata: sub.metadataUri,
minter: { id: sub.minter },
name: sub.name,
owner: { id: sub.owner },
}));
if (isMounted.current) {
setDomain({
...metadata,
...formattedDomain,
subdomains: formattedSubdomains,
});
setDomainMetadata(metadata);
setLoading(false);
}
const getDomain = async (id: string) => {
const domain = formatDomain(await sdk.getDomainById(id));
const metadata = await getMetadata(domain.metadata);
return { domain, metadata };
};

const refetch = () => {
setDomain(undefined);
setLoading(true);
getDomainData().catch((e) => {
// Need better error handling here
console.error(e);
setLoading(false);
loadingDomainId.current = undefined;
});
const getSubdomains = async (id: string) => {
const subs = formatSubdomains(await sdk.getSubdomainsById(id));
return subs;
};

/**
* This method gets all of the data relevant to a domain
*/
const refetch = useCallback(async () => {
try {
loadingDomainId.current = domainId;

// Reset state objects
setDomainMetadata(undefined);
setDomain(undefined);
setLoading(true);

const d = await getDomain(domainId);
if (loadingDomainId.current !== domainId) {
setLoading(false);
return;
}
setDomainMetadata(d.metadata);
const s = await getSubdomains(domainId);
if (loadingDomainId.current !== domainId) {
setLoading(false);
return;
}
setDomain({
...d.domain,
...d.metadata,
subdomains: s,
} as DisplayParentDomain);

setLoading(false);
} catch (e) {}
}, [domainId]);

useEffect(() => {
isMounted.current = true;
if (!domainId || !sdk) {
Expand Down