@scaleway/use-analytics
Version:
A small hook to handle events analytics
57 lines (56 loc) • 1.88 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const react = require("react");
const timeout = (time) => {
const controller = new AbortController();
setTimeout(() => controller.abort(), time * 1e3);
return controller;
};
const transformConfigToDestinations = (config) => {
const { destinations } = config.source;
const dest = destinations.map(
({ destinationDefinition, config: { consentManagement } }) => ({
name: destinationDefinition.name,
displayName: destinationDefinition.displayName,
consents: consentManagement.flatMap(
({ consents }) => consents.map(({ consent }) => consent)
)
})
);
return dest;
};
const useDestinations = (config) => {
const [destinations, setDestinations] = react.useState(void 0);
react.useEffect(() => {
const fetchDestinations = async () => {
if (config.analytics?.cdnURL && config.analytics.writeKey) {
const url = `${config.analytics.cdnURL}/sourceConfig`;
const WRITE_KEY = window.btoa(`${config.analytics.writeKey}:`);
const response = await fetch(url, {
method: "GET",
headers: {
Authorization: `Basic ${WRITE_KEY}`
},
// We'd rather have an half consent than no consent at all
signal: timeout(10).signal
});
if (!response.ok) {
throw new Error("Failed to fetch integrations from source");
}
const json = await response.json();
return transformConfigToDestinations(json);
}
return [];
};
fetchDestinations().then((response) => {
setDestinations(response);
}).catch(() => {
setDestinations([]);
});
}, [setDestinations, config.analytics]);
return {
destinations,
isLoaded: destinations !== void 0
};
};
exports.useDestinations = useDestinations;