fix: correct layout interface and enhance user session management

This commit is contained in:
Dayoung 2025-05-12 10:21:01 +09:00
parent c06a96bc1b
commit da0d77724d
12 changed files with 40 additions and 38 deletions

View File

@ -27,7 +27,7 @@ export async function POST(request: Request) {
const session = await getIronSession<SessionData>(cookieStore, sessionOptions)
console.log('start session edit!')
session.userNm = user.username!
// session.email = user.email!
session.email = user.email!
session.isLoggedIn = true
console.log('end session edit!')
await session.save()

View File

@ -18,7 +18,7 @@ interface RootLayoutProps {
header: ReactNode
footer: ReactNode
floatBtn: ReactNode
}
}6
export default async function RootLayout({ children, header, footer, floatBtn }: RootLayoutProps): Promise<ReactNode> {
return (

View File

@ -3,7 +3,6 @@
import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import { usePathname, useRouter, useSearchParams, useParams } from 'next/navigation'
import { useEffect } from 'react'
import { usePopupController } from '@/store/popupController'
export default function NavTab() {
const router = useRouter()
@ -11,6 +10,7 @@ export default function NavTab() {
const searchParams = useSearchParams()
const id = searchParams.get('id')
const isTemp = searchParams.get('isTemp')
const params = useParams()
const detailId = params.id
@ -40,6 +40,10 @@ export default function NavTab() {
const handleRoofInfoClick = () => {
if (id) {
if (isTemp === 'true') {
alert('基本情報が一時保存された状態です。')
return
}
router.push(`/survey-sale/roof-info?id=${id}`)
return
}
@ -48,8 +52,7 @@ export default function NavTab() {
return
}
if (pathname === '/survey-sale/basic-info') {
// TODO: 팝업 추가
alert('Save essential information first')
alert('基本情報を先に保存してください。')
return null
}
}

View File

@ -16,12 +16,12 @@ export default function DataTable() {
const tab = searchParams.get('tab')
const { surveyDetail, isLoadingSurveyDetail } = useServey(Number(id))
const [isTemporary, setIsTemporary] = useState(false)
const [isTemporary, setIsTemporary] = useState(true)
const { setBasicInfoSelected, setRoofInfoSelected } = useSurveySaleTabState()
useEffect(() => {
if (!surveyDetail?.representative || !surveyDetail?.store || !surveyDetail?.construction_point) {
setIsTemporary(true)
if (surveyDetail?.representative && surveyDetail?.store && surveyDetail?.construction_point) {
setIsTemporary(false)
}
if (tab === 'roof-info') {
setRoofInfoSelected()
@ -66,8 +66,9 @@ export default function DataTable() {
<td>
{surveyDetail?.submission_status && surveyDetail?.submission_date ? (
<>
{/* TODO: 제출한 판매점 ID 추가 필요 */}
<div>{new Date(surveyDetail.submission_date).toLocaleString()}</div>
<div> ID </div>
<div> ID...</div>
</>
) : (
'-'

View File

@ -2,29 +2,29 @@
import { useRouter } from 'next/navigation'
import { useServey } from '@/hooks/useSurvey'
export default function DetailButton({ isTemporary, surveyId }: { isTemporary: boolean, surveyId: number }) {
export default function DetailButton({ isTemporary, surveyId }: { isTemporary: boolean; surveyId: number }) {
const router = useRouter()
const { submitSurvey, deleteSurvey } = useServey(surveyId)
const handleSubmit = async () => {
if (isTemporary) {
alert('SAVE FIRST')
alert('一時保存されたデータは提出できません。')
return
}
if (confirm('submit?')) {
if (confirm('提出しますか??')) {
if (surveyId) {
// TODO: 제출 페이지 추가
alert('SUBMIT POPUP')
alert('SUBMIT POPUP!!!!!!!!!!!')
await submitSurvey()
}
}
}
const handleUpdate = () => {
router.push(`/survey-sale/basic-info?id=${surveyId}`)
router.push(`/survey-sale/basic-info?id=${surveyId}&isTemp=${isTemporary}`)
}
const handleDelete = async () => {
if (confirm('delete?')) {
if (confirm('削除しますか?')) {
if (surveyId) {
await deleteSurvey()
router.push('/survey-sale')

View File

@ -7,6 +7,7 @@ import { useState, useEffect } from 'react'
import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import { usePopupController } from '@/store/popupController'
import { useAddressStore } from '@/store/addressStore'
import { useSessionStore } from '@/store/session'
const defaultBasicInfoForm: SurveyBasicRequest = {
representative: '',
@ -78,16 +79,17 @@ export default function BasicForm() {
const handleSave = async (isTemporary: boolean) => {
if (id) {
updateSurvey(basicInfoData)
alert('保存しました。')
router.push(`/survey-sale/${id}?tab=basic-info`)
}
if (isTemporary) {
const saveId = await createSurvey(basicInfoData)
alert('save success temporary id: ' + saveId)
alert('一時保存されました。')
router.push(`/survey-sale/${saveId}?tab=basic-info`)
} else {
if (validateSurvey(basicInfoData)) {
const saveId = await createSurvey(basicInfoData)
alert('save success id: ' + saveId)
alert('保存しました。 登録番号: ' + saveId)
router.push(`/survey-sale/${saveId}?tab=basic-info`)
}
}
@ -109,7 +111,6 @@ export default function BasicForm() {
id="representative"
value={basicInfoData.representative}
onChange={(e) => handleChange('representative', e.target.value)}
required
/>
</div>
<div className="data-input-form-bx">
@ -120,7 +121,6 @@ export default function BasicForm() {
id="store"
value={basicInfoData.store ?? ''}
onChange={(e) => handleChange('store', e.target.value)}
required
/>
</div>
<div className="data-input-form-bx">
@ -131,7 +131,6 @@ export default function BasicForm() {
id="construction_point"
value={basicInfoData.construction_point ?? ''}
onChange={(e) => handleChange('construction_point', e.target.value)}
required
/>
</div>
</div>

View File

@ -73,8 +73,8 @@ export default function RoofInfoForm() {
const handleNumberInput = (key: keyof SurveyDetailRequest, value: number | string) => {
if (key === 'roof_slope' || key === 'open_field_plate_thickness') {
const stringValue = value.toString()
if (stringValue.length > 4) {
alert('over db size')
if (stringValue.length > 5) {
alert('保存できるサイズを超えました。')
return
}
if (stringValue.includes('.')) {
@ -118,17 +118,18 @@ export default function RoofInfoForm() {
surveyId: Number(id),
surveyDetail: updatedBasicInfoData,
})
alert('調査物件を保存しました。')
} catch (error) {
alert(error)
throw new Error('failed to create survey detail: ' + error)
}
alert('created successfully')
router.push(`/survey-sale`)
} else {
alert(emptyField + ' is required')
alert(emptyField + ' は必須項目です。')
focusOnInput(emptyField)
}
} else {
alert('save essential information first')
alert('基本情報を作成した後、屋根情報を作成することができます。')
}
}
const focusOnInput = (field: string) => {

View File

@ -215,16 +215,10 @@ export default function SelectBoxForm({
name={column}
id={column}
onChange={handleSelectChange}
value={
detailInfoData[column]
? detailInfoData[column]
: detailInfoData[`${column}_etc`]
? 'etc'
: ''
}
value={detailInfoData[column] ? detailInfoData[column] : detailInfoData[`${column}_etc`] ? 'etc' : ''}
>
<option value="" hidden>
</option>
{selectBoxOptions[column].map((option) => (
<option key={option.id} value={option.id}>

View File

@ -2,10 +2,11 @@
import LoadMoreButton from '@/components/LoadMoreButton'
import { useServey } from '@/hooks/useSurvey'
import { useEffect, useState, useRef } from 'react'
import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation'
import SearchForm from './SearchForm'
import { useSurveyFilterStore } from '@/store/surveyFilterStore'
import { useSessionStore } from '@/store/session'
export default function ListTable() {
const router = useRouter()
@ -15,6 +16,9 @@ export default function ListTable() {
const [heldSurveyList, setHeldSurveyList] = useState<typeof surveyList>([])
const [hasMore, setHasMore] = useState(false)
const { session } = useSessionStore()
console.log('session:: ', session)
useEffect(() => {
if (surveyList && surveyList.length > 0) {
if (offset === 0) {

View File

@ -1,7 +1,6 @@
'use client'
import { useRouter } from 'next/navigation'
export default function Main() {
const router = useRouter()

View File

@ -60,6 +60,7 @@ export const SEARCH_OPTIONS_PARTNERS = [
},
]
export type MEMBER_TYPE = 'hwj' | 'order' | 'musubi' | 'partner'
export type SEARCH_OPTIONS_ENUM = (typeof SEARCH_OPTIONS)[number]['id']
export type SEARCH_OPTIONS_PARTNERS_ENUM = (typeof SEARCH_OPTIONS_PARTNERS)[number]['id']
export type SORT_OPTIONS_ENUM = 'created' | 'updated'

View File

@ -9,11 +9,11 @@ export interface SessionData {
storeId: null
userId: null
category: null
userNm: null
userNmKana: null
userNm: null | string
userNmKana: null | string
telNo: null
fax: null
email: null
email: null | string
lastEditUser: null
storeGubun: null
pwCurr: null