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 && (
+
+ )}
+
+
-
>
)}
>
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 && (