From 07b0618c9362516b81c7267ed58b31868fcd9292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A0=9C=EA=B2=BD?= Date: Tue, 31 Mar 2026 16:59:58 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20dropdown=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/workspace/WorkspaceCard.tsx | 12 ------------ src/routes/Router.tsx | 11 ++++++----- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/components/workspace/WorkspaceCard.tsx b/src/components/workspace/WorkspaceCard.tsx index f13d8854..f8dc22ee 100644 --- a/src/components/workspace/WorkspaceCard.tsx +++ b/src/components/workspace/WorkspaceCard.tsx @@ -86,18 +86,6 @@ function WorkspaceCard({ - -
e.stopPropagation()} - > -
); } diff --git a/src/routes/Router.tsx b/src/routes/Router.tsx index 1dee2241..7a3a46e0 100644 --- a/src/routes/Router.tsx +++ b/src/routes/Router.tsx @@ -35,11 +35,12 @@ export const router = createBrowserRouter([ children: AuthRoutes, }, { - element: ( - - - - ), + // element: ( + // + // + // + // ), + element: , children: MainRoutes, }, ], From 015eebb3fe342b6025b818d296fdf2362d7665aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A0=9C=EA=B2=BD?= Date: Tue, 31 Mar 2026 17:00:26 +0900 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/workspace/WorkspaceCard.tsx | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/components/workspace/WorkspaceCard.tsx b/src/components/workspace/WorkspaceCard.tsx index f8dc22ee..e1a05827 100644 --- a/src/components/workspace/WorkspaceCard.tsx +++ b/src/components/workspace/WorkspaceCard.tsx @@ -4,13 +4,9 @@ import { twMerge } from "tailwind-merge"; import type { TWorkspace } from "@/types/workspace/workspace"; import { ROLE_LABEL_MAP } from "@/constants/workspaceRole"; -import { - DropdownMenu, - type TMenuItem, -} from "@/components/common/dropdownmenu/DropdownMenu"; +import { type TMenuItem } from "@/components/common/dropdownmenu/DropdownMenu"; import BuildingIcon from "@/assets/icon/common/building.svg?react"; -import VectorIcon from "@/assets/icon/common/more.svg?react"; import { getImageUrl } from "@/lib/getImageUrl"; type TProps = { @@ -20,12 +16,7 @@ type TProps = { onClick?: () => void; }; -function WorkspaceCard({ - workspace: w, - menuItems, - isSelected = false, - onClick, -}: TProps) { +function WorkspaceCard({ workspace: w, isSelected = false, onClick }: TProps) { const [imageError, setImageError] = useState(false); useEffect(() => { From 104763ec366d1400f950138bbff208dff6864b5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A0=9C=EA=B2=BD?= Date: Tue, 31 Mar 2026 17:01:39 +0900 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=EB=A9=A4=EB=B2=84=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99=20=EB=B2=84=ED=8A=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/workspace/WorkspaceSetting.tsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/pages/workspace/WorkspaceSetting.tsx b/src/pages/workspace/WorkspaceSetting.tsx index 2fbe7d64..e3a94c86 100644 --- a/src/pages/workspace/WorkspaceSetting.tsx +++ b/src/pages/workspace/WorkspaceSetting.tsx @@ -297,19 +297,6 @@ export default function WorkspaceSetting() {
- - -
-
-
- - -
- {loading && (

불러오는중..

@@ -214,10 +196,6 @@ export default function WorkspaceSetting() { {!loading && !errorMsg && ( <>
-

기본 정보

-

- 워크스페이스의 대표적인 정보를 설정합니다. -

diff --git a/src/routes/MainRoutes.tsx b/src/routes/MainRoutes.tsx index c537660f..4ba47230 100644 --- a/src/routes/MainRoutes.tsx +++ b/src/routes/MainRoutes.tsx @@ -22,10 +22,12 @@ const CampaignGroup = loadable( lazy(() => import("@/pages/ads/new/CampaignGroup")), ); const Workspace = loadable(lazy(() => import("@/pages/workspace/Workspace"))); +const WorkspaceManageLayout = loadable( + lazy(() => import("@/layout/workspace/WorkspaceManageLayout")), +); const WorkspaceSetting = loadable( lazy(() => import("@/pages/workspace/WorkspaceSetting")), ); - const MemberManagement = loadable( lazy(() => import("@/pages/workspace/MemberManagement")), ); @@ -57,17 +59,17 @@ const MainRoutes: RouteObject[] = [ element: , }, - { - path: "workspace/:workspaceId/settings", - element: , - }, { path: "workspace", element: , }, { - path: "workspace/:workspaceId/members", - element: , + path: "workspace/:workspaceId", + element: , + children: [ + { path: "settings", element: }, + { path: "members", element: }, + ], }, { path: "workspace/billing", diff --git a/src/routes/Router.tsx b/src/routes/Router.tsx index 7a3a46e0..1dee2241 100644 --- a/src/routes/Router.tsx +++ b/src/routes/Router.tsx @@ -35,12 +35,11 @@ export const router = createBrowserRouter([ children: AuthRoutes, }, { - // element: ( - // - // - // - // ), - element: , + element: ( + + + + ), children: MainRoutes, }, ], From 906d7ab8a437622a47fa5af3ba193aa8e3f4ab5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A0=9C=EA=B2=BD?= Date: Tue, 31 Mar 2026 17:40:46 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20skeleton=20ui=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspace/WorkspaceListLoading.tsx | 34 +++++++++++++++---- src/routes/MainRoutes.tsx | 7 +++- src/utils/loadable.tsx | 2 +- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/components/workspace/WorkspaceListLoading.tsx b/src/components/workspace/WorkspaceListLoading.tsx index 9eecf294..4f117add 100644 --- a/src/components/workspace/WorkspaceListLoading.tsx +++ b/src/components/workspace/WorkspaceListLoading.tsx @@ -1,13 +1,33 @@ +import { Skeleton } from "@/components/common/skeleton/Skeleton"; + +function WorkspaceCardSkeleton() { + return ( + <> +
  • +
    + +
    + + + +
    +
    + +
  • + + ); +} + export default function WorkspaceListLoading() { return ( -
    -

    - 워크스페이스 목록을 불러오는 중입니다. -

    -
    + {Array.from({ length: 3 }).map((_, i) => ( + + ))} + ); } diff --git a/src/routes/MainRoutes.tsx b/src/routes/MainRoutes.tsx index 4ba47230..65992a29 100644 --- a/src/routes/MainRoutes.tsx +++ b/src/routes/MainRoutes.tsx @@ -3,6 +3,8 @@ import type { RouteObject } from "react-router-dom"; import { loadable } from "@/utils/loadable"; +import WorkspaceListLoading from "@/components/workspace/WorkspaceListLoading"; + const OverviewDashboard = loadable( lazy(() => import("@/pages/dashboard/overview/OverviewDashboard")), ); @@ -21,7 +23,10 @@ const CampaignDetail = loadable( const CampaignGroup = loadable( lazy(() => import("@/pages/ads/new/CampaignGroup")), ); -const Workspace = loadable(lazy(() => import("@/pages/workspace/Workspace"))); +const Workspace = loadable( + lazy(() => import("@/pages/workspace/Workspace")), + , +); const WorkspaceManageLayout = loadable( lazy(() => import("@/layout/workspace/WorkspaceManageLayout")), ); diff --git a/src/utils/loadable.tsx b/src/utils/loadable.tsx index e904b8cc..8c540947 100644 --- a/src/utils/loadable.tsx +++ b/src/utils/loadable.tsx @@ -4,7 +4,7 @@ type TPropsOf = T extends ComponentType ? P : never; export function loadable>( Component: T, - fallback: ReactNode =
    Loading...
    , + fallback: ReactNode = null, ) { function Wrapped(props: TPropsOf) { return ( From d28e0a0ede30bf4c654d79a3ca5a71f3ba1517f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=84=9C=EC=A0=9C=EA=B2=BD?= Date: Tue, 31 Mar 2026 18:33:08 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20workspace=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=EB=9E=99=EC=85=98=20=EB=B0=8F=20=ED=98=B8=EB=B2=84=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icon/common/uploadImg.svg | 2 +- src/components/common/button/Button.tsx | 8 +- .../common/dropdownmenu/DropdownMenu.tsx | 42 ++++---- src/components/workspace/MemberRoleSelect.tsx | 2 +- src/components/workspace/WorkspaceCard.tsx | 95 +++++++++--------- src/pages/workspace/Workspace.tsx | 98 ++++++++++--------- 6 files changed, 129 insertions(+), 118 deletions(-) diff --git a/src/assets/icon/common/uploadImg.svg b/src/assets/icon/common/uploadImg.svg index 37c18ee5..98740532 100644 --- a/src/assets/icon/common/uploadImg.svg +++ b/src/assets/icon/common/uploadImg.svg @@ -1,3 +1,3 @@ - + diff --git a/src/components/common/button/Button.tsx b/src/components/common/button/Button.tsx index 16b8f0c2..5b96b782 100644 --- a/src/components/common/button/Button.tsx +++ b/src/components/common/button/Button.tsx @@ -36,13 +36,13 @@ export default function Button({ const variantClasses = { primary: - "bg-chart-3 text-white hover:opacity-80 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50", + "bg-chart-3 text-white hover:bg-[#0e6add] disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", secondary: - "bg-gray-100 text-brand-900 hover:bg-gray-200 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50 disabled:hover:opacity-50", + "bg-gray-100 text-brand-900 hover:bg-gray-200 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", outline: - "bg-transparent border border-chart-3 text-chart-3 hover:bg-brand-300 disabled:border-gray-300 disabled:text-text-disabled disabled:hover:bg-transparent", + "bg-transparent border border-chart-3 text-chart-3 hover:bg-chart-3/5 disabled:border-gray-300 disabled:text-text-disabled disabled:hover:bg-transparent", danger: - "bg-status-red text-white hover:opacity-80 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50", + "bg-status-red text-white hover:bg-[#d91632] disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", dangerSoft: "bg-status-red/10 text-status-red border border-status-red hover:bg-status-red/20 disabled:bg-bg-disabled disabled:text-text-disabled disabled:border-gray-300 disabled:hover:bg-bg-disabled", gradient: diff --git a/src/components/common/dropdownmenu/DropdownMenu.tsx b/src/components/common/dropdownmenu/DropdownMenu.tsx index 896adf9e..e8abf297 100644 --- a/src/components/common/dropdownmenu/DropdownMenu.tsx +++ b/src/components/common/dropdownmenu/DropdownMenu.tsx @@ -57,7 +57,7 @@ export function DropdownMenu({ )} diff --git a/src/components/workspace/WorkspaceCard.tsx b/src/components/workspace/WorkspaceCard.tsx index 0f3e2675..6269608e 100644 --- a/src/components/workspace/WorkspaceCard.tsx +++ b/src/components/workspace/WorkspaceCard.tsx @@ -24,56 +24,61 @@ function WorkspaceCard({ workspace: w, isSelected = false, onClick }: TProps) { const showPlaceholder = !imageSrc || imageError; return ( -
  • -
    -
    - {showPlaceholder ? ( -
    - -
    - ) : ( - {`${w.name} { - setImageError(true); - }} - /> - )} -
    - -
    -
    -
    - {w.name} -
    - {isSelected && ( - - 현재 대시보드 기준 - +
  • +
  • ); } diff --git a/src/pages/workspace/Workspace.tsx b/src/pages/workspace/Workspace.tsx index 05084909..5efb6cf1 100644 --- a/src/pages/workspace/Workspace.tsx +++ b/src/pages/workspace/Workspace.tsx @@ -202,26 +202,19 @@ export default function WorkspacePage() { {renderWorkspaceContent()} - -
    -

    + +
    +

    워크스페이스 생성

    -

    - 워크스페이스를 생성한 사용자는 자동으로 관리자 권한을 갖습니다.{" "} -
    로고 이미지와 기본 정보를 입력해 주세요. +

    + 워크스페이스를 생성한 사용자는 자동으로 관리자 권한을 갖습니다. +
    + 로고 이미지와 기본 정보를 입력해 주세요.

    -
    -
    -
    - 로고 이미지 -
    + +
    +
    {logoPreview ? ( - 새 로고 미리 보기 + <> + 새 로고 미리 보기 +
    + + + 사진 변경 + +
    + ) : ( - +
    + + + 이미지 업로드 + +
    )} - -
    -
    + + {/* 입력 폼 */} +
    setNewDesc(e.target.value)} disabled={isCreating} @@ -275,18 +278,19 @@ export default function WorkspacePage() {

    {createErrorMsg}

    )}
    -
    -
    - + +
    + +