Skip to content

Commit 5437213

Browse files
Setting(project): amplitude initial setting (#326)
* setting: @pinback/analytics workspace 의존성 추가 * setting: AnalyticsProvider types 정의 * setting: turbo.json globalEnv 설정 추가 * feat: noopProvider 구현 * feat: consoleProvider 구현 * setting: amplitudeProvider 구현 * setting: amplitude default set analytics 구현 * feat: initAnalytics, trackEvent 추가 * feat: UserProperties job_role 제외 필드 삭제 * setting: @amplitude/ampli 의존 추가 * setting: ampli interface index 파일 추가 (ampli pull) * feat: login, logout userProperties 설정 로직 추가 * refactor: consoleProvider init apiKey 종속 제거 * chore: apps/landing @pinback/analytics 의존 제거 * feat: refresh 로그인 대비 임시 jobRole 상태 추가 * setting: client, extension initAnalytics 추가 * fix: update pnpm-lock * feat: amplitude user properties API 연동 * refactor: amplitude identify 로직을 전용 API 기반으로 교체 * fix: consoleProvider identify에 userProperties 출력 추가 * fix: session replay 설정 제거 * fix: 로그인 후 amplitude identify 누락 문제 수정
1 parent a6ca148 commit 5437213

22 files changed

Lines changed: 2456 additions & 52 deletions

File tree

apps/client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
},
1212
"dependencies": {
1313
"@pinback/contracts": "workspace:*",
14+
"@pinback/analytics": "workspace:*",
1415
"@tanstack/react-query": "^5.85.3",
1516
"axios": "^1.11.0",
1617
"class-variance-authority": "^0.7.1",

apps/client/src/App.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
1+
import { analytics } from '@pinback/analytics';
12
import { router } from '@routes/router';
3+
import { useGetAmplitudeUserProperties } from '@shared/apis/queries';
4+
import { useEffect } from 'react';
25
import { RouterProvider } from 'react-router-dom';
36
import './App.css';
7+
48
function App() {
5-
return (
6-
<>
7-
<RouterProvider router={router} />
8-
</>
9-
);
9+
const { data: userProperties } = useGetAmplitudeUserProperties();
10+
11+
useEffect(() => {
12+
if (!userProperties) return;
13+
analytics.identify(
14+
String(userProperties.userId),
15+
userProperties.jobRole ? { job_role: userProperties.jobRole } : undefined
16+
);
17+
}, [userProperties]);
18+
19+
return <RouterProvider router={router} />;
1020
}
1121

1222
export default App;

apps/client/src/layout/Layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Outlet, useLocation } from 'react-router-dom';
99
const Layout = () => {
1010
const location = useLocation();
1111
const queryClient = useQueryClient();
12+
const isLoggedIn = authStorage.hasAccessToken();
1213

1314
const isPolicyPage =
1415
location.pathname === ROUTES_CONFIG.privacyPolicy.path ||
@@ -20,7 +21,6 @@ const Layout = () => {
2021
location.pathname.startsWith(ROUTES_CONFIG.onboardingCallback.path);
2122

2223
const isSidebarHidden = isAuthPage || isPolicyPage;
23-
const isLoggedIn = authStorage.hasAccessToken();
2424

2525
const { data: hasJobData, isLoading: isHasJobLoading } = useGetHasJob(
2626
isLoggedIn && !isAuthPage

apps/client/src/main.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1+
import { initAnalytics } from '@pinback/analytics';
12
import { StrictMode } from 'react';
23
import { createRoot } from 'react-dom/client';
34
import App from './App.tsx';
5+
6+
initAnalytics({
7+
apiKey: import.meta.env.VITE_AMPLITUDE_API_KEY,
8+
isDev: import.meta.env.DEV,
9+
});
410
import { QueryClientProvider } from '@tanstack/react-query';
511
import getQueryClient from '@shared/apis/setting/query/getQueryClient.ts';
612
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';

apps/client/src/pages/onBoarding/GoogleCallback.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import apiRequest from '@shared/apis/setting/axiosInstance';
22
import LoadingChippi from '@shared/components/loadingChippi/LoadingChippi';
33
import { authStorage } from '@shared/utils/authStorage';
44
import { extensionBridge } from '@shared/utils/extensionBridge';
5+
import { useQueryClient } from '@tanstack/react-query';
56
import { useEffect } from 'react';
67
import { useNavigate, useSearchParams } from 'react-router-dom';
78

89
const GoogleCallback = () => {
910
const navigate = useNavigate();
1011
const [searchParams] = useSearchParams();
12+
const queryClient = useQueryClient();
1113

1214
useEffect(() => {
1315
const code = searchParams.get('code');
@@ -65,6 +67,7 @@ const GoogleCallback = () => {
6567
res.data.data;
6668

6769
authStorage.setUserIdentity(email, userId);
70+
queryClient.invalidateQueries({ queryKey: ['amplitudeUserProperties'] });
6871

6972
handleUserLogin(isUser, accessToken, refreshToken, hasJob);
7073
} catch (error) {

apps/client/src/shared/apis/axios.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import apiRequest from '@shared/apis/setting/axiosInstance';
22
import {
3+
AmplitudeUserPropertiesResponse,
34
EditArticleRequest,
45
HasJobResponse,
56
JobsResponse,
@@ -117,3 +118,9 @@ export const getCategoryDetail = async (categoryId: number) => {
117118
const { data } = await apiRequest.get(`/api/v3/categories/${categoryId}`);
118119
return data.data;
119120
};
121+
122+
export const getAmplitudeUserProperties =
123+
async (): Promise<AmplitudeUserPropertiesResponse> => {
124+
const { data } = await apiRequest.get('/api/v3/users/properties');
125+
return data.data;
126+
};

apps/client/src/shared/apis/queries.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
deleteCategory,
33
deleteRemindArticle,
44
getAcorns,
5+
getAmplitudeUserProperties,
56
getArticleDetail,
67
getCategoryDetail,
78
getDashboardCategories,
@@ -20,6 +21,7 @@ import {
2021
} from '@shared/apis/axios';
2122
import {
2223
AcornsResponse,
24+
AmplitudeUserPropertiesResponse,
2325
ArticleDetailResponse,
2426
ArticleReadStatusResponse,
2527
CategoryDetailResponse,
@@ -220,6 +222,16 @@ export const useSuspenseGetJobs = () => {
220222
});
221223
};
222224

225+
export const useGetAmplitudeUserProperties =
226+
(): UseQueryResult<AmplitudeUserPropertiesResponse, AxiosError> => {
227+
return useQuery({
228+
queryKey: ['amplitudeUserProperties'],
229+
queryFn: getAmplitudeUserProperties,
230+
staleTime: Infinity,
231+
retry: false,
232+
});
233+
};
234+
223235
export const usePatchUserJob = () => {
224236
const queryClient = useQueryClient();
225237

@@ -229,6 +241,9 @@ export const usePatchUserJob = () => {
229241
queryClient.invalidateQueries({
230242
queryKey: ['hasJob'],
231243
});
244+
queryClient.invalidateQueries({
245+
queryKey: ['amplitudeUserProperties'],
246+
});
232247
},
233248
});
234249
};

apps/client/src/shared/components/profilePopup/ProfilePopup.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { analytics } from '@pinback/analytics';
12
import { Icon } from '@pinback/design-system/icons';
23
import { Button } from '@pinback/design-system/ui';
34
import { useQueryClient } from '@tanstack/react-query';
@@ -44,6 +45,7 @@ export default function ProfilePopup({
4445
if (!open) return null;
4546

4647
const handleLogout = () => {
48+
analytics.reset();
4749
authStorage.clearSession();
4850
queryClient.clear();
4951
extensionBridge.logout();

apps/client/src/shared/types/api.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,8 @@ export interface CategoryDetailResponse {
6060
export interface HasJobResponse {
6161
hasJob: boolean;
6262
}
63+
64+
export interface AmplitudeUserPropertiesResponse {
65+
userId: string;
66+
jobRole: string | null;
67+
}

apps/extension/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"dependencies": {
1717
"@pinback/contracts": "workspace:*",
1818
"@tanstack/react-query": "^5.85.5",
19+
"@pinback/analytics": "workspace:*",
1920
"axios": "^1.11.0",
2021
"react": "^19.1.1",
2122
"react-dom": "^19.1.1"

0 commit comments

Comments
 (0)