saleor-dashboard/src/apps/useExtensions.ts
Jakub Majorek dbaed5478a
App adjustments (#1385)
* Use shop domain as backendHost, guard domain changes on cloud instances

* Update messages and snapshots

* Remove unused prop
2021-09-13 16:14:04 +02:00

74 lines
1.8 KiB
TypeScript

import {
AppExtensionTargetEnum,
AppExtensionTypeEnum,
AppExtensionViewEnum
} from "@saleor/types/globalTypes";
import { mapEdgesToItems } from "@saleor/utils/maps";
import { AppData, useExternalApp } from "./components/ExternalAppContext";
import { useExtensionList } from "./queries";
import { ExtensionList_appExtensions_edges_node } from "./types/ExtensionList";
interface Extension {
id: string;
accessToken: string;
label: string;
url: string;
open(): void;
}
type Target = "create" | "moreActions";
const filterAndMapToTarget = (
extensions: ExtensionList_appExtensions_edges_node[],
target: AppExtensionTargetEnum,
openApp: (appData: AppData) => void
): Extension[] =>
extensions
.filter(app => app.target === target)
.map(({ id, accessToken, url, label }) => ({
id,
accessToken,
url,
label,
open: () => openApp({ appToken: accessToken, src: url, label })
}));
export const mapToMenuItems = (extensions: Extension[]) =>
extensions.map(({ label, id, open }) => ({
label,
testId: `extension-${id}`,
onSelect: open
}));
export const useExtensions = (
view: AppExtensionViewEnum,
type: AppExtensionTypeEnum
): Record<Target, Extension[]> => {
const { openApp } = useExternalApp();
const { data } = useExtensionList({
fetchPolicy: "cache-first",
variables: {
filter: {
view,
type
}
}
});
const extensions = mapEdgesToItems(data?.appExtensions) || [];
const targetCreate = filterAndMapToTarget(
extensions,
AppExtensionTargetEnum.CREATE,
openApp
);
const targetMoreActions = filterAndMapToTarget(
extensions,
AppExtensionTargetEnum.MORE_ACTIONS,
openApp
);
return {
create: targetCreate,
moreActions: targetMoreActions
};
};