@xyo-network/react-payload 2.26.7 → 2.26.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import ContentCopyIcon from '@mui/icons-material/ContentCopy';
3
3
  import { IconButton, Typography, useTheme } from '@mui/material';
4
- import { QuickTipButton } from '@xylabs/react-common';
5
4
  import { FlexCol, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox';
5
+ import { QuickTipButton } from '@xylabs/react-quick-tip-button';
6
6
  import { XyoPayloadWrapper } from '@xyo-network/payload';
7
7
  export const PayloadHashSourceDetails = ({ noTitle = false, payload, ...props }) => {
8
8
  const theme = useTheme();
@@ -1 +1 @@
1
- {"version":3,"file":"HashSourceDetails.js","sourceRoot":"","sources":["../../../../src/components/Details/HashSourceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,eAAe,MAAM,iCAAiC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAgB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAc,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAOpE,MAAM,CAAC,MAAM,wBAAwB,GAA4C,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAC1H,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEtE,OAAO,CACL,MAAC,OAAO,IAAC,UAAU,EAAC,SAAS,KAAK,KAAK,aACpC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChB,MAAC,OAAO,IAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAC,YAAY,aAC7C,KAAC,UAAU,8BAAyB,EACpC,KAAC,cAAc,IAAC,KAAK,EAAC,aAAa,qEAAsE,IACjG,CACX,EACD,MAAC,OAAO,eACN,KAAC,WAAW,IAAC,UAAU,QAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,EAAC,OAAO,YAC3F,KAAC,UAAU,IAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,YACtH,cAAc,EAAE,WAAW,IAAI,EAAE,GACvB,GACD,EACd,KAAC,UAAU,cACT,KAAC,eAAe,KAAG,GACR,IACL,EACT,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAC,YAAY,YAC7C,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,sHAAmH,GACtI,CACX,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"HashSourceDetails.js","sourceRoot":"","sources":["../../../../src/components/Details/HashSourceDetails.tsx"],"names":[],"mappings":";AAAA,OAAO,eAAe,MAAM,iCAAiC,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAgB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAc,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAOpE,MAAM,CAAC,MAAM,wBAAwB,GAA4C,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAC1H,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAEtE,OAAO,CACL,MAAC,OAAO,IAAC,UAAU,EAAC,SAAS,KAAK,KAAK,aACpC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChB,MAAC,OAAO,IAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAC,YAAY,aAC7C,KAAC,UAAU,8BAAyB,EACpC,KAAC,cAAc,IAAC,KAAK,EAAC,aAAa,qEAAsE,IACjG,CACX,EACD,MAAC,OAAO,eACN,KAAC,WAAW,IAAC,UAAU,QAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,EAAC,OAAO,YAC3F,KAAC,UAAU,IAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAC,WAAW,EAAC,OAAO,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,YACtH,cAAc,EAAE,WAAW,IAAI,EAAE,GACvB,GACD,EACd,KAAC,UAAU,cACT,KAAC,eAAe,KAAG,GACR,IACL,EACT,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAC,YAAY,YAC7C,KAAC,UAAU,IAAC,OAAO,EAAC,OAAO,sHAAmH,GACtI,CACX,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAA;AACH,CAAC,CAAA"}
@@ -1,5 +1,8 @@
1
1
  import { XyoApiError } from '@xyo-network/api';
2
2
  import { Huri, XyoPayload } from '@xyo-network/payload';
3
3
  import { FetchHuriHashOptions } from './lib';
4
- declare const useHuriHash: (huriOrHash?: string | Huri, huriUri?: string, options?: FetchHuriHashOptions) => [XyoPayload | undefined, boolean, XyoApiError | undefined];
4
+ /**
5
+ * Resolve a hash or a huri regardless of network
6
+ */
7
+ declare const useHuriHash: (huriOrHash?: string | Huri, huriUri?: string, options?: FetchHuriHashOptions) => [XyoPayload | undefined, boolean, XyoApiError | undefined, boolean | undefined];
5
8
  export { useHuriHash };
@@ -2,6 +2,9 @@ import { Huri } from '@xyo-network/payload';
2
2
  import { useCallback } from 'react';
3
3
  import { usePayload } from './usePayload';
4
4
  import { useResolveHuri } from './useResolveHuri';
5
+ /**
6
+ * Resolve a hash or a huri regardless of network
7
+ */
5
8
  const useHuriHash = (huriOrHash, huriUri, options) => {
6
9
  const hash = useCallback((huriOrHash) => {
7
10
  if (huriOrHash) {
@@ -13,9 +16,12 @@ const useHuriHash = (huriOrHash, huriUri, options) => {
13
16
  }
14
17
  }
15
18
  }, []);
16
- const [payload, notFound, apiError] = usePayload(hash(huriOrHash));
17
- const [huriPayload, huriPayloadNotFound, huriApiError] = useResolveHuri(huriUri, notFound, options);
18
- return [payload ?? huriPayload, huriPayloadNotFound, apiError ?? huriApiError];
19
+ const foundHash = hash(huriOrHash);
20
+ // Optimistically try to grab the has from the current network and archive
21
+ const [payload, notFound, apiError] = usePayload(foundHash);
22
+ // If payload isn't found, fallback to the huriUri
23
+ const [huriPayload, huriPayloadNotFound, huriApiError, networkNotFound] = useResolveHuri(huriUri, notFound, options);
24
+ return [payload ?? huriPayload, huriPayloadNotFound, apiError ?? huriApiError, networkNotFound];
19
25
  };
20
26
  export { useHuriHash };
21
27
  //# sourceMappingURL=useHuriHash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useHuriHash.js","sourceRoot":"","sources":["../../../src/hooks/useHuriHash.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,MAAM,WAAW,GAAG,CAAC,UAA0B,EAAE,OAAgB,EAAE,OAA8B,EAA8D,EAAE;IAC/J,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,UAA0B,EAAE,EAAE;QACtD,IAAI,UAAU,EAAE;YACd,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;gBAClC,OAAO,UAAU,CAAA;aAClB;YACD,IAAI,UAAU,YAAY,IAAI,EAAE;gBAC9B,OAAO,UAAU,CAAC,IAAI,CAAA;aACvB;SACF;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IAClE,MAAM,CAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEnG,OAAO,CAAC,OAAO,IAAI,WAAW,EAAE,mBAAmB,EAAE,QAAQ,IAAI,YAAY,CAAC,CAAA;AAChF,CAAC,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
1
+ {"version":3,"file":"useHuriHash.js","sourceRoot":"","sources":["../../../src/hooks/useHuriHash.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,GAAG,CAClB,UAA0B,EAC1B,OAAgB,EAChB,OAA8B,EACmD,EAAE;IACnF,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,UAA0B,EAAE,EAAE;QACtD,IAAI,UAAU,EAAE;YACd,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;gBAClC,OAAO,UAAU,CAAA;aAClB;YACD,IAAI,UAAU,YAAY,IAAI,EAAE;gBAC9B,OAAO,UAAU,CAAC,IAAI,CAAA;aACvB;SACF;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAA;IAElC,0EAA0E;IAC1E,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAE3D,kDAAkD;IAClD,MAAM,CAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEpH,OAAO,CAAC,OAAO,IAAI,WAAW,EAAE,mBAAmB,EAAE,QAAQ,IAAI,YAAY,EAAE,eAAe,CAAC,CAAA;AACjG,CAAC,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -1,3 +1,3 @@
1
1
  import { XyoApiError } from '@xyo-network/api';
2
2
  import { XyoPayload } from '@xyo-network/payload';
3
- export declare const usePayload: (hash?: string) => [XyoPayload | undefined, boolean, XyoApiError | undefined];
3
+ export declare const usePayload: (hash?: string) => [XyoPayload | undefined, boolean | undefined, XyoApiError | undefined];
@@ -5,17 +5,22 @@ import { useState } from 'react';
5
5
  export const usePayload = (hash) => {
6
6
  const { api } = useArchivistApi();
7
7
  const { archive } = useArchive();
8
- const [notFound, setNotFound] = useState(false);
8
+ const [notFound, setNotFound] = useState();
9
9
  const [apiError, setApiError] = useState();
10
10
  const [payload, setPayload] = useState();
11
+ const reset = () => {
12
+ setPayload(undefined);
13
+ setApiError(undefined);
14
+ setNotFound(undefined);
15
+ };
11
16
  useAsyncEffect(
12
17
  // eslint-disable-next-line react-hooks/exhaustive-deps
13
18
  async (mounted) => {
14
- if (hash && hash.length > 0) {
19
+ if (api && hash && hash.length > 0) {
15
20
  try {
21
+ reset();
16
22
  const result = await api?.archive(archive).payload.hash(hash).get();
17
23
  if (mounted()) {
18
- setApiError(undefined);
19
24
  if (result?.length) {
20
25
  setPayload(result[0]);
21
26
  }
@@ -26,8 +31,8 @@ export const usePayload = (hash) => {
26
31
  }
27
32
  }
28
33
  catch (e) {
34
+ reset();
29
35
  setApiError(e);
30
- setPayload(undefined);
31
36
  console.error(e);
32
37
  }
33
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePayload.js","sourceRoot":"","sources":["../../../src/hooks/usePayload.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAa,EAA8D,EAAE;IACtG,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAA;IAChC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAe,CAAA;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAc,CAAA;IACpD,cAAc;IACZ,uDAAuD;IACvD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;gBACnE,IAAI,OAAO,EAAE,EAAE;oBACb,WAAW,CAAC,SAAS,CAAC,CAAA;oBACtB,IAAI,MAAM,EAAE,MAAM,EAAE;wBAClB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;qBACtB;yBAAM,IAAI,MAAM,EAAE;wBACjB,WAAW,CAAC,IAAI,CAAC,CAAA;wBACjB,UAAU,CAAC,SAAS,CAAC,CAAA;qBACtB;iBACF;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,WAAW,CAAC,CAAgB,CAAC,CAAA;gBAC7B,UAAU,CAAC,SAAS,CAAC,CAAA;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;aACjB;SACF;IACH,CAAC,EACD,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CACrB,CAAA;IACD,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA"}
1
+ {"version":3,"file":"usePayload.js","sourceRoot":"","sources":["../../../src/hooks/usePayload.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAa,EAA0E,EAAE;IAClH,MAAM,EAAE,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAA;IAChC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAW,CAAA;IACnD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAe,CAAA;IACvD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAc,CAAA;IAEpD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,UAAU,CAAC,SAAS,CAAC,CAAA;QACrB,WAAW,CAAC,SAAS,CAAC,CAAA;QACtB,WAAW,CAAC,SAAS,CAAC,CAAA;IACxB,CAAC,CAAA;IAED,cAAc;IACZ,uDAAuD;IACvD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,IAAI;gBACF,KAAK,EAAE,CAAA;gBACP,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAA;gBACnE,IAAI,OAAO,EAAE,EAAE;oBACb,IAAI,MAAM,EAAE,MAAM,EAAE;wBAClB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;qBACtB;yBAAM,IAAI,MAAM,EAAE;wBACjB,WAAW,CAAC,IAAI,CAAC,CAAA;wBACjB,UAAU,CAAC,SAAS,CAAC,CAAA;qBACtB;iBACF;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,KAAK,EAAE,CAAA;gBACP,WAAW,CAAC,CAAgB,CAAC,CAAA;gBAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;aACjB;SACF;IACH,CAAC,EACD,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CACrB,CAAA;IACD,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { XyoApiError } from '@xyo-network/api';
2
2
  import { XyoPayload } from '@xyo-network/payload';
3
3
  import { FetchHuriHashOptions } from './lib';
4
- declare const useResolveHuri: (huriUri?: string, dependentNotFound?: boolean, options?: FetchHuriHashOptions) => [XyoPayload | undefined, boolean, XyoApiError | undefined];
4
+ declare const useResolveHuri: (huriUri?: string, dependentNotFound?: boolean, options?: FetchHuriHashOptions) => [XyoPayload | undefined, boolean, XyoApiError | undefined, boolean | undefined];
5
5
  export { useResolveHuri };
@@ -5,30 +5,28 @@ import { useState } from 'react';
5
5
  import { findHuriNetwork } from './lib';
6
6
  const useResolveHuri = (huriUri, dependentNotFound, options) => {
7
7
  const { network, networks, setNetwork } = useNetwork();
8
- const [huriNetwork, setHuriNetwork] = useState();
9
8
  const [huriPayload, setHuriPayload] = useState();
10
9
  const [huriPayloadNotFound, setHuriPayloadNotFound] = useState(false);
10
+ const [huriNetworkNotFound, setHuriNetworkNotFound] = useState();
11
11
  const [huriApiError, setHuriApiError] = useState();
12
12
  const { changeActiveNetwork } = options ?? {};
13
13
  useAsyncEffect(
14
14
  // eslint-disable-next-line react-hooks/exhaustive-deps
15
15
  async (mounted) => {
16
- if ((dependentNotFound === undefined || dependentNotFound) && huriUri && network !== huriNetwork) {
16
+ if ((dependentNotFound === undefined || dependentNotFound) && huriUri) {
17
17
  const huriInstance = new Huri(huriUri);
18
18
  const foundHuriNetwork = findHuriNetwork(huriInstance, networks);
19
- // Update when we found a huri network and it doesn't match the current one
20
19
  if (foundHuriNetwork && mounted()) {
21
- setHuriNetwork(huriNetwork);
22
20
  if (network !== foundHuriNetwork && changeActiveNetwork) {
23
21
  setNetwork?.(foundHuriNetwork);
24
22
  return;
25
23
  }
26
- // If no matching network try to resolve the huri itself
27
24
  try {
28
25
  const huriPayload = await huriInstance.fetch();
29
26
  if (mounted()) {
30
27
  if (huriPayload) {
31
28
  setHuriPayload(huriPayload);
29
+ setHuriPayloadNotFound(false);
32
30
  }
33
31
  else {
34
32
  setHuriPayloadNotFound(true);
@@ -41,9 +39,18 @@ const useResolveHuri = (huriUri, dependentNotFound, options) => {
41
39
  }
42
40
  }
43
41
  }
42
+ else {
43
+ setHuriNetworkNotFound(true);
44
+ }
45
+ }
46
+ else {
47
+ // If the dependent is not found, then assume not found till proven otherwise
48
+ if (dependentNotFound) {
49
+ setHuriPayloadNotFound(true);
50
+ }
44
51
  }
45
- }, [huriNetwork, huriUri, network, networks, dependentNotFound, setNetwork, changeActiveNetwork]);
46
- return [huriPayload, huriPayloadNotFound, huriApiError];
52
+ }, [huriUri, network, networks, dependentNotFound, setNetwork, changeActiveNetwork]);
53
+ return [huriPayload, huriPayloadNotFound, huriApiError, huriNetworkNotFound];
47
54
  };
48
55
  export { useResolveHuri };
49
56
  //# sourceMappingURL=useResolveHuri.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useResolveHuri.js","sourceRoot":"","sources":["../../../src/hooks/useResolveHuri.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAwB,eAAe,EAAE,MAAM,OAAO,CAAA;AAE7D,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,iBAA2B,EAAE,OAA8B,EAA8D,EAAE;IACnK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAA;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAAqB,CAAA;IACnE,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAAc,CAAA;IAC5D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,EAAe,CAAA;IAE/D,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;IAE7C,cAAc;IACZ,uDAAuD;IACvD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,CAAC,IAAI,OAAO,IAAI,OAAO,KAAK,WAAW,EAAE;YAChG,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtC,MAAM,gBAAgB,GAAG,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;YAEhE,2EAA2E;YAC3E,IAAI,gBAAgB,IAAI,OAAO,EAAE,EAAE;gBACjC,cAAc,CAAC,WAAW,CAAC,CAAA;gBAC3B,IAAI,OAAO,KAAK,gBAAgB,IAAI,mBAAmB,EAAE;oBACvD,UAAU,EAAE,CAAC,gBAAgB,CAAC,CAAA;oBAC9B,OAAM;iBACP;gBAED,wDAAwD;gBACxD,IAAI;oBACF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;oBAC9C,IAAI,OAAO,EAAE,EAAE;wBACb,IAAI,WAAW,EAAE;4BACf,cAAc,CAAC,WAAW,CAAC,CAAA;yBAC5B;6BAAM;4BACL,sBAAsB,CAAC,IAAI,CAAC,CAAA;yBAC7B;qBACF;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,OAAO,EAAE,EAAE;wBACb,eAAe,CAAC,CAAgB,CAAC,CAAA;qBAClC;iBACF;aACF;SACF;IACH,CAAC,EACD,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAC9F,CAAA;IAED,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"useResolveHuri.js","sourceRoot":"","sources":["../../../src/hooks/useResolveHuri.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,IAAI,EAAc,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAwB,eAAe,EAAE,MAAM,OAAO,CAAA;AAE7D,MAAM,cAAc,GAAG,CACrB,OAAgB,EAChB,iBAA2B,EAC3B,OAA8B,EACmD,EAAE;IACnF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAAA;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,EAAc,CAAA;IAC5D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,EAAW,CAAA;IACzE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,EAAe,CAAA;IAE/D,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;IAE7C,cAAc;IACZ,uDAAuD;IACvD,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,iBAAiB,CAAC,IAAI,OAAO,EAAE;YACrE,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtC,MAAM,gBAAgB,GAAG,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;YAEhE,IAAI,gBAAgB,IAAI,OAAO,EAAE,EAAE;gBACjC,IAAI,OAAO,KAAK,gBAAgB,IAAI,mBAAmB,EAAE;oBACvD,UAAU,EAAE,CAAC,gBAAgB,CAAC,CAAA;oBAC9B,OAAM;iBACP;gBAED,IAAI;oBACF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;oBAC9C,IAAI,OAAO,EAAE,EAAE;wBACb,IAAI,WAAW,EAAE;4BACf,cAAc,CAAC,WAAW,CAAC,CAAA;4BAC3B,sBAAsB,CAAC,KAAK,CAAC,CAAA;yBAC9B;6BAAM;4BACL,sBAAsB,CAAC,IAAI,CAAC,CAAA;yBAC7B;qBACF;iBACF;gBAAC,OAAO,CAAC,EAAE;oBACV,IAAI,OAAO,EAAE,EAAE;wBACb,eAAe,CAAC,CAAgB,CAAC,CAAA;qBAClC;iBACF;aACF;iBAAM;gBACL,sBAAsB,CAAC,IAAI,CAAC,CAAA;aAC7B;SACF;aAAM;YACL,6EAA6E;YAC7E,IAAI,iBAAiB,EAAE;gBACrB,sBAAsB,CAAC,IAAI,CAAC,CAAA;aAC7B;SACF;IACH,CAAC,EACD,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,CAAC,CACjF,CAAA;IAED,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAA;AAC9E,CAAC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}
package/package.json CHANGED
@@ -13,23 +13,22 @@
13
13
  "@emotion/react": "^11.9.3",
14
14
  "@emotion/styled": "^11.9.3",
15
15
  "@mui/icons-material": "^5.8.4",
16
- "@mui/material": "^5.8.6",
17
- "@xylabs/react-button": "^2.14.4",
18
- "@xylabs/react-common": "^2.14.4",
19
- "@xylabs/react-flexbox": "^2.14.4",
20
- "@xylabs/react-shared": "^2.14.4",
21
- "@xyo-network/api": "^2.21.13",
22
- "@xyo-network/core": "^2.21.13",
23
- "@xyo-network/network": "^2.21.13",
24
- "@xyo-network/payload": "^2.21.13",
25
- "@xyo-network/react-archive": "^2.26.7",
26
- "@xyo-network/react-archivist-api": "^2.26.7",
27
- "@xyo-network/react-auth-service": "^2.26.7",
28
- "@xyo-network/react-network": "^2.26.7",
29
- "@xyo-network/react-property": "^2.26.7",
30
- "@xyo-network/react-schema": "^2.26.7",
31
- "@xyo-network/react-shared": "^2.26.7",
32
- "@xyo-network/utils": "^2.21.13",
16
+ "@mui/material": "^5.8.7",
17
+ "@xylabs/react-button": "^2.14.5",
18
+ "@xylabs/react-flexbox": "^2.14.5",
19
+ "@xylabs/react-quick-tip-button": "^2.14.5",
20
+ "@xylabs/react-shared": "^2.14.5",
21
+ "@xyo-network/api": "^2.21.14",
22
+ "@xyo-network/network": "^2.21.14",
23
+ "@xyo-network/payload": "^2.21.14",
24
+ "@xyo-network/react-archive": "^2.26.10",
25
+ "@xyo-network/react-archivist-api": "^2.26.10",
26
+ "@xyo-network/react-auth-service": "^2.26.10",
27
+ "@xyo-network/react-network": "^2.26.10",
28
+ "@xyo-network/react-property": "^2.26.10",
29
+ "@xyo-network/react-schema": "^2.26.10",
30
+ "@xyo-network/react-shared": "^2.26.10",
31
+ "@xyo-network/utils": "^2.21.14",
33
32
  "luxon": "^2.4.0",
34
33
  "react": "^18.2.0",
35
34
  "react-dom": "^18.2.0",
@@ -40,8 +39,8 @@
40
39
  },
41
40
  "description": "Common React library for all XYO projects that use React",
42
41
  "devDependencies": {
43
- "@babel/core": "^7.18.5",
44
- "@babel/preset-env": "^7.18.2",
42
+ "@babel/core": "^7.18.6",
43
+ "@babel/preset-env": "^7.18.6",
45
44
  "@storybook/react": "^6.5.9",
46
45
  "@types/luxon": "^2.3.2",
47
46
  "@xylabs/tsconfig": "^1.0.14"
@@ -95,6 +94,6 @@
95
94
  },
96
95
  "sideEffects": false,
97
96
  "types": "dist/esm/index.d.ts",
98
- "version": "2.26.7",
97
+ "version": "2.26.10",
99
98
  "packageManager": "yarn@3.1.1"
100
99
  }
@@ -1,7 +1,7 @@
1
1
  import ContentCopyIcon from '@mui/icons-material/ContentCopy'
2
2
  import { IconButton, Typography, useTheme } from '@mui/material'
3
- import { QuickTipButton } from '@xylabs/react-common'
4
3
  import { FlexBoxProps, FlexCol, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'
4
+ import { QuickTipButton } from '@xylabs/react-quick-tip-button'
5
5
  import { XyoPayload, XyoPayloadWrapper } from '@xyo-network/payload'
6
6
 
7
7
  export interface PayloadHashSourceDetailsProps extends FlexBoxProps {
@@ -1,32 +1,41 @@
1
1
  /* eslint-disable import/no-internal-modules */
2
- import { Typography } from '@mui/material'
2
+ import { Alert, Typography } from '@mui/material'
3
3
  import { ComponentStory, Meta } from '@storybook/react'
4
4
  import { FlexCol } from '@xylabs/react-flexbox'
5
5
  import { Huri } from '@xyo-network/payload'
6
+ import { ArchivistApiProvider } from '@xyo-network/react-archivist-api'
7
+ import { NetworkMemoryProvider } from '@xyo-network/react-network'
6
8
  import { XyoSchemaCache } from '@xyo-network/utils'
7
9
  import { lazy, Suspense } from 'react'
8
10
 
9
- import { ArchivistApiProvider } from '../../../archivist-api/src'
11
+ import { FetchHuriHashOptions } from './lib'
10
12
  import { useHuriHash } from './useHuriHash'
11
13
 
12
14
  const JsonView = lazy(() => import(/* webpackChunkName: "jsonView" */ 'react-json-view'))
13
15
 
14
16
  interface UseHuriHashComponentProps {
15
17
  huriOrHash: string | Huri
18
+ huriUri?: string
19
+ options?: FetchHuriHashOptions
16
20
  }
17
21
 
18
22
  const apiDomain = 'https://beta.api.archivist.xyo.network'
19
23
  const hash = '5605fabad11b10bb5fb86b309ca0970894eda8f22362dda1a489817723bca992'
20
24
  XyoSchemaCache.instance.proxy = `${apiDomain}/domain`
21
25
 
22
- const Wrapper: React.FC<UseHuriHashComponentProps> = ({ huriOrHash }) => (
23
- <ArchivistApiProvider apiDomain={apiDomain}>
24
- <UseHuriHashComponent huriOrHash={huriOrHash} />
25
- </ArchivistApiProvider>
26
+ const mainApiDomain = 'https://api.archivist.xyo.network'
27
+ const mainHash = 'd3a3936e31ba1d835c528784ab77c1eaaeedd6e16b7aad68a88241ce539853cb'
28
+
29
+ const Wrapper: React.FC<UseHuriHashComponentProps> = (props) => (
30
+ <NetworkMemoryProvider>
31
+ <ArchivistApiProvider apiDomain={apiDomain}>
32
+ <UseHuriHashComponent {...props} />
33
+ </ArchivistApiProvider>
34
+ </NetworkMemoryProvider>
26
35
  )
27
36
 
28
- const UseHuriHashComponent: React.FC<UseHuriHashComponentProps> = ({ huriOrHash }) => {
29
- const [payload] = useHuriHash(huriOrHash)
37
+ const UseHuriHashComponent: React.FC<UseHuriHashComponentProps> = ({ huriOrHash, huriUri, options }) => {
38
+ const [payload, notFound, _, networkNotFound] = useHuriHash(huriOrHash, huriUri, options)
30
39
 
31
40
  return (
32
41
  <>
@@ -34,6 +43,8 @@ const UseHuriHashComponent: React.FC<UseHuriHashComponentProps> = ({ huriOrHash
34
43
  Fetches the payload for a huriOrHash.
35
44
  </Typography>
36
45
  <FlexCol my={3}>
46
+ {notFound ? <Alert severity="warning">Not Found</Alert> : null}
47
+ {networkNotFound ? <Alert severity="warning">Network Not Found</Alert> : null}
37
48
  <Suspense fallback={<FlexCol busy />}>
38
49
  <JsonView src={payload || {}} />
39
50
  </Suspense>
@@ -53,17 +64,31 @@ const StorybookEntry: Meta = {
53
64
  title: 'payload/useHuriHash',
54
65
  }
55
66
 
56
- const Template: ComponentStory<typeof UseHuriHashComponent> = ({ huriOrHash }) => {
57
- return <Wrapper huriOrHash={huriOrHash} />
67
+ const Template: ComponentStory<typeof UseHuriHashComponent> = (props) => {
68
+ return <Wrapper {...props} />
58
69
  }
59
70
 
60
71
  const Default = Template.bind({})
61
72
  Default.args = { huriOrHash: hash }
62
73
 
74
+ const NotFound = Template.bind({})
75
+ NotFound.args = { huriOrHash: 'foo' }
76
+
63
77
  const WithHuri = Template.bind({})
64
78
  WithHuri.args = { huriOrHash: new Huri(`${apiDomain}/${hash}`) }
65
79
 
66
- export { Default, WithHuri }
80
+ const WithHuriUri = Template.bind({})
81
+ WithHuriUri.args = { huriUri: `${mainApiDomain}/${mainHash}` }
82
+
83
+ const WithHuriUriNetworkNotFound = Template.bind({})
84
+ WithHuriUriNetworkNotFound.args = { huriUri: `http://badarchivisturl.com/${mainHash}` }
85
+
86
+ // Note - story will work correctly once main net return 200 instead of 404 when payloads aren't found
87
+ // Resolve huriUri when network is different from the current network
88
+ const WithHuriUriNotFound = Template.bind({})
89
+ WithHuriUriNotFound.args = { huriUri: `${mainApiDomain}/foo` }
90
+
91
+ export { Default, NotFound, WithHuri, WithHuriUri, WithHuriUriNetworkNotFound, WithHuriUriNotFound }
67
92
 
68
93
  // eslint-disable-next-line import/no-default-export
69
94
  export default StorybookEntry
@@ -6,7 +6,14 @@ import { FetchHuriHashOptions } from './lib'
6
6
  import { usePayload } from './usePayload'
7
7
  import { useResolveHuri } from './useResolveHuri'
8
8
 
9
- const useHuriHash = (huriOrHash?: string | Huri, huriUri?: string, options?: FetchHuriHashOptions): [XyoPayload | undefined, boolean, XyoApiError | undefined] => {
9
+ /**
10
+ * Resolve a hash or a huri regardless of network
11
+ */
12
+ const useHuriHash = (
13
+ huriOrHash?: string | Huri,
14
+ huriUri?: string,
15
+ options?: FetchHuriHashOptions
16
+ ): [XyoPayload | undefined, boolean, XyoApiError | undefined, boolean | undefined] => {
10
17
  const hash = useCallback((huriOrHash?: string | Huri) => {
11
18
  if (huriOrHash) {
12
19
  if (typeof huriOrHash === 'string') {
@@ -18,10 +25,15 @@ const useHuriHash = (huriOrHash?: string | Huri, huriUri?: string, options?: Fet
18
25
  }
19
26
  }, [])
20
27
 
21
- const [payload, notFound, apiError] = usePayload(hash(huriOrHash))
22
- const [huriPayload, huriPayloadNotFound, huriApiError] = useResolveHuri(huriUri, notFound, options)
28
+ const foundHash = hash(huriOrHash)
23
29
 
24
- return [payload ?? huriPayload, huriPayloadNotFound, apiError ?? huriApiError]
30
+ // Optimistically try to grab the has from the current network and archive
31
+ const [payload, notFound, apiError] = usePayload(foundHash)
32
+
33
+ // If payload isn't found, fallback to the huriUri
34
+ const [huriPayload, huriPayloadNotFound, huriApiError, networkNotFound] = useResolveHuri(huriUri, notFound, options)
35
+
36
+ return [payload ?? huriPayload, huriPayloadNotFound, apiError ?? huriApiError, networkNotFound]
25
37
  }
26
38
 
27
39
  export { useHuriHash }
@@ -0,0 +1,69 @@
1
+ /* eslint-disable import/no-internal-modules */
2
+ import { ComponentStory, Meta } from '@storybook/react'
3
+ import { ButtonEx } from '@xylabs/react-button'
4
+ import { FlexCol } from '@xylabs/react-flexbox'
5
+ import { ArchivistApiProvider, useArchivistApi } from '@xyo-network/react-archivist-api'
6
+ import { lazy, Suspense, useState } from 'react'
7
+
8
+ import { usePayload } from './usePayload'
9
+
10
+ const JsonView = lazy(() => import(/* webpackChunkName: "jsonView" */ 'react-json-view'))
11
+
12
+ const apiDomain = 'https://beta.api.archivist.xyo.network'
13
+ const hash = '5605fabad11b10bb5fb86b309ca0970894eda8f22362dda1a489817723bca992'
14
+
15
+ const Wrapper: React.FC<{ hash?: string }> = ({ hash }) => (
16
+ <ArchivistApiProvider apiDomain={apiDomain}>
17
+ <UsePayloadComponent hash={hash} />
18
+ </ArchivistApiProvider>
19
+ )
20
+
21
+ const UsePayloadComponent: React.FC<{ hash?: string }> = ({ hash }) => {
22
+ const { api } = useArchivistApi()
23
+ const [trigger, setTrigger] = useState<string>()
24
+ const [payload, notFound] = usePayload(trigger)
25
+
26
+ return (
27
+ <>
28
+ {api ? (
29
+ <>
30
+ <ButtonEx variant="contained" marginBottom={2} onClick={() => setTrigger(hash)}>
31
+ Fetch Payload
32
+ </ButtonEx>
33
+ <ButtonEx variant="contained" onClick={() => setTrigger('foo')}>
34
+ Fetch Not Found
35
+ </ButtonEx>
36
+ </>
37
+ ) : null}
38
+ <FlexCol my={3}>
39
+ <Suspense fallback={<FlexCol busy />}>
40
+ {notFound ? 'Not Found' : null}
41
+ <JsonView src={payload || {}} />
42
+ </Suspense>
43
+ </FlexCol>
44
+ </>
45
+ )
46
+ }
47
+
48
+ const StorybookEntry: Meta = {
49
+ argTypes: {},
50
+ component: UsePayloadComponent,
51
+ parameters: {
52
+ docs: {
53
+ page: null,
54
+ },
55
+ },
56
+ title: 'payload/usePayload',
57
+ }
58
+
59
+ const Template: ComponentStory<typeof UsePayloadComponent> = (props) => {
60
+ return <Wrapper {...props} />
61
+ }
62
+
63
+ const Default = Template.bind({})
64
+ Default.args = { hash }
65
+
66
+ export { Default }
67
+
68
+ // eslint-disable-next-line import/no-default-export
69
+ export default StorybookEntry
@@ -5,20 +5,27 @@ import { useArchive } from '@xyo-network/react-archive'
5
5
  import { useArchivistApi } from '@xyo-network/react-archivist-api'
6
6
  import { useState } from 'react'
7
7
 
8
- export const usePayload = (hash?: string): [XyoPayload | undefined, boolean, XyoApiError | undefined] => {
8
+ export const usePayload = (hash?: string): [XyoPayload | undefined, boolean | undefined, XyoApiError | undefined] => {
9
9
  const { api } = useArchivistApi()
10
10
  const { archive } = useArchive()
11
- const [notFound, setNotFound] = useState(false)
11
+ const [notFound, setNotFound] = useState<boolean>()
12
12
  const [apiError, setApiError] = useState<XyoApiError>()
13
13
  const [payload, setPayload] = useState<XyoPayload>()
14
+
15
+ const reset = () => {
16
+ setPayload(undefined)
17
+ setApiError(undefined)
18
+ setNotFound(undefined)
19
+ }
20
+
14
21
  useAsyncEffect(
15
22
  // eslint-disable-next-line react-hooks/exhaustive-deps
16
23
  async (mounted) => {
17
- if (hash && hash.length > 0) {
24
+ if (api && hash && hash.length > 0) {
18
25
  try {
26
+ reset()
19
27
  const result = await api?.archive(archive).payload.hash(hash).get()
20
28
  if (mounted()) {
21
- setApiError(undefined)
22
29
  if (result?.length) {
23
30
  setPayload(result[0])
24
31
  } else if (result) {
@@ -27,8 +34,8 @@ export const usePayload = (hash?: string): [XyoPayload | undefined, boolean, Xyo
27
34
  }
28
35
  }
29
36
  } catch (e) {
37
+ reset()
30
38
  setApiError(e as XyoApiError)
31
- setPayload(undefined)
32
39
  console.error(e)
33
40
  }
34
41
  }
@@ -1,17 +1,20 @@
1
1
  import { useAsyncEffect } from '@xylabs/react-shared'
2
2
  import { XyoApiError } from '@xyo-network/api'
3
- import { XyoNetworkPayload } from '@xyo-network/network'
4
3
  import { Huri, XyoPayload } from '@xyo-network/payload'
5
4
  import { useNetwork } from '@xyo-network/react-network'
6
5
  import { useState } from 'react'
7
6
 
8
7
  import { FetchHuriHashOptions, findHuriNetwork } from './lib'
9
8
 
10
- const useResolveHuri = (huriUri?: string, dependentNotFound?: boolean, options?: FetchHuriHashOptions): [XyoPayload | undefined, boolean, XyoApiError | undefined] => {
9
+ const useResolveHuri = (
10
+ huriUri?: string,
11
+ dependentNotFound?: boolean,
12
+ options?: FetchHuriHashOptions
13
+ ): [XyoPayload | undefined, boolean, XyoApiError | undefined, boolean | undefined] => {
11
14
  const { network, networks, setNetwork } = useNetwork()
12
- const [huriNetwork, setHuriNetwork] = useState<XyoNetworkPayload>()
13
15
  const [huriPayload, setHuriPayload] = useState<XyoPayload>()
14
16
  const [huriPayloadNotFound, setHuriPayloadNotFound] = useState(false)
17
+ const [huriNetworkNotFound, setHuriNetworkNotFound] = useState<boolean>()
15
18
  const [huriApiError, setHuriApiError] = useState<XyoApiError>()
16
19
 
17
20
  const { changeActiveNetwork } = options ?? {}
@@ -19,25 +22,23 @@ const useResolveHuri = (huriUri?: string, dependentNotFound?: boolean, options?:
19
22
  useAsyncEffect(
20
23
  // eslint-disable-next-line react-hooks/exhaustive-deps
21
24
  async (mounted) => {
22
- if ((dependentNotFound === undefined || dependentNotFound) && huriUri && network !== huriNetwork) {
25
+ if ((dependentNotFound === undefined || dependentNotFound) && huriUri) {
23
26
  const huriInstance = new Huri(huriUri)
24
27
 
25
28
  const foundHuriNetwork = findHuriNetwork(huriInstance, networks)
26
29
 
27
- // Update when we found a huri network and it doesn't match the current one
28
30
  if (foundHuriNetwork && mounted()) {
29
- setHuriNetwork(huriNetwork)
30
31
  if (network !== foundHuriNetwork && changeActiveNetwork) {
31
32
  setNetwork?.(foundHuriNetwork)
32
33
  return
33
34
  }
34
35
 
35
- // If no matching network try to resolve the huri itself
36
36
  try {
37
37
  const huriPayload = await huriInstance.fetch()
38
38
  if (mounted()) {
39
39
  if (huriPayload) {
40
40
  setHuriPayload(huriPayload)
41
+ setHuriPayloadNotFound(false)
41
42
  } else {
42
43
  setHuriPayloadNotFound(true)
43
44
  }
@@ -47,13 +48,20 @@ const useResolveHuri = (huriUri?: string, dependentNotFound?: boolean, options?:
47
48
  setHuriApiError(e as XyoApiError)
48
49
  }
49
50
  }
51
+ } else {
52
+ setHuriNetworkNotFound(true)
53
+ }
54
+ } else {
55
+ // If the dependent is not found, then assume not found till proven otherwise
56
+ if (dependentNotFound) {
57
+ setHuriPayloadNotFound(true)
50
58
  }
51
59
  }
52
60
  },
53
- [huriNetwork, huriUri, network, networks, dependentNotFound, setNetwork, changeActiveNetwork]
61
+ [huriUri, network, networks, dependentNotFound, setNetwork, changeActiveNetwork]
54
62
  )
55
63
 
56
- return [huriPayload, huriPayloadNotFound, huriApiError]
64
+ return [huriPayload, huriPayloadNotFound, huriApiError, huriNetworkNotFound]
57
65
  }
58
66
 
59
67
  export { useResolveHuri }