UNPKG

poli-charts

Version:

The best graphics for your Hedera Network application NFTs.

164 lines (150 loc) 4.81 kB
import ApexCharts from "apexcharts"; import { validateHexColor } from "../../../utils/validateHexColor.js"; import { validateObject } from "../../../utils/validateObject.js"; import { validateString } from "../../../utils/validateString.js"; import { validateNumber } from "../../../utils/validateNumber.js"; const $ = (select) => document.querySelector(select); // -> selecciona un elemento const $$ = (select) => document.querySelectorAll(select); // -> selecciona varios elementos //------------------------------------------------------------------------------------------------------------------------ export async function OwnersBarChartFunction(options) { const { elementId = "container_testing", backgroundColor = "#000000", barColor = "#5c8ab4", fetchData = { apiKey: "35996d57-04b1-4091-9e6f-68337a0c2c1f", tokenId: "0.0.2179656", amount: 50, }, fontConfig = { size: "12px", color: "#fff", }, } = options; // Validar los parámetros validateObject(options, "options"); validateString(options.elementId, "options.elementId"); validateHexColor(options.backgroundColor, "options.backgroundColor"); validateHexColor(options.barColor, "options.barColor"); validateObject(options.fetchData, "options.fetchData"); validateString(options.fetchData.apiKey, "options.fetchData.apiKey"); validateString(options.fetchData.tokenId, "options.fetchData.tokenId"); validateNumber(options.fetchData.amount, "options.fetchData.amount"); validateObject(options.fontConfig, "options.fontConfig"); validateString(options.fontConfig.size, "options.fontConfig.size"); validateHexColor(options.fontConfig.color, "options.fontConfig.color"); let tokenOwnersData = []; // Función para obtener los datos async function fetchTokenOwners(apiKey, tokenId, amount) { const response = await fetch( `https://api.sentx.io/v1/public/token/owners?apikey=${apiKey}&token=${tokenId}&amount=${amount}` ); const result = await response.json(); tokenOwnersData = result.owners.map((owner) => ({ label: owner.account, value: owner.balance, })); } // Obtener los datos iniciales await fetchTokenOwners(fetchData.apiKey, fetchData.tokenId, fetchData.amount); // Configurar los datos para ApexCharts const chartOptions = { chart: { type: "bar", height: "100%", width: "100%", background: backgroundColor, }, theme: { mode: "dark", }, plotOptions: { bar: { borderRadius: 4, // Ajusta este valor para cambiar el radio del borde redondeado horizontal: false, }, }, series: [ { name: "Balance", data: tokenOwnersData.map((d) => d.value), }, ], xaxis: { categories: tokenOwnersData.map((d) => d.label), // Asignar las etiquetas correctas title: { text: "", }, labels: { show: false, }, tickAmount: 0, axisBorder: { show: false, }, axisTicks: { show: false, }, lines: { show: false, }, }, yaxis: { title: { text: "", }, axisBorder: { show: false, // Oculta la línea del borde del eje Y }, axisTicks: { show: false, // Oculta las muescas en el eje Y }, labels: { style: { colors: fontConfig.color, fontSize: fontConfig.size, }, }, }, colors: [barColor], tooltip: { enabled: true, theme: "dark", }, dataLabels: { enabled: false, // Desactivar las etiquetas de datos }, }; // Renderizar la gráfica const $element = $(`#${elementId}`); if (!$element) { throw new Error(`No se encontró el elemento con ID: ${elementId}`); } const $container = document.createElement("div"); $container.id = `poli-chart_bar-${fetchData.tokenId}`; $container.style.position = "relative"; $container.style.width = "100%"; $container.style.height = "100%"; $element.appendChild($container); // Define la función de actualización del gráfico async function updateChart(chart) { await fetchTokenOwners( fetchData.apiKey, fetchData.tokenId, fetchData.amount ); chart.updateSeries([ { name: "Balance", data: tokenOwnersData.map((d) => d.value), }, ]); } // Configura y renderiza el gráfico usando el proxy async function renderChart() { const chart = new ApexCharts($container, chartOptions); await updateChart(chart); chart.render(); } renderChart(); }