Skip to content

Commit 25ab6e6

Browse files
Merge branch 'develop'
2 parents 2d409e9 + cb29ccb commit 25ab6e6

10 files changed

Lines changed: 75 additions & 68 deletions

File tree

apps/client/src/App.tsx

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
1-
import { analytics } from '@pinback/analytics';
21
import { router } from '@routes/router';
3-
import { useGetAmplitudeUserProperties } from '@shared/apis/queries';
4-
import { useEffect } from 'react';
2+
import AmplitudeProvider from 'src/providers/AmplitudeProvider';
53
import { RouterProvider } from 'react-router-dom';
64
import './App.css';
75

86
function App() {
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} />;
7+
return (
8+
<AmplitudeProvider>
9+
<RouterProvider router={router} />
10+
</AmplitudeProvider>
11+
);
2012
}
2113

2214
export default App;

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

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,76 +6,71 @@ import { useQueryClient } from '@tanstack/react-query';
66
import { useEffect } from 'react';
77
import { useNavigate, useSearchParams } from 'react-router-dom';
88

9+
const REDIRECT_URI = import.meta.env.VITE_GOOGLE_REDIRECT_URI;
10+
911
const GoogleCallback = () => {
1012
const navigate = useNavigate();
1113
const [searchParams] = useSearchParams();
1214
const queryClient = useQueryClient();
1315

14-
useEffect(() => {
15-
const code = searchParams.get('code');
16+
const saveSession = (params: {
17+
accessToken: string | null;
18+
refreshToken: string | null;
19+
email: string;
20+
userId: string;
21+
hasJob?: boolean;
22+
}) => {
23+
const { accessToken, refreshToken, email, userId, hasJob } = params;
1624

17-
if (!code) {
18-
alert('로그인 실패. 다시 시도해주세요.');
19-
navigate('/onboarding?step=SOCIAL_LOGIN');
20-
return;
25+
authStorage.setUserIdentity(email, userId);
26+
27+
if (accessToken) {
28+
authStorage.setAccessToken(accessToken);
29+
extensionBridge.syncToken(accessToken);
2130
}
2231

23-
loginWithCode(code);
24-
}, []);
32+
if (refreshToken) {
33+
authStorage.setRefreshToken(refreshToken);
34+
}
2535

26-
const handleUserLogin = (
27-
isUser: boolean,
28-
accessToken: string | null,
29-
refreshToken: string | null,
30-
hasJob?: boolean
31-
) => {
32-
if (isUser) {
33-
if (accessToken) {
34-
authStorage.setAccessToken(accessToken);
35-
extensionBridge.syncToken(accessToken);
36-
}
37-
38-
if (refreshToken) {
39-
authStorage.setRefreshToken(refreshToken);
40-
}
41-
42-
if (typeof hasJob === 'boolean') {
43-
authStorage.setHasJob(hasJob);
44-
}
45-
navigate('/');
46-
} else {
47-
navigate('/onboarding?step=JOB');
36+
if (typeof hasJob === 'boolean') {
37+
authStorage.setHasJob(hasJob);
4838
}
4939
};
5040

51-
const redirectUri = import.meta.env.VITE_GOOGLE_REDIRECT_URI;
52-
5341
const loginWithCode = async (code: string) => {
5442
try {
5543
const res = await apiRequest.post(
5644
'/api/v3/auth/google',
57-
{
58-
code,
59-
uri: redirectUri,
60-
},
61-
{
62-
withCredentials: true,
63-
}
45+
{ code, uri: REDIRECT_URI },
46+
{ withCredentials: true }
6447
);
6548

6649
const { isUser, userId, email, accessToken, refreshToken, hasJob } =
6750
res.data.data;
6851

69-
authStorage.setUserIdentity(email, userId);
52+
saveSession({ accessToken, refreshToken, email, userId, hasJob });
7053
queryClient.invalidateQueries({ queryKey: ['amplitudeUserProperties'] });
7154

72-
handleUserLogin(isUser, accessToken, refreshToken, hasJob);
55+
navigate(isUser ? '/' : '/onboarding?step=JOB');
7356
} catch (error) {
7457
console.error('로그인 오류:', error);
7558
navigate('/onboarding?step=SOCIAL_LOGIN');
7659
}
7760
};
7861

62+
useEffect(() => {
63+
const code = searchParams.get('code');
64+
65+
if (!code) {
66+
alert('로그인 실패. 다시 시도해주세요.');
67+
navigate('/onboarding?step=SOCIAL_LOGIN');
68+
return;
69+
}
70+
71+
loginWithCode(code);
72+
}, []);
73+
7974
return (
8075
<div className="flex h-screen flex-col items-center justify-center">
8176
<LoadingChippi className="mb-6" />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { analytics } from '@pinback/analytics';
2+
import { useGetAmplitudeUserProperties } from '@shared/apis/queries';
3+
import { useEffect, type PropsWithChildren } from 'react';
4+
5+
const AmplitudeProvider = ({ children }: PropsWithChildren) => {
6+
const { data: userProperties } = useGetAmplitudeUserProperties();
7+
8+
useEffect(() => {
9+
if (!userProperties) return;
10+
analytics.identify(
11+
String(userProperties.userId),
12+
userProperties.jobRole ? { job_role: userProperties.jobRole } : undefined
13+
);
14+
}, [userProperties]);
15+
16+
return <>{children}</>;
17+
};
18+
19+
export default AmplitudeProvider;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ export const useGetAmplitudeUserProperties =
229229
queryFn: getAmplitudeUserProperties,
230230
staleTime: Infinity,
231231
retry: false,
232+
enabled: authStorage.hasAccessToken(),
232233
});
233234
};
234235

apps/client/src/shared/apis/setting/axiosInstance.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ apiRequest.interceptors.response.use(
7676

7777
if (
7878
error.response &&
79-
(error.response.status === 401 || error.response.status === 403) &&
79+
error.response.status === 401 &&
8080
!originalRequest._retry &&
8181
!isNoAuth &&
8282
!isLoginPage

packages/analytics/index.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { analytics } from './src/analytics';
2-
import { amplitudeProvider } from './src/providers/amplitude';
3-
import { consoleProvider } from './src/providers/console';
2+
import { amplitudeAdapter } from './src/adapters/amplitude';
3+
import { consoleAdapter } from './src/adapters/console';
44

55
export type { AnalyticsProvider, UserProperties } from './src/types';
66
export type * from './src/ampli';
@@ -13,16 +13,16 @@ interface InitAnalyticsOptions {
1313

1414
export const initAnalytics = ({ apiKey, isDev }: InitAnalyticsOptions): void => {
1515
if (isDev || !apiKey) {
16-
analytics.setProvider(consoleProvider);
16+
analytics.setProvider(consoleAdapter);
1717
return;
1818
}
1919

2020
try {
21-
amplitudeProvider.init(apiKey);
22-
analytics.setProvider(amplitudeProvider);
21+
amplitudeAdapter.init(apiKey);
22+
analytics.setProvider(amplitudeAdapter);
2323
} catch (error) {
24-
console.error('[Analytics] Failed to initialize Amplitude, falling back to console provider', error);
25-
analytics.setProvider(consoleProvider);
24+
console.error('[Analytics] Failed to initialize Amplitude, falling back to console adapter', error);
25+
analytics.setProvider(consoleAdapter);
2626
}
2727
};
2828

packages/analytics/src/providers/amplitude.ts renamed to packages/analytics/src/adapters/amplitude.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Identify, identify, setUserId, reset, track, initAll } from '@amplitude
22

33
import type { AnalyticsProvider, UserProperties } from '../types';
44

5-
export const amplitudeProvider: AnalyticsProvider = {
5+
export const amplitudeAdapter: AnalyticsProvider = {
66
init(apiKey: string) {
77
initAll(apiKey, {
88
analytics: {

packages/analytics/src/providers/console.ts renamed to packages/analytics/src/adapters/console.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { AnalyticsProvider } from '../types';
22

3-
export const consoleProvider: AnalyticsProvider = {
3+
export const consoleAdapter: AnalyticsProvider = {
44
init: (_apiKey) => console.log('[Analytics] init'),
55
track: (name, props) => console.log('[Analytics] track', name, props ?? {}),
66
identify: (userId, userProperties) => console.log('[Analytics] identify', { userId, ...userProperties }),
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { AnalyticsProvider } from '../types';
22

3-
export const noopProvider: AnalyticsProvider = {
3+
export const noopAdapter: AnalyticsProvider = {
44
init: () => {},
55
track: () => {},
66
identify: (_userId: string) => {},

packages/analytics/src/analytics.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { noopProvider } from './providers/noop';
1+
import { noopAdapter } from './adapters/noop';
22
import type { AnalyticsProvider, UserProperties } from './types';
33

4-
let provider: AnalyticsProvider = noopProvider;
4+
let provider: AnalyticsProvider = noopAdapter;
55

66
export const analytics = {
77
setProvider(newProvider: AnalyticsProvider): void {

0 commit comments

Comments
 (0)