diff --git a/src/app/(home)/HomeClient.tsx b/src/app/(home)/HomeClient.tsx index b1aa158f..ae11df4c 100644 --- a/src/app/(home)/HomeClient.tsx +++ b/src/app/(home)/HomeClient.tsx @@ -1,25 +1,10 @@ 'use client' import { useApp } from '@/app/context/AppContext' import { Main as DashboardMain } from '@/components/dashboard/Main' -import { SilentError } from '@/components/template/SilentError' -import { useAppBridge, useQuickbooks } from '@/hook/useQuickbooks' -import { Button, Spinner } from 'copilot-design-system' +import { useAppBridge } from '@/hook/useQuickbooks' export default function HomeClient() { - const { - token, - tokenPayload, - reconnect, - portalConnectionStatus, - isEnabled, - syncFlag, - } = useApp() - - const { loading, handleConnect, isReconnecting } = useQuickbooks( - token, - tokenPayload, - reconnect, - ) + const { token, portalConnectionStatus, isEnabled, syncFlag } = useApp() // bridge related logics like disconnect app and download sync log csv useAppBridge({ @@ -29,45 +14,9 @@ export default function HomeClient() { connectionStatus: portalConnectionStatus || false, }) - if (portalConnectionStatus === null) { - return ( - - ) - } - return (
- {portalConnectionStatus ? ( - <> - {isReconnecting && ( -
- Reconnecting to QuickBooks{' '} - -
- )} - - - ) : ( -
- {loading ? ( -
- - Connecting to QuickBooks. Please wait - {' '} - -
- ) : ( -
- )} +
) } diff --git a/src/app/api/quickbooks/auth/auth.service.ts b/src/app/api/quickbooks/auth/auth.service.ts index 408d9611..57deedd5 100644 --- a/src/app/api/quickbooks/auth/auth.service.ts +++ b/src/app/api/quickbooks/auth/auth.service.ts @@ -15,6 +15,7 @@ import { QBPortalConnectionCreateSchemaType, QBPortalConnectionUpdateSchemaType, } from '@/db/schema/qbPortalConnections' +import { QBSetting } from '@/db/schema/qbSettings' import { getPortalConnection, getPortalSettings, @@ -111,6 +112,13 @@ export class AuthService extends BaseService { portalId, syncFlag, }) + } else { + await settingsService.updateQBSettings( + { + syncFlag, + }, + eq(QBSetting.portalId, portalId), + ) } } diff --git a/src/app/api/quickbooks/invoice/invoice.service.ts b/src/app/api/quickbooks/invoice/invoice.service.ts index 6d9a43e6..3b63aae3 100644 --- a/src/app/api/quickbooks/invoice/invoice.service.ts +++ b/src/app/api/quickbooks/invoice/invoice.service.ts @@ -151,12 +151,12 @@ export class InvoiceService extends BaseService { // check if the flag is on for create new item const settingService = new SettingService(this.user) const setting = await settingService.getOneByPortalId([ - 'createInvoiceItemFlag', + 'createNewProductFlag', ]) - if (!setting?.createInvoiceItemFlag) { + if (!setting?.createNewProductFlag) { console.info( - 'WebhookService#getInvoiceItemRef | Create new invoice item flag is false', + 'WebhookService#getInvoiceItemRef | Create new product flag is false', ) return { ref: oneOffItem } } diff --git a/src/app/api/quickbooks/setting/setting.controller.ts b/src/app/api/quickbooks/setting/setting.controller.ts index 363a9542..703b5e25 100644 --- a/src/app/api/quickbooks/setting/setting.controller.ts +++ b/src/app/api/quickbooks/setting/setting.controller.ts @@ -12,17 +12,17 @@ export async function getSettings(req: NextRequest) { const settingService = new SettingService(user) const type = req.nextUrl.searchParams.get('type') const parsedType = z.nativeEnum(SettingType).safeParse(type) - const returnigFields: (keyof typeof QBSetting)[] = [] + const returningFields: (keyof typeof QBSetting)[] = [] if (parsedType.success) { // return attributes as per the type. If type not provided, return all attributes - returnigFields.push('id', 'initialSettingMap') + returningFields.push('id', 'initialSettingMap') if (parsedType.data === SettingType.INVOICE) - returnigFields.push('absorbedFeeFlag', 'useCompanyNameFlag') + returningFields.push('absorbedFeeFlag', 'useCompanyNameFlag') if (parsedType.data === SettingType.PRODUCT) - returnigFields.push('createNewProductFlag', 'createInvoiceItemFlag') + returningFields.push('createNewProductFlag') } - const setting = await settingService.getOneByPortalId(returnigFields) + const setting = await settingService.getOneByPortalId(returningFields) return NextResponse.json({ setting }) } diff --git a/src/components/dashboard/Main.tsx b/src/components/dashboard/Main.tsx index 14690175..a09aa418 100644 --- a/src/components/dashboard/Main.tsx +++ b/src/components/dashboard/Main.tsx @@ -12,6 +12,7 @@ import { Spinner, } from 'copilot-design-system' import LastSyncAt from '@/components/dashboard/LastSyncAt' +import { SilentError } from '@/components/template/SilentError' type CalloutType = { title: string @@ -43,6 +44,13 @@ const DashboardCallout = (lastSyncTime: string | null) => ({ actionIcon: 'Repeat' as IconType, buttonVariant: 'secondary' as const, }, + [CalloutVariant.INFO]: { + title: 'Authorize your account', + description: 'Log into QuickBooks with an admin account to get started.', + actionLabel: 'Connect to QuickBooks', + actionIcon: 'Check' as IconType, + buttonVariant: 'primary' as const, + }, }) export const Main = () => { @@ -53,8 +61,21 @@ export const Main = () => { isReconnecting, lastSyncTimestamp, itemMapped, + portalConnectionStatus, + syncFlag, + handleConnect, + isConnecting, } = useDashboardMain() + if (portalConnectionStatus === null) { + return ( + + ) + } + const dashboardCallout: CalloutType = DashboardCallout(lastSyncTimestamp)[status] @@ -70,31 +91,39 @@ export const Main = () => { variant={status} {...(dashboardCallout.actionLabel && { actionProps: { - label: isReconnecting - ? 'Reauthorizing...' - : dashboardCallout.actionLabel, + label: + isReconnecting || isConnecting + ? 'Connecting...' + : dashboardCallout.actionLabel, onClick: buttonAction, disabled: isReconnecting || + isConnecting || (status === CalloutVariant.WARNING && !itemMapped), prefixIcon: dashboardCallout.actionIcon, ...(dashboardCallout.buttonVariant && { variant: dashboardCallout.buttonVariant, }), + className: !portalConnectionStatus ? 'lg:!px-8' : '', }, })} /> -
- - Settings - - +
+ {!portalConnectionStatus && ( +
+ )} +
+ + Settings + + +
+
- )} diff --git a/src/components/dashboard/settings/SettingAccordion.tsx b/src/components/dashboard/settings/SettingAccordion.tsx index 3559057a..23f4ba83 100644 --- a/src/components/dashboard/settings/SettingAccordion.tsx +++ b/src/components/dashboard/settings/SettingAccordion.tsx @@ -9,7 +9,11 @@ import { } from '@/hook/useSettings' import { Button } from 'copilot-design-system' -export default function SettingAccordion() { +export default function SettingAccordion({ + syncFlag, +}: { + syncFlag: boolean | null +}) { const { openDropdowns, setOpenDropdowns, @@ -89,6 +93,7 @@ export default function SettingAccordion() { className={`absolute top-[14px] right-0 z-10 flex items-center justify-end`} > {index === 0 && + syncFlag && (showProductConfirm || setting.settingShowConfirm) && ( <> {!initialSettingMapFlag && ( @@ -107,7 +112,7 @@ export default function SettingAccordion() { /> )} - {index === 1 && showInvoiceButton && ( + {index === 1 && syncFlag && showInvoiceButton && ( <> {!initialSettingMapFlag && (