From f2d576cfc5952f98c2ad2212503724a7017b628a Mon Sep 17 00:00:00 2001 From: Honghyeonji <66579773+Honghyeonji@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:07:33 +0900 Subject: [PATCH] =?UTF-8?q?[release]=20dev=20->=20main=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20merge=20/=201.0.1version=20upgrade=20(#24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ๐Ÿ”จ refactor: Docker ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง * ๐Ÿ™€ chore: ์˜คํƒ€ ์ˆ˜์ • * ๐Ÿ› fix: COPY ๊ฒฝ๋กœ ์ˆ˜์ • * ๐Ÿ› fix: swagger-auto ๋ช…๋ น์–ด ์ถ”๊ฐ€ * ๐Ÿ™€ chore: ์˜คํƒ€์ˆ˜์ • * ๐Ÿ› fix: backend ์ด๋ฏธ์ง€๊ฐ€ base-image๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์น˜ ๋ฐ ์ถ”๊ฐ€ ํŒŒ์ผ ๋ณต์‚ฌํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€ * ๐Ÿ› fix: pnpm-lock ๋ณต์‚ฌ ์ฝ”๋“œ ์ถ”๊ฐ€ * ๐Ÿ› fix: ์„œ๋ฒ„ ํŒจํ‚ค์ง€ ์„ค์น˜ ์•ˆ๋˜๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์ˆ˜์ • * ๐Ÿ› fix: eslint ๊ฒฝ๋กœ ์ฒดํฌ์šฉ package ํด๋” ์ถ”๊ฐ€ ๋ณต์‚ฌ * ๐Ÿ› fix: ์˜์กด์„ฑ์„ ๋ณต์‚ฌํ•ด์˜ค๊ณ  dev์šฉ์„ ์ง€์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ • * ๐Ÿ› fix: pnpm-workspace ํŒŒ์ผ ๋ณต์‚ฌ * ๐Ÿ™€ chore: cicd ์Šคํฌ๋ฆฝํŠธ ์˜คํƒ€ ์ˆ˜์ • * ๐Ÿ™€ chore: copy ๋ช…๋ น์–ด ํ•ฉ์นจ * ๐Ÿ™€ chore: ์ฝ”๋“œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ * ๐Ÿ› fix: COPY ๊ฒฝ๋กœ ์ˆ˜์ • * ๐Ÿ™€ chore: ๊ฒฝ๋กœ ์˜คํƒ€ ์ˆ˜์ • * ๐Ÿ”จ refactor: ๋ฐฐํฌ์‹œ swagger-auto ์•ˆ ํ•˜๊ฒŒ ๋กœ์ง ์ˆ˜์ • ๋ฐ prod ์ข…์†์„ฑ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ dev ์ข…์†์„ฑ์—์„œ ์ด๋™ * ๐Ÿ™€ chore: ๊ฒฝ๋กœ ์˜คํƒ€ ์ˆ˜์ • * ๐Ÿ™€ chore: ์•ˆ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ญ์ œ * ๐Ÿšจ !HOTFIX!: env ์„ค์ • ๋ˆ„๋ฝ๋œ ์ฝ”๋“œ ์ถ”๊ฐ€ * ๐Ÿšจ !HOTFIX!: env ์„ค์ • ๋ˆ„๋ฝ๋œ ์ฝ”๋“œ ์ถ”๊ฐ€ * [#10] ํ™ˆํŽ˜์ด์ง€ ๊ฐ€์ƒ์Šคํฌ๋กค ์ ์šฉ (#14) * โœจ feat: scroll์˜ Y ์ขŒํ‘œ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” useScroll ์ปค์Šคํ…€ ํ›… ์ถ”๊ฐ€ * ๐Ÿšš rename: hooks/css์— ์žˆ๋˜ useWindowSize ํ›… ํด๋” ์œ„์น˜ ๋ณ€๊ฒฝ * โœจ feat: ๊ฐ€์ƒ์Šคํฌ๋กค ๊ตฌํ˜„ ์ค‘ * ๐Ÿ™€ chore: ํ•จ์ˆ˜๋ช… ์˜คํƒ€ ์ˆ˜์ • * โœจ feat: ๊ฐ€์ƒ์Šคํฌ๋กค ์ปค์Šคํ…€ํ›… ์ถ”๊ฐ€ * โœจ feat: WorkspaceGrid ์ปดํฌ๋„ŒํŠธ์— ๊ฐ€์ƒ์Šคํฌ๋กค ์ ์šฉ * ๐Ÿ™€ chore: grid์˜ ์ด ๋†’์ด ๊ณ„์‚ฐํ•  ๋•Œ ๋ฐ˜์˜ฌ๋ฆผ ์ ์šฉ * [#11] Google Analytics ์ ์šฉ (#15) * โœจ feat: ga4 ์ฝ”๋“œ ์ถ”๊ฐ€ * ๐Ÿ”จ refactor: ๋กœ์ปฌ ํ™˜๊ฒฝ ๋””๋ฒ„๊น…์šฉ ์ฝ”๋“œ๋กœ ์ „ํ™˜ * ๐Ÿ™€ chore: GA ๋””๋ฒ„๊น… ์ฝ”๋“œ ์‚ญ์ œ * โœจ feat: ์ด๋ฒคํŠธ ํŠธ๋ ˆ์ด์‹ฑ * Update boolock-dev-cicd.yml * Update boolock-dev-cicd.yml * [#18] useQuery, useInfiniteQuery -> useSuspenseQuery, useSuspenseInfiniteQuery ๊ต์ฒด (#19) * ๐Ÿ”จ refactor: useQuery๋ฅผ useSuspenseQuery๋กœ ๊ต์ฒด ๋ฐ error ์ฒ˜๋Ÿฌ ์ฝ”๋“œ ์‚ญ์ œ * ๐Ÿ”จ refactor: ๋กœ๋”ฉ UI ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์‚ญ์ œ * ๐Ÿ”จ refactor: suspense ์ ์šฉ ๋ฐ error boundy fallback์— workspace ์—๋Ÿฌ ํŽ˜์ด์ง€ ์„ค์ • * ๐Ÿ”จ refactor: useInfinityQuery -> useSuspenseQuery๋กœ ๊ต์ฒด * ๐Ÿ™€ chore: 400 ์—๋Ÿฌ์™€ 404์—๋Ÿฌ์˜ ์—๋Ÿฌ ์ฝ”๋“œ ๋ฐ ์ƒํƒœ ๋ฉ”์„ธ์ง€๊ฐ€ ์ž˜๋ชป ์„ค์ • ๋˜์–ด ์žˆ์–ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆ˜์ • * ๐Ÿ› fix: ๊ธฐ์กด ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ 500 ์—๋Ÿฌ๋กœ๋งŒ ์‘๋‹ตํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ * ๐Ÿ”จ refactor: workspaceContainer์—์„œ ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ํŽ˜์นญํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•จ * ๐Ÿ™€ chore: ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ์ˆ˜์ • * ๐Ÿ™€ chore: github action ์—์„œ ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ * ๐Ÿ™€ chore: ๋ถˆํ•„์š”ํ•œ console.log ์‚ญ์ œ * [#21] ํ™ˆํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ ์Šค์ผˆ๋ ˆํ†คUI์— ๊ทธ๋ฆฌ๋“œ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ, ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋กœ๋”ฉ ํ™”๋ฉด ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง (#22) * ๐Ÿ› fix: ์Šค์ผˆ๋ ˆํ†คUI์— ๊ทธ๋ฆฌ๋“œ๊ฐ€ ์•ˆ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ * โœจ feat: ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋กœ๋”ฉ ์‹œ๊ฐ„์ด 0.05์ดˆ ์ด์ƒ์ผ ๋•Œ๋งŒ ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณ€๊ฒฝ * ๐Ÿšจ !HOTFIX!: error๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ return ํ•ด์•ผํ•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ return ํ•˜์—ฌ workspace๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ * ๐Ÿšจ !HOTFIX!: workflow on ์„ค์ • main push ์ผ ๊ฒฝ์šฐ๋กœ ์ˆ˜์ • --------- Co-authored-by: YEONGJAE LEE <71895560+lee0jae330@users.noreply.github.com> Co-authored-by: Gyeungil Choi Co-authored-by: Yujin Co-authored-by: lee0jae330 --- .github/workflows/boolock-dev-cicd.yml | 15 +- apps/client/Dockerfile | 17 ++- apps/client/index.html | 15 +- apps/client/package.json | 4 +- apps/client/src/app/App.tsx | 20 ++- apps/client/src/app/main.tsx | 2 + .../CssCategoryButton/CssCategoryButton.tsx | 1 + .../workspace/SaveButton/SaveButton.tsx | 3 +- apps/client/src/pages/HomePage/HomePage.tsx | 4 +- .../WorkspaceErrorPage/WorkspaceErrorPage.tsx | 14 ++ .../src/pages/Workspacepage/WorkspacePage.tsx | 16 +- apps/client/src/pages/index.ts | 2 + apps/client/src/shared/hooks/index.ts | 4 +- .../shared/hooks/queries/useGetWorkspace.ts | 21 +-- .../hooks/queries/useGetWorkspaceList.ts | 7 +- .../src/shared/hooks/useScrollPosition.ts | 25 +++ .../src/shared/hooks/useVirtualScroll.ts | 56 +++++++ .../shared/hooks/{css => }/useWindowSize.ts | 0 .../src/shared/store/useCssPropsStore.ts | 42 +++-- apps/client/src/shared/ui/index.ts | 1 + .../src/shared/ui/loading/DelayedFallback.tsx | 19 +++ apps/client/src/shared/utils/index.ts | 1 + apps/client/src/shared/utils/mixpanel.ts | 28 ++++ .../WorkspaceContainer.stories.tsx | 2 +- .../WorkspaceContainer/WorkspaceContainer.tsx | 49 +++--- .../home/WorkspaceGrid/WorkspaceGrid.tsx | 15 +- .../WorkspaceSection.stories.tsx | 22 +++ .../WorkspaceSection/WorkspaceSection.tsx | 26 ++++ apps/client/src/widgets/index.ts | 3 +- .../workspace/PreviewBox/PreviewBox.tsx | 17 ++- .../WorkspaceContent/WorkspaceContent.tsx | 22 +++ .../CssOptionItemList/CssOptionItemList.tsx | 1 + apps/server/Dockerfile | 19 ++- apps/server/package.json | 2 +- apps/server/src/app.ts | 10 +- .../server/src/middlewares/errorMiddleware.ts | 23 ++- apps/server/src/utils/customError.ts | 8 +- apps/server/tsconfig.json | 2 +- pnpm-lock.yaml | 143 +++++++++++------- 39 files changed, 507 insertions(+), 174 deletions(-) create mode 100644 apps/client/src/pages/WorkspaceErrorPage/WorkspaceErrorPage.tsx create mode 100644 apps/client/src/shared/hooks/useScrollPosition.ts create mode 100644 apps/client/src/shared/hooks/useVirtualScroll.ts rename apps/client/src/shared/hooks/{css => }/useWindowSize.ts (100%) create mode 100644 apps/client/src/shared/ui/loading/DelayedFallback.tsx create mode 100644 apps/client/src/shared/utils/mixpanel.ts create mode 100644 apps/client/src/widgets/home/WorkspaceSection/WorkspaceSection.stories.tsx create mode 100644 apps/client/src/widgets/home/WorkspaceSection/WorkspaceSection.tsx diff --git a/.github/workflows/boolock-dev-cicd.yml b/.github/workflows/boolock-dev-cicd.yml index 595fdfa..51cd35b 100644 --- a/.github/workflows/boolock-dev-cicd.yml +++ b/.github/workflows/boolock-dev-cicd.yml @@ -2,9 +2,7 @@ name: ci/cd action on: push: - branches: ['dev'] - pull_request: - branches: ['dev'] + branches: ['main'] jobs: build: @@ -42,6 +40,7 @@ jobs: - name: Set FE .env run: | echo "VITE_SERVER_URL=http://localhost:3000" > apps/client/.env + echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env - name: Set Nginx SSL files @@ -98,18 +97,20 @@ jobs: password: ${{ secrets.SSH_PASSWORD }} port: ${{ secrets.SSH_PORT }} script: | - cd boolock/web31-BooLock - git checkout dev - git pull origin dev + cd boolock/refactor-web31-BooLock + git checkout main + git pull origin main echo "MONGO_URI=${{ secrets.DEPLOY_MONGO_URI }}" > apps/server/.env echo "IS_LOCAL=false" >> apps/server/.env - echo "${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env + echo "SERVER_CORS_ACCEPT=${{ secrets.DEPLOY_SERVER_CORS_ACCEPT }}" >> apps/server/.env echo "S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}" >> apps/server/.env echo "S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}" >> apps/server/.env echo "S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }}" >> apps/server/.env + echo "NODE_ENV=production" >> apps/server/.env echo "VITE_SERVER_URL=${{ secrets.DEPLOY_VITE_SERVER_URL }}" > apps/client/.env + echo "VITE_MIXPANEL_TOKEN=${{ secrets.VITE_MIXPANEL_TOKEN }}" >> apps/client/.env echo "VITE_STATIC_STORAGE_URL=${{ secrets.VITE_STATIC_STORAGE_URL }}" >> apps/client/.env sudo docker compose pull diff --git a/apps/client/Dockerfile b/apps/client/Dockerfile index 5b82913..6f9915d 100644 --- a/apps/client/Dockerfile +++ b/apps/client/Dockerfile @@ -1,19 +1,20 @@ FROM base-image AS frontend-build + WORKDIR /app/apps/client COPY ./apps/client . -COPY --from=base-image /app/packages /app/packages -RUN pnpm install --offline --frozen-lockfile -RUN pnpm run build +RUN pnpm install --offline --frozen-lockfile &&\ + pnpm run build FROM nginx:alpine AS frontend -COPY --from=frontend-build /app/apps/client/dist /usr/share/nginx/html + COPY /apps/client/nginx.conf /etc/nginx/conf.d/default.conf COPY /apps/client/ssl /etc/nginx/ssl +RUN chmod 644 /etc/nginx/ssl/fullchain.pem &&\ + chmod 600 /etc/nginx/ssl/privkey.pem &&\ + chown -R nginx:nginx /usr/share/nginx/html /etc/nginx/ssl -RUN chmod -R 755 /usr/share/nginx/html -RUN chmod 644 /etc/nginx/ssl/fullchain.pem -RUN chmod 600 /etc/nginx/ssl/privkey.pem -RUN chown -R nginx:nginx /usr/share/nginx/html /etc/nginx/ssl +COPY --from=frontend-build /app/apps/client/dist /usr/share/nginx/html/ +RUN chmod -R 755 /usr/share/nginx/html EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/apps/client/index.html b/apps/client/index.html index aaf34e8..ff71a31 100644 --- a/apps/client/index.html +++ b/apps/client/index.html @@ -1,6 +1,16 @@ + + + @@ -14,10 +24,7 @@ - + diff --git a/apps/client/package.json b/apps/client/package.json index ddde07c..62e8d24 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -22,13 +22,13 @@ "codemirror": "^6.0.1", "html2canvas": "^1.4.1", "init": "^0.1.2", + "mixpanel-browser": "^2.58.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.4.1", "react-router-dom": "^6.27.0", "react-spinners": "^0.14.1", - "react-youtube": "^10.1.0", "storybook": "^8.4.1", "uuid": "^11.0.3", "zustand": "^5.0.1" @@ -44,6 +44,7 @@ "@storybook/react": "8.4.2", "@storybook/react-vite": "8.4.2", "@storybook/test": "8.4.2", + "@types/mixpanel-browser": "^2.51.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/react-router-dom": "^5.3.3", @@ -55,7 +56,6 @@ "eslint-plugin-react-refresh": "^0.4.14", "eslint-plugin-storybook": "^0.11.0", "postcss": "^8.4.47", - "prop-types": "15.8.1", "tailwindcss": "^3.4.14", "vite": "^5.4.10", "vite-plugin-svgr": "^4.3.0" diff --git a/apps/client/src/app/App.tsx b/apps/client/src/app/App.tsx index 6be0a6f..e0a18ea 100644 --- a/apps/client/src/app/App.tsx +++ b/apps/client/src/app/App.tsx @@ -1,9 +1,10 @@ +import { DelayedFallback, Loading } from '@/shared/ui'; +import { ErrorPage, WorkspaceErrorPage } from '@/pages'; import { RouterProvider, createBrowserRouter } from 'react-router-dom'; -import { ToasterWithMax } from '@/shared/ui'; -import { ErrorPage } from '@/pages/ErrorPage/ErrorPage'; -import { lazy, Suspense } from 'react'; -import { Loading } from '@/shared/ui'; +import { Suspense, lazy } from 'react'; + import { Helmet } from 'react-helmet-async'; +import { ToasterWithMax } from '@/shared/ui'; // lazy ๋กœ๋”ฉ const HomePage = lazy(() => @@ -47,12 +48,19 @@ const router = createBrowserRouter([ BooLock - ์ž‘์—… ๊ณต๊ฐ„ - }> + + + + + } + > ), - errorElement: , + errorElement: , }, { path: '*', diff --git a/apps/client/src/app/main.tsx b/apps/client/src/app/main.tsx index 056e764..9004325 100644 --- a/apps/client/src/app/main.tsx +++ b/apps/client/src/app/main.tsx @@ -6,11 +6,13 @@ import { App } from './App'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { HelmetProvider } from 'react-helmet-async'; +import { initMixpanel } from '@/shared/utils'; const container = document.getElementById('root'); const root = createRoot(container!); const queryClient = new QueryClient(); +initMixpanel(); root.render( diff --git a/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx b/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx index 15fceba..2a94421 100644 --- a/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx +++ b/apps/client/src/entities/workspace/CssCategoryButton/CssCategoryButton.tsx @@ -12,6 +12,7 @@ type CssCategoryButtonProps = { */ export const CssCategoryButton = ({ cssCategory }: CssCategoryButtonProps) => { const { selectedCssCategory, setSelectedCssCategory } = useCssPropsStore(); + return (