dev #756

Merged
ysCha merged 2 commits from dev into dev-deploy 2026-04-03 16:25:25 +09:00
4 changed files with 26 additions and 22 deletions

View File

@ -3,12 +3,12 @@
import { useState } from 'react' import { useState } from 'react'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { setSession, login } from '@/lib/authActions' import { setSession, login } from '@/lib/authActions'
import Cookies from 'js-cookie'
import { sessionStore } from '@/store/commonAtom' import { sessionStore } from '@/store/commonAtom'
import { useRecoilState } from 'recoil' import { useRecoilState } from 'recoil'
import { useAxios } from '@/hooks/useAxios' import { useAxios } from '@/hooks/useAxios'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import Cookies from 'js-cookie'
import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' import GlobalSpinner from '@/components/common/spinner/GlobalSpinner'

View File

@ -50,6 +50,7 @@ export default function Header(props) {
const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState)
const { closeAll } = usePopup() const { closeAll } = usePopup()
const { logoutProcess } = useLogout()
const { userSession } = props const { userSession } = props
const [sessionState, setSessionState] = useRecoilState(sessionStore) const [sessionState, setSessionState] = useRecoilState(sessionStore)
@ -78,7 +79,6 @@ export default function Header(props) {
const { promiseGet } = useAxios() const { promiseGet } = useAxios()
const { swalFire } = useSwal() const { swalFire } = useSwal()
const { logoutProcess } = useLogout()
/** /**
* 지붕재 목록 Header에서 조회 * 지붕재 목록 Header에서 조회

View File

@ -6,10 +6,9 @@ import { useRecoilState, useRecoilValue } from 'recoil'
import { useAxios } from '@/hooks/useAxios' import { useAxios } from '@/hooks/useAxios'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { login, setSession } from '@/lib/authActions' import { login, setSession } from '@/lib/authActions'
import { useLogout } from '@/hooks/useLogout'
import { useSwal } from '@/hooks/useSwal' import { useSwal } from '@/hooks/useSwal'
import { QcastContext } from '@/app/QcastProvider' import { QcastContext } from '@/app/QcastProvider'
import { useRouter } from 'next/navigation' import { useLogout } from '@/hooks/useLogout'
export default function ChangePasswordPop(props) { export default function ChangePasswordPop(props) {
const globalLocaleState = useRecoilValue(globalLocaleStore) const globalLocaleState = useRecoilValue(globalLocaleStore)
@ -18,10 +17,9 @@ export default function ChangePasswordPop(props) {
const { swalFire } = useSwal() const { swalFire } = useSwal()
const { patch } = useAxios(globalLocaleState) const { patch } = useAxios(globalLocaleState)
const { logoutProcess } = useLogout()
const { getMessage } = useMessage() const { getMessage } = useMessage()
const [sessionState, setSessionState] = useRecoilState(sessionStore) const [sessionState, setSessionState] = useRecoilState(sessionStore)
const router = useRouter() const { logoutProcess } = useLogout()
const formInitValue = { const formInitValue = {
password1: '', password1: '',
password2: '', password2: '',

View File

@ -6,6 +6,11 @@ import { useAxios } from '@/hooks/useAxios'
import { logout } from '@/lib/authActions' import { logout } from '@/lib/authActions'
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
/**
* 로그아웃 처리 Hook
* - 로그아웃 API 호출 성공/실패 상관없이 로그아웃 처리
* - Header, ChangePasswordPop 등에서 공통으로 사용
*/
export function useLogout() { export function useLogout() {
const [sessionState] = useRecoilState(sessionStore) const [sessionState] = useRecoilState(sessionStore)
const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState)
@ -15,23 +20,24 @@ export function useLogout() {
const logoutProcess = async () => { const logoutProcess = async () => {
const param = { const param = {
loginId: sessionState.userId, loginId: sessionState.userId,
requestId: Cookies.get('sessionId'), requestId: Cookies.get('sessionId'), // 로그인 시 저장한 sessionId
} }
// 로그아웃 API 호출 (실패해도 로그아웃 진행)
try {
await promisePost({ url: '/api/login/v1.0/logout', data: param }) await promisePost({ url: '/api/login/v1.0/logout', data: param })
.then(async (res) => { } catch (error) {
if (res.data.result.resultCode === 'S') { console.log('logout api error:', error)
}
// 물건검색 상태 초기화
setStuffSearch({ setStuffSearch({
...stuffSearch, ...stuffSearch,
code: 'DELETE', code: 'DELETE',
}) })
Cookies.remove('sessionId') Cookies.remove('sessionId') // sessionId 쿠키 삭제
await logout() await logout() // iron-session 세션 파기
window.location.href = '/login' window.location.href = '/login' // 로그인 페이지로 이동 (full reload)
}
})
.catch((error) => {
alert(error.response?.data?.message || 'ログアウトに失敗しました。')
})
} }
return { logoutProcess } return { logoutProcess }