diff --git a/apps/client/components/APM.tsx b/apps/client/components/APM.tsx
index 333bcd16..94e858c3 100644
--- a/apps/client/components/APM.tsx
+++ b/apps/client/components/APM.tsx
@@ -1,28 +1,9 @@
import { useAuth0 } from '@auth0/auth0-react'
-import { useIntercom } from '@maybe-finance/client/shared'
-import { useRouter } from 'next/router'
import { useEffect } from 'react'
import * as Sentry from '@sentry/react'
export default function APM() {
const { user } = useAuth0()
- const router = useRouter()
- const intercom = useIntercom()
-
- // Boot intercom
- useEffect(() => {
- const isBooted = intercom.boot()
-
- const handleRouteChange = () => {
- if (isBooted) {
- intercom.update()
- }
- }
-
- router.events.on('routeChangeComplete', handleRouteChange)
-
- return () => router.events.off('routeChangeComplete', handleRouteChange)
- }, [intercom, router.events])
// Identify Sentry user
useEffect(() => {
diff --git a/apps/client/components/Meta.tsx b/apps/client/components/Meta.tsx
index 6328946a..f6512440 100644
--- a/apps/client/components/Meta.tsx
+++ b/apps/client/components/Meta.tsx
@@ -48,15 +48,6 @@ export default function Meta() {
href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css"
rel="stylesheet"
/>
-
- {/* Intercom */}
-
- {/* End Intercom */}
)
}
diff --git a/apps/client/env.ts b/apps/client/env.ts
index e6b1f9b2..0e00bd5f 100644
--- a/apps/client/env.ts
+++ b/apps/client/env.ts
@@ -10,7 +10,6 @@ const env = {
process.env.NEXT_PUBLIC_LD_CLIENT_SIDE_ID || 'REPLACE_THIS',
NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN,
NEXT_PUBLIC_SENTRY_ENV: process.env.NEXT_PUBLIC_SENTRY_ENV,
- NEXT_PUBLIC_INTERCOM_APP_ID: process.env.NEXT_PUBLIC_INTERCOM_APP_ID || 'REPLACE_THIS',
}
export default env
diff --git a/apps/client/pages/oauth.tsx b/apps/client/pages/oauth.tsx
index aec78da9..8baba4a4 100644
--- a/apps/client/pages/oauth.tsx
+++ b/apps/client/pages/oauth.tsx
@@ -1,4 +1,4 @@
-import { BrowserUtil, usePlaid } from '@maybe-finance/client/shared'
+import { usePlaid } from '@maybe-finance/client/shared'
import { Disclosure, Transition } from '@headlessui/react'
import { RiArrowUpSFill } from 'react-icons/ri'
import { Button, LoadingSpinner } from '@maybe-finance/design-system'
@@ -56,14 +56,9 @@ export default function OAuth() {
Still not working?{' '}
-
- BrowserUtil.showIntercom()
- }
- className="underline text-cyan"
- >
+
Let us know!
-
+
diff --git a/apps/server/src/app/routes/users.router.ts b/apps/server/src/app/routes/users.router.ts
index ca5f24b5..52ec5f7d 100644
--- a/apps/server/src/app/routes/users.router.ts
+++ b/apps/server/src/app/routes/users.router.ts
@@ -145,19 +145,6 @@ router.get(
})
)
-router.get(
- '/intercom',
- endpoint.create({
- resolve: async ({ ctx }) => {
- if (!ctx.user || !ctx.user.id) {
- throw new Error('User not found')
- }
-
- return ctx.userService.getIntercomMetadata(ctx.user.id, env.NX_INTERCOM_SECRET)
- },
- })
-)
-
router.put(
'/',
endpoint.create({
diff --git a/apps/server/src/env.ts b/apps/server/src/env.ts
index 9589b4ca..0310d64b 100644
--- a/apps/server/src/env.ts
+++ b/apps/server/src/env.ts
@@ -65,8 +65,6 @@ const envSchema = z.object({
.string()
.default(process.env.NODE_ENV === 'development' ? 'dev' : 'combined'),
- NX_INTERCOM_SECRET: z.string().optional(),
-
NX_STRIPE_SECRET_KEY: z.string().default('REPLACE_THIS'),
NX_STRIPE_WEBHOOK_SECRET: z.string().default('whsec_REPLACE_THIS'),
NX_STRIPE_PREMIUM_MONTHLY_PRICE_ID: z.string().default('price_REPLACE_THIS'),
diff --git a/aws/maybe-app/lib/stacks/server-stack.ts b/aws/maybe-app/lib/stacks/server-stack.ts
index 61668d67..1a45d955 100644
--- a/aws/maybe-app/lib/stacks/server-stack.ts
+++ b/aws/maybe-app/lib/stacks/server-stack.ts
@@ -179,15 +179,6 @@ export class ServerStack extends Stack {
}
)
),
- NX_INTERCOM_SECRET: ECSSecret.fromSsmParameter(
- StringParameter.fromSecureStringParameterAttributes(
- this,
- 'IntercomSecretParam',
- {
- parameterName: '/providers/NX_INTERCOM_SECRET',
- }
- )
- ),
NX_STRIPE_SECRET_KEY: ECSSecret.fromSsmParameter(
StringParameter.fromSecureStringParameterAttributes(
this,
diff --git a/libs/client/features/src/onboarding/sidebar/SidebarOnboarding.tsx b/libs/client/features/src/onboarding/sidebar/SidebarOnboarding.tsx
index 21bfba2a..07ddc24a 100644
--- a/libs/client/features/src/onboarding/sidebar/SidebarOnboarding.tsx
+++ b/libs/client/features/src/onboarding/sidebar/SidebarOnboarding.tsx
@@ -13,7 +13,6 @@ import {
RiMore2Fill,
} from 'react-icons/ri'
import { HiOutlineSparkles } from 'react-icons/hi'
-import { BrowserUtil } from '@maybe-finance/client/shared'
import Link from 'next/link'
import { AnimatePresence, motion } from 'framer-motion'
@@ -399,13 +398,11 @@ export function SidebarOnboarding({ onClose, onHide }: Props) {
- If you have any issues with connecting accounts, please let us know{' '}
- BrowserUtil.showIntercom()}
- className="text-cyan cursor-pointer hover:underline"
- >
- via live chat
-
+ If you have any issues with connecting accounts,{' '}
+
+ please let us know
+
+ .
>
)
diff --git a/libs/client/features/src/user-details/LinkAccountFlow.tsx b/libs/client/features/src/user-details/LinkAccountFlow.tsx
index d6ac7af5..4f3856b7 100644
--- a/libs/client/features/src/user-details/LinkAccountFlow.tsx
+++ b/libs/client/features/src/user-details/LinkAccountFlow.tsx
@@ -1,5 +1,5 @@
import { useAuth0 } from '@auth0/auth0-react'
-import { BoxIcon, BrowserUtil, linkAuth0AccountCtx, useUserApi } from '@maybe-finance/client/shared'
+import { BoxIcon, linkAuth0AccountCtx, useUserApi } from '@maybe-finance/client/shared'
import { Button, DialogV2 } from '@maybe-finance/design-system'
import { useQueryClient } from '@tanstack/react-query'
import { useState } from 'react'
@@ -253,12 +253,9 @@ function LinkError({ onClose, error }: { onClose(): void; error: string }) {
{error}
-
+
Please contact us.
-
+
diff --git a/libs/client/shared/src/api/useAccountApi.ts b/libs/client/shared/src/api/useAccountApi.ts
index 8f41c3a6..e018af7b 100644
--- a/libs/client/shared/src/api/useAccountApi.ts
+++ b/libs/client/shared/src/api/useAccountApi.ts
@@ -8,10 +8,9 @@ import type {
} from '@tanstack/react-query'
import { useMemo } from 'react'
-import sumBy from 'lodash/sumBy'
import toast from 'react-hot-toast'
import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
-import { useAxiosWithAuth, useIntercom } from '..'
+import { useAxiosWithAuth } from '..'
import { invalidateAccountQueries } from '../utils'
const AccountApi = (axios: AxiosInstance) => ({
@@ -135,7 +134,6 @@ export function useAccountApi() {
const queryClient = useQueryClient()
const { axios } = useAxiosWithAuth()
const api = useMemo(() => AccountApi(axios), [axios])
- const { update: updateIntercom } = useIntercom()
const useAccounts = (
options?: Omit<
@@ -152,13 +150,6 @@ export function useAccountApi() {
staleTime: staleTimes.accounts,
onSuccess: (...args) => {
if (options?.onSuccess) options.onSuccess(...args)
-
- const [{ accounts, connections }] = args
- updateIntercom({
- 'Manual Accounts': accounts.length,
- 'Connected Accounts': sumBy(connections, (c) => c.accounts.length),
- Connections: connections.length,
- })
},
...options,
})
diff --git a/libs/client/shared/src/api/useUserApi.ts b/libs/client/shared/src/api/useUserApi.ts
index bc43c0ee..0c357f9a 100644
--- a/libs/client/shared/src/api/useUserApi.ts
+++ b/libs/client/shared/src/api/useUserApi.ts
@@ -38,11 +38,6 @@ const UserApi = (
return data
},
- async getIntercomMetadata() {
- const { data } = await axios.get('/users/intercom')
- return data
- },
-
async update(userData: SharedType.UpdateUser) {
const { data } = await axios.put('/users', userData)
return data
@@ -254,22 +249,6 @@ export function useUserApi() {
staleTime: staleTimes.insights,
})
- const useIntercomMetadata = (
- options?: Omit<
- UseQueryOptions<
- SharedType.UserIntercomMetadata,
- unknown,
- SharedType.UserIntercomMetadata,
- any[]
- >,
- 'queryKey' | 'queryFn'
- >
- ) =>
- useQuery(['users', 'intercom-metadata'], api.getIntercomMetadata, {
- refetchOnWindowFocus: false,
- ...options,
- })
-
const useProfile = (
options?: Omit<
UseQueryOptions,
@@ -471,7 +450,6 @@ export function useUserApi() {
useNetWorthSeries,
useInsights,
useCurrentNetWorth,
- useIntercomMetadata,
useProfile,
useUpdateProfile,
useAuth0Profile,
diff --git a/libs/client/shared/src/hooks/index.ts b/libs/client/shared/src/hooks/index.ts
index c11f27e3..6481beb2 100644
--- a/libs/client/shared/src/hooks/index.ts
+++ b/libs/client/shared/src/hooks/index.ts
@@ -1,7 +1,6 @@
export * from './useAxiosWithAuth'
export * from './useDebounce'
export * from './useFinicity'
-export * from './useIntercom'
export * from './useInterval'
export * from './useLastUpdated'
export * from './useLocalStorage'
diff --git a/libs/client/shared/src/hooks/useFinicity.ts b/libs/client/shared/src/hooks/useFinicity.ts
index 4f0aed0c..4f078843 100644
--- a/libs/client/shared/src/hooks/useFinicity.ts
+++ b/libs/client/shared/src/hooks/useFinicity.ts
@@ -5,12 +5,10 @@ import type {
ConnectCancelEvent,
ConnectDoneEvent,
ConnectErrorEvent,
- ConnectRouteEvent,
} from '@finicity/connect-web-sdk'
import { useFinicityApi } from '../api'
import { useAccountContext, useUserAccountContext } from '../providers'
import { useLogger } from './useLogger'
-import { BrowserUtil } from '..'
export function useFinicity() {
const logger = useLogger()
@@ -35,9 +33,6 @@ export function useFinicity() {
FinicityConnect.launch(link, {
onDone(evt: ConnectDoneEvent) {
logger.debug(`Finicity Connect onDone event`, evt)
- BrowserUtil.trackIntercomEvent('FINICITY_CONNECT_DONE', {
- ...evt,
- })
setExpectingAccounts(true)
},
onError(evt: ConnectErrorEvent) {
@@ -50,25 +45,15 @@ export function useFinicity() {
'finicity.error.reason': evt.reason,
},
})
- BrowserUtil.trackIntercomEvent('FINICITY_CONNECT_ERROR', {
- ...evt,
- })
},
onCancel(evt: ConnectCancelEvent) {
logger.debug(`Finicity Connect onCancel event`, evt)
- BrowserUtil.trackIntercomEvent('FINICITY_CONNECT_CANCEL', {
- ...evt,
- })
},
- onUser(evt: any) {
- BrowserUtil.trackIntercomEvent('FINICITY_CONNECT_USER_ACTION', {
- ...evt,
- })
+ onUser() {
+ // ...
},
- onRoute(evt: ConnectRouteEvent) {
- BrowserUtil.trackIntercomEvent('FINICITY_CONNECT_ROUTE_EVENT', {
- ...evt,
- })
+ onRoute() {
+ // ...
},
})
},
diff --git a/libs/client/shared/src/hooks/useIntercom.ts b/libs/client/shared/src/hooks/useIntercom.ts
deleted file mode 100644
index 60742503..00000000
--- a/libs/client/shared/src/hooks/useIntercom.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import { useCallback } from 'react'
-import { useAuth0 } from '@auth0/auth0-react'
-import type { SharedType } from '@maybe-finance/shared'
-import { useUserApi } from '../api'
-import { BrowserUtil } from '..'
-
-export function useIntercom() {
- const { user, isAuthenticated } = useAuth0()
-
- const { useIntercomMetadata } = useUserApi()
- const { data: intercomMetadata } = useIntercomMetadata({ enabled: isAuthenticated })
-
- const boot = useCallback(
- (data?: BrowserUtil.IntercomData) => {
- if (!user?.sub || !intercomMetadata?.hash) return false
-
- BrowserUtil.bootIntercom({
- user_id: user.sub,
- user_hash: intercomMetadata.hash,
- email: user.email,
- name: user.name,
- last_request_at: Math.floor(new Date().getTime() / 1000),
- ...data,
- })
-
- return true
- },
- [user, intercomMetadata]
- )
-
- const update = useCallback(
- (data?: BrowserUtil.IntercomData, updateLastRequestAt = true) => {
- if (!user?.sub || !intercomMetadata?.hash) return
-
- BrowserUtil.updateIntercom({
- user_id: user.sub,
- user_hash: intercomMetadata.hash,
- email: user.email,
- name: user.name,
- last_request_at: updateLastRequestAt
- ? Math.floor(new Date().getTime() / 1000)
- : undefined,
- ...data,
- })
- },
- [user, intercomMetadata]
- )
-
- return { boot, update }
-}
diff --git a/libs/client/shared/src/hooks/usePlaid.ts b/libs/client/shared/src/hooks/usePlaid.ts
index c063b444..9808cbea 100644
--- a/libs/client/shared/src/hooks/usePlaid.ts
+++ b/libs/client/shared/src/hooks/usePlaid.ts
@@ -2,7 +2,6 @@ import * as Sentry from '@sentry/react'
import { DateTime } from 'luxon'
import { useEffect, useState } from 'react'
import { usePlaidLink } from 'react-plaid-link'
-import { BrowserUtil } from '..'
import { usePlaidApi } from '../api'
import { useAccountContext } from '../providers'
import { useLogger } from './useLogger'
@@ -68,22 +67,8 @@ export function usePlaid(mode: 'default' | 'oauth' = 'default') {
}
},
// https://plaid.com/docs/link/web/#onexit
- onExit: (error, metadata) => {
- if (error) {
- const { error_code, error_type, error_message, display_message } = error
- BrowserUtil.trackIntercomEvent(`PLAID_LINK_EXIT_ERROR`, {
- error_type,
- error_code,
- error_message,
- display_message,
- reference: 'https://plaid.com/docs/errors/',
- })
- }
-
- BrowserUtil.trackIntercomEvent('PLAID_EXIT_EVENT', {
- ...error,
- ...metadata,
- })
+ onExit: () => {
+ // ...
},
// https://plaid.com/docs/link/web/#onevent
onEvent: (event, metadata) => {
@@ -97,9 +82,6 @@ export function usePlaid(mode: 'default' | 'oauth' = 'default') {
},
})
- // Capture all events to Intercom
- BrowserUtil.trackIntercomEvent(event, metadata)
-
logger.debug(
`Plaid link event: ${event} for session ID ${metadata.link_session_id}`,
metadata
diff --git a/libs/client/shared/src/utils/index.ts b/libs/client/shared/src/utils/index.ts
index 9aabdd80..8d7a415c 100644
--- a/libs/client/shared/src/utils/index.ts
+++ b/libs/client/shared/src/utils/index.ts
@@ -1,5 +1,4 @@
export * from './image-loaders'
-export * from './intercom'
export * from './browser-utils'
export * from './account-utils'
export * from './agreement-utils'
diff --git a/libs/client/shared/src/utils/intercom.ts b/libs/client/shared/src/utils/intercom.ts
deleted file mode 100644
index 73817c57..00000000
--- a/libs/client/shared/src/utils/intercom.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-export type IntercomData = {
- user_id?: string
- user_hash?: string
- email?: string
- name?: string
-
- last_request_at?: number
-
- 'Manual Accounts'?: number
- 'Connected Accounts'?: number
- Connections?: number
-}
-
-export function bootIntercom(data?: IntercomData) {
- const w = window as any
- w.Intercom('boot', {
- app_id: w.INTERCOM_APP_ID,
- ...data,
- })
-}
-
-export function updateIntercom(data?: IntercomData) {
- ;(window as any).Intercom('update', {
- ...data,
- })
-}
-
-export function trackIntercomEvent(name: string, data: Record) {
- ;(window as any).Intercom('trackEvent', name, {
- ...data,
- })
-}
-
-export function showIntercom() {
- ;(window as any).Intercom('show')
-}
diff --git a/libs/server/features/src/user/user.service.ts b/libs/server/features/src/user/user.service.ts
index d7f9457e..812d6d15 100644
--- a/libs/server/features/src/user/user.service.ts
+++ b/libs/server/features/src/user/user.service.ts
@@ -20,7 +20,6 @@ import type { IAccountQueryService } from '../account'
import type { SharedType } from '@maybe-finance/shared'
import { CopyObjectCommand, MetadataDirective } from '@aws-sdk/client-s3'
import { DateTime } from 'luxon'
-import crypto from 'crypto'
import { DbUtil } from '@maybe-finance/server/shared'
import { DateUtil } from '@maybe-finance/shared'
import { flatten } from 'lodash'
@@ -279,22 +278,6 @@ export class UserService implements IUserService {
}
}
- async getIntercomMetadata(
- userId: User['id'],
- secret?: string
- ): Promise {
- const { auth0Id } = await this.prisma.user.findUniqueOrThrow({
- select: { auth0Id: true },
- where: { id: userId },
- })
-
- return {
- hash: secret
- ? crypto.createHmac('sha256', secret).update(auth0Id).digest('hex')
- : undefined,
- }
- }
-
async getSignedAgreements(userId: User['id']) {
return this.prisma.agreement.findMany({
distinct: 'type',
diff --git a/libs/shared/src/types/user-types.ts b/libs/shared/src/types/user-types.ts
index 2d5e4aad..b26c63d8 100644
--- a/libs/shared/src/types/user-types.ts
+++ b/libs/shared/src/types/user-types.ts
@@ -227,10 +227,6 @@ export type UserSubscription = {
currentPeriodEnd: DateTime | null
}
-export type UserIntercomMetadata = {
- hash?: string
-}
-
export type UserMemberCardDetails = {
memberNumber: number
name: string