From ceacb1370486eaffca1cbb913cbf6453590cd5ab Mon Sep 17 00:00:00 2001 From: RSONE001 Date: Thu, 16 Oct 2025 13:47:43 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=99=B8=EB=B6=80=20API=20=EC=97=B0?= =?UTF-8?q?=EA=B3=84=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=B0=EA=B3=84=20?= =?UTF-8?q?key=20=EB=A7=8C=EB=A3=8C=20=EC=B2=B4=ED=81=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/entities/link/model/link-interface.ts | 3 + .../cs/src/pages/link/model/table-columns.tsx | 2 +- .../cs/src/pages/link/ui/LinkExpiredAlert.tsx | 90 +++++++++++++++++++ .../cs/src/pages/link/ui/QuickStartButton.tsx | 2 +- apps/cs/src/pages/link/ui/link-form.tsx | 72 +++++++++++++-- apps/cs/src/pages/link/ui/link-page.tsx | 5 +- apps/cs/src/pages/link/ui/modify-page.tsx | 8 +- 7 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 apps/cs/src/pages/link/ui/LinkExpiredAlert.tsx diff --git a/apps/cs/src/entities/link/model/link-interface.ts b/apps/cs/src/entities/link/model/link-interface.ts index f8cf82016..244bb4c63 100644 --- a/apps/cs/src/entities/link/model/link-interface.ts +++ b/apps/cs/src/entities/link/model/link-interface.ts @@ -20,6 +20,7 @@ export interface Link { mdfcn_dt: string; mdfr_id_id: string; link_cycle_mi: string; + link_key_expry_ymd: string; } export interface LinkLog { @@ -50,6 +51,7 @@ export interface LinkInfo extends LinkFormData { mdfcn_dt: string; mdfr_id: string; link_cycle_mi: number; + link_key_expry_ymd: string; } export interface LinkStats { @@ -125,6 +127,7 @@ export const linkFormSchema = z.object({ }, { message: "연계 주기는 5분 이상이어야 합니다." }), + link_key_expry_ymd: z.string().nullable().optional(), }); export const linkVrblFormSchema = z.object({ diff --git a/apps/cs/src/pages/link/model/table-columns.tsx b/apps/cs/src/pages/link/model/table-columns.tsx index 81b86b570..800801277 100644 --- a/apps/cs/src/pages/link/model/table-columns.tsx +++ b/apps/cs/src/pages/link/model/table-columns.tsx @@ -68,7 +68,7 @@ const columns = [ header: '연계상태', cell: (info) => { const resultCd = info.row.original.last_link_rslt_cd; - return {resultCd === 'SUCC' ? '성공' : (resultCd === 'FAIL' ? '실패' : '대기')} + return {resultCd === 'SUCC' ? '성공' : (resultCd === 'FAIL' ? '실패' : (resultCd === 'RUNN' ? '진행중' : '대기'))} }, }), columnHelper.accessor('last_link_excn_dt', { diff --git a/apps/cs/src/pages/link/ui/LinkExpiredAlert.tsx b/apps/cs/src/pages/link/ui/LinkExpiredAlert.tsx new file mode 100644 index 000000000..92628a755 --- /dev/null +++ b/apps/cs/src/pages/link/ui/LinkExpiredAlert.tsx @@ -0,0 +1,90 @@ +import type { Link, LinkList } from "@/entities/link/model/link-interface"; +import { + Button, + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem +} from "@common/components"; +import type { UseQueryResult } from "@tanstack/react-query"; +import { useState, useEffect } from "react"; +import dayjs from "dayjs"; +import { useRouter } from "next/navigation"; + +const LinkExpiredAlert = ({ linkList }: { linkList: UseQueryResult }) => { + const [expriedLinkList, setExpriedLinkLikst] = useState([]); + const router = useRouter(); + + useEffect(() => { + if (linkList?.data?.content) { + const expriedLinks = linkList.data.content.filter((l) => { + if (l.link_key_expry_ymd === 'none' || !l.link_key_expry_ymd) { + return false; + } + + const expryDate = dayjs(l.link_key_expry_ymd, 'YYMMDD'); + const today = dayjs(); + + const daysDiff = expryDate.diff(today, 'day'); + + return daysDiff <= 7 + }); + + setExpriedLinkLikst(expriedLinks); + } + }, [linkList]); + + return ( +
+ + +
+ + {expriedLinkList.length > 0 && + + NEW + + } +
+
+ {expriedLinkList.length > 0 ? + + {expriedLinkList.map((l) => { + const expryDate = dayjs(l.link_key_expry_ymd, 'YYMMDD'); + const today = dayjs(); + const daysDiff = expryDate.diff(today, 'day'); + + return router.push(`link/register/${l.link_sn}`)}> +
+ {daysDiff > 0 ? +

{l.link_nm} API KEY 만료 {daysDiff}일전

+ : +

{l.link_nm} API KEY 만료됨

+ } +

만료일자: {expryDate.format('YYYY-MM-DD')}

+
+
+ })} +
+ : + + +
+ + 새로운 알림이 없습니다. +
+
+
+ } +
+
+ ); +}; + +export default LinkExpiredAlert; \ No newline at end of file diff --git a/apps/cs/src/pages/link/ui/QuickStartButton.tsx b/apps/cs/src/pages/link/ui/QuickStartButton.tsx index a322ee678..8c443884e 100644 --- a/apps/cs/src/pages/link/ui/QuickStartButton.tsx +++ b/apps/cs/src/pages/link/ui/QuickStartButton.tsx @@ -22,7 +22,7 @@ const QuickStartButton: React.FC<{ linkSn: string }> = ({ linkSn }) => { return ( diff --git a/apps/cs/src/pages/link/ui/modify-page.tsx b/apps/cs/src/pages/link/ui/modify-page.tsx index c690b8aa7..88a83f47b 100644 --- a/apps/cs/src/pages/link/ui/modify-page.tsx +++ b/apps/cs/src/pages/link/ui/modify-page.tsx @@ -7,7 +7,7 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import LinkForm from "./link-form"; import { useAlertStore } from "@/shared/lib/use-alert-store"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { getUserInfo } from "../../../../../../packages/common/components/src/api"; import { AUTH_USER_ID } from "@/shared/config"; import { getCookie } from "@common/components"; @@ -18,6 +18,8 @@ function ModifyLinkPage({ linkSn }: { linkSn: string }) { const { setMessage: alert } = useAlertStore((state) => state); const userUniqId = getCookie(AUTH_USER_ID) ?? ""; + const [initialIsNoExprie, setInitialIsNoExprie] = useState(true); + // 컴포넌트 마운트 시 캐시 초기화 useEffect(() => { queryClient.removeQueries({ @@ -82,7 +84,8 @@ function ModifyLinkPage({ linkSn }: { linkSn: string }) { } form.reset(newData); - + + setInitialIsNoExprie(newData.link_key_expry_ymd === 'none'); } }; @@ -101,6 +104,7 @@ function ModifyLinkPage({ linkSn }: { linkSn: string }) { updateLinkInfo={updateLinkInfo} deleteLink={deleteLink} updateLinkResultCode={updateLinkResultCode} + initialIsNoExprie={initialIsNoExprie} />