@blocklet/payment-react
Version:
Reusable react components for payment kit v2
238 lines (236 loc) • 7.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _jsxRuntime = require("react/jsx-runtime");
var _Empty = _interopRequireDefault(require("@arcblock/ux/lib/Empty"));
var _context = require("@arcblock/ux/lib/Locale/context");
var _material = require("@mui/material");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function SourceDataViewer({
data,
compact = false,
maxItems = void 0,
locale: propLocale = void 0,
showGroups = false
}) {
const {
locale: contextLocale,
t
} = (0, _context.useLocaleContext)();
const currentLocale = propLocale || contextLocale || "en";
if (!data || Array.isArray(data) && data.length === 0 || typeof data === "object" && Object.keys(data).length === 0) {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_Empty.default, {
children: t("common.none")
});
}
const getLocalizedText = text => {
if (typeof text === "string") {
return text;
}
return text[currentLocale] || text.en || "";
};
const isSimpleSourceData = sourceData => {
return typeof sourceData === "object" && !Array.isArray(sourceData) && sourceData !== null;
};
const isUrlLike = str => {
try {
new URL(str);
return true;
} catch {
return /^https?:\/\/.+/.test(str) || /^www\..+/.test(str);
}
};
const normalizeData = inputData => {
if (isSimpleSourceData(inputData)) {
return Object.entries(inputData).map(([key, value]) => {
const stringValue = String(value);
const isUrl = isUrlLike(stringValue);
return {
key,
label: key.replace(/_/g, " ").replace(/\b\w/g, l => l.toUpperCase()),
value: stringValue,
type: isUrl ? "url" : "text",
url: isUrl ? stringValue : void 0
};
});
}
return inputData;
};
const renderFieldValue = field => {
const displayValue = field.value;
if (field.type === "url") {
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Link, {
href: field.url || field.value,
target: "_blank",
rel: "noopener noreferrer",
sx: {
color: "primary.main",
textDecoration: "none",
fontSize: "0.85rem",
fontWeight: 600,
lineHeight: 1.4,
"&:hover": {
textDecoration: "underline",
color: "primary.dark"
},
"&:visited": {
color: "primary.main"
}
},
children: displayValue
});
}
if (field.type === "image") {
return /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
sx: {
display: "flex",
alignItems: "center",
gap: 1
},
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
component: "img",
src: field.url || field.value,
alt: displayValue,
sx: {
width: 24,
height: 24,
borderRadius: 1,
objectFit: "cover"
}
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "body2",
sx: {
fontWeight: 500
},
children: displayValue
})]
});
}
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "body2",
sx: {
fontWeight: 500,
color: "text.primary"
},
children: displayValue
});
};
if (!data || Array.isArray(data) && data.length === 0 || typeof data === "object" && Object.keys(data).length === 0) {
return null;
}
const normalizedData = normalizeData(data);
const displayItems = maxItems ? normalizedData.slice(0, maxItems) : normalizedData;
if (compact) {
return /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Stack, {
direction: "row",
spacing: 1,
useFlexGap: true,
sx: {
flexWrap: "wrap"
},
children: [displayItems.map(field => /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Chip, {
label: `${getLocalizedText(field.label)}: ${field.value}`,
size: "small",
variant: "outlined",
sx: {
maxWidth: 200
}
}, field.key)), maxItems && normalizedData.length > maxItems && /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Chip, {
label: `+${normalizedData.length - maxItems} more`,
size: "small",
color: "primary",
variant: "outlined"
})]
});
}
if (showGroups) {
const groupedData = displayItems.reduce((acc, field) => {
const group = field.group || "default";
if (!acc[group]) acc[group] = [];
acc[group].push(field);
return acc;
}, {});
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Stack, {
spacing: 2.5,
children: Object.entries(groupedData).map(([group, fields]) => /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
children: [group !== "default" && /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "subtitle2",
sx: {
mb: 1.5,
fontWeight: 700,
color: "text.primary",
letterSpacing: "0.5px",
borderBottom: "1px solid",
borderColor: "divider",
pb: 0.5
},
children: group.replace(/_/g, " ").replace(/\b\w/g, l => l.toUpperCase())
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Stack, {
spacing: 1.2,
sx: {
pl: group !== "default" ? 1 : 0
},
children: fields.map(field => /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
sx: {
display: "flex",
flexDirection: "row",
alignItems: "flex-start",
gap: 3,
minHeight: 20
},
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "body2",
sx: {
color: "text.secondary",
fontSize: "0.8rem",
minWidth: 100,
fontWeight: 600,
lineHeight: 1.4
},
children: getLocalizedText(field.label)
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
sx: {
flex: 1,
minWidth: 0,
wordBreak: "break-all",
whiteSpace: "wrap"
},
children: renderFieldValue(field)
})]
}, field.key))
})]
}, group))
});
}
return /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Stack, {
spacing: 1.5,
children: displayItems.map(field => /* @__PURE__ */(0, _jsxRuntime.jsxs)(_material.Box, {
sx: {
display: "flex",
flexDirection: "row",
alignItems: "flex-start",
gap: 3,
minHeight: 20
},
children: [/* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Typography, {
variant: "body2",
sx: {
color: "text.secondary",
fontSize: "0.8rem",
minWidth: 100,
fontWeight: 600,
lineHeight: 1.4
},
children: getLocalizedText(field.label)
}), /* @__PURE__ */(0, _jsxRuntime.jsx)(_material.Box, {
sx: {
flex: 1,
minWidth: 0
},
children: renderFieldValue(field)
})]
}, field.key))
});
}
module.exports = SourceDataViewer;