2023-08-26 07:39:15 +01:00
|
|
|
import { useTranslation } from "next-i18next";
|
|
|
|
|
|
|
|
import Container from "components/services/widget/container";
|
|
|
|
import Block from "components/services/widget/block";
|
|
|
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
|
|
|
|
|
|
|
function getValue(field, data) {
|
|
|
|
let value = data;
|
|
|
|
let lastField = field;
|
2023-10-17 23:26:55 -07:00
|
|
|
let key = "";
|
2023-08-26 07:39:15 +01:00
|
|
|
|
|
|
|
while (typeof lastField === "object") {
|
|
|
|
key = Object.keys(lastField)[0] ?? null;
|
|
|
|
|
|
|
|
if (key === null) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
value = value[key];
|
|
|
|
lastField = lastField[key];
|
|
|
|
}
|
|
|
|
|
2023-10-17 23:26:55 -07:00
|
|
|
if (typeof value === "undefined") {
|
2023-08-26 07:39:15 +01:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return value[lastField] ?? null;
|
|
|
|
}
|
|
|
|
|
2023-09-14 23:50:54 -07:00
|
|
|
function formatValue(t, mapping, rawValue) {
|
|
|
|
let value = rawValue;
|
|
|
|
|
|
|
|
// Remap the value.
|
|
|
|
const remaps = mapping?.remap ?? [];
|
|
|
|
for (let i = 0; i < remaps.length; i += 1) {
|
|
|
|
const remap = remaps[i];
|
|
|
|
if (remap?.any || remap?.value === value) {
|
|
|
|
value = remap.to;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Scale the value. Accepts either a number to multiply by or a string
|
|
|
|
// like "12/345".
|
|
|
|
const scale = mapping?.scale;
|
2023-10-17 23:26:55 -07:00
|
|
|
if (typeof scale === "number") {
|
2023-09-14 23:50:54 -07:00
|
|
|
value *= scale;
|
2023-10-17 23:26:55 -07:00
|
|
|
} else if (typeof scale === "string") {
|
|
|
|
const parts = scale.split("/");
|
2023-09-14 23:50:54 -07:00
|
|
|
const numerator = parts[0] ? parseFloat(parts[0]) : 1;
|
|
|
|
const denominator = parts[1] ? parseFloat(parts[1]) : 1;
|
2023-10-17 23:26:55 -07:00
|
|
|
value = (value * numerator) / denominator;
|
2023-09-14 23:50:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Format the value using a known type.
|
2023-08-26 07:39:15 +01:00
|
|
|
switch (mapping?.format) {
|
2023-10-17 23:26:55 -07:00
|
|
|
case "number":
|
2023-09-14 23:50:54 -07:00
|
|
|
value = t("common.number", { value: parseInt(value, 10) });
|
|
|
|
break;
|
2023-10-17 23:26:55 -07:00
|
|
|
case "float":
|
2023-09-14 23:50:54 -07:00
|
|
|
value = t("common.number", { value });
|
|
|
|
break;
|
2023-10-17 23:26:55 -07:00
|
|
|
case "percent":
|
2023-09-14 23:50:54 -07:00
|
|
|
value = t("common.percent", { value });
|
|
|
|
break;
|
2023-10-17 23:26:55 -07:00
|
|
|
case "bytes":
|
2023-09-14 23:50:54 -07:00
|
|
|
value = t("common.bytes", { value });
|
|
|
|
break;
|
2023-10-17 23:26:55 -07:00
|
|
|
case "bitrate":
|
2023-09-14 23:50:54 -07:00
|
|
|
value = t("common.bitrate", { value });
|
|
|
|
break;
|
2023-10-24 02:54:04 +03:00
|
|
|
case "date":
|
|
|
|
value = t("common.date", { value, dateStyle: mapping?.dateStyle ?? "long" });
|
|
|
|
break;
|
2023-10-17 23:26:55 -07:00
|
|
|
case "text":
|
2023-08-26 07:39:15 +01:00
|
|
|
default:
|
2023-10-17 23:26:55 -07:00
|
|
|
// nothing
|
2023-08-26 07:39:15 +01:00
|
|
|
}
|
2023-09-14 23:50:54 -07:00
|
|
|
|
|
|
|
// Apply fixed suffix.
|
|
|
|
const suffix = mapping?.suffix;
|
|
|
|
if (suffix) {
|
|
|
|
value = `${value} ${suffix}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
return value;
|
2023-08-26 07:39:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export default function Component({ service }) {
|
|
|
|
const { t } = useTranslation();
|
|
|
|
|
|
|
|
const { widget } = service;
|
|
|
|
|
|
|
|
const { mappings = [], refreshInterval = 10000 } = widget;
|
|
|
|
const { data: customData, error: customError } = useWidgetAPI(widget, null, {
|
|
|
|
refreshInterval: Math.max(1000, refreshInterval),
|
|
|
|
});
|
|
|
|
|
|
|
|
if (customError) {
|
|
|
|
return <Container service={service} error={customError} />;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!customData) {
|
|
|
|
return (
|
|
|
|
<Container service={service}>
|
2023-10-17 23:26:55 -07:00
|
|
|
{mappings.slice(0, 4).map((item) => (
|
|
|
|
<Block label={item.label} key={item.label} />
|
|
|
|
))}
|
2023-08-26 07:39:15 +01:00
|
|
|
</Container>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Container service={service}>
|
2023-10-17 23:26:55 -07:00
|
|
|
{mappings.slice(0, 4).map((mapping) => (
|
|
|
|
<Block
|
|
|
|
label={mapping.label}
|
|
|
|
key={mapping.label}
|
|
|
|
value={formatValue(t, mapping, getValue(mapping.field, customData))}
|
|
|
|
/>
|
|
|
|
))}
|
2023-08-26 07:39:15 +01:00
|
|
|
</Container>
|
|
|
|
);
|
|
|
|
}
|