From 4a34a4b0c63f9b6ec9fb0338feaf23fea8775194 Mon Sep 17 00:00:00 2001 From: Adrian Pilarczyk Date: Thu, 18 May 2023 13:37:00 +0200 Subject: [PATCH] feat: :sparkles: add AppBreadcrumbs and new provider pages --- .../providers-config.ts | 1 + .../src/modules/taxes/provider-config.ts | 14 -- apps/taxes/src/modules/ui/app-breadcrumbs.tsx | 61 +++++++++ apps/taxes/src/modules/ui/providers.tsx | 42 +++--- apps/taxes/src/pages/configuration.tsx | 5 +- apps/taxes/src/pages/providers/avatax.tsx | 11 ++ apps/taxes/src/pages/providers/index.tsx | 128 ++++++++++++++++++ apps/taxes/src/pages/providers/new.tsx | 5 - apps/taxes/src/pages/providers/taxjar.tsx | 11 ++ 9 files changed, 231 insertions(+), 47 deletions(-) delete mode 100644 apps/taxes/src/modules/taxes/provider-config.ts create mode 100644 apps/taxes/src/modules/ui/app-breadcrumbs.tsx create mode 100644 apps/taxes/src/pages/providers/avatax.tsx create mode 100644 apps/taxes/src/pages/providers/index.tsx delete mode 100644 apps/taxes/src/pages/providers/new.tsx create mode 100644 apps/taxes/src/pages/providers/taxjar.tsx diff --git a/apps/taxes/src/modules/providers-configuration/providers-config.ts b/apps/taxes/src/modules/providers-configuration/providers-config.ts index 1fbdd71..a77cceb 100644 --- a/apps/taxes/src/modules/providers-configuration/providers-config.ts +++ b/apps/taxes/src/modules/providers-configuration/providers-config.ts @@ -7,3 +7,4 @@ export const providersSchema = z.array(providerSchema); export type ProvidersConfig = z.infer; export type ProviderConfig = z.infer; +export type ProviderName = ProviderConfig["provider"]; diff --git a/apps/taxes/src/modules/taxes/provider-config.ts b/apps/taxes/src/modules/taxes/provider-config.ts deleted file mode 100644 index 90aa289..0000000 --- a/apps/taxes/src/modules/taxes/provider-config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AvataxIcon, TaxJarIcon } from "../../assets"; - -export const providerConfig = { - taxjar: { - label: "TaxJar", - icon: TaxJarIcon, - }, - avatax: { - label: "Avatax", - icon: AvataxIcon, - }, -}; - -export type TaxProviderName = keyof typeof providerConfig; diff --git a/apps/taxes/src/modules/ui/app-breadcrumbs.tsx b/apps/taxes/src/modules/ui/app-breadcrumbs.tsx new file mode 100644 index 0000000..452a1f5 --- /dev/null +++ b/apps/taxes/src/modules/ui/app-breadcrumbs.tsx @@ -0,0 +1,61 @@ +import { Breadcrumbs } from "@saleor/apps-ui"; +import { useRouter } from "next/router"; + +type Breadcrumb = { + label: string; + href?: string; +}; + +const newProviderBreadcrumbs = [ + { + href: "/configuration", + label: "Configuration", + }, + { + label: "Add provider", + href: "/providers", + }, +] as Breadcrumb[]; + +const breadcrumbsForRoute = { + "/configuration": [ + { + href: "/configuration", + label: "Configuration", + }, + ], + "/providers": [...newProviderBreadcrumbs], + "/providers/taxjar": [ + ...newProviderBreadcrumbs, + { + label: "TaxJar", + href: "/providers/taxjar", + }, + ], + "/providers/avatax": [ + ...newProviderBreadcrumbs, + { + label: "Avatax", + href: "/providers/avatax", + }, + ], +} as Record; + +const useBreadcrumbs = () => { + const router = useRouter(); + const breadcrumbs = breadcrumbsForRoute[router.pathname]; + + return breadcrumbs; +}; + +export const AppBreadcrumbs = () => { + const breadcrumbs = useBreadcrumbs(); + + return ( + + {breadcrumbs?.map((breadcrumb) => ( + {breadcrumb.label} + ))} + + ); +}; diff --git a/apps/taxes/src/modules/ui/providers.tsx b/apps/taxes/src/modules/ui/providers.tsx index 700ad6c..896ef7a 100644 --- a/apps/taxes/src/modules/ui/providers.tsx +++ b/apps/taxes/src/modules/ui/providers.tsx @@ -1,17 +1,7 @@ import { Box, BoxProps, Button, Text } from "@saleor/macaw-ui/next"; import { useRouter } from "next/router"; import { trpcClient } from "../trpc/trpc-client"; - -const Table = { - Container: (props: BoxProps) => , - THead: (props: BoxProps) => , - TR: (props: BoxProps) => , - TH: (props: BoxProps) => ( - - ), - TBody: (props: BoxProps) => , - TD: (props: BoxProps) => , -}; +import { AppCard } from "./app-card"; const AddProvider = () => { const router = useRouter(); @@ -28,19 +18,31 @@ const AddProvider = () => { No providers configured yet - + ); }; const Skeleton = () => { + // todo: replace with skeleton return ( - Skeleton... + Loading... ); }; +const Table = { + Container: (props: BoxProps) => , + THead: (props: BoxProps) => , + TR: (props: BoxProps) => , + TH: (props: BoxProps) => ( + + ), + TBody: (props: BoxProps) => , + TD: (props: BoxProps) => , +}; + const ProvidersTable = () => { const { data } = trpcClient.providersConfiguration.getAll.useQuery(); @@ -75,25 +77,17 @@ export const Providers = () => { const isNoResult = isFetched && !isProvider; return ( - + {isFetching && } {isNoResult && } {isResult && ( <> - + )} - + ); }; diff --git a/apps/taxes/src/pages/configuration.tsx b/apps/taxes/src/pages/configuration.tsx index 018e544..18d42d0 100644 --- a/apps/taxes/src/pages/configuration.tsx +++ b/apps/taxes/src/pages/configuration.tsx @@ -4,10 +4,7 @@ import { Providers } from "../modules/ui/providers"; const Header = () => { return ( - - - Configuration - + Please configure the app by connecting one of the supported tax providers. diff --git a/apps/taxes/src/pages/providers/avatax.tsx b/apps/taxes/src/pages/providers/avatax.tsx new file mode 100644 index 0000000..d19066e --- /dev/null +++ b/apps/taxes/src/pages/providers/avatax.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +/* + * * placeholder + * // todo: add new avatax config view + */ +const NewAvataxPage = () => { + return
Avatax
; +}; + +export default NewAvataxPage; diff --git a/apps/taxes/src/pages/providers/index.tsx b/apps/taxes/src/pages/providers/index.tsx new file mode 100644 index 0000000..c4b1411 --- /dev/null +++ b/apps/taxes/src/pages/providers/index.tsx @@ -0,0 +1,128 @@ +import { Box, Button, Text } from "@saleor/macaw-ui/next"; +import Image from "next/image"; +import { useRouter } from "next/router"; +import { AvataxIcon, StripeTaxIcon, TaxJarIcon } from "../../assets"; +import { AppCard } from "../../modules/ui/app-card"; +import { AppColumns } from "../../modules/ui/app-columns"; + +const Header = () => { + return ( + + + Select and configure providers to connect Saleor with selected services. + + + ); +}; + +const Intro = () => { + return ( + + + Choose provider + + + ); +}; + +type ProviderProps = { + label: string; + icon: string; + description: React.ReactNode; + isComingSoon?: boolean; +}; + +const providerConfig = { + taxjar: { + label: "TaxJar", + icon: TaxJarIcon, + description: ( +

+ TaxJar is a cloud-based tax automation platform designed to simplify and streamline sales + tax management for online sellers. +

+ ), + }, + avatax: { + label: "Avatax", + icon: AvataxIcon, + description: ( +

+ Avatax is a comprehensive tax automation software service that helps businesses calculate + and manage sales tax accurately and efficiently. +

+ ), + }, + stripeTax: { + label: "Stripe Tax", + icon: StripeTaxIcon, + isComingSoon: true, + description: ( +

+ Stripe Tax lets you calculate, collect, and report tax on global payments with a single + integration. +

+ ), + }, +} satisfies Record; + +const ProviderCard = ({ + label, + icon, + description, + provider, + isComingSoon, +}: ProviderProps & { provider: string }) => { + const router = useRouter(); + + return ( + + + + + {`provider + {label} + + {isComingSoon && ( + + Coming soon + + )} + + + {description} + + + + {!isComingSoon && ( + + )} + + + ); +}; + +const ChooseProvider = () => { + return ( + + {Object.entries(providerConfig).map(([provider, description]) => { + return ; + })} + + ); +}; + +const NewProviderPage = () => { + return ( +
+ } bottomLeft={} bottomRight={} /> +
+ ); +}; + +export default NewProviderPage; diff --git a/apps/taxes/src/pages/providers/new.tsx b/apps/taxes/src/pages/providers/new.tsx deleted file mode 100644 index 1f807d3..0000000 --- a/apps/taxes/src/pages/providers/new.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const NewProviderPage = () => { - return
new
; -}; - -export default NewProviderPage; diff --git a/apps/taxes/src/pages/providers/taxjar.tsx b/apps/taxes/src/pages/providers/taxjar.tsx new file mode 100644 index 0000000..24972f2 --- /dev/null +++ b/apps/taxes/src/pages/providers/taxjar.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +/* + * * placeholder + * // todo: add new taxjar config view + */ +const NewTaxJarPage = () => { + return
TaxJar
; +}; + +export default NewTaxJarPage;