Skip to content

Commit

Permalink
feat: Google Analytics 연동 (#227)
Browse files Browse the repository at this point in the history
* chore: react-ga4 설치

* feat: GA 태그 코드 삽입

* build: action 수정
  • Loading branch information
2yunseong authored Sep 4, 2024
1 parent 2d048e9 commit f396102
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 35 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ jobs:
- name: env 파일 생성
run: |
touch .env
echo VITE_REACT_APP_GA_KEY=${{ secrets.VITE_REACT_APP_GA_KEY }} >> .env
echo VITE_PUBLIC_API_URL=${{ secrets.VITE_PUBLIC_API_URL }} >> .env
cat .env
Expand All @@ -51,6 +52,6 @@ jobs:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
SOURCE_DIR: "dist/service-manager"
SOURCE_DIR: 'dist/service-manager'
run: |
aws s3 sync dist/service-manager s3://${{ secrets.AWS_MANAGER_WS_BUCKET_NAME }}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
"react-markdown": "^9.0.1",
"react-modal": "^3.16.1",
"react-router-dom": "6.11.2",
"xlsx": "^0.18.5"
"xlsx": "^0.18.5",
"react-ga4": "^2.1.0"
}
}
18 changes: 18 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions service-manager/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ import { StrictMode } from 'react';
import * as ReactDOM from 'react-dom/client';
import App from './app/app';
import './main.css';
import ReactGA from 'react-ga4';

if (import.meta.env.VITE_REACT_APP_GA_KEY) {
ReactGA.initialize(import.meta.env.VITE_REACT_APP_GA_KEY);
}

const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement,
Expand Down
30 changes: 30 additions & 0 deletions service-manager/src/router/RouterChangeTracker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useState, useEffect, useCallback } from 'react';
import { useLocation } from 'react-router-dom';
import ReactGA from 'react-ga4';

const RouteChangeTracker = () => {
const location = useLocation();
const [initialized, setInitialized] = useState(false);

const GAInitializer = useCallback(() => {
if (initialized) {
ReactGA.set({ page: location.pathname });
ReactGA.send('pageview');
}
}, [location, initialized]);

useEffect(() => {
if (import.meta.env.VITE_REACT_APP_GA_KEY) {
ReactGA.initialize(import.meta.env.VITE_REACT_APP_GA_KEY);
setInitialized(true);
}
}, []);

useEffect(() => {
GAInitializer();
}, [GAInitializer]);

return <></>;
};

export default RouteChangeTracker;
70 changes: 37 additions & 33 deletions service-manager/src/router/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,45 +20,49 @@ import { NotFound } from '../pages/NotFound';
import { SettingBoardPage } from '../pages/setting/SettingList.page';
import { SectionCreateSettingPage } from '../pages/setting/SectionCreate.page';
import { ApplyBoardPage } from '../pages/apply/ApplyBoard.page';
import RouteChangeTracker from './RouterChangeTracker';

export default function Router() {
return (
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="/admin" element={<AdminPage />} />
<Route path="/signup" element={<SignUpPage />} />
<Route path="/password-reset" element={<PasswordResetLayout />}>
<Route index element={<RequestPasswordResetPage />} />
<Route
path="/password-reset/:resetId"
element={<PasswordResetPage />}
/>
</Route>
<Route path="/" element={<CommonLayout />}>
<Route path="announcement" element={<AnnouncementLayout />}>
<Route index element={<AnnouncementListPage />} />
<Route path=":announcementId" element={<AnnouncementPage />} />
<>
<RouteChangeTracker />
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="/admin" element={<AdminPage />} />
<Route path="/signup" element={<SignUpPage />} />
<Route path="/password-reset" element={<PasswordResetLayout />}>
<Route index element={<RequestPasswordResetPage />} />
<Route
path="update/:announcementId"
element={<AnnouncementUpdatePage />}
path="/password-reset/:resetId"
element={<PasswordResetPage />}
/>
<Route path="create" element={<AnnouncementCreatePage />} />
</Route>
<Route path="apply-list">
<Route index element={<ApplyBoardPage />} />
<Route path=":eventId" element={<ApplyListPage />} />
<Route path="/" element={<CommonLayout />}>
<Route path="announcement" element={<AnnouncementLayout />}>
<Route index element={<AnnouncementListPage />} />
<Route path=":announcementId" element={<AnnouncementPage />} />
<Route
path="update/:announcementId"
element={<AnnouncementUpdatePage />}
/>
<Route path="create" element={<AnnouncementCreatePage />} />
</Route>
<Route path="apply-list">
<Route index element={<ApplyBoardPage />} />
<Route path=":eventId" element={<ApplyListPage />} />
</Route>
<Route path="setting">
<Route index element={<SettingBoardPage />} />
<Route path=":eventId" element={<SectionSettingPage />} />
<Route path="create" element={<SectionCreateSettingPage />} />
</Route>
<Route path="notice" element={<NoticeLayout />}>
<Route index element={<NoticeViewPage />} />
<Route path="update" element={<NoticeUpdatePage />} />
</Route>
</Route>
<Route path="setting">
<Route index element={<SettingBoardPage />} />
<Route path=":eventId" element={<SectionSettingPage />} />
<Route path="create" element={<SectionCreateSettingPage />} />
</Route>
<Route path="notice" element={<NoticeLayout />}>
<Route index element={<NoticeViewPage />} />
<Route path="update" element={<NoticeUpdatePage />} />
</Route>
</Route>
<Route path="*" element={<NotFound />} />
</Routes>
<Route path="*" element={<NotFound />} />
</Routes>
</>
);
}

0 comments on commit f396102

Please sign in to comment.