2022-03-25 12:41:54 +00:00
|
|
|
import { useUserPermissions } from "@saleor/auth/hooks/useUserPermissions";
|
2021-08-20 13:58:53 +00:00
|
|
|
import {
|
2022-02-02 15:30:34 +00:00
|
|
|
AppExtensionMountEnum,
|
2022-03-09 08:56:55 +00:00
|
|
|
ExtensionListQuery,
|
|
|
|
PermissionEnum,
|
|
|
|
useExtensionListQuery
|
|
|
|
} from "@saleor/graphql";
|
|
|
|
import { RelayToFlat } from "@saleor/types";
|
2021-08-20 13:58:53 +00:00
|
|
|
import { mapEdgesToItems } from "@saleor/utils/maps";
|
|
|
|
|
|
|
|
import { AppData, useExternalApp } from "./components/ExternalAppContext";
|
|
|
|
|
2022-02-02 15:30:34 +00:00
|
|
|
export interface Extension {
|
2021-08-20 13:58:53 +00:00
|
|
|
id: string;
|
2022-03-09 08:56:55 +00:00
|
|
|
app: RelayToFlat<ExtensionListQuery["appExtensions"]>[0]["app"];
|
2021-08-20 13:58:53 +00:00
|
|
|
accessToken: string;
|
2022-02-02 15:30:34 +00:00
|
|
|
permissions: PermissionEnum[];
|
2021-08-20 13:58:53 +00:00
|
|
|
label: string;
|
2022-02-02 15:30:34 +00:00
|
|
|
mount: AppExtensionMountEnum;
|
2021-08-20 13:58:53 +00:00
|
|
|
url: string;
|
|
|
|
open(): void;
|
|
|
|
}
|
2022-02-02 15:30:34 +00:00
|
|
|
export const extensionMountPoints = {
|
|
|
|
PRODUCT_LIST: [
|
|
|
|
AppExtensionMountEnum.PRODUCT_OVERVIEW_CREATE,
|
|
|
|
AppExtensionMountEnum.PRODUCT_OVERVIEW_MORE_ACTIONS
|
|
|
|
],
|
|
|
|
PRODUCT_DETAILS: [AppExtensionMountEnum.PRODUCT_DETAILS_MORE_ACTIONS],
|
|
|
|
NAVIGATION_SIDEBAR: [
|
|
|
|
AppExtensionMountEnum.NAVIGATION_CATALOG,
|
|
|
|
AppExtensionMountEnum.NAVIGATION_CUSTOMERS,
|
|
|
|
AppExtensionMountEnum.NAVIGATION_DISCOUNTS,
|
|
|
|
AppExtensionMountEnum.NAVIGATION_ORDERS,
|
|
|
|
AppExtensionMountEnum.NAVIGATION_PAGES,
|
|
|
|
AppExtensionMountEnum.NAVIGATION_TRANSLATIONS
|
|
|
|
]
|
|
|
|
};
|
2021-08-20 13:58:53 +00:00
|
|
|
|
|
|
|
const filterAndMapToTarget = (
|
2022-03-09 08:56:55 +00:00
|
|
|
extensions: RelayToFlat<ExtensionListQuery["appExtensions"]>,
|
2021-08-20 13:58:53 +00:00
|
|
|
openApp: (appData: AppData) => void
|
|
|
|
): Extension[] =>
|
2022-02-02 15:30:34 +00:00
|
|
|
extensions.map(
|
|
|
|
({ id, accessToken, permissions, url, label, mount, target, app }) => ({
|
2021-08-20 13:58:53 +00:00
|
|
|
id,
|
2022-02-02 15:30:34 +00:00
|
|
|
app,
|
2021-08-20 13:58:53 +00:00
|
|
|
accessToken,
|
2022-02-02 15:30:34 +00:00
|
|
|
permissions: permissions.map(({ code }) => code),
|
2021-08-20 13:58:53 +00:00
|
|
|
url,
|
|
|
|
label,
|
2022-02-02 15:30:34 +00:00
|
|
|
mount,
|
|
|
|
open: () =>
|
|
|
|
openApp({ id: app.id, appToken: accessToken, src: url, label, target })
|
|
|
|
})
|
|
|
|
);
|
2021-08-20 13:58:53 +00:00
|
|
|
|
|
|
|
export const mapToMenuItems = (extensions: Extension[]) =>
|
|
|
|
extensions.map(({ label, id, open }) => ({
|
|
|
|
label,
|
|
|
|
testId: `extension-${id}`,
|
|
|
|
onSelect: open
|
|
|
|
}));
|
|
|
|
|
2022-02-02 15:30:34 +00:00
|
|
|
export const useExtensions = <T extends AppExtensionMountEnum>(
|
|
|
|
mountList: T[]
|
|
|
|
): Record<T, Extension[]> => {
|
2021-08-20 13:58:53 +00:00
|
|
|
const { openApp } = useExternalApp();
|
2022-03-25 12:41:54 +00:00
|
|
|
const permissions = useUserPermissions();
|
|
|
|
const extensionsPermissions = permissions?.find(
|
|
|
|
perm => perm.code === PermissionEnum.MANAGE_APPS
|
|
|
|
);
|
2022-02-02 15:30:34 +00:00
|
|
|
|
2022-03-09 08:56:55 +00:00
|
|
|
const { data } = useExtensionListQuery({
|
2021-08-20 13:58:53 +00:00
|
|
|
fetchPolicy: "cache-first",
|
|
|
|
variables: {
|
|
|
|
filter: {
|
2022-02-02 15:30:34 +00:00
|
|
|
mount: mountList
|
2021-08-20 13:58:53 +00:00
|
|
|
}
|
2022-03-25 12:41:54 +00:00
|
|
|
},
|
|
|
|
skip: !extensionsPermissions
|
2021-08-20 13:58:53 +00:00
|
|
|
});
|
|
|
|
|
2022-02-02 15:30:34 +00:00
|
|
|
const extensions = filterAndMapToTarget(
|
|
|
|
mapEdgesToItems(data?.appExtensions) || [],
|
2021-08-20 13:58:53 +00:00
|
|
|
openApp
|
|
|
|
);
|
2022-02-02 15:30:34 +00:00
|
|
|
|
|
|
|
const extensionsMap = mountList.reduce(
|
|
|
|
(extensionsMap, mount) => ({ ...extensionsMap, [mount]: [] }),
|
|
|
|
{} as Record<T, Extension[]>
|
2021-08-20 13:58:53 +00:00
|
|
|
);
|
|
|
|
|
2022-02-02 15:30:34 +00:00
|
|
|
return extensions.reduce(
|
|
|
|
(prevExtensionsMap, extension) => ({
|
|
|
|
...prevExtensionsMap,
|
|
|
|
[extension.mount]: [
|
|
|
|
...(prevExtensionsMap[extension.mount] || []),
|
|
|
|
extension
|
|
|
|
]
|
|
|
|
}),
|
|
|
|
extensionsMap
|
|
|
|
);
|
2021-08-20 13:58:53 +00:00
|
|
|
};
|