📊 feat: Google tag manager integration (#2469)

* Google tag manager integration

* change location of react-gtm-module package

* refactor: move react-gtm-module usage from Chat/Footer to useAppStartup hook

---------

Co-authored-by: Danny Avila <danny@librechat.ai>
This commit is contained in:
Denis Palnitsky 2024-06-15 14:09:18 +02:00 committed by GitHub
parent 4416f69a9b
commit 97d12d03d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 29 additions and 0 deletions

View file

@ -407,6 +407,9 @@ HELP_AND_FAQ_URL=https://librechat.ai
# SHOW_BIRTHDAY_ICON=true # SHOW_BIRTHDAY_ICON=true
# Google tag manager id
#ANALYTICS_GTM_ID=user provided google tag manager id
#==================================================# #==================================================#
# Others # # Others #
#==================================================# #==================================================#

View file

@ -52,6 +52,7 @@ router.get('/', async function (req, res) {
helpAndFaqURL: process.env.HELP_AND_FAQ_URL || 'https://librechat.ai', helpAndFaqURL: process.env.HELP_AND_FAQ_URL || 'https://librechat.ai',
interface: req.app.locals.interfaceConfig, interface: req.app.locals.interfaceConfig,
modelSpecs: req.app.locals.modelSpecs, modelSpecs: req.app.locals.modelSpecs,
analyticsGtmId: process.env.ANALYTICS_GTM_ID,
}; };
if (typeof process.env.CUSTOM_FOOTER === 'string') { if (typeof process.env.CUSTOM_FOOTER === 'string') {

View file

@ -74,6 +74,7 @@
"react-dnd-html5-backend": "^16.0.1", "react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-flip-toolkit": "^7.1.0", "react-flip-toolkit": "^7.1.0",
"react-gtm-module": "^2.0.11",
"react-hook-form": "^7.43.9", "react-hook-form": "^7.43.9",
"react-lazy-load-image-component": "^1.6.0", "react-lazy-load-image-component": "^1.6.0",
"react-markdown": "^8.0.6", "react-markdown": "^8.0.6",

View file

@ -1,9 +1,11 @@
import React from 'react'; import React from 'react';
import ReactMarkdown from 'react-markdown'; import ReactMarkdown from 'react-markdown';
import TagManager from 'react-gtm-module';
import { Constants } from 'librechat-data-provider'; import { Constants } from 'librechat-data-provider';
import { useGetStartupConfig } from 'librechat-data-provider/react-query'; import { useGetStartupConfig } from 'librechat-data-provider/react-query';
import { useLocalize } from '~/hooks'; import { useLocalize } from '~/hooks';
export default function Footer({ className }: { className?: string }) { export default function Footer({ className }: { className?: string }) {
const { data: config } = useGetStartupConfig(); const { data: config } = useGetStartupConfig();
const localize = useLocalize(); const localize = useLocalize();
@ -33,6 +35,13 @@ export default function Footer({ className }: { className?: string }) {
</a> </a>
); );
if (config?.analyticsGtmId) {
const tagManagerArgs = {
gtmId: config?.analyticsGtmId,
};
TagManager.initialize(tagManagerArgs);
}
const mainContentParts = ( const mainContentParts = (
typeof config?.customFooter === 'string' typeof config?.customFooter === 'string'
? config.customFooter ? config.customFooter

View file

@ -1,4 +1,5 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import TagManager from 'react-gtm-module';
import { useRecoilState, useSetRecoilState } from 'recoil'; import { useRecoilState, useSetRecoilState } from 'recoil';
import { LocalStorageKeys } from 'librechat-data-provider'; import { LocalStorageKeys } from 'librechat-data-provider';
import { useAvailablePluginsQuery } from 'librechat-data-provider/react-query'; import { useAvailablePluginsQuery } from 'librechat-data-provider/react-query';
@ -98,4 +99,11 @@ export default function useAppStartup({
setAvailableTools({ pluginStore, ...mapPlugins(tools) }); setAvailableTools({ pluginStore, ...mapPlugins(tools) });
}, [allPlugins, user, setAvailableTools]); }, [allPlugins, user, setAvailableTools]);
if (startupConfig?.analyticsGtmId) {
const tagManagerArgs = {
gtmId: startupConfig?.analyticsGtmId,
};
TagManager.initialize(tagManagerArgs);
}
} }

6
package-lock.json generated
View file

@ -1159,6 +1159,7 @@
"react-dnd-html5-backend": "^16.0.1", "react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-flip-toolkit": "^7.1.0", "react-flip-toolkit": "^7.1.0",
"react-gtm-module": "^2.0.11",
"react-hook-form": "^7.43.9", "react-hook-form": "^7.43.9",
"react-lazy-load-image-component": "^1.6.0", "react-lazy-load-image-component": "^1.6.0",
"react-markdown": "^8.0.6", "react-markdown": "^8.0.6",
@ -24286,6 +24287,11 @@
"react-dom": ">= 16.x" "react-dom": ">= 16.x"
} }
}, },
"node_modules/react-gtm-module": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz",
"integrity": "sha512-8gyj4TTxeP7eEyc2QKawEuQoAZdjKvMY4pgWfycGmqGByhs17fR+zEBs0JUDq4US/l+vbTl+6zvUIx27iDo/Vw=="
},
"node_modules/react-hook-form": { "node_modules/react-hook-form": {
"version": "7.50.0", "version": "7.50.0",
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.0.tgz", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.50.0.tgz",

View file

@ -296,6 +296,7 @@ export type TStartupConfig = {
helpAndFaqURL: string; helpAndFaqURL: string;
customFooter?: string; customFooter?: string;
modelSpecs?: TSpecsConfig; modelSpecs?: TSpecsConfig;
analyticsGtmId?: string;
}; };
export type TRefreshTokenResponse = { export type TRefreshTokenResponse = {