saleor-apps-redis_apl/apps/crm/src/pages/_app.tsx
Lukasz Ostrowski 3acc1553a8
Introduce CRM App (#292)
* Add template

Cleanup

Update queries

Basic mailchimp client

Add Oauth flow

remove next auth

* Auth flow, mailchimp button

* Basic layouts

* session saver for appbridge

* ideas drop

* basic iframe flow

* iframe flow - with post message

* saving token in backend

* saving token in backend

* Extracted settings manager

* Refactor audience router

* Remove old macaw ui

* Nav and layout

* display lists and wip add customer

* Metadata updater

* Allow iframe to NOT have app layout

* Add segment coming soon

* App layout

* Add removing config button

* Add iframe

* Fix postmessages

* Display lists

* webhook settings

* Connect webhook

* remove comment

* batch customer adding client

* Update macaw

* Fetching customers component

* Add bulk sync

* add temp ts-ignore until macaw is fixed

* Improve ui

* redesign

* Extract sections

* Redesign mailchimp login

* Refactor sections

* Extract mailchimp list picker

* Add name mapping

* WIP tags, extracted colocated queries to folders

* Wip - not working CustomerUpdated subs

* Add instructions

* Fix webhook config state

* Add external links

* envs

* Protected Oauth handler

* Fix instructions

* Squash some todos

* Instructions update with gql

* empty trygger

* Add env validation

* Fix error message

* Update macaw and remove todos

* Add metadata manager test

* Replace Mailchimp enum to lowercase

* Update oauth routes

* Fix typo

* Add loader to removing config box

* Update labeler to include CRM app

* Apply suggestions from CR

* Fix linter
2023-04-06 09:26:56 +02:00

64 lines
2 KiB
TypeScript

import "@saleor/macaw-ui/next/style";
import "../styles/globals.css";
import { AppBridge, AppBridgeProvider } from "@saleor/app-sdk/app-bridge";
import { RoutePropagator } from "@saleor/app-sdk/app-bridge/next";
import React, { ReactElement } from "react";
import { AppProps } from "next/app";
import { NoSSRWrapper } from "@saleor/apps-shared";
import { trpcClient } from "../modules/trpc/trpc-client";
import { Box, ThemeProvider } from "@saleor/macaw-ui/next";
import { NextPage } from "next";
import { GraphQLProvider } from "../lib/graphql-provider";
import { AppBridgeStorageSetter } from "../lib/app-bridge-persistence";
/**
* Ensure instance is a singleton.
* TODO: This is React 18 issue, consider hiding this workaround inside app-sdk
*/
export let appBridgeInstance: AppBridge | undefined;
if (typeof window !== "undefined" && !appBridgeInstance) {
appBridgeInstance = new AppBridge();
}
/**
* Implementation of layout pattern
* https://nextjs.org/docs/basic-features/layouts#per-page-layouts
*
* In this app, there are pages inside the iframe, which will not use AppBridge etc, so they need
* to provider custom tree of wrappers
*/
export type NextPageWithLayoutOverwrite<P = {}, IP = P> = NextPage<P, IP> & {
overwriteLayout?: (page: ReactElement) => ReactElement;
};
type AppPropsWithLayout = AppProps & {
Component: NextPageWithLayoutOverwrite;
};
function NextApp({ Component, pageProps: { session, ...pageProps } }: AppPropsWithLayout) {
if (Component.overwriteLayout) {
return Component.overwriteLayout(<Component {...pageProps} />);
}
return (
<NoSSRWrapper>
<AppBridgeProvider appBridgeInstance={appBridgeInstance}>
<GraphQLProvider>
<ThemeProvider defaultTheme="defaultLight">
<RoutePropagator />
<AppBridgeStorageSetter />
<Box padding={8}>
<Component {...pageProps} />
</Box>
</ThemeProvider>
</GraphQLProvider>
</AppBridgeProvider>
</NoSSRWrapper>
);
}
export default trpcClient.withTRPC(NextApp);