Skip to content

Commit 125df13

Browse files
committed
feat: add tianji script environment
1 parent d457934 commit 125df13

File tree

11 files changed

+84
-0
lines changed

11 files changed

+84
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { DependencyList, useLayoutEffect, useRef } from 'react';
2+
import { useEvent } from './useEvent';
3+
4+
/**
5+
* Call once on data ready(validator return true)
6+
*/
7+
export function useDataReady(
8+
validator: () => boolean,
9+
cb: () => void,
10+
deps?: DependencyList
11+
) {
12+
const isReadyRef = useRef(false);
13+
14+
const _validator = useEvent(validator);
15+
const _callback = useEvent(cb);
16+
17+
useLayoutEffect(() => {
18+
if (isReadyRef.current) {
19+
return;
20+
}
21+
22+
if (_validator() === true) {
23+
_callback();
24+
isReadyRef.current = true;
25+
}
26+
}, deps);
27+
}

client/shared/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export { useAsync } from './hooks/useAsync';
7474
export { useAsyncFn } from './hooks/useAsyncFn';
7575
export { useAsyncRefresh } from './hooks/useAsyncRefresh';
7676
export { useAsyncRequest } from './hooks/useAsyncRequest';
77+
export { useDataReady } from './hooks/useDataReady';
7778
export { useDebounce } from './hooks/useDebounce';
7879
export { useEditValue } from './hooks/useEditValue';
7980
export { useEvent } from './hooks/useEvent';

client/shared/model/config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ import { defaultGlobalConfig } from '../utils/consts';
66
* 后端的全局设置
77
*/
88
export interface GlobalConfig {
9+
/**
10+
* Tianji 配置
11+
*/
12+
tianji: {
13+
scriptUrl?: string;
14+
websiteId?: string;
15+
};
16+
917
/**
1018
* 上传文件体积
1119
* 默认1m

client/shared/utils/consts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const LANGUAGE_KEY = 'i18n:language';
1919
export const SYSTEM_USERID = '000000000000000000000000';
2020

2121
export const defaultGlobalConfig: GlobalConfig = {
22+
tianji: {},
2223
uploadFileLimit: 1 * 1024 * 1024,
2324
emailVerification: false,
2425
serverName: 'Tailchat',

client/web/src/App.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { HTML5Backend } from 'react-dnd-html5-backend';
3232
import { ErrorBoundary } from './components/ErrorBoundary';
3333
import enUS from 'antd/es/locale/en_US';
3434
import type { Locale } from 'antd/es/locale-provider';
35+
import { useInjectTianjiScript } from './hooks/useInjectTianjiScript';
3536

3637
const AppRouter: any = isElectron() ? HashRouter : BrowserRouter;
3738

@@ -146,6 +147,8 @@ AppHeader.displayName = 'AppHeader';
146147
export const App: React.FC = React.memo(() => {
147148
useRecordMeasure('appRenderStart');
148149

150+
useInjectTianjiScript();
151+
149152
useEffect(() => {
150153
sharedEvent.emit('appLoaded');
151154
}, []);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { useDataReady, useGlobalConfigStore } from 'tailchat-shared';
2+
3+
export function useInjectTianjiScript() {
4+
const { tianji } = useGlobalConfigStore();
5+
6+
useDataReady(
7+
() =>
8+
typeof tianji.scriptUrl === 'string' &&
9+
typeof tianji.websiteId === 'string' &&
10+
tianji.websiteId.length > 0,
11+
() => {
12+
if (!tianji.scriptUrl) {
13+
console.error(
14+
'Cannot inject Tianji script because of scriptUrl not cool:',
15+
tianji.scriptUrl
16+
);
17+
return;
18+
}
19+
20+
const el = document.createElement('script');
21+
el.src = tianji.scriptUrl;
22+
el.setAttribute('data-website-id', String(tianji.websiteId));
23+
el.setAttribute('async', 'async');
24+
el.setAttribute('defer', 'defer');
25+
document.head.append(el);
26+
}
27+
);
28+
}

server/.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,7 @@ ADMIN_PASS=com.msgbyte.tailchat
3333
GETUI_APPID=
3434
GETUI_APPKEY=
3535
GETUI_MASTERSECRET=
36+
37+
# Tianji
38+
TIANJI_SCRIPT_URL=
39+
TIANJI_WEBSITE_ID=

server/packages/sdk/src/services/lib/settings.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ export const config = {
5555
runner: {
5656
requestTimeout,
5757
},
58+
/**
59+
* 使用Tianji对网站进行监控
60+
*/
61+
tianji: {
62+
scriptUrl: process.env.TIANJI_SCRIPT_URL,
63+
websiteId: process.env.TIANJI_WEBSITE_ID,
64+
},
5865
feature: {
5966
disableFileCheck: checkEnvTrusty(process.env.DISABLE_FILE_CHECK),
6067
disableLogger: checkEnvTrusty(process.env.DISABLE_LOGGER), // 是否关闭日志

server/services/core/config.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class ConfigService extends TcService {
7777
const persistConfig = await this.adapter.model.getAllClientPersistConfig();
7878

7979
return {
80+
tianji: config.tianji,
8081
uploadFileLimit: config.storage.limit,
8182
emailVerification: config.emailVerification,
8283
disableUserRegister: config.feature.disableUserRegister,

website/docs/deployment/environment.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ title: Environment Variable
2525
| FILE_LIMIT | 1048576 | File/image upload size limit, the default is 1m, please enter a number(unit: byte) |
2626
| EMAIL_VERIFY | - | Whether to enable email verification, if it is "1" or "true", add email verification control when registering |
2727
| REQUEST_TIMEOUT | 10000 | Number of milliseconds to wait before reject a request with a RequestTimeout error. Disabled: 0 |
28+
| TIANJI_SCRIPT_URL | - | Script Url of Tianji if you wanna monitor Tailchat user usage, you can get it in code modal in Tianji website (example: `https://tianji.example.com/tracker.js`) |
29+
| TIANJI_WEBSITE_ID | - | Tianji website id |
2830
| DISABLE_LOGGER | - | Whether to disable the log output, if "1" or "true" turn off the log on the fly |
2931
| DISABLE_USER_REGISTER | - | Whether to disable the user register, if "1" or "true" turn off this method |
3032
| DISABLE_GUEST_LOGIN | - | Whether to disable the guest login, if "1" or "true" turn off this method |

0 commit comments

Comments
 (0)