'use client'
import React, { useEffect, useState } from 'react'
import { Button } from '@nextui-org/react'
import { useAxios } from '@/hooks/useAxios'
import { useRecoilState } from 'recoil'
import { customSettingsState } from '@/store/canvasAtom'
import { modalContent, modalState } from '@/store/modalAtom'
import ColorPicker from './common/color-picker/ColorPicker'
export default function Settings() {
const [objectNo, setObjectNo] = useState('test123240829010')
const [error, setError] = useState(null)
const [customSettings, setCustomSettings] = useRecoilState(customSettingsState)
const [color, setColor] = useState('#ff0000')
const [open, setOpen] = useRecoilState(modalState)
const [contents, setContent] = useRecoilState(modalContent)
const { get, post } = useAxios()
const handleSavePopup = () => {
console.log('color ', color)
}
const handleClosePopup = () => {
setContent('')
setOpen(false)
console.log('colorSetting ', color)
}
const colorSetting = (
<>
React ColorPicker
{color}
>
)
const customStyles = {
overlay: {
backgroundColor: 'rgba(0,0,0,0.5)',
},
content: {
width: '300px',
height: '400px',
margin: 'auto',
borderRadius: '4px',
boxShadow: '0 2px 4px rgba(0,0,0,0.2)',
padding: '20px',
},
}
// 상태를 하나의 객체로 관리
const [settings, setSettings] = useState({
display1: Array(11).fill(false), // 화면 표시1
display2: Array(3).fill(false), // 화면 표시2
rangeSetting: 0, // 흡착 범위 설정
gridSettings: Array(5).fill(false), // 그리드 설정
})
const gridItems = {
display1: [
'할당 표시',
'도면 표시',
'그리드 표시',
'문자 표시',
'흐름방향 표시',
'복도치수 표시',
'실제치수 표시',
'치수 표시 없음',
'가대 표시',
'좌표 표시',
'도면전환 표시',
],
display2: ['테두리만', '라인해치', 'All Painted'],
rangeSetting: ['극소', '소', '중', '대'],
gridSettings: ['임의 그리드', '실선 그리드', '점 그리드', '그리드 색 설정', '흡착점 추가'],
}
// 초기 조회
useEffect(() => {
if (!objectNo) {
alert('object_no를 입력하세요.')
}
}, [])
// 클릭 시 상태 변경 함수
const handleToggle = (type, index) => {
// '실선 그리드' 클릭 시 팝업 열기
if (type === 'gridSettings' && gridItems.gridSettings[index] === '실선 그리드') {
//openGridPopup()
}
// '그리드 색 설정' 클릭 시 팝업 열기
if (type === 'gridSettings' && gridItems.gridSettings[index] === '그리드 색 설정') {
//setSelectedGridSetting(gridItems.gridSettings[index])
//setIsPopupOpen(true)
//return prevSettings // 설정은 변경하지 않음
setOpen(true)
setContent({ ...colorSetting })
}
setSettings((prevSettings) => {
// prevSettings[type]이 배열인지 확인하고, 그렇지 않은 경우 빈 배열로 초기화
let updated = Array.isArray(prevSettings[type]) ? [...prevSettings[type]] : []
if (type === 'rangeSetting') {
return { ...prevSettings, [type]: index }
}
updated[index] = updated[index] === false ? true : false
return { ...prevSettings, [type]: updated }
})
}
// '실선 그리드' 클릭 시 팝업을 열기 위한 함수
const openGridPopup = () => {
const popupWidth = 500
const popupHeight = 300
// 팝업 창 위치를 화면 중앙으로 조정하기 위해 계산
const left = window.innerWidth / 2 - popupWidth / 2
const top = window.innerHeight / 2 - popupHeight / 2
// 새 창 열기
window
.open
//'./components/intro', // 팝업으로 띄울 페이지의 URL
//'_blank', // 새 창으로 열기
//`width=${popupWidth},height=${popupHeight},top=${top},left=${left}`, // 크기와 위치 지정
()
}
// Canvas Setting 조회 및 초기화
const handleSelect = async () => {
try {
if (!objectNo) {
alert('object_no를 입력하세요.')
return
}
const res = await get({ url: `/api/canvas-management/canvas-settings/by-object/${objectNo}` })
// 데이터가 없는 경우
if (!res) {
console.warn('조회 결과가 없습니다.')
// 기본값을 설정하거나 사용자에게 알림 표시
setSettings({
display1: Array(11).fill(false), // 화면 표시1 기본값
display2: Array(3).fill(false), // 화면 표시2 기본값
rangeSetting: 0, // 흡착 범위 설정 기본값
gridSettings: Array(5).fill(false), // 그리드 설정 기본값
})
alert('조회된 데이터가 없습니다. 기본 설정이 적용됩니다.')
return // 이후 코드 실행을 중단
}
const data = {
display1: [
res.assignDisplay,
res.drawDisplay,
res.gridDisplay,
res.charDisplay,
res.flowDisplay,
res.hallwayDimenDisplay,
res.actualDimenDisplay,
res.noDimenDisplay,
res.trestleDisplay,
res.coordiDisplay,
res.drawConverDisplay,
],
display2: [res.onlyBorder, res.lineHatch, res.allPainted],
rangeSetting: res.adsorpRangeSetting,
gridSettings: [res.randomGrid, res.solidGrid, res.dotGrid, res.gridColorSet, res.adsorpPointAdd],
}
// 데이터 설정
setSettings({
display1: data.display1,
display2: data.display2,
rangeSetting: data.rangeSetting,
gridSettings: data.gridSettings,
})
} catch (error) {
console.error('Data fetching error:', error)
}
}
// Canvas Setting 저장
const handleSubmit = async () => {
if (!objectNo) {
alert('object_no를 입력하세요.')
return
}
const patternData = {
objectNo,
assignDisplay: settings.display1[0],
drawDisplay: settings.display1[1],
gridDisplay: settings.display1[2],
charDisplay: settings.display1[3],
flowDisplay: settings.display1[4],
hallwayDimenDisplay: settings.display1[5],
actualDimenDisplay: settings.display1[6],
noDimenDisplay: settings.display1[7],
trestleDisplay: settings.display1[8],
coordiDisplay: settings.display1[9],
drawConverDisplay: settings.display1[10],
onlyBorder: settings.display2[0],
lineHatch: settings.display2[1],
allPainted: settings.display2[2],
adsorpRangeSetting: settings.rangeSetting,
randomGrid: settings.gridSettings[0],
solidGrid: settings.gridSettings[1],
dotGrid: settings.gridSettings[2],
gridColorSet: settings.gridSettings[3],
adsorpPointAdd: settings.gridSettings[4],
}
console.log('patternData', patternData)
await post({ url: `/api/canvas-management/canvas-settings`, data: patternData })
//Recoil 설정
setCustomSettings({ ...patternData })
// 저장 후 재조회
await handleSelect()
}
return (
<>
setObjectNo(e.target.value)} />
[디스플레이 설정]
* 도면에 표시할 항목을 클릭하면 적용 됩니다.
{gridItems.display1.map((item, index) => (
handleToggle('display1', index)}
>
{settings.display1[index]} {item}
))}
* 화면 표시
{gridItems.display2.map((item, index) => (
handleToggle('display2', index)}
>
{settings.display2[index]} {item}
))}
[글꼴/도면크기 설정]
* 글꼴 및 크기 변경
문자 글꼴 변경
흐름방향 글꼴 변경
치수 글꼴 변경
회로번호 글꼴 변경
``
* 흡착 범위 설정
{gridItems.rangeSetting.map((item, index) => (
handleToggle('rangeSetting', index)}
>
{item}
))}
[그리드 설정]
{gridItems.gridSettings.map((item, index) => (
handleToggle('gridSettings', index)}
>
{settings.gridSettings[index]} {item}
))}
>
)
}