From f354bd9c4d956d64bc9d86fe748a10660eeabe49 Mon Sep 17 00:00:00 2001 From: Lukasz Ostrowski Date: Mon, 4 May 2026 17:22:50 +0200 Subject: [PATCH 01/18] POC - homepage widgets --- src/components/DevModePanel/DevModePanel.tsx | 8 +- src/components/Sidebar/menu/utils.test.ts | 2 + .../components/AppWidgets/AppWidgets.tsx | 94 +---- .../components/IframePost/IframePost.tsx | 83 ++++ ...app-extension-manifest-available-mounts.ts | 4 + .../app-extension-manifest-options.test.ts | 84 ++++ .../domain/app-extension-manifest-options.ts | 6 + .../domain/app-extension-manifest.test.ts | 53 +++ .../domain/app-extension-manifest.ts | 13 + .../InstalledExtensions.test.tsx | 16 - .../InstalledExtensions.tsx | 8 +- src/fragments/orders.ts | 13 - src/graphql/hooks.generated.ts | 166 +------- src/graphql/types.generated.ts | 32 -- src/home/HomePage.tsx | 59 +++ src/home/HomeWidgetTabs.tsx | 37 ++ src/home/HomeWidgetView.tsx | 55 +++ src/home/filterHomeExtensions.test.ts | 128 ++++++ src/home/filterHomeExtensions.ts | 25 ++ src/home/urls.ts | 2 + src/index.tsx | 18 +- src/orders/views/OrderList/OrderList.tsx | 9 +- .../views/ProductCreate/ProductCreate.tsx | 3 - src/staff/views/StaffList/StaffList.tsx | 3 - src/welcomePage/WelcomePage.tsx | 58 --- .../WelcomePageOnboarding.test.tsx | 297 -------------- .../WelcomePageOnboarding.tsx | 128 ------ .../WelcomePageCheckGraphQLButton.tsx | 25 -- .../WelcomePageCreateProductButton.tsx | 49 --- .../WelcomePageFakeDisabledButton.tsx | 33 -- .../WelcomePageInviteStaffButton.tsx | 44 -- .../WelcomePageOnboardingAccordion.tsx | 97 ----- .../components/WelcomePageOrdersButton.tsx | 45 --- .../components/WelcomePageWebhooksButton.tsx | 16 - .../WelcomePageOnboarding/components/type.ts | 3 - .../hooks/useNewUserCheck.test.ts | 95 ----- .../hooks/useNewUserCheck.ts | 36 -- .../hooks/useOnboardingData.tsx | 231 ----------- .../WelcomePageOnboarding/index.ts | 1 - .../WelcomePageOnboarding/mocks.ts | 14 - .../onboardingContext/OnboardingContext.tsx | 140 ------- .../onboardingContext/index.ts | 2 - .../initialOnboardingState.ts | 56 --- .../onboardingContext/types.ts | 43 -- .../useExpandedOnboardingId.test.ts | 186 --------- .../useExpandedOnboardingId.ts | 53 --- .../useOnboardingStorage.test.ts | 126 ------ .../onboardingContext/useOnboardingStorage.ts | 60 --- .../onboardingContext/utils.test.ts | 377 ------------------ .../onboardingContext/utils.ts | 137 ------- .../WelcmePageSidebar.test.tsx | 127 ------ .../WelcomePageSidebar/WelcomePageSidebar.tsx | 53 --- .../WelcomePageActivities.tsx | 106 ----- .../WelcomePageActivities/activityMessages.ts | 51 --- .../components/WelcomePageActivities/index.ts | 1 - .../useWelcomePageActivities.tsx | 25 -- .../components/WelcomePageAnalyticsCard.tsx | 37 -- .../WelcomePageSalesAnalytics.tsx | 30 -- .../WelcomePageSalesAnalytics/index.ts | 1 - .../useWelcomePageSalesAnalytics.ts | 28 -- .../WelcomePageStocksAnalytics.tsx | 28 -- .../WelcomePageStocksAnalytics/index.ts | 1 - .../useWelcomePageStocksAnalytics.ts | 24 -- .../WelcomePageSidebarContextProvider.tsx | 36 -- .../context/welcomePageSidebarContext.ts | 24 -- src/welcomePage/WelcomePageSidebar/index.ts | 1 - .../WelcomePageSidebar/messages.ts | 12 - .../WelcomePageInfoTile.tsx | 44 -- .../WelcomePageTilesContainer.tsx | 32 -- .../WelcomePageTilesContainer/index.ts | 1 - .../WelcomePageTilesContainer/tileData.tsx | 231 ----------- src/welcomePage/WelcomePageTitle.tsx | 21 - src/welcomePage/fixtures.ts | 22 - src/welcomePage/index.ts | 1 - src/welcomePage/mutations.ts | 11 - src/welcomePage/queries.ts | 33 -- 76 files changed, 566 insertions(+), 3688 deletions(-) create mode 100644 src/extensions/components/IframePost/IframePost.tsx create mode 100644 src/home/HomePage.tsx create mode 100644 src/home/HomeWidgetTabs.tsx create mode 100644 src/home/HomeWidgetView.tsx create mode 100644 src/home/filterHomeExtensions.test.ts create mode 100644 src/home/filterHomeExtensions.ts create mode 100644 src/home/urls.ts delete mode 100644 src/welcomePage/WelcomePage.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/WelcomePageOnboarding.test.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/WelcomePageOnboarding.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageCheckGraphQLButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageCreateProductButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageFakeDisabledButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageInviteStaffButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageOnboardingAccordion.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageOrdersButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/WelcomePageWebhooksButton.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/components/type.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/hooks/useNewUserCheck.test.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/hooks/useNewUserCheck.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/hooks/useOnboardingData.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/index.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/mocks.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/OnboardingContext.tsx delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/index.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/initialOnboardingState.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/types.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/useExpandedOnboardingId.test.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/useExpandedOnboardingId.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/useOnboardingStorage.test.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/useOnboardingStorage.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/utils.test.ts delete mode 100644 src/welcomePage/WelcomePageOnboarding/onboardingContext/utils.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/WelcmePageSidebar.test.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/WelcomePageSidebar.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageActivities/WelcomePageActivities.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageActivities/activityMessages.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageActivities/index.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageActivities/useWelcomePageActivities.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageAnalyticsCard.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageSalesAnalytics/WelcomePageSalesAnalytics.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageSalesAnalytics/index.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageSalesAnalytics/useWelcomePageSalesAnalytics.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageStocksAnalytics/WelcomePageStocksAnalytics.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageStocksAnalytics/index.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/components/WelcomePageStocksAnalytics/useWelcomePageStocksAnalytics.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/context/WelcomePageSidebarContextProvider.tsx delete mode 100644 src/welcomePage/WelcomePageSidebar/context/welcomePageSidebarContext.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/index.ts delete mode 100644 src/welcomePage/WelcomePageSidebar/messages.ts delete mode 100644 src/welcomePage/WelcomePageTilesContainer/WelcomePageInfoTile.tsx delete mode 100644 src/welcomePage/WelcomePageTilesContainer/WelcomePageTilesContainer.tsx delete mode 100644 src/welcomePage/WelcomePageTilesContainer/index.ts delete mode 100644 src/welcomePage/WelcomePageTilesContainer/tileData.tsx delete mode 100644 src/welcomePage/WelcomePageTitle.tsx delete mode 100644 src/welcomePage/fixtures.ts delete mode 100644 src/welcomePage/index.ts delete mode 100644 src/welcomePage/mutations.ts delete mode 100644 src/welcomePage/queries.ts diff --git a/src/components/DevModePanel/DevModePanel.tsx b/src/components/DevModePanel/DevModePanel.tsx index 9b15ffc516f..30640e8dbd6 100644 --- a/src/components/DevModePanel/DevModePanel.tsx +++ b/src/components/DevModePanel/DevModePanel.tsx @@ -1,7 +1,6 @@ // @ts-strict-ignore import { useDashboardTheme } from "@dashboard/components/GraphiQL/styles"; import { DashboardModal } from "@dashboard/components/Modal"; -import { useOnboarding } from "@dashboard/welcomePage/WelcomePageOnboarding/onboardingContext"; import { type FetcherOpts, type FetcherParams } from "@graphiql/toolkit"; import { useIntl } from "react-intl"; @@ -16,16 +15,11 @@ export const DevModePanel = () => { const intl = useIntl(); const subtitle = useContextualLink("dev_panel"); const { rootStyle } = useDashboardTheme(); - const { markOnboardingStepAsCompleted } = useOnboarding(); const { isDevModeVisible, variables, devModeContent, setDevModeVisibility } = useDevModeContext(); const fetcher = async (graphQLParams: FetcherParams, opts: FetcherOpts) => { - if (graphQLParams.operationName !== "IntrospectionQuery") { - markOnboardingStepAsCompleted("graphql-playground"); - } - const baseFetcher = getFetcher(opts); - const result = await baseFetcher(graphQLParams, opts); // Call the base fetcher + const result = await baseFetcher(graphQLParams, opts); return result; }; diff --git a/src/components/Sidebar/menu/utils.test.ts b/src/components/Sidebar/menu/utils.test.ts index 35f9385ab6d..c9c04b049ad 100644 --- a/src/components/Sidebar/menu/utils.test.ts +++ b/src/components/Sidebar/menu/utils.test.ts @@ -275,6 +275,7 @@ describe("getMenuItemExtension", () => { DRAFT_ORDER_DETAILS_WIDGETS: [], GIFT_CARD_DETAILS_WIDGETS: [], TRANSLATIONS_MORE_ACTIONS: [], + HOMEPAGE_WIDGETS: [], }; const emptyExtensionsRecord: Record = { @@ -328,6 +329,7 @@ describe("getMenuItemExtension", () => { DRAFT_ORDER_DETAILS_WIDGETS: [], GIFT_CARD_DETAILS_WIDGETS: [], TRANSLATIONS_MORE_ACTIONS: [], + HOMEPAGE_WIDGETS: [], }; it("should return the corresponding Extension object when a menu item ID represents a registered extension", () => { diff --git a/src/extensions/components/AppWidgets/AppWidgets.tsx b/src/extensions/components/AppWidgets/AppWidgets.tsx index 6d1de0398d8..2da062b0479 100644 --- a/src/extensions/components/AppWidgets/AppWidgets.tsx +++ b/src/extensions/components/AppWidgets/AppWidgets.tsx @@ -1,7 +1,8 @@ import { DashboardCard } from "@dashboard/components/Card"; import Link from "@dashboard/components/Link"; -import { APP_VERSION, getAbsoluteApiUrl } from "@dashboard/config"; +import { APP_VERSION } from "@dashboard/config"; import { AppAvatar } from "@dashboard/extensions/components/AppAvatar/AppAvatar"; +import { IframePost } from "@dashboard/extensions/components/IframePost/IframePost"; import { appExtensionManifestOptionsSchema } from "@dashboard/extensions/domain/app-extension-manifest-options"; import { isUrlAbsolute } from "@dashboard/extensions/isUrlAbsolute"; import { extensionActions } from "@dashboard/extensions/messages"; @@ -10,9 +11,9 @@ import { type AppDetailsUrlMountQueryParams, ExtensionsUrls } from "@dashboard/e import { AppFrame } from "@dashboard/extensions/views/ViewManifestExtension/components/AppFrame/AppFrame"; import useNavigator from "@dashboard/hooks/useNavigator"; import { type ThemeType } from "@saleor/app-sdk/app-bridge"; -import { Box, Skeleton, Text } from "@saleor/macaw-ui-next"; +import { Box, Text } from "@saleor/macaw-ui-next"; import { ExternalLink } from "lucide-react"; -import { useEffect, useRef } from "react"; +import { useRef } from "react"; import { useIntl } from "react-intl"; type AppWidgetsProps = { @@ -20,96 +21,9 @@ type AppWidgetsProps = { params: AppDetailsUrlMountQueryParams; }; -const hiddenStyle = { visibility: "hidden" } as const; - // TODO We will add size negotiations after render const defaultIframeSize = 200; -/** - * Renders a form and iframe, the form is automatically submitted with POST action and