Update app-sdk and pass saleor versions to handshake event for apps (#3789)

* Update app-sdk (early build) and pass saleor versions to handshake event for apps

* Add changeset

* Fix sdk version

* Fix broken external app context

* cr fixes
This commit is contained in:
Lukasz Ostrowski 2023-06-28 15:06:08 +02:00 committed by GitHub
parent eb92e08670
commit 6640294078
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 100 additions and 54 deletions

View file

@ -0,0 +1,5 @@
---
"saleor-dashboard": patch
---
Dashboard is sending Saleor and Dashboard versions with Handshake event to apps, via AppBridge. To achieve that, @saleor/app-sdk was updated to 0.41.0

14
package-lock.json generated
View file

@ -117,7 +117,7 @@
"@graphql-codegen/typescript-react-apollo": "^3.2.5",
"@percy/cli": "^1.21.0",
"@percy/cypress": "^3.1.2",
"@saleor/app-sdk": "0.39.1",
"@saleor/app-sdk": "0.41.0",
"@swc/jest": "^0.2.26",
"@types/apollo-upload-client": "^17.0.2",
"@types/color-convert": "^2.0.0",
@ -7803,9 +7803,9 @@
}
},
"node_modules/@saleor/app-sdk": {
"version": "0.39.1",
"resolved": "https://registry.npmjs.org/@saleor/app-sdk/-/app-sdk-0.39.1.tgz",
"integrity": "sha512-PBREZWwkk+DHCBhOZzsuFdp7/vLItxfAqKD+gcZ5QxzSAt82S0/FS6ii7igpW3H+bEiK4oBUjMxgUyhJMOXQHw==",
"version": "0.41.0",
"resolved": "https://registry.npmjs.org/@saleor/app-sdk/-/app-sdk-0.41.0.tgz",
"integrity": "sha512-9Yc73N8QvqfHlhsPzuWqwlbl+o/gq/VJ+HB2OUro68zTF+rapEssb79OUGLp2JmnTlM4xovCiPwPlDsW8nVSqw==",
"dev": true,
"dependencies": {
"@changesets/cli": "^2.26.0",
@ -40625,9 +40625,9 @@
}
},
"@saleor/app-sdk": {
"version": "0.39.1",
"resolved": "https://registry.npmjs.org/@saleor/app-sdk/-/app-sdk-0.39.1.tgz",
"integrity": "sha512-PBREZWwkk+DHCBhOZzsuFdp7/vLItxfAqKD+gcZ5QxzSAt82S0/FS6ii7igpW3H+bEiK4oBUjMxgUyhJMOXQHw==",
"version": "0.41.0",
"resolved": "https://registry.npmjs.org/@saleor/app-sdk/-/app-sdk-0.41.0.tgz",
"integrity": "sha512-9Yc73N8QvqfHlhsPzuWqwlbl+o/gq/VJ+HB2OUro68zTF+rapEssb79OUGLp2JmnTlM4xovCiPwPlDsW8nVSqw==",
"dev": true,
"requires": {
"@changesets/cli": "^2.26.0",

View file

@ -124,7 +124,7 @@
"@graphql-codegen/typescript-react-apollo": "^3.2.5",
"@percy/cli": "^1.21.0",
"@percy/cypress": "^3.1.2",
"@saleor/app-sdk": "0.39.1",
"@saleor/app-sdk": "0.41.0",
"@swc/jest": "^0.2.26",
"@types/apollo-upload-client": "^17.0.2",
"@types/color-convert": "^2.0.0",

View file

@ -4,6 +4,7 @@ import { useUpdateAppToken } from "@dashboard/apps/components/AppFrame/useUpdate
import { AppDetailsUrlQueryParams } from "@dashboard/apps/urls";
import { useAllFlags } from "@dashboard/featureFlags";
import { CircularProgress } from "@material-ui/core";
import { DashboardEventFactory } from "@saleor/app-sdk/app-bridge";
import clsx from "clsx";
import React, { useCallback } from "react";
@ -19,6 +20,8 @@ interface Props {
className?: string;
params?: AppDetailsUrlQueryParams;
refetch?: () => void;
dashboardVersion: string;
coreVersion?: string;
onError?(): void;
}
@ -32,6 +35,8 @@ export const AppFrame: React.FC<Props> = ({
params,
onError,
refetch,
dashboardVersion,
coreVersion,
}) => {
const frameRef = React.useRef<HTMLIFrameElement | null>(null);
const classes = useStyles();
@ -46,6 +51,10 @@ export const AppFrame: React.FC<Props> = ({
appOrigin,
appId,
appToken,
{
core: coreVersion,
dashboard: dashboardVersion,
},
);
/**
@ -62,13 +71,12 @@ export const AppFrame: React.FC<Props> = ({
* Move handshake to notifyReady, so app is requesting token after it's ready to receive it
* Currently handshake it 2 times, for compatibility
*/
postToExtension({
type: "handshake",
payload: {
token: appToken,
version: 1,
},
});
postToExtension(
DashboardEventFactory.createHandshakeEvent(appToken, 1, {
core: coreVersion,
dashboard: dashboardVersion,
}),
);
setHandshakeDone(true);
}, [appToken, postToExtension, setHandshakeDone]);

View file

@ -6,6 +6,7 @@ import { getAppMountUri } from "@dashboard/config";
import useNavigator from "@dashboard/hooks/useNavigator";
import useNotifier from "@dashboard/hooks/useNotifier";
import {
DashboardEventFactory,
DispatchResponseEvent,
NotificationAction,
NotifyReady,
@ -185,6 +186,10 @@ const useNotifyReadyAction = (
frameEl: HTMLIFrameElement | null,
appOrigin: string,
appToken: string,
versions: {
core: string;
dashboard: string;
},
) => {
const postToExtension = usePostToExtension(frameEl, appOrigin);
@ -192,13 +197,12 @@ const useNotifyReadyAction = (
return {
handle(action: NotifyReady) {
postToExtension({
type: "handshake",
payload: {
token: appToken,
version: 1,
},
});
postToExtension(
DashboardEventFactory.createHandshakeEvent(appToken, 1, {
core: versions.core,
dashboard: versions.dashboard,
}),
);
return createResponseStatus(action.payload.actionId, true);
},
};

View file

@ -3,11 +3,18 @@ import { usePostToExtension } from "@dashboard/apps/components/AppFrame/usePostT
import { Actions, DispatchResponseEvent } from "@saleor/app-sdk/app-bridge";
import React, { useState } from "react";
/**
* TODO Refactor to named attributes
*/
export const useAppActions = (
frameEl: HTMLIFrameElement | null,
appOrigin: string,
appId: string,
appToken: string,
versions: {
core: string;
dashboard: string;
},
) => {
const postToExtension = usePostToExtension(frameEl, appOrigin);
@ -21,6 +28,7 @@ export const useAppActions = (
frameEl,
appOrigin,
appToken,
versions,
);
/**

View file

@ -5,7 +5,9 @@ import {
topBarHeight,
} from "@dashboard/components/AppLayout/consts";
import { DetailPageLayout } from "@dashboard/components/Layouts";
import { APP_VERSION } from "@dashboard/config";
import { AppQuery } from "@dashboard/graphql";
import useShop from "@dashboard/hooks/useShop";
import { Box } from "@saleor/macaw-ui/next";
import React from "react";
@ -24,11 +26,21 @@ export const AppPage: React.FC<AppPageProps> = ({
url,
onError,
refetch,
}) => (
}) => {
const shop = useShop();
/**
* TODO Make some loading state
*/
if (!shop?.version) {
return null;
}
return (
<DetailPageLayout gridTemplateColumns={1} withSavebar={false}>
<AppPageNav
goBackUrl={AppUrls.resolveAppListUrl()}
appId={data.id}
appId={data?.id}
name={data?.name}
supportUrl={data?.supportUrl}
homepageUrl={data?.homepageUrl}
@ -50,12 +62,15 @@ export const AppPage: React.FC<AppPageProps> = ({
onError={onError}
appId={data?.id ?? ""}
refetch={refetch}
coreVersion={shop.version}
dashboardVersion={APP_VERSION}
/>
)}
</Box>
</DetailPageLayout.Content>
</DetailPageLayout>
);
);
};
AppPage.displayName = "AppPage";
export default AppPage;

View file

@ -1,6 +1,8 @@
import { AppUrls } from "@dashboard/apps/urls";
import { APP_VERSION } from "@dashboard/config";
import { AppExtensionTargetEnum } from "@dashboard/graphql";
import useNavigator from "@dashboard/hooks/useNavigator";
import useShop from "@dashboard/hooks/useShop";
import React from "react";
import { AppDialog } from "../AppDialog";
@ -11,6 +13,8 @@ export const ExternalAppProvider: React.FC = ({ children }) => {
const [open, setOpen] = React.useState(false);
const [appData, setAppData] = React.useState<AppData | undefined>();
const shop = useShop();
const handleClose = () => {
setOpen(false);
setAppData(undefined);
@ -26,6 +30,8 @@ export const ExternalAppProvider: React.FC = ({ children }) => {
appToken={appData.appToken}
appId={appData.id}
params={appData.params}
dashboardVersion={APP_VERSION}
coreVersion={shop?.version}
/>
)}
</AppDialog>