From f18972f080209827c3cdf140ceaa5a38391748fe Mon Sep 17 00:00:00 2001 From: artwork21c Date: Fri, 23 Jan 2026 09:42:13 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AF=B8=EC=82=AC=EC=9A=A9=20=EC=9A=94?= =?UTF-8?q?=EC=86=8C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/_nav.tsx | 32 --- src/assets/images/avatars/default.png | Bin 0 -> 24579 bytes src/components/AppFooter.tsx | 9 +- src/components/AppHeader.tsx | 11 -- src/components/header/AppHeaderDropdown.tsx | 120 ++++++------ src/views/dashboard/Dashboard.tsx | 206 +------------------- 6 files changed, 66 insertions(+), 312 deletions(-) create mode 100644 src/assets/images/avatars/default.png diff --git a/src/_nav.tsx b/src/_nav.tsx index 4a360d3..9cb5e35 100644 --- a/src/_nav.tsx +++ b/src/_nav.tsx @@ -2,7 +2,6 @@ import React from 'react' import CIcon from '@coreui/icons-react' import { cilSpeedometer, - cilStar, } from '@coreui/icons' import { CNavGroup, CNavItem, CNavTitle } from '@coreui/react' @@ -21,37 +20,6 @@ const _nav = [ component: CNavTitle, name: 'Menu', }, - { - component: CNavTitle, - name: 'Extras', - }, - { - component: CNavGroup, - name: 'Pages', - icon: , - items: [ - { - component: CNavItem, - name: 'Login', - to: '/login', - }, - { - component: CNavItem, - name: 'Register', - to: '/register', - }, - { - component: CNavItem, - name: 'Error 404', - to: '/404', - }, - { - component: CNavItem, - name: 'Error 500', - to: '/500', - }, - ], - }, ] export default _nav diff --git a/src/assets/images/avatars/default.png b/src/assets/images/avatars/default.png new file mode 100644 index 0000000000000000000000000000000000000000..d75072bc9a2c89be8f98bc33e1636e400435fb15 GIT binary patch literal 24579 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 { return (
- - CoreUI - - © 2025 creativeLabs. -
- -
- Referrence : + CoreUI React Referrence : Demo diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx index 87a884f..25bfb41 100644 --- a/src/components/AppHeader.tsx +++ b/src/components/AppHeader.tsx @@ -69,17 +69,6 @@ const AppHeader = () => { {member.memberId} )} - - - - - - - - - - - diff --git a/src/components/header/AppHeaderDropdown.tsx b/src/components/header/AppHeaderDropdown.tsx index e79124c..79ec160 100644 --- a/src/components/header/AppHeaderDropdown.tsx +++ b/src/components/header/AppHeaderDropdown.tsx @@ -1,7 +1,6 @@ -import React from 'react' +import React, { useState, useEffect } from 'react' import { CAvatar, - CBadge, CDropdown, CDropdownDivider, CDropdownHeader, @@ -10,24 +9,64 @@ import { CDropdownToggle, } from '@coreui/react' import { - cilBell, - cilCreditCard, - cilCommentSquare, - cilEnvelopeOpen, - cilFile, - cilLockLocked, - cilSettings, - cilTask, cilUser, cilAccountLogout, + cilClock, } from '@coreui/icons' import { useAuth } from 'src/hooks/useAuth' +import { getAccessTokenFromCookie, getRefreshTokenFromCookie, getUserFromToken } from 'src/axios/authService' import CIcon from '@coreui/icons-react' -import avatar8 from 'src/assets/images/avatars/8.jpg' +import avatar8 from 'src/assets/images/avatars/default.png' const AppHeaderDropdown = () => { - const { logout } = useAuth() + const { logout, state } = useAuth() + const [accessTokenExpiry, setAccessTokenExpiry] = useState('') + const [refreshTokenExpiry, setRefreshTokenExpiry] = useState('') + + useEffect(() => { + const formatExpiry = (diff: number): string => { + if (diff <= 0) return '만료됨' + const days = Math.floor(diff / (24 * 60 * 60 * 1000)) + const hours = Math.floor((diff % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000)) + const minutes = Math.floor((diff % (60 * 60 * 1000)) / 60000) + const seconds = Math.floor((diff % 60000) / 1000) + + if (days > 0) return `${days}일 ${hours}시간 후 만료` + if (hours > 0) return `${hours}시간 ${minutes}분 후 만료` + return `${minutes}분 ${seconds}초 후 만료` + } + + const updateExpiry = () => { + const now = new Date() + + // Access Token + const accessToken = getAccessTokenFromCookie() || localStorage.getItem('accessToken') + if (accessToken) { + const decoded = getUserFromToken(accessToken) + if (decoded?.exp) { + const diff = decoded.exp * 1000 - now.getTime() + setAccessTokenExpiry(formatExpiry(diff)) + } + } + + // Refresh Token + const refreshToken = getRefreshTokenFromCookie() || localStorage.getItem('refreshToken') + if (refreshToken) { + const decoded = getUserFromToken(refreshToken) + if (decoded?.exp) { + const diff = decoded.exp * 1000 - now.getTime() + setRefreshTokenExpiry(formatExpiry(diff)) + } + } else { + setRefreshTokenExpiry('HttpOnly (접근 불가)') + } + } + + updateExpiry() + const interval = setInterval(updateExpiry, 1000) + return () => clearInterval(interval) + }, []) return ( @@ -36,56 +75,21 @@ const AppHeaderDropdown = () => { Account - - - Updates - - 42 - - - - - Messages - - 42 - - - - - Tasks - - 42 - - - - - Comments - - 42 - - - Settings - + - Profile + ID: {state.member?.memberId || '-'} - - - Settings + + + 이름: {state.member?.memberName || '-'} - - - Payments - - 42 - + + + Access: {accessTokenExpiry} - - - Projects - - 42 - + + + Refresh: {refreshTokenExpiry} diff --git a/src/views/dashboard/Dashboard.tsx b/src/views/dashboard/Dashboard.tsx index 63d6f5a..9b21921 100644 --- a/src/views/dashboard/Dashboard.tsx +++ b/src/views/dashboard/Dashboard.tsx @@ -1,210 +1,10 @@ import React from 'react' -import classNames from 'classnames' - -import { - CAvatar, - CButton, - CButtonGroup, - CCard, - CCardBody, - CCardFooter, - CCardHeader, - CCol, - CProgress, - CRow, - CTable, - CTableBody, - CTableDataCell, - CTableHead, - CTableHeaderCell, - CTableRow, -} from '@coreui/react' -import CIcon from '@coreui/icons-react' -import { - cibCcAmex, - cibCcApplePay, - cibCcMastercard, - cibCcPaypal, - cibCcStripe, - cibCcVisa, - cibGoogle, - cibFacebook, - cibLinkedin, - cifBr, - cifEs, - cifFr, - cifIn, - cifPl, - cifUs, - cibTwitter, - cilCloudDownload, - cilPeople, - cilUser, - cilUserFemale, -} from '@coreui/icons' - -import avatar1 from 'src/assets/images/avatars/1.jpg' -import avatar2 from 'src/assets/images/avatars/2.jpg' -import avatar3 from 'src/assets/images/avatars/3.jpg' -import avatar4 from 'src/assets/images/avatars/4.jpg' -import avatar5 from 'src/assets/images/avatars/5.jpg' -import avatar6 from 'src/assets/images/avatars/6.jpg' - -import MainChart from 'src/views/dashboard/MainChart' const Dashboard = () => { - const tableExample = [ - { - avatar: { src: avatar1, status: 'success' }, - user: { - name: 'Yiorgos Avraamu', - new: true, - registered: 'Jan 1, 2023', - }, - country: { name: 'USA', flag: cifUs }, - usage: { - value: 50, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'success', - }, - payment: { name: 'Mastercard', icon: cibCcMastercard }, - activity: '10 sec ago', - }, - { - avatar: { src: avatar2, status: 'danger' }, - user: { - name: 'Avram Tarasios', - new: false, - registered: 'Jan 1, 2023', - }, - country: { name: 'Brazil', flag: cifBr }, - usage: { - value: 22, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'info', - }, - payment: { name: 'Visa', icon: cibCcVisa }, - activity: '5 minutes ago', - }, - { - avatar: { src: avatar3, status: 'warning' }, - user: { name: 'Quintin Ed', new: true, registered: 'Jan 1, 2023' }, - country: { name: 'India', flag: cifIn }, - usage: { - value: 74, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'warning', - }, - payment: { name: 'Stripe', icon: cibCcStripe }, - activity: '1 hour ago', - }, - { - avatar: { src: avatar4, status: 'secondary' }, - user: { name: 'Enéas Kwadwo', new: true, registered: 'Jan 1, 2023' }, - country: { name: 'France', flag: cifFr }, - usage: { - value: 98, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'danger', - }, - payment: { name: 'PayPal', icon: cibCcPaypal }, - activity: 'Last month', - }, - { - avatar: { src: avatar5, status: 'success' }, - user: { - name: 'Agapetus Tadeáš', - new: true, - registered: 'Jan 1, 2023', - }, - country: { name: 'Spain', flag: cifEs }, - usage: { - value: 22, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'primary', - }, - payment: { name: 'Google Wallet', icon: cibCcApplePay }, - activity: 'Last week', - }, - { - avatar: { src: avatar6, status: 'danger' }, - user: { - name: 'Friderik Dávid', - new: true, - registered: 'Jan 1, 2023', - }, - country: { name: 'Poland', flag: cifPl }, - usage: { - value: 43, - period: 'Jun 11, 2023 - Jul 10, 2023', - color: 'success', - }, - payment: { name: 'Amex', icon: cibCcAmex }, - activity: 'Last week', - }, - ] - return ( - <> - - Traffic {' & '} Sales - - - - - - - - User - - Country - - Usage - - Payment Method - - Activity - - - - {tableExample.map((item, index) => ( - - - - - -
{item.user.name}
-
- {item.user.new ? 'New' : 'Recurring'} | Registered:{' '} - {item.user.registered} -
-
- - - - -
-
{item.usage.value}%
-
- {item.usage.period} -
-
- -
- - - - -
Last login
-
{item.activity}
-
-
- ))} -
-
-
-
- +
+

Welcome to Admin Sample

+
) }