UNPKG

@scaleway/use-analytics

Version:

A small hook to handle events analytics

57 lines (56 loc) 1.88 kB
"use strict"; 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;