@xyo-network/react-payload-details 2.64.0 → 2.64.1
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.
- package/dist/browser/components/Details/DataDetails.js +40 -15
- package/dist/browser/components/Details/DataDetails.js.map +1 -1
- package/dist/browser/components/Details/Details.js +157 -10
- package/dist/browser/components/Details/Details.js.map +1 -1
- package/dist/browser/components/Details/HashSourceDetails.js +3 -2
- package/dist/browser/components/Details/HashSourceDetails.js.map +1 -1
- package/dist/browser/components/Details/JsonDetails.js +4 -3
- package/dist/browser/components/Details/JsonDetails.js.map +1 -1
- package/dist/browser/components/Details/ValidationDetails/ValidationDetails.js +3 -2
- package/dist/browser/components/Details/ValidationDetails/ValidationDetails.js.map +1 -1
- package/dist/browser/components/Details/ValidationDetails/index.js +35 -2
- package/dist/browser/components/Details/ValidationDetails/index.js.map +1 -1
- package/dist/browser/components/Details/index.js +167 -4
- package/dist/browser/components/Details/index.js.map +1 -1
- package/dist/browser/components/index.js +167 -1
- package/dist/browser/components/index.js.map +1 -1
- package/dist/browser/index.js +167 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/docs.json +30 -30
- package/package.json +14 -14
@@ -1,5 +1,168 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
// src/components/Details/DataDetails.tsx
|
2
|
+
import { ContentCopy as ContentCopyIcon2, Visibility as VisibilityIcon } from "@mui/icons-material";
|
3
|
+
import { Dialog, DialogActions, DialogContent, DialogTitle } from "@mui/material";
|
4
|
+
import { ButtonEx } from "@xylabs/react-button";
|
5
|
+
import { PayloadHasher as PayloadHasher2 } from "@xyo-network/hash";
|
6
|
+
import { Property } from "@xyo-network/react-property";
|
7
|
+
import { usePayloadHash } from "@xyo-network/react-shared";
|
8
|
+
import { useState } from "react";
|
9
|
+
|
10
|
+
// src/components/Details/HashSourceDetails.tsx
|
11
|
+
import { ContentCopy as ContentCopyIcon } from "@mui/icons-material";
|
12
|
+
import { IconButton, Typography, useTheme } from "@mui/material";
|
13
|
+
import { FlexCol, FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
|
14
|
+
import { QuickTipButton } from "@xylabs/react-quick-tip-button";
|
15
|
+
import { PayloadHasher } from "@xyo-network/hash";
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
17
|
+
var PayloadHashSourceDetails = ({ noTitle = false, payload, ...props }) => {
|
18
|
+
const theme = useTheme();
|
19
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : "";
|
20
|
+
return /* @__PURE__ */ jsxs(FlexCol, { alignItems: "stretch", ...props, children: [
|
21
|
+
noTitle ? null : /* @__PURE__ */ jsxs(FlexRow, { margin: 1, justifyContent: "flex-start", children: [
|
22
|
+
/* @__PURE__ */ jsx(Typography, { children: "Hash Source" }),
|
23
|
+
/* @__PURE__ */ jsx(QuickTipButton, { title: "Hash Source", children: "The actual string used to generate the hash (SHA256)" })
|
24
|
+
] }),
|
25
|
+
/* @__PURE__ */ jsxs(FlexRow, { children: [
|
26
|
+
/* @__PURE__ */ jsx(FlexGrowRow, { background: true, border: 1, borderColor: theme.palette.divider, justifyContent: "start", children: /* @__PURE__ */ jsx(Typography, { padding: 2, fontFamily: "monospace", variant: "body1", sx: { overflowWrap: "break-word", wordBreak: "break-all" }, children: payloadString }) }),
|
27
|
+
/* @__PURE__ */ jsx(IconButton, { children: /* @__PURE__ */ jsx(ContentCopyIcon, {}) })
|
28
|
+
] }),
|
29
|
+
noTitle ? /* @__PURE__ */ jsx(FlexRow, { margin: 1, justifyContent: "flex-start", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "The actual string used to generate the hash (SHA256). This can be used to validate the hash manually." }) }) : null
|
30
|
+
] });
|
31
|
+
};
|
32
|
+
|
33
|
+
// src/components/Details/DataDetails.tsx
|
34
|
+
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
35
|
+
var PayloadDataDetails = ({ size, badge, payload, ...props }) => {
|
36
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher2.hashFields(payload), null, 2) : "";
|
37
|
+
const [viewSourceOpen, setViewSourceOpen] = useState(false);
|
38
|
+
const hash = usePayloadHash(payload);
|
39
|
+
let elevation = 2;
|
40
|
+
if (props.paper) {
|
41
|
+
elevation += props.elevation ?? 0;
|
42
|
+
}
|
43
|
+
const actions = [
|
44
|
+
{
|
45
|
+
icon: /* @__PURE__ */ jsx2(VisibilityIcon, {}),
|
46
|
+
name: "View",
|
47
|
+
onClick: () => setViewSourceOpen(true)
|
48
|
+
},
|
49
|
+
{
|
50
|
+
icon: /* @__PURE__ */ jsx2(ContentCopyIcon2, {}),
|
51
|
+
name: "Copy",
|
52
|
+
onClick: async () => await navigator.clipboard.writeText(hash ?? "")
|
53
|
+
}
|
54
|
+
];
|
55
|
+
const onCopy = async () => {
|
56
|
+
await navigator.clipboard.writeText(payloadString);
|
57
|
+
};
|
58
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
59
|
+
/* @__PURE__ */ jsx2(
|
60
|
+
Property,
|
61
|
+
{
|
62
|
+
titleProps: { elevation },
|
63
|
+
badge,
|
64
|
+
size,
|
65
|
+
actions,
|
66
|
+
title: "Payload Hash",
|
67
|
+
value: hash ?? "<Unknown>",
|
68
|
+
tip: "This is the payload hash",
|
69
|
+
...props
|
70
|
+
}
|
71
|
+
),
|
72
|
+
/* @__PURE__ */ jsxs2(Dialog, { open: viewSourceOpen, onClose: () => setViewSourceOpen(false), children: [
|
73
|
+
/* @__PURE__ */ jsx2(DialogTitle, { children: "Hash Source" }),
|
74
|
+
/* @__PURE__ */ jsx2(DialogContent, { children: /* @__PURE__ */ jsx2(PayloadHashSourceDetails, { noTitle: true, payload }) }),
|
75
|
+
/* @__PURE__ */ jsxs2(DialogActions, { children: [
|
76
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: onCopy, children: "Copy" }),
|
77
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: () => setViewSourceOpen(false), children: "Close" })
|
78
|
+
] })
|
79
|
+
] })
|
80
|
+
] });
|
81
|
+
};
|
82
|
+
|
83
|
+
// src/components/Details/Details.tsx
|
84
|
+
import { FlexCol as FlexCol3 } from "@xylabs/react-flexbox";
|
85
|
+
import { forwardRef } from "react";
|
86
|
+
|
87
|
+
// src/components/Details/JsonDetails.tsx
|
88
|
+
import { Paper, useMediaQuery, useTheme as useTheme2 } from "@mui/material";
|
89
|
+
import { FlexGrowRow as FlexGrowRow2 } from "@xylabs/react-flexbox";
|
90
|
+
import { PropertyGroup } from "@xyo-network/react-property";
|
91
|
+
import { lazy, Suspense } from "react";
|
92
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
93
|
+
var JsonView = lazy(() => import(
|
94
|
+
/* webpackChunkName: "jsonView" */
|
95
|
+
"react-json-view"
|
96
|
+
));
|
97
|
+
var PayloadJsonDetails = ({ jsonViewProps, payload = {}, ...props }) => {
|
98
|
+
const { breakpoints, palette } = useTheme2();
|
99
|
+
const belowSm = useMediaQuery(breakpoints.down("sm"));
|
100
|
+
let elevation = 2;
|
101
|
+
if (props.paper) {
|
102
|
+
elevation += props.elevation ?? 0;
|
103
|
+
}
|
104
|
+
const jsonTheme = palette.mode === "dark" ? "shapeshifter" : void 0;
|
105
|
+
return /* @__PURE__ */ jsx3(PropertyGroup, { titleProps: { elevation }, title: "JSON", tip: "The raw JSON of the payload", ...props, children: /* @__PURE__ */ jsx3(Paper, { square: true, variant: "elevation", style: { overflow: "hidden", padding: "16px", width: "100%" }, children: /* @__PURE__ */ jsx3(Suspense, { fallback: /* @__PURE__ */ jsx3(FlexGrowRow2, {}), children: /* @__PURE__ */ jsx3(
|
106
|
+
JsonView,
|
107
|
+
{
|
108
|
+
groupArraysAfterLength: 20,
|
109
|
+
style: { backgroundColor: void 0, overflow: "hidden" },
|
110
|
+
src: payload,
|
111
|
+
enableClipboard: true,
|
112
|
+
theme: jsonTheme,
|
113
|
+
collapseStringsAfterLength: belowSm ? 24 : 32,
|
114
|
+
...jsonViewProps
|
115
|
+
}
|
116
|
+
) }) }) });
|
117
|
+
};
|
118
|
+
|
119
|
+
// src/components/Details/ValidationDetails/ValidationDetails.tsx
|
120
|
+
import { Typography as Typography2 } from "@mui/material";
|
121
|
+
import { FlexCol as FlexCol2 } from "@xylabs/react-flexbox";
|
122
|
+
import { usePromise } from "@xylabs/react-promise";
|
123
|
+
import { PayloadValidator } from "@xyo-network/payload-validator";
|
124
|
+
import { Property as Property2, PropertyGroup as PropertyGroup2 } from "@xyo-network/react-property";
|
125
|
+
import { SchemaProperty } from "@xyo-network/react-schema";
|
126
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
127
|
+
var PayloadValidationDetails = ({ skipBody = false, value, ...props }) => {
|
128
|
+
const [validateErrors] = usePromise(async () => value ? await new PayloadValidator(value).validate() : void 0, [value]);
|
129
|
+
const bodyErrors = skipBody ? [] : validateErrors ?? [];
|
130
|
+
const errors = [...bodyErrors];
|
131
|
+
let elevation = 2;
|
132
|
+
if (props.paper) {
|
133
|
+
elevation += props.elevation ?? 0;
|
134
|
+
}
|
135
|
+
return /* @__PURE__ */ jsxs3(PropertyGroup2, { titleProps: { elevation }, title: "Validation", tip: "The results from validating the payload", ...props, children: [
|
136
|
+
/* @__PURE__ */ jsx4(
|
137
|
+
Property2,
|
138
|
+
{
|
139
|
+
titleProps: { elevation },
|
140
|
+
flexGrow: 1,
|
141
|
+
title: "Valid",
|
142
|
+
value: errors.length === 0 ? "True" : "False",
|
143
|
+
tip: errors.length > 0 ? /* @__PURE__ */ jsx4(FlexCol2, { children: errors.map((error, index) => {
|
144
|
+
return /* @__PURE__ */ jsx4(Typography2, { children: error.toString() }, index);
|
145
|
+
}) }) : /* @__PURE__ */ jsx4(Typography2, { children: "No Errors" })
|
146
|
+
}
|
147
|
+
),
|
148
|
+
value?.schema && /* @__PURE__ */ jsx4(SchemaProperty, { flexGrow: 1, titleProps: { elevation }, value: value.schema })
|
149
|
+
] });
|
150
|
+
};
|
151
|
+
|
152
|
+
// src/components/Details/Details.tsx
|
153
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
154
|
+
var PayloadDetails = forwardRef(({ paper, payload, ...props }, ref) => {
|
155
|
+
return /* @__PURE__ */ jsxs4(FlexCol3, { gap: 1, justifyContent: "flex-start", alignItems: "stretch", marginTop: 2, marginBottom: 8, ref, ...props, children: [
|
156
|
+
/* @__PURE__ */ jsx5(PayloadDataDetails, { paper, size: "large", badge: true, payload }),
|
157
|
+
/* @__PURE__ */ jsx5(PayloadValidationDetails, { paper, value: payload }),
|
158
|
+
/* @__PURE__ */ jsx5(PayloadJsonDetails, { paper, payload })
|
159
|
+
] });
|
160
|
+
});
|
161
|
+
PayloadDetails.displayName = "PayloadDetails";
|
162
|
+
export {
|
163
|
+
PayloadDataDetails,
|
164
|
+
PayloadDetails,
|
165
|
+
PayloadJsonDetails,
|
166
|
+
PayloadValidationDetails
|
167
|
+
};
|
5
168
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/Details/index.ts"],"sourcesContent":["export * from './DataDetails'\nexport * from './Details'\nexport * from './JsonDetails'\nexport * from './ValidationDetails'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
1
|
+
{"version":3,"sources":["../../../../src/components/Details/DataDetails.tsx","../../../../src/components/Details/HashSourceDetails.tsx","../../../../src/components/Details/Details.tsx","../../../../src/components/Details/JsonDetails.tsx","../../../../src/components/Details/ValidationDetails/ValidationDetails.tsx"],"sourcesContent":["import { ContentCopy as ContentCopyIcon, Visibility as VisibilityIcon } from '@mui/icons-material'\nimport { Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Property, PropertyAction, PropertyProps } from '@xyo-network/react-property'\nimport { SizeProp, usePayloadHash } from '@xyo-network/react-shared'\nimport { useState } from 'react'\n\nimport { PayloadHashSourceDetails } from './HashSourceDetails'\n\nexport type PayloadDataDetailsProps = PropertyProps & {\n badge?: boolean\n payload?: Payload\n size?: SizeProp\n}\n\nexport const PayloadDataDetails: React.FC<PayloadDataDetailsProps> = ({ size, badge, payload, ...props }) => {\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n const [viewSourceOpen, setViewSourceOpen] = useState(false)\n const hash = usePayloadHash(payload)\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const actions: PropertyAction[] = [\n {\n icon: <VisibilityIcon />,\n name: 'View',\n onClick: () => setViewSourceOpen(true),\n },\n {\n icon: <ContentCopyIcon />,\n name: 'Copy',\n onClick: async () => await navigator.clipboard.writeText(hash ?? ''),\n },\n ]\n\n const onCopy = async () => {\n await navigator.clipboard.writeText(payloadString)\n }\n\n return (\n <>\n <Property\n titleProps={{ elevation }}\n badge={badge}\n size={size}\n actions={actions}\n title=\"Payload Hash\"\n value={hash ?? '<Unknown>'}\n tip=\"This is the payload hash\"\n {...props}\n />\n <Dialog open={viewSourceOpen} onClose={() => setViewSourceOpen(false)}>\n <DialogTitle>Hash Source</DialogTitle>\n <DialogContent>\n <PayloadHashSourceDetails noTitle payload={payload} />\n </DialogContent>\n <DialogActions>\n <ButtonEx color=\"secondary\" onClick={onCopy}>\n Copy\n </ButtonEx>\n <ButtonEx color=\"secondary\" onClick={() => setViewSourceOpen(false)}>\n Close\n </ButtonEx>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n","import { ContentCopy as ContentCopyIcon } from '@mui/icons-material'\nimport { IconButton, Typography, useTheme } from '@mui/material'\nimport { FlexBoxProps, FlexCol, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { QuickTipButton } from '@xylabs/react-quick-tip-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface PayloadHashSourceDetailsProps extends FlexBoxProps {\n noTitle?: boolean\n payload?: Payload\n}\n\nexport const PayloadHashSourceDetails: React.FC<PayloadHashSourceDetailsProps> = ({ noTitle = false, payload, ...props }) => {\n const theme = useTheme()\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n return (\n <FlexCol alignItems=\"stretch\" {...props}>\n {noTitle ? null : (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography>Hash Source</Typography>\n <QuickTipButton title=\"Hash Source\">The actual string used to generate the hash (SHA256)</QuickTipButton>\n </FlexRow>\n )}\n <FlexRow>\n <FlexGrowRow background border={1} borderColor={theme.palette.divider} justifyContent=\"start\">\n <Typography padding={2} fontFamily=\"monospace\" variant=\"body1\" sx={{ overflowWrap: 'break-word', wordBreak: 'break-all' }}>\n {payloadString}\n </Typography>\n </FlexGrowRow>\n <IconButton>\n <ContentCopyIcon />\n </IconButton>\n </FlexRow>\n {noTitle ? (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography variant=\"body2\">\n The actual string used to generate the hash (SHA256). This can be used to validate the hash manually.\n </Typography>\n </FlexRow>\n ) : null}\n </FlexCol>\n )\n}\n","import { FlexBoxProps, FlexCol } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { forwardRef } from 'react'\n\nimport { PayloadDataDetails } from './DataDetails'\nimport { PayloadJsonDetails } from './JsonDetails'\nimport { PayloadValidationDetails } from './ValidationDetails'\n\nexport type WithPaper<T> = T & { paper: true }\nexport type WithoutPaper<T> = T & { paper?: false }\n\nexport type PayloadDetailsProps = FlexBoxProps & {\n paper?: boolean\n payload?: Payload\n}\n\nexport const PayloadDetails = forwardRef<HTMLDivElement, PayloadDetailsProps>(({ paper, payload, ...props }, ref) => {\n return (\n <FlexCol gap={1} justifyContent=\"flex-start\" alignItems=\"stretch\" marginTop={2} marginBottom={8} ref={ref} {...props}>\n <PayloadDataDetails paper={paper} size=\"large\" badge payload={payload} />\n <PayloadValidationDetails paper={paper} value={payload} />\n <PayloadJsonDetails paper={paper} payload={payload} />\n </FlexCol>\n )\n})\n\nPayloadDetails.displayName = 'PayloadDetails'\n","import { Paper, useMediaQuery, useTheme } from '@mui/material'\nimport { FlexGrowRow } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PropertyGroup, PropertyGroupProps } from '@xyo-network/react-property'\nimport { lazy, Suspense } from 'react'\nimport { ReactJsonViewProps } from 'react-json-view'\n\nconst JsonView = lazy(() => import(/* webpackChunkName: \"jsonView\" */ 'react-json-view'))\n\nexport type PayloadJsonDetailsProps = PropertyGroupProps & {\n jsonViewProps?: ReactJsonViewProps\n payload?: Payload\n}\n\nexport const PayloadJsonDetails: React.FC<PayloadJsonDetailsProps> = ({ jsonViewProps, payload = {}, ...props }) => {\n const { breakpoints, palette } = useTheme()\n const belowSm = useMediaQuery(breakpoints.down('sm'))\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const jsonTheme = palette.mode === 'dark' ? 'shapeshifter' : undefined\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"JSON\" tip=\"The raw JSON of the payload\" {...props}>\n <Paper square variant=\"elevation\" style={{ overflow: 'hidden', padding: '16px', width: '100%' }}>\n <Suspense fallback={<FlexGrowRow />}>\n <JsonView\n groupArraysAfterLength={20}\n style={{ backgroundColor: undefined, overflow: 'hidden' }}\n src={payload}\n enableClipboard\n theme={jsonTheme}\n collapseStringsAfterLength={belowSm ? 24 : 32}\n {...jsonViewProps}\n />\n </Suspense>\n </Paper>\n </PropertyGroup>\n )\n}\n","import { Typography } from '@mui/material'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport { usePromise } from '@xylabs/react-promise'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\nimport { Property, PropertyGroup } from '@xyo-network/react-property'\nimport { SchemaProperty } from '@xyo-network/react-schema'\n\nimport { PayloadValidationDetailsProps } from './ValidationDetailsProps'\n\nexport const PayloadValidationDetails: React.FC<PayloadValidationDetailsProps> = ({ skipBody = false, value, ...props }) => {\n const [validateErrors] = usePromise(async () => (value ? await new PayloadValidator(value).validate() : undefined), [value])\n\n const bodyErrors = skipBody ? [] : validateErrors ?? []\n const errors: Error[] = [...bodyErrors]\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"Validation\" tip=\"The results from validating the payload\" {...props}>\n <Property\n titleProps={{ elevation }}\n flexGrow={1}\n title=\"Valid\"\n value={errors.length === 0 ? 'True' : 'False'}\n tip={\n errors.length > 0 ? (\n <FlexCol>\n {errors.map((error, index) => {\n return <Typography key={index}>{error.toString()}</Typography>\n })}\n </FlexCol>\n ) : (\n <Typography>No Errors</Typography>\n )\n }\n />\n {value?.schema && <SchemaProperty flexGrow={1} titleProps={{ elevation }} value={value.schema} />}\n </PropertyGroup>\n )\n}\n"],"mappings":"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","names":["ContentCopyIcon","PayloadHasher","jsx","jsxs","PayloadHasher","ContentCopyIcon","FlexCol","useTheme","FlexGrowRow","jsx","Typography","FlexCol","Property","PropertyGroup","jsx","jsxs","jsx","jsxs","FlexCol"]}
|
@@ -1,2 +1,168 @@
|
|
1
|
-
|
1
|
+
// src/components/Details/DataDetails.tsx
|
2
|
+
import { ContentCopy as ContentCopyIcon2, Visibility as VisibilityIcon } from "@mui/icons-material";
|
3
|
+
import { Dialog, DialogActions, DialogContent, DialogTitle } from "@mui/material";
|
4
|
+
import { ButtonEx } from "@xylabs/react-button";
|
5
|
+
import { PayloadHasher as PayloadHasher2 } from "@xyo-network/hash";
|
6
|
+
import { Property } from "@xyo-network/react-property";
|
7
|
+
import { usePayloadHash } from "@xyo-network/react-shared";
|
8
|
+
import { useState } from "react";
|
9
|
+
|
10
|
+
// src/components/Details/HashSourceDetails.tsx
|
11
|
+
import { ContentCopy as ContentCopyIcon } from "@mui/icons-material";
|
12
|
+
import { IconButton, Typography, useTheme } from "@mui/material";
|
13
|
+
import { FlexCol, FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
|
14
|
+
import { QuickTipButton } from "@xylabs/react-quick-tip-button";
|
15
|
+
import { PayloadHasher } from "@xyo-network/hash";
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
17
|
+
var PayloadHashSourceDetails = ({ noTitle = false, payload, ...props }) => {
|
18
|
+
const theme = useTheme();
|
19
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : "";
|
20
|
+
return /* @__PURE__ */ jsxs(FlexCol, { alignItems: "stretch", ...props, children: [
|
21
|
+
noTitle ? null : /* @__PURE__ */ jsxs(FlexRow, { margin: 1, justifyContent: "flex-start", children: [
|
22
|
+
/* @__PURE__ */ jsx(Typography, { children: "Hash Source" }),
|
23
|
+
/* @__PURE__ */ jsx(QuickTipButton, { title: "Hash Source", children: "The actual string used to generate the hash (SHA256)" })
|
24
|
+
] }),
|
25
|
+
/* @__PURE__ */ jsxs(FlexRow, { children: [
|
26
|
+
/* @__PURE__ */ jsx(FlexGrowRow, { background: true, border: 1, borderColor: theme.palette.divider, justifyContent: "start", children: /* @__PURE__ */ jsx(Typography, { padding: 2, fontFamily: "monospace", variant: "body1", sx: { overflowWrap: "break-word", wordBreak: "break-all" }, children: payloadString }) }),
|
27
|
+
/* @__PURE__ */ jsx(IconButton, { children: /* @__PURE__ */ jsx(ContentCopyIcon, {}) })
|
28
|
+
] }),
|
29
|
+
noTitle ? /* @__PURE__ */ jsx(FlexRow, { margin: 1, justifyContent: "flex-start", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "The actual string used to generate the hash (SHA256). This can be used to validate the hash manually." }) }) : null
|
30
|
+
] });
|
31
|
+
};
|
32
|
+
|
33
|
+
// src/components/Details/DataDetails.tsx
|
34
|
+
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
35
|
+
var PayloadDataDetails = ({ size, badge, payload, ...props }) => {
|
36
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher2.hashFields(payload), null, 2) : "";
|
37
|
+
const [viewSourceOpen, setViewSourceOpen] = useState(false);
|
38
|
+
const hash = usePayloadHash(payload);
|
39
|
+
let elevation = 2;
|
40
|
+
if (props.paper) {
|
41
|
+
elevation += props.elevation ?? 0;
|
42
|
+
}
|
43
|
+
const actions = [
|
44
|
+
{
|
45
|
+
icon: /* @__PURE__ */ jsx2(VisibilityIcon, {}),
|
46
|
+
name: "View",
|
47
|
+
onClick: () => setViewSourceOpen(true)
|
48
|
+
},
|
49
|
+
{
|
50
|
+
icon: /* @__PURE__ */ jsx2(ContentCopyIcon2, {}),
|
51
|
+
name: "Copy",
|
52
|
+
onClick: async () => await navigator.clipboard.writeText(hash ?? "")
|
53
|
+
}
|
54
|
+
];
|
55
|
+
const onCopy = async () => {
|
56
|
+
await navigator.clipboard.writeText(payloadString);
|
57
|
+
};
|
58
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
59
|
+
/* @__PURE__ */ jsx2(
|
60
|
+
Property,
|
61
|
+
{
|
62
|
+
titleProps: { elevation },
|
63
|
+
badge,
|
64
|
+
size,
|
65
|
+
actions,
|
66
|
+
title: "Payload Hash",
|
67
|
+
value: hash ?? "<Unknown>",
|
68
|
+
tip: "This is the payload hash",
|
69
|
+
...props
|
70
|
+
}
|
71
|
+
),
|
72
|
+
/* @__PURE__ */ jsxs2(Dialog, { open: viewSourceOpen, onClose: () => setViewSourceOpen(false), children: [
|
73
|
+
/* @__PURE__ */ jsx2(DialogTitle, { children: "Hash Source" }),
|
74
|
+
/* @__PURE__ */ jsx2(DialogContent, { children: /* @__PURE__ */ jsx2(PayloadHashSourceDetails, { noTitle: true, payload }) }),
|
75
|
+
/* @__PURE__ */ jsxs2(DialogActions, { children: [
|
76
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: onCopy, children: "Copy" }),
|
77
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: () => setViewSourceOpen(false), children: "Close" })
|
78
|
+
] })
|
79
|
+
] })
|
80
|
+
] });
|
81
|
+
};
|
82
|
+
|
83
|
+
// src/components/Details/Details.tsx
|
84
|
+
import { FlexCol as FlexCol3 } from "@xylabs/react-flexbox";
|
85
|
+
import { forwardRef } from "react";
|
86
|
+
|
87
|
+
// src/components/Details/JsonDetails.tsx
|
88
|
+
import { Paper, useMediaQuery, useTheme as useTheme2 } from "@mui/material";
|
89
|
+
import { FlexGrowRow as FlexGrowRow2 } from "@xylabs/react-flexbox";
|
90
|
+
import { PropertyGroup } from "@xyo-network/react-property";
|
91
|
+
import { lazy, Suspense } from "react";
|
92
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
93
|
+
var JsonView = lazy(() => import(
|
94
|
+
/* webpackChunkName: "jsonView" */
|
95
|
+
"react-json-view"
|
96
|
+
));
|
97
|
+
var PayloadJsonDetails = ({ jsonViewProps, payload = {}, ...props }) => {
|
98
|
+
const { breakpoints, palette } = useTheme2();
|
99
|
+
const belowSm = useMediaQuery(breakpoints.down("sm"));
|
100
|
+
let elevation = 2;
|
101
|
+
if (props.paper) {
|
102
|
+
elevation += props.elevation ?? 0;
|
103
|
+
}
|
104
|
+
const jsonTheme = palette.mode === "dark" ? "shapeshifter" : void 0;
|
105
|
+
return /* @__PURE__ */ jsx3(PropertyGroup, { titleProps: { elevation }, title: "JSON", tip: "The raw JSON of the payload", ...props, children: /* @__PURE__ */ jsx3(Paper, { square: true, variant: "elevation", style: { overflow: "hidden", padding: "16px", width: "100%" }, children: /* @__PURE__ */ jsx3(Suspense, { fallback: /* @__PURE__ */ jsx3(FlexGrowRow2, {}), children: /* @__PURE__ */ jsx3(
|
106
|
+
JsonView,
|
107
|
+
{
|
108
|
+
groupArraysAfterLength: 20,
|
109
|
+
style: { backgroundColor: void 0, overflow: "hidden" },
|
110
|
+
src: payload,
|
111
|
+
enableClipboard: true,
|
112
|
+
theme: jsonTheme,
|
113
|
+
collapseStringsAfterLength: belowSm ? 24 : 32,
|
114
|
+
...jsonViewProps
|
115
|
+
}
|
116
|
+
) }) }) });
|
117
|
+
};
|
118
|
+
|
119
|
+
// src/components/Details/ValidationDetails/ValidationDetails.tsx
|
120
|
+
import { Typography as Typography2 } from "@mui/material";
|
121
|
+
import { FlexCol as FlexCol2 } from "@xylabs/react-flexbox";
|
122
|
+
import { usePromise } from "@xylabs/react-promise";
|
123
|
+
import { PayloadValidator } from "@xyo-network/payload-validator";
|
124
|
+
import { Property as Property2, PropertyGroup as PropertyGroup2 } from "@xyo-network/react-property";
|
125
|
+
import { SchemaProperty } from "@xyo-network/react-schema";
|
126
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
127
|
+
var PayloadValidationDetails = ({ skipBody = false, value, ...props }) => {
|
128
|
+
const [validateErrors] = usePromise(async () => value ? await new PayloadValidator(value).validate() : void 0, [value]);
|
129
|
+
const bodyErrors = skipBody ? [] : validateErrors ?? [];
|
130
|
+
const errors = [...bodyErrors];
|
131
|
+
let elevation = 2;
|
132
|
+
if (props.paper) {
|
133
|
+
elevation += props.elevation ?? 0;
|
134
|
+
}
|
135
|
+
return /* @__PURE__ */ jsxs3(PropertyGroup2, { titleProps: { elevation }, title: "Validation", tip: "The results from validating the payload", ...props, children: [
|
136
|
+
/* @__PURE__ */ jsx4(
|
137
|
+
Property2,
|
138
|
+
{
|
139
|
+
titleProps: { elevation },
|
140
|
+
flexGrow: 1,
|
141
|
+
title: "Valid",
|
142
|
+
value: errors.length === 0 ? "True" : "False",
|
143
|
+
tip: errors.length > 0 ? /* @__PURE__ */ jsx4(FlexCol2, { children: errors.map((error, index) => {
|
144
|
+
return /* @__PURE__ */ jsx4(Typography2, { children: error.toString() }, index);
|
145
|
+
}) }) : /* @__PURE__ */ jsx4(Typography2, { children: "No Errors" })
|
146
|
+
}
|
147
|
+
),
|
148
|
+
value?.schema && /* @__PURE__ */ jsx4(SchemaProperty, { flexGrow: 1, titleProps: { elevation }, value: value.schema })
|
149
|
+
] });
|
150
|
+
};
|
151
|
+
|
152
|
+
// src/components/Details/Details.tsx
|
153
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
154
|
+
var PayloadDetails = forwardRef(({ paper, payload, ...props }, ref) => {
|
155
|
+
return /* @__PURE__ */ jsxs4(FlexCol3, { gap: 1, justifyContent: "flex-start", alignItems: "stretch", marginTop: 2, marginBottom: 8, ref, ...props, children: [
|
156
|
+
/* @__PURE__ */ jsx5(PayloadDataDetails, { paper, size: "large", badge: true, payload }),
|
157
|
+
/* @__PURE__ */ jsx5(PayloadValidationDetails, { paper, value: payload }),
|
158
|
+
/* @__PURE__ */ jsx5(PayloadJsonDetails, { paper, payload })
|
159
|
+
] });
|
160
|
+
});
|
161
|
+
PayloadDetails.displayName = "PayloadDetails";
|
162
|
+
export {
|
163
|
+
PayloadDataDetails,
|
164
|
+
PayloadDetails,
|
165
|
+
PayloadJsonDetails,
|
166
|
+
PayloadValidationDetails
|
167
|
+
};
|
2
168
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/components/index.ts"],"sourcesContent":["export * from './Details'\n"],"mappings":"AAAA,cAAc;","names":[]}
|
1
|
+
{"version":3,"sources":["../../../src/components/Details/DataDetails.tsx","../../../src/components/Details/HashSourceDetails.tsx","../../../src/components/Details/Details.tsx","../../../src/components/Details/JsonDetails.tsx","../../../src/components/Details/ValidationDetails/ValidationDetails.tsx"],"sourcesContent":["import { ContentCopy as ContentCopyIcon, Visibility as VisibilityIcon } from '@mui/icons-material'\nimport { Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Property, PropertyAction, PropertyProps } from '@xyo-network/react-property'\nimport { SizeProp, usePayloadHash } from '@xyo-network/react-shared'\nimport { useState } from 'react'\n\nimport { PayloadHashSourceDetails } from './HashSourceDetails'\n\nexport type PayloadDataDetailsProps = PropertyProps & {\n badge?: boolean\n payload?: Payload\n size?: SizeProp\n}\n\nexport const PayloadDataDetails: React.FC<PayloadDataDetailsProps> = ({ size, badge, payload, ...props }) => {\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n const [viewSourceOpen, setViewSourceOpen] = useState(false)\n const hash = usePayloadHash(payload)\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const actions: PropertyAction[] = [\n {\n icon: <VisibilityIcon />,\n name: 'View',\n onClick: () => setViewSourceOpen(true),\n },\n {\n icon: <ContentCopyIcon />,\n name: 'Copy',\n onClick: async () => await navigator.clipboard.writeText(hash ?? ''),\n },\n ]\n\n const onCopy = async () => {\n await navigator.clipboard.writeText(payloadString)\n }\n\n return (\n <>\n <Property\n titleProps={{ elevation }}\n badge={badge}\n size={size}\n actions={actions}\n title=\"Payload Hash\"\n value={hash ?? '<Unknown>'}\n tip=\"This is the payload hash\"\n {...props}\n />\n <Dialog open={viewSourceOpen} onClose={() => setViewSourceOpen(false)}>\n <DialogTitle>Hash Source</DialogTitle>\n <DialogContent>\n <PayloadHashSourceDetails noTitle payload={payload} />\n </DialogContent>\n <DialogActions>\n <ButtonEx color=\"secondary\" onClick={onCopy}>\n Copy\n </ButtonEx>\n <ButtonEx color=\"secondary\" onClick={() => setViewSourceOpen(false)}>\n Close\n </ButtonEx>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n","import { ContentCopy as ContentCopyIcon } from '@mui/icons-material'\nimport { IconButton, Typography, useTheme } from '@mui/material'\nimport { FlexBoxProps, FlexCol, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { QuickTipButton } from '@xylabs/react-quick-tip-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface PayloadHashSourceDetailsProps extends FlexBoxProps {\n noTitle?: boolean\n payload?: Payload\n}\n\nexport const PayloadHashSourceDetails: React.FC<PayloadHashSourceDetailsProps> = ({ noTitle = false, payload, ...props }) => {\n const theme = useTheme()\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n return (\n <FlexCol alignItems=\"stretch\" {...props}>\n {noTitle ? null : (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography>Hash Source</Typography>\n <QuickTipButton title=\"Hash Source\">The actual string used to generate the hash (SHA256)</QuickTipButton>\n </FlexRow>\n )}\n <FlexRow>\n <FlexGrowRow background border={1} borderColor={theme.palette.divider} justifyContent=\"start\">\n <Typography padding={2} fontFamily=\"monospace\" variant=\"body1\" sx={{ overflowWrap: 'break-word', wordBreak: 'break-all' }}>\n {payloadString}\n </Typography>\n </FlexGrowRow>\n <IconButton>\n <ContentCopyIcon />\n </IconButton>\n </FlexRow>\n {noTitle ? (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography variant=\"body2\">\n The actual string used to generate the hash (SHA256). This can be used to validate the hash manually.\n </Typography>\n </FlexRow>\n ) : null}\n </FlexCol>\n )\n}\n","import { FlexBoxProps, FlexCol } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { forwardRef } from 'react'\n\nimport { PayloadDataDetails } from './DataDetails'\nimport { PayloadJsonDetails } from './JsonDetails'\nimport { PayloadValidationDetails } from './ValidationDetails'\n\nexport type WithPaper<T> = T & { paper: true }\nexport type WithoutPaper<T> = T & { paper?: false }\n\nexport type PayloadDetailsProps = FlexBoxProps & {\n paper?: boolean\n payload?: Payload\n}\n\nexport const PayloadDetails = forwardRef<HTMLDivElement, PayloadDetailsProps>(({ paper, payload, ...props }, ref) => {\n return (\n <FlexCol gap={1} justifyContent=\"flex-start\" alignItems=\"stretch\" marginTop={2} marginBottom={8} ref={ref} {...props}>\n <PayloadDataDetails paper={paper} size=\"large\" badge payload={payload} />\n <PayloadValidationDetails paper={paper} value={payload} />\n <PayloadJsonDetails paper={paper} payload={payload} />\n </FlexCol>\n )\n})\n\nPayloadDetails.displayName = 'PayloadDetails'\n","import { Paper, useMediaQuery, useTheme } from '@mui/material'\nimport { FlexGrowRow } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PropertyGroup, PropertyGroupProps } from '@xyo-network/react-property'\nimport { lazy, Suspense } from 'react'\nimport { ReactJsonViewProps } from 'react-json-view'\n\nconst JsonView = lazy(() => import(/* webpackChunkName: \"jsonView\" */ 'react-json-view'))\n\nexport type PayloadJsonDetailsProps = PropertyGroupProps & {\n jsonViewProps?: ReactJsonViewProps\n payload?: Payload\n}\n\nexport const PayloadJsonDetails: React.FC<PayloadJsonDetailsProps> = ({ jsonViewProps, payload = {}, ...props }) => {\n const { breakpoints, palette } = useTheme()\n const belowSm = useMediaQuery(breakpoints.down('sm'))\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const jsonTheme = palette.mode === 'dark' ? 'shapeshifter' : undefined\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"JSON\" tip=\"The raw JSON of the payload\" {...props}>\n <Paper square variant=\"elevation\" style={{ overflow: 'hidden', padding: '16px', width: '100%' }}>\n <Suspense fallback={<FlexGrowRow />}>\n <JsonView\n groupArraysAfterLength={20}\n style={{ backgroundColor: undefined, overflow: 'hidden' }}\n src={payload}\n enableClipboard\n theme={jsonTheme}\n collapseStringsAfterLength={belowSm ? 24 : 32}\n {...jsonViewProps}\n />\n </Suspense>\n </Paper>\n </PropertyGroup>\n )\n}\n","import { Typography } from '@mui/material'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport { usePromise } from '@xylabs/react-promise'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\nimport { Property, PropertyGroup } from '@xyo-network/react-property'\nimport { SchemaProperty } from '@xyo-network/react-schema'\n\nimport { PayloadValidationDetailsProps } from './ValidationDetailsProps'\n\nexport const PayloadValidationDetails: React.FC<PayloadValidationDetailsProps> = ({ skipBody = false, value, ...props }) => {\n const [validateErrors] = usePromise(async () => (value ? await new PayloadValidator(value).validate() : undefined), [value])\n\n const bodyErrors = skipBody ? [] : validateErrors ?? []\n const errors: Error[] = [...bodyErrors]\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"Validation\" tip=\"The results from validating the payload\" {...props}>\n <Property\n titleProps={{ elevation }}\n flexGrow={1}\n title=\"Valid\"\n value={errors.length === 0 ? 'True' : 'False'}\n tip={\n errors.length > 0 ? (\n <FlexCol>\n {errors.map((error, index) => {\n return <Typography key={index}>{error.toString()}</Typography>\n })}\n </FlexCol>\n ) : (\n <Typography>No Errors</Typography>\n )\n }\n />\n {value?.schema && <SchemaProperty flexGrow={1} titleProps={{ elevation }} value={value.schema} />}\n </PropertyGroup>\n )\n}\n"],"mappings":"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","names":["ContentCopyIcon","PayloadHasher","jsx","jsxs","PayloadHasher","ContentCopyIcon","FlexCol","useTheme","FlexGrowRow","jsx","Typography","FlexCol","Property","PropertyGroup","jsx","jsxs","jsx","jsxs","FlexCol"]}
|
package/dist/browser/index.js
CHANGED
@@ -1,2 +1,168 @@
|
|
1
|
-
|
1
|
+
// src/components/Details/DataDetails.tsx
|
2
|
+
import { ContentCopy as ContentCopyIcon2, Visibility as VisibilityIcon } from "@mui/icons-material";
|
3
|
+
import { Dialog, DialogActions, DialogContent, DialogTitle } from "@mui/material";
|
4
|
+
import { ButtonEx } from "@xylabs/react-button";
|
5
|
+
import { PayloadHasher as PayloadHasher2 } from "@xyo-network/hash";
|
6
|
+
import { Property } from "@xyo-network/react-property";
|
7
|
+
import { usePayloadHash } from "@xyo-network/react-shared";
|
8
|
+
import { useState } from "react";
|
9
|
+
|
10
|
+
// src/components/Details/HashSourceDetails.tsx
|
11
|
+
import { ContentCopy as ContentCopyIcon } from "@mui/icons-material";
|
12
|
+
import { IconButton, Typography, useTheme } from "@mui/material";
|
13
|
+
import { FlexCol, FlexGrowRow, FlexRow } from "@xylabs/react-flexbox";
|
14
|
+
import { QuickTipButton } from "@xylabs/react-quick-tip-button";
|
15
|
+
import { PayloadHasher } from "@xyo-network/hash";
|
16
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
17
|
+
var PayloadHashSourceDetails = ({ noTitle = false, payload, ...props }) => {
|
18
|
+
const theme = useTheme();
|
19
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : "";
|
20
|
+
return /* @__PURE__ */ jsxs(FlexCol, { alignItems: "stretch", ...props, children: [
|
21
|
+
noTitle ? null : /* @__PURE__ */ jsxs(FlexRow, { margin: 1, justifyContent: "flex-start", children: [
|
22
|
+
/* @__PURE__ */ jsx(Typography, { children: "Hash Source" }),
|
23
|
+
/* @__PURE__ */ jsx(QuickTipButton, { title: "Hash Source", children: "The actual string used to generate the hash (SHA256)" })
|
24
|
+
] }),
|
25
|
+
/* @__PURE__ */ jsxs(FlexRow, { children: [
|
26
|
+
/* @__PURE__ */ jsx(FlexGrowRow, { background: true, border: 1, borderColor: theme.palette.divider, justifyContent: "start", children: /* @__PURE__ */ jsx(Typography, { padding: 2, fontFamily: "monospace", variant: "body1", sx: { overflowWrap: "break-word", wordBreak: "break-all" }, children: payloadString }) }),
|
27
|
+
/* @__PURE__ */ jsx(IconButton, { children: /* @__PURE__ */ jsx(ContentCopyIcon, {}) })
|
28
|
+
] }),
|
29
|
+
noTitle ? /* @__PURE__ */ jsx(FlexRow, { margin: 1, justifyContent: "flex-start", children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "The actual string used to generate the hash (SHA256). This can be used to validate the hash manually." }) }) : null
|
30
|
+
] });
|
31
|
+
};
|
32
|
+
|
33
|
+
// src/components/Details/DataDetails.tsx
|
34
|
+
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
35
|
+
var PayloadDataDetails = ({ size, badge, payload, ...props }) => {
|
36
|
+
const payloadString = payload ? JSON.stringify(PayloadHasher2.hashFields(payload), null, 2) : "";
|
37
|
+
const [viewSourceOpen, setViewSourceOpen] = useState(false);
|
38
|
+
const hash = usePayloadHash(payload);
|
39
|
+
let elevation = 2;
|
40
|
+
if (props.paper) {
|
41
|
+
elevation += props.elevation ?? 0;
|
42
|
+
}
|
43
|
+
const actions = [
|
44
|
+
{
|
45
|
+
icon: /* @__PURE__ */ jsx2(VisibilityIcon, {}),
|
46
|
+
name: "View",
|
47
|
+
onClick: () => setViewSourceOpen(true)
|
48
|
+
},
|
49
|
+
{
|
50
|
+
icon: /* @__PURE__ */ jsx2(ContentCopyIcon2, {}),
|
51
|
+
name: "Copy",
|
52
|
+
onClick: async () => await navigator.clipboard.writeText(hash ?? "")
|
53
|
+
}
|
54
|
+
];
|
55
|
+
const onCopy = async () => {
|
56
|
+
await navigator.clipboard.writeText(payloadString);
|
57
|
+
};
|
58
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
59
|
+
/* @__PURE__ */ jsx2(
|
60
|
+
Property,
|
61
|
+
{
|
62
|
+
titleProps: { elevation },
|
63
|
+
badge,
|
64
|
+
size,
|
65
|
+
actions,
|
66
|
+
title: "Payload Hash",
|
67
|
+
value: hash ?? "<Unknown>",
|
68
|
+
tip: "This is the payload hash",
|
69
|
+
...props
|
70
|
+
}
|
71
|
+
),
|
72
|
+
/* @__PURE__ */ jsxs2(Dialog, { open: viewSourceOpen, onClose: () => setViewSourceOpen(false), children: [
|
73
|
+
/* @__PURE__ */ jsx2(DialogTitle, { children: "Hash Source" }),
|
74
|
+
/* @__PURE__ */ jsx2(DialogContent, { children: /* @__PURE__ */ jsx2(PayloadHashSourceDetails, { noTitle: true, payload }) }),
|
75
|
+
/* @__PURE__ */ jsxs2(DialogActions, { children: [
|
76
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: onCopy, children: "Copy" }),
|
77
|
+
/* @__PURE__ */ jsx2(ButtonEx, { color: "secondary", onClick: () => setViewSourceOpen(false), children: "Close" })
|
78
|
+
] })
|
79
|
+
] })
|
80
|
+
] });
|
81
|
+
};
|
82
|
+
|
83
|
+
// src/components/Details/Details.tsx
|
84
|
+
import { FlexCol as FlexCol3 } from "@xylabs/react-flexbox";
|
85
|
+
import { forwardRef } from "react";
|
86
|
+
|
87
|
+
// src/components/Details/JsonDetails.tsx
|
88
|
+
import { Paper, useMediaQuery, useTheme as useTheme2 } from "@mui/material";
|
89
|
+
import { FlexGrowRow as FlexGrowRow2 } from "@xylabs/react-flexbox";
|
90
|
+
import { PropertyGroup } from "@xyo-network/react-property";
|
91
|
+
import { lazy, Suspense } from "react";
|
92
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
93
|
+
var JsonView = lazy(() => import(
|
94
|
+
/* webpackChunkName: "jsonView" */
|
95
|
+
"react-json-view"
|
96
|
+
));
|
97
|
+
var PayloadJsonDetails = ({ jsonViewProps, payload = {}, ...props }) => {
|
98
|
+
const { breakpoints, palette } = useTheme2();
|
99
|
+
const belowSm = useMediaQuery(breakpoints.down("sm"));
|
100
|
+
let elevation = 2;
|
101
|
+
if (props.paper) {
|
102
|
+
elevation += props.elevation ?? 0;
|
103
|
+
}
|
104
|
+
const jsonTheme = palette.mode === "dark" ? "shapeshifter" : void 0;
|
105
|
+
return /* @__PURE__ */ jsx3(PropertyGroup, { titleProps: { elevation }, title: "JSON", tip: "The raw JSON of the payload", ...props, children: /* @__PURE__ */ jsx3(Paper, { square: true, variant: "elevation", style: { overflow: "hidden", padding: "16px", width: "100%" }, children: /* @__PURE__ */ jsx3(Suspense, { fallback: /* @__PURE__ */ jsx3(FlexGrowRow2, {}), children: /* @__PURE__ */ jsx3(
|
106
|
+
JsonView,
|
107
|
+
{
|
108
|
+
groupArraysAfterLength: 20,
|
109
|
+
style: { backgroundColor: void 0, overflow: "hidden" },
|
110
|
+
src: payload,
|
111
|
+
enableClipboard: true,
|
112
|
+
theme: jsonTheme,
|
113
|
+
collapseStringsAfterLength: belowSm ? 24 : 32,
|
114
|
+
...jsonViewProps
|
115
|
+
}
|
116
|
+
) }) }) });
|
117
|
+
};
|
118
|
+
|
119
|
+
// src/components/Details/ValidationDetails/ValidationDetails.tsx
|
120
|
+
import { Typography as Typography2 } from "@mui/material";
|
121
|
+
import { FlexCol as FlexCol2 } from "@xylabs/react-flexbox";
|
122
|
+
import { usePromise } from "@xylabs/react-promise";
|
123
|
+
import { PayloadValidator } from "@xyo-network/payload-validator";
|
124
|
+
import { Property as Property2, PropertyGroup as PropertyGroup2 } from "@xyo-network/react-property";
|
125
|
+
import { SchemaProperty } from "@xyo-network/react-schema";
|
126
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
127
|
+
var PayloadValidationDetails = ({ skipBody = false, value, ...props }) => {
|
128
|
+
const [validateErrors] = usePromise(async () => value ? await new PayloadValidator(value).validate() : void 0, [value]);
|
129
|
+
const bodyErrors = skipBody ? [] : validateErrors ?? [];
|
130
|
+
const errors = [...bodyErrors];
|
131
|
+
let elevation = 2;
|
132
|
+
if (props.paper) {
|
133
|
+
elevation += props.elevation ?? 0;
|
134
|
+
}
|
135
|
+
return /* @__PURE__ */ jsxs3(PropertyGroup2, { titleProps: { elevation }, title: "Validation", tip: "The results from validating the payload", ...props, children: [
|
136
|
+
/* @__PURE__ */ jsx4(
|
137
|
+
Property2,
|
138
|
+
{
|
139
|
+
titleProps: { elevation },
|
140
|
+
flexGrow: 1,
|
141
|
+
title: "Valid",
|
142
|
+
value: errors.length === 0 ? "True" : "False",
|
143
|
+
tip: errors.length > 0 ? /* @__PURE__ */ jsx4(FlexCol2, { children: errors.map((error, index) => {
|
144
|
+
return /* @__PURE__ */ jsx4(Typography2, { children: error.toString() }, index);
|
145
|
+
}) }) : /* @__PURE__ */ jsx4(Typography2, { children: "No Errors" })
|
146
|
+
}
|
147
|
+
),
|
148
|
+
value?.schema && /* @__PURE__ */ jsx4(SchemaProperty, { flexGrow: 1, titleProps: { elevation }, value: value.schema })
|
149
|
+
] });
|
150
|
+
};
|
151
|
+
|
152
|
+
// src/components/Details/Details.tsx
|
153
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
154
|
+
var PayloadDetails = forwardRef(({ paper, payload, ...props }, ref) => {
|
155
|
+
return /* @__PURE__ */ jsxs4(FlexCol3, { gap: 1, justifyContent: "flex-start", alignItems: "stretch", marginTop: 2, marginBottom: 8, ref, ...props, children: [
|
156
|
+
/* @__PURE__ */ jsx5(PayloadDataDetails, { paper, size: "large", badge: true, payload }),
|
157
|
+
/* @__PURE__ */ jsx5(PayloadValidationDetails, { paper, value: payload }),
|
158
|
+
/* @__PURE__ */ jsx5(PayloadJsonDetails, { paper, payload })
|
159
|
+
] });
|
160
|
+
});
|
161
|
+
PayloadDetails.displayName = "PayloadDetails";
|
162
|
+
export {
|
163
|
+
PayloadDataDetails,
|
164
|
+
PayloadDetails,
|
165
|
+
PayloadJsonDetails,
|
166
|
+
PayloadValidationDetails
|
167
|
+
};
|
2
168
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export * from './components'\n"],"mappings":"AAAA,cAAc;","names":[]}
|
1
|
+
{"version":3,"sources":["../../src/components/Details/DataDetails.tsx","../../src/components/Details/HashSourceDetails.tsx","../../src/components/Details/Details.tsx","../../src/components/Details/JsonDetails.tsx","../../src/components/Details/ValidationDetails/ValidationDetails.tsx"],"sourcesContent":["import { ContentCopy as ContentCopyIcon, Visibility as VisibilityIcon } from '@mui/icons-material'\nimport { Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'\nimport { ButtonEx } from '@xylabs/react-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\nimport { Property, PropertyAction, PropertyProps } from '@xyo-network/react-property'\nimport { SizeProp, usePayloadHash } from '@xyo-network/react-shared'\nimport { useState } from 'react'\n\nimport { PayloadHashSourceDetails } from './HashSourceDetails'\n\nexport type PayloadDataDetailsProps = PropertyProps & {\n badge?: boolean\n payload?: Payload\n size?: SizeProp\n}\n\nexport const PayloadDataDetails: React.FC<PayloadDataDetailsProps> = ({ size, badge, payload, ...props }) => {\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n const [viewSourceOpen, setViewSourceOpen] = useState(false)\n const hash = usePayloadHash(payload)\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const actions: PropertyAction[] = [\n {\n icon: <VisibilityIcon />,\n name: 'View',\n onClick: () => setViewSourceOpen(true),\n },\n {\n icon: <ContentCopyIcon />,\n name: 'Copy',\n onClick: async () => await navigator.clipboard.writeText(hash ?? ''),\n },\n ]\n\n const onCopy = async () => {\n await navigator.clipboard.writeText(payloadString)\n }\n\n return (\n <>\n <Property\n titleProps={{ elevation }}\n badge={badge}\n size={size}\n actions={actions}\n title=\"Payload Hash\"\n value={hash ?? '<Unknown>'}\n tip=\"This is the payload hash\"\n {...props}\n />\n <Dialog open={viewSourceOpen} onClose={() => setViewSourceOpen(false)}>\n <DialogTitle>Hash Source</DialogTitle>\n <DialogContent>\n <PayloadHashSourceDetails noTitle payload={payload} />\n </DialogContent>\n <DialogActions>\n <ButtonEx color=\"secondary\" onClick={onCopy}>\n Copy\n </ButtonEx>\n <ButtonEx color=\"secondary\" onClick={() => setViewSourceOpen(false)}>\n Close\n </ButtonEx>\n </DialogActions>\n </Dialog>\n </>\n )\n}\n","import { ContentCopy as ContentCopyIcon } from '@mui/icons-material'\nimport { IconButton, Typography, useTheme } from '@mui/material'\nimport { FlexBoxProps, FlexCol, FlexGrowRow, FlexRow } from '@xylabs/react-flexbox'\nimport { QuickTipButton } from '@xylabs/react-quick-tip-button'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\n\nexport interface PayloadHashSourceDetailsProps extends FlexBoxProps {\n noTitle?: boolean\n payload?: Payload\n}\n\nexport const PayloadHashSourceDetails: React.FC<PayloadHashSourceDetailsProps> = ({ noTitle = false, payload, ...props }) => {\n const theme = useTheme()\n const payloadString = payload ? JSON.stringify(PayloadHasher.hashFields(payload), null, 2) : ''\n\n return (\n <FlexCol alignItems=\"stretch\" {...props}>\n {noTitle ? null : (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography>Hash Source</Typography>\n <QuickTipButton title=\"Hash Source\">The actual string used to generate the hash (SHA256)</QuickTipButton>\n </FlexRow>\n )}\n <FlexRow>\n <FlexGrowRow background border={1} borderColor={theme.palette.divider} justifyContent=\"start\">\n <Typography padding={2} fontFamily=\"monospace\" variant=\"body1\" sx={{ overflowWrap: 'break-word', wordBreak: 'break-all' }}>\n {payloadString}\n </Typography>\n </FlexGrowRow>\n <IconButton>\n <ContentCopyIcon />\n </IconButton>\n </FlexRow>\n {noTitle ? (\n <FlexRow margin={1} justifyContent=\"flex-start\">\n <Typography variant=\"body2\">\n The actual string used to generate the hash (SHA256). This can be used to validate the hash manually.\n </Typography>\n </FlexRow>\n ) : null}\n </FlexCol>\n )\n}\n","import { FlexBoxProps, FlexCol } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { forwardRef } from 'react'\n\nimport { PayloadDataDetails } from './DataDetails'\nimport { PayloadJsonDetails } from './JsonDetails'\nimport { PayloadValidationDetails } from './ValidationDetails'\n\nexport type WithPaper<T> = T & { paper: true }\nexport type WithoutPaper<T> = T & { paper?: false }\n\nexport type PayloadDetailsProps = FlexBoxProps & {\n paper?: boolean\n payload?: Payload\n}\n\nexport const PayloadDetails = forwardRef<HTMLDivElement, PayloadDetailsProps>(({ paper, payload, ...props }, ref) => {\n return (\n <FlexCol gap={1} justifyContent=\"flex-start\" alignItems=\"stretch\" marginTop={2} marginBottom={8} ref={ref} {...props}>\n <PayloadDataDetails paper={paper} size=\"large\" badge payload={payload} />\n <PayloadValidationDetails paper={paper} value={payload} />\n <PayloadJsonDetails paper={paper} payload={payload} />\n </FlexCol>\n )\n})\n\nPayloadDetails.displayName = 'PayloadDetails'\n","import { Paper, useMediaQuery, useTheme } from '@mui/material'\nimport { FlexGrowRow } from '@xylabs/react-flexbox'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PropertyGroup, PropertyGroupProps } from '@xyo-network/react-property'\nimport { lazy, Suspense } from 'react'\nimport { ReactJsonViewProps } from 'react-json-view'\n\nconst JsonView = lazy(() => import(/* webpackChunkName: \"jsonView\" */ 'react-json-view'))\n\nexport type PayloadJsonDetailsProps = PropertyGroupProps & {\n jsonViewProps?: ReactJsonViewProps\n payload?: Payload\n}\n\nexport const PayloadJsonDetails: React.FC<PayloadJsonDetailsProps> = ({ jsonViewProps, payload = {}, ...props }) => {\n const { breakpoints, palette } = useTheme()\n const belowSm = useMediaQuery(breakpoints.down('sm'))\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n const jsonTheme = palette.mode === 'dark' ? 'shapeshifter' : undefined\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"JSON\" tip=\"The raw JSON of the payload\" {...props}>\n <Paper square variant=\"elevation\" style={{ overflow: 'hidden', padding: '16px', width: '100%' }}>\n <Suspense fallback={<FlexGrowRow />}>\n <JsonView\n groupArraysAfterLength={20}\n style={{ backgroundColor: undefined, overflow: 'hidden' }}\n src={payload}\n enableClipboard\n theme={jsonTheme}\n collapseStringsAfterLength={belowSm ? 24 : 32}\n {...jsonViewProps}\n />\n </Suspense>\n </Paper>\n </PropertyGroup>\n )\n}\n","import { Typography } from '@mui/material'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport { usePromise } from '@xylabs/react-promise'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\nimport { Property, PropertyGroup } from '@xyo-network/react-property'\nimport { SchemaProperty } from '@xyo-network/react-schema'\n\nimport { PayloadValidationDetailsProps } from './ValidationDetailsProps'\n\nexport const PayloadValidationDetails: React.FC<PayloadValidationDetailsProps> = ({ skipBody = false, value, ...props }) => {\n const [validateErrors] = usePromise(async () => (value ? await new PayloadValidator(value).validate() : undefined), [value])\n\n const bodyErrors = skipBody ? [] : validateErrors ?? []\n const errors: Error[] = [...bodyErrors]\n\n let elevation = 2\n if (props.paper) {\n elevation += props.elevation ?? 0\n }\n\n return (\n <PropertyGroup titleProps={{ elevation }} title=\"Validation\" tip=\"The results from validating the payload\" {...props}>\n <Property\n titleProps={{ elevation }}\n flexGrow={1}\n title=\"Valid\"\n value={errors.length === 0 ? 'True' : 'False'}\n tip={\n errors.length > 0 ? (\n <FlexCol>\n {errors.map((error, index) => {\n return <Typography key={index}>{error.toString()}</Typography>\n })}\n </FlexCol>\n ) : (\n <Typography>No Errors</Typography>\n )\n }\n />\n {value?.schema && <SchemaProperty flexGrow={1} titleProps={{ elevation }} value={value.schema} />}\n </PropertyGroup>\n )\n}\n"],"mappings":"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","names":["ContentCopyIcon","PayloadHasher","jsx","jsxs","PayloadHasher","ContentCopyIcon","FlexCol","useTheme","FlexGrowRow","jsx","Typography","FlexCol","Property","PropertyGroup","jsx","jsxs","jsx","jsxs","FlexCol"]}
|