11'use client' ;
22
33import * as React from 'react' ;
4- import { useState , useMemo } from 'react' ;
4+ import { useState , useMemo , useRef , useEffect } from 'react' ;
55import { getFormatDatetime } from '../utils/datetime' ;
66import {
77 setCenturyPage ,
@@ -15,6 +15,8 @@ import Controller from './Controller';
1515import ViewDecade from './view/Decade' ;
1616import ViewYear from './view/Year' ;
1717import ViewMonth from './view/Month' ;
18+ import { addLeadingZero } from '../utils/string' ;
19+ import useOutsideClick from '../hooks/useOutsideClick' ;
1820
1921function Container ( ) {
2022 // 인수가 없을 땐 LOCAL 기준 현재 시간을 반환한다.
@@ -26,25 +28,61 @@ function Container() {
2628 const [ viewType , setViewType ] = useState <
2729 'century' | 'decade' | 'year' | 'month'
2830 > ( 'century' ) ;
31+ const [ isVisible , setIsVisible ] = useState < boolean > ( false ) ;
2932
3033 const centuryPage = useMemo ( ( ) => setCenturyPage ( viewDate ) , [ viewDate ] ) ;
3134 const decadePage = useMemo ( ( ) => setDecadePage ( viewDate ) , [ viewDate ] ) ;
3235 const yearPage = useMemo ( ( ) => setYearPage ( viewDate ) , [ viewDate ] ) ;
3336 const monthPage = useMemo ( ( ) => setMonthPage ( viewDate ) , [ viewDate ] ) ;
37+ const container = useRef ( null ) ;
38+
39+ useOutsideClick ( container , ( ) => {
40+ setIsVisible ( false ) ;
41+ } ) ;
3442
3543 const setViewDateByType = (
36- value : string ,
44+ value : string | number ,
3745 type : 'year' | 'month' | 'date'
3846 ) => {
39- const split = viewDate . split ( '-' ) ;
47+ type Tsplit = string | number ;
48+ const split = viewDate . split ( '-' ) as [ Tsplit , Tsplit , Tsplit ] ;
49+ const valueNum = Number ( value ) ;
4050
41- if ( type === 'year' ) split [ 0 ] = value ;
42- if ( type === 'month' ) split [ 1 ] = value ;
43- if ( type === 'date' ) split [ 2 ] = value ;
51+ if ( type === 'year' ) {
52+ if ( valueNum < 1 ) {
53+ split [ 0 ] = 1 ;
54+ } else {
55+ split [ 0 ] = valueNum ;
56+ }
57+ }
58+ if ( type === 'month' ) {
59+ if ( valueNum === 0 ) {
60+ if ( Number ( split [ 0 ] ) > 1 ) {
61+ split [ 0 ] = Number ( split [ 0 ] ) - 1 ;
62+ split [ 1 ] = 12 ;
63+ }
64+ } else if ( valueNum === 13 ) {
65+ split [ 0 ] = Number ( split [ 0 ] ) + 1 ;
66+ split [ 1 ] = 1 ;
67+ } else {
68+ split [ 1 ] = valueNum ;
69+ }
70+ split [ 1 ] = addLeadingZero ( split [ 1 ] ) ;
71+ }
72+ if ( type === 'date' ) split [ 2 ] = addLeadingZero ( valueNum ) ;
4473
4574 setViewDate ( split . join ( '-' ) ) ;
4675 } ;
4776
77+ const handleFocus = ( ) => {
78+ console . log ( 'handleFocus' ) ;
79+ setIsVisible ( true ) ;
80+ } ;
81+
82+ useEffect ( ( ) => {
83+ setIsVisible ( false ) ;
84+ } , [ activeDate ] ) ;
85+
4886 // const [centuryPage, setCenturyPage] = useState<number>(0);
4987 // const [decadePage, setDecadePage] = useState<number>(0);
5088 // const [yearPage, setYearPage] = useState<number>(0);
@@ -56,49 +94,51 @@ function Container() {
5694 // yearPage 2041
5795 // monthPage 24487
5896
59- console . log ( NEW_DATE ) ;
60-
6197 return (
6298 < div className = { `${ NAME_SPACE } __wrapper` } >
6399 < div className = { `${ NAME_SPACE } __input-container` } >
64100 < input
65101 type = "text"
66102 value = { getFormatDatetime ( activeDate , 'YYYY-MM-DD' ) }
67103 readOnly
104+ onFocus = { handleFocus }
68105 />
69106 </ div >
70- < div className = { `${ NAME_SPACE } __datepicker-container` } >
71- < Controller
72- viewType = { viewType }
73- setViewType = { setViewType }
74- viewDate = { viewDate }
75- />
76- < div className = { `${ NAME_SPACE } __datepicker` } >
77- { viewType === 'month' && (
78- < ViewMonth monthPage = { monthPage } setActiveDate = { setActiveDate } />
79- ) }
80- { viewType === 'year' && (
81- < ViewYear
82- setViewDateByType = { setViewDateByType }
83- setViewType = { setViewType }
84- />
85- ) }
86- { viewType === 'decade' && (
87- < ViewDecade
88- decadePage = { decadePage }
89- setViewDateByType = { setViewDateByType }
90- setViewType = { setViewType }
91- />
92- ) }
93- { viewType === 'century' && (
94- < ViewCentury
95- centuryPage = { centuryPage }
96- setViewDateByType = { setViewDateByType }
97- setViewType = { setViewType }
98- />
99- ) }
107+ { isVisible && (
108+ < div className = { `${ NAME_SPACE } __datepicker-container` } ref = { container } >
109+ < Controller
110+ viewType = { viewType }
111+ setViewType = { setViewType }
112+ viewDate = { viewDate }
113+ setViewDateByType = { setViewDateByType }
114+ />
115+ < div className = { `${ NAME_SPACE } __datepicker` } >
116+ { viewType === 'month' && (
117+ < ViewMonth monthPage = { monthPage } setActiveDate = { setActiveDate } />
118+ ) }
119+ { viewType === 'year' && (
120+ < ViewYear
121+ setViewDateByType = { setViewDateByType }
122+ setViewType = { setViewType }
123+ />
124+ ) }
125+ { viewType === 'decade' && (
126+ < ViewDecade
127+ decadePage = { decadePage }
128+ setViewDateByType = { setViewDateByType }
129+ setViewType = { setViewType }
130+ />
131+ ) }
132+ { viewType === 'century' && (
133+ < ViewCentury
134+ centuryPage = { centuryPage }
135+ setViewDateByType = { setViewDateByType }
136+ setViewType = { setViewType }
137+ />
138+ ) }
139+ </ div >
100140 </ div >
101- </ div >
141+ ) }
102142 < div
103143 className = "dashboard"
104144 style = { {
0 commit comments