From 6a7218b8ce5a39f5db3ad1973ccb2983c2fb8865 Mon Sep 17 00:00:00 2001 From: bicochan Date: Sat, 24 May 2025 00:47:27 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20header=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/features/package.json | 2 +- .../src/app/providers/app-provider.tsx | 4 - apps/cs/package.json | 2 +- .../src/pages/popup/model/table-columns.tsx | 7 - packages/common/assets/package.json | 2 +- packages/common/components/package.json | 2 +- packages/common/components/src/api/index.ts | 1 + packages/common/components/src/api/popup.ts | 69 ++++++++++ packages/common/components/src/config/api.ts | 1 + .../common/components/src/ui/header/index.tsx | 128 +++++++++++++++++- packages/common/config/package.json | 2 +- packages/common/network/package.json | 2 +- 12 files changed, 204 insertions(+), 18 deletions(-) create mode 100644 packages/common/components/src/api/popup.ts diff --git a/apps/common/features/package.json b/apps/common/features/package.json index 8ec6639bf..0bd642b8e 100644 --- a/apps/common/features/package.json +++ b/apps/common/features/package.json @@ -1,6 +1,6 @@ { "name": "features", - "version": "0.0.0", + "version": "0.1.0", "private": true, "scripts": { "dev": "next dev -p 13000", diff --git a/apps/common/features/src/app/providers/app-provider.tsx b/apps/common/features/src/app/providers/app-provider.tsx index b82fc1d71..721f04bb6 100644 --- a/apps/common/features/src/app/providers/app-provider.tsx +++ b/apps/common/features/src/app/providers/app-provider.tsx @@ -9,13 +9,9 @@ import { StoreProvider, PromptProvider } from "@/shared/providers"; import { AlertDialog } from "@/shared/ui/alert-dialog"; import { PromptDialog } from "@/shared/ui/prompt-dialog"; import { ConfirmDialog } from "@/shared/ui/confirm-dialog"; -import { initializeNextClientConfig } from "@common/config"; const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => { const queryClient = new QueryClient(); - - initializeNextClientConfig(); - return ( diff --git a/apps/cs/package.json b/apps/cs/package.json index f699334d3..dce55ccd3 100644 --- a/apps/cs/package.json +++ b/apps/cs/package.json @@ -1,6 +1,6 @@ { "name": "cs", - "version": "0.0.0", + "version": "0.1.0", "private": true, "scripts": { "dev": "next dev", diff --git a/apps/cs/src/pages/popup/model/table-columns.tsx b/apps/cs/src/pages/popup/model/table-columns.tsx index 09c291c84..04920f201 100644 --- a/apps/cs/src/pages/popup/model/table-columns.tsx +++ b/apps/cs/src/pages/popup/model/table-columns.tsx @@ -76,13 +76,6 @@ const PreviewButton = ({ popupSn }: { popupSn: number }) => { e.stopPropagation(); try { - const cookieName = `cs-popup-hide-for-day-${popupSn}`; - const cookies = document.cookie.split(";"); - const popupCookie = cookies.find((cookie) => - cookie.trim().startsWith(`${cookieName}=`), - ); - if (popupCookie) return; - const response = await PopupApi.getPopupInfo(popupSn); if (!response) return; diff --git a/packages/common/assets/package.json b/packages/common/assets/package.json index 15ae2fb43..71d71cf53 100644 --- a/packages/common/assets/package.json +++ b/packages/common/assets/package.json @@ -1,6 +1,6 @@ { "name": "@common/assets", - "version": "0.0.0", + "version": "1.0.0", "private": true, "main": "./dist/index.js", "module": "./dist/index.mjs", diff --git a/packages/common/components/package.json b/packages/common/components/package.json index ca166abc7..5df2501d4 100644 --- a/packages/common/components/package.json +++ b/packages/common/components/package.json @@ -1,6 +1,6 @@ { "name": "@common/components", - "version": "0.0.0", + "version": "1.0.0", "private": true, "sideEffects": false, "type": "module", diff --git a/packages/common/components/src/api/index.ts b/packages/common/components/src/api/index.ts index fd0c1fc18..10d68732c 100644 --- a/packages/common/components/src/api/index.ts +++ b/packages/common/components/src/api/index.ts @@ -1,4 +1,5 @@ export * from "./client"; export * from "./menu"; +export * from "./popup"; export * from "./site"; export * from "./user"; diff --git a/packages/common/components/src/api/popup.ts b/packages/common/components/src/api/popup.ts new file mode 100644 index 000000000..85c5ac312 --- /dev/null +++ b/packages/common/components/src/api/popup.ts @@ -0,0 +1,69 @@ +import { getApiClient } from "./client"; +import { ENDPOINT } from "../config"; + +export interface PopupInfo { + popupSn: number; + popupTypeCd: string; + popupTypeNm: string; + contsTypeCd: string; + contsTypeNm: string; + popupTtl: string; + popupCn: string; + popupWdth: number; + popupHgt: number; + popupVtclPstn: number; + popupHrzntltyPstn: number; + popupEndUseYn: string; + popupLnkgUrl: string; + atflCd: string; + useYn: string; + regDt: string; + mdfcnDt: string; + rgTrNm: string; + mdfrNm: string; +} + +interface SortConfig { + empty: boolean; + sorted: boolean; + unsorted: boolean; +} + +interface PageableConfig { + sort: SortConfig; + offset: number; + pageNumber: number; + pageSize: number; + paged: boolean; + unpaged: boolean; +} + +interface PageableList { + content: T[]; + pageable: PageableConfig; + sort: SortConfig; + totalPages: number; + totalElements: number; + number: number; + numberOfElements: number; + size: number; + first: boolean; + last: boolean; + empty: boolean; +} + +const client = getApiClient(); + +export const getPopupList = async () => { + const response = await client.get>( + `${ENDPOINT.CMS_SERVICE.POPUPS}`, + ); + return response.data; +}; + +export const getPopupInfo = async (popupSn: number) => { + const response = await client.get( + `${ENDPOINT.CMS_SERVICE.POPUPS}/${popupSn}`, + ); + return response.data; +}; diff --git a/packages/common/components/src/config/api.ts b/packages/common/components/src/config/api.ts index 07428479b..2b2612ffb 100644 --- a/packages/common/components/src/config/api.ts +++ b/packages/common/components/src/config/api.ts @@ -2,6 +2,7 @@ export const ENDPOINT = { CMS_SERVICE: { MENU_ROLES: "/cms-service/api/v1/menu-roles", SITES: "/cms-service/api/v1/sites", + POPUPS: "/cms-service/api/v1/popups", }, USER_SERVICE: { USERS: "/user-service/api/v1/users", diff --git a/packages/common/components/src/ui/header/index.tsx b/packages/common/components/src/ui/header/index.tsx index 285fad049..db1115b18 100644 --- a/packages/common/components/src/ui/header/index.tsx +++ b/packages/common/components/src/ui/header/index.tsx @@ -1,9 +1,15 @@ +import { useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import { images } from "@common/assets"; import { getConfig } from "@common/config"; import { ENDPOINT } from "../../config"; import { setCookie } from "../../lib"; -import { getSiteInfo, getUserInfo } from "../../api"; +import { + getPopupInfo, + getPopupList, + getSiteInfo, + getUserInfo, +} from "../../api"; import { DropdownMenu, DropdownMenuTrigger, @@ -35,6 +41,53 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) { enabled: !viewOnly, }); + const { data: popupList } = useQuery({ + queryKey: ["ENDPOINT.CMS_SERVICE.POPUPS"], + queryFn: () => getPopupList(), + enabled: false, + }); + + useEffect(() => { + if (!popupList?.content.length) return; + + const openPopups = async () => { + for (const popup of popupList.content) { + try { + const cookieName = `cs-popup-hide-for-day-${popup.popupSn}`; + const cookies = document.cookie.split(";"); + const popupCookie = cookies.find((cookie) => + cookie.trim().startsWith(`${cookieName}=`), + ); + if (popupCookie) continue; + + const response = await getPopupInfo(popup.popupSn); + if (!response) continue; + + const width = response.popupWdth; + const height = response.popupHgt; + const left = response.popupHrzntltyPstn + window.screenX; + const top = response.popupVtclPstn + window.screenY; + const popupWindow = window.open( + "", + `popup_preview_${popup.popupSn}`, + `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes,status=no,location=no,menubar=no`, + ); + if (!popupWindow) continue; + + popupWindow.document.write( + previewTemplate(popup.popupSn, response.popupTtl, response.popupCn), + ); + popupWindow.document.close(); + } catch (error) { + console.error("Failed to open popup:", error); + continue; + } + } + }; + + openPopups(); + }, [popupList]); + return (
@@ -72,3 +125,76 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) {
); } + +const previewTemplate = ( + popupSn: number, + popupTitle: string, + popupCn: string, +) => { + return ` + + + + + 팝업 미리보기 + + + + + + + + +`; +}; diff --git a/packages/common/config/package.json b/packages/common/config/package.json index 5f71fca42..fac19c4e0 100644 --- a/packages/common/config/package.json +++ b/packages/common/config/package.json @@ -1,6 +1,6 @@ { "name": "@common/config", - "version": "0.1.0", + "version": "1.0.0", "private": true, "type": "module", "main": "./dist/index.js", diff --git a/packages/common/network/package.json b/packages/common/network/package.json index 23659bac7..b59676eab 100644 --- a/packages/common/network/package.json +++ b/packages/common/network/package.json @@ -1,6 +1,6 @@ { "name": "@common/network", - "version": "0.0.0", + "version": "1.0.0", "private": true, "main": "./index.ts", "types": "./index.ts",