feat: use gtag instead gtm (#1695)

This commit is contained in:
Joel 2023-12-05 15:05:05 +08:00 committed by GitHub
parent b5dd948e56
commit 2e588ae221
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 64 additions and 34 deletions

View File

@ -212,7 +212,7 @@ const NewAppDialog = ({ show, onSuccess, onClose }: NewAppDialogProps) => {
</> </>
)} )}
</div> </div>
{isAppsFull && <AppsFull />} {isAppsFull && <AppsFull loc='app-create' />}
</Dialog> </Dialog>
</> </>
} }

View File

@ -1,5 +1,7 @@
import React, { FC } from 'react' import type { FC } from 'react'
import React from 'react'
import Script from 'next/script' import Script from 'next/script'
import { IS_CE_EDITION } from '@/config'
export enum GaType { export enum GaType {
admin = 'admin', admin = 'admin',
@ -11,27 +13,34 @@ const gaIdMaps = {
[GaType.webapp]: 'G-2MFWXK7WYT', [GaType.webapp]: 'G-2MFWXK7WYT',
} }
export interface IGAProps { export type IGAProps = {
gaType: GaType gaType: GaType
} }
const GA: FC<IGAProps> = ({ const GA: FC<IGAProps> = ({
gaType gaType,
}) => { }) => {
if (IS_CE_EDITION)
return null
return ( return (
<Script <>
id="gtag-base" <Script strategy="beforeInteractive" async src={`https://www.googletagmanager.com/gtag/js?id=${gaIdMaps[gaType]}`}></Script>
strategy="beforeInteractive" <Script
dangerouslySetInnerHTML={{ id="ga-init"
__html: ` dangerouslySetInnerHTML={{
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': __html: `
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], window.dataLayer = window.dataLayer || [];
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= function gtag(){dataLayer.push(arguments);}
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); gtag('js', new Date());
})(window,document,'script','dataLayer', '${gaIdMaps[gaType]}'); gtag('config', '${gaIdMaps[gaType]}');
`, `,
}} /> }}
>
</Script>
</>
) )
} }
export default React.memo(GA) export default React.memo(GA)

View File

@ -8,7 +8,9 @@ import AppsInfo from '../usage-info/apps-info'
import s from './style.module.css' import s from './style.module.css'
import GridMask from '@/app/components/base/grid-mask' import GridMask from '@/app/components/base/grid-mask'
const AppsFull: FC = () => { const AppsFull: FC<{ loc: string }> = ({
loc,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
return ( return (
@ -20,7 +22,7 @@ const AppsFull: FC = () => {
<div>{t('billing.apps.fullTipLine2')}</div> <div>{t('billing.apps.fullTipLine2')}</div>
</div> </div>
<div className='flex'> <div className='flex'>
<UpgradeBtn /> <UpgradeBtn loc={loc} />
</div> </div>
</div> </div>
<AppsInfo className='mt-4' /> <AppsInfo className='mt-4' />

View File

@ -18,7 +18,7 @@ const AppsFull: FC = () => {
<div>{t('billing.apps.fullTipLine2')}</div> <div>{t('billing.apps.fullTipLine2')}</div>
</div> </div>
<div className='flex mt-8'> <div className='flex mt-8'>
<UpgradeBtn /> <UpgradeBtn loc='app-create' />
</div> </div>
</div> </div>
</GridMask> </GridMask>

View File

@ -26,7 +26,7 @@ const Billing: FC = () => {
return ( return (
<div> <div>
<PlanComp /> <PlanComp loc={'billing-page'} />
{enableBilling && isCurrentWorkspaceManager && billingUrl && ( {enableBilling && isCurrentWorkspaceManager && billingUrl && (
<a className='mt-5 flex px-6 justify-between h-12 items-center bg-gray-50 rounded-xl cursor-pointer' href={billingUrl} target='_blank'> <a className='mt-5 flex px-6 justify-between h-12 items-center bg-gray-50 rounded-xl cursor-pointer' href={billingUrl} target='_blank'>
<div className='flex items-center'> <div className='flex items-center'>

View File

@ -29,7 +29,7 @@ const typeStyle = {
} }
type Props = { type Props = {
loc?: string loc: string
} }
const PlanComp: FC<Props> = ({ const PlanComp: FC<Props> = ({
@ -69,7 +69,7 @@ const PlanComp: FC<Props> = ({
<UpgradeBtn <UpgradeBtn
className='flex-shrink-0' className='flex-shrink-0'
isPlain={type !== Plan.sandbox} isPlain={type !== Plan.sandbox}
gaEventName='click_header_upgrade_btn' loc={loc}
/> />
)} )}
</div> </div>
@ -84,7 +84,7 @@ const PlanComp: FC<Props> = ({
isFull isFull
size='lg' size='lg'
isPlain={type !== Plan.sandbox} isPlain={type !== Plan.sandbox}
gaEventName='click_header_upgrade_btn' loc={loc}
/> />
)} )}
</div> </div>

View File

@ -141,8 +141,18 @@ const PlanItem: FC<Props> = ({
setLoading(true) setLoading(true)
try { try {
const res = await fetchSubscriptionUrls(plan, isYear ? 'year' : 'month') const res = await fetchSubscriptionUrls(plan, isYear ? 'year' : 'month')
if ((window as any).gtag) {
window.location.href = res.url (window as any).gtag('event', 'click_pay_btn', {
plan,
interval: isYear ? 'year' : 'month',
event_callback: () => {
window.location.href = res.url
},
})
}
else {
window.location.href = res.url
}
} }
finally { finally {
setLoading(false) setLoading(false)

View File

@ -15,7 +15,7 @@ type Props = {
isPlain?: boolean isPlain?: boolean
isShort?: boolean isShort?: boolean
onClick?: () => void onClick?: () => void
gaEventName?: string loc?: string
} }
const PlainBtn = ({ className, onClick }: { className?: string; onClick: () => void }) => { const PlainBtn = ({ className, onClick }: { className?: string; onClick: () => void }) => {
@ -40,18 +40,27 @@ const UpgradeBtn: FC<Props> = ({
isShort = false, isShort = false,
size = 'md', size = 'md',
onClick: _onClick, onClick: _onClick,
gaEventName, loc,
}) => { }) => {
const { t } = useTranslation() const { t } = useTranslation()
const { setShowPricingModal } = useModalContext() const { setShowPricingModal } = useModalContext()
const onClick = () => { const handleClick = () => {
if (gaEventName)
(window as any).dataLayer.push({ event: gaEventName })
if (_onClick) if (_onClick)
_onClick() _onClick()
else else
(setShowPricingModal as any)() (setShowPricingModal as any)()
} }
const onClick = () => {
if (loc && (window as any).gtag) {
(window as any).gtag('event', 'click_upgrade_btn', {
loc,
event_callback: handleClick,
})
}
else {
handleClick()
}
}
if (isPlain) if (isPlain)
return <PlainBtn onClick={onClick} className={className} /> return <PlainBtn onClick={onClick} className={className} />

View File

@ -22,7 +22,7 @@ const VectorSpaceFull: FC = () => {
<div>{t('billing.vectorSpace.fullTip')}</div> <div>{t('billing.vectorSpace.fullTip')}</div>
<div>{t('billing.vectorSpace.fullSolution')}</div> <div>{t('billing.vectorSpace.fullSolution')}</div>
</div> </div>
<UpgradeBtn /> <UpgradeBtn loc='knowledge-add-file' />
</div> </div>
<VectorSpaceInfo className='pt-4' /> <VectorSpaceInfo className='pt-4' />
</div> </div>

View File

@ -206,7 +206,7 @@ const EmbeddingProcess: FC<Props> = ({ datasetId, batchId, documents = [], index
<div className='grow mx-3 text-[13px] font-medium text-gray-700'> <div className='grow mx-3 text-[13px] font-medium text-gray-700'>
{t('billing.plansCommon.documentProcessingPriorityUpgrade')} {t('billing.plansCommon.documentProcessingPriorityUpgrade')}
</div> </div>
<UpgradeBtn /> <UpgradeBtn loc='knowledge-speed-up' />
</div> </div>
) )
} }

View File

@ -68,7 +68,7 @@ const CreateAppModal = ({
className='h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg grow' className='h-10 px-3 text-sm font-normal bg-gray-100 rounded-lg grow'
/> />
</div> </div>
{isAppsFull && <AppsFull />} {isAppsFull && <AppsFull loc='app-explore-create'/>}
</div> </div>
<div className='flex flex-row-reverse'> <div className='flex flex-row-reverse'>
<Button disabled={isAppsFull} className='w-24 ml-2' type='primary' onClick={submit}>{t('common.operation.create')}</Button> <Button disabled={isAppsFull} className='w-24 ml-2' type='primary' onClick={submit}>{t('common.operation.create')}</Button>

View File

@ -71,7 +71,7 @@ const MembersPage = () => {
</div> </div>
{isMemberFull && ( {isMemberFull && (
<UpgradeBtn className='mr-2' /> <UpgradeBtn className='mr-2' loc='member-invite' />
)} )}
<div className={ <div className={
`shrink-0 flex items-center py-[7px] px-3 border-[0.5px] border-gray-200 `shrink-0 flex items-center py-[7px] px-3 border-[0.5px] border-gray-200