@tapcart/app-studio-utils
Version:
A utility library for Tapcart's App Studio
57 lines • 2.89 kB
JavaScript
"use client";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { jsx as _jsx } from "react/jsx-runtime";
import { createContext, useMemo, useState, useContext, useEffect, } from "react";
const DependencyContextDefault = {
ready: false,
dependencies: {},
};
const AppStudioDependencyContext = createContext(DependencyContextDefault);
export const useAppStudioDependencies = () => {
return useContext(AppStudioDependencyContext);
};
export const AppStudioDependencyProvider = ({ dependencies, children, }) => {
const [ready, setReady] = useState(false);
const [dependenciesCache, setDependenciesCache] = useState({});
useEffect(() => {
const hydrate = () => __awaiter(void 0, void 0, void 0, function* () {
if (!dependencies || !Object.keys(dependencies).length) {
setDependenciesCache({});
setReady(true);
return;
}
const existingDependencies = Object.keys(dependenciesCache);
const missingDependencies = Object.entries(dependencies).reduce((acc, [key, value]) => {
if (!existingDependencies.includes(key)) {
acc[key] = value;
}
return acc;
}, {});
const loadedDependencies = yield Promise.all(Object.entries(missingDependencies).map((_a) => __awaiter(void 0, [_a], void 0, function* ([key, value]) {
const url = `https://esm.sh/${key}@${value}`;
const _module = yield import(/* webpackIgnore: true */ url);
return { key, module: _module.default || _module };
}))).then((results) => results.reduce((acc, { key, module }) => {
acc[key] = module;
return acc;
}, {}));
setDependenciesCache(Object.assign(Object.assign({}, dependenciesCache), loadedDependencies));
setReady(true);
});
hydrate();
}, [dependencies]);
const contextValue = useMemo(() => ({
ready,
dependencies: dependenciesCache,
}), [ready, dependenciesCache]);
return (_jsx(AppStudioDependencyContext.Provider, { value: contextValue, children: children }));
};
//# sourceMappingURL=index.js.map