@@ -11,11 +11,12 @@ import {
1111 differenceInDays ,
1212 differenceInMonths ,
1313 differenceInWeeks ,
14- differenceInYears ,
14+ differenceInYears , endOfWeek ,
1515 format ,
1616 isAfter ,
17- isBefore , isEqual ,
18- min , parseISO
17+ isBefore , isEqual , isSameWeek ,
18+ min , startOfWeek ,
19+ toDate
1920} from "date-fns" ;
2021import {
2122 createTheme ,
@@ -42,20 +43,16 @@ import {
4243 TimelineOppositeContent ,
4344 TimelineSeparator
4445} from "@mui/lab" ;
45- import { usePathname , useRouter , useSearchParams } from "next/navigation" ;
4646import CustomMilestoneDialog , { CustomMilestoneDialogRef , Milestone } from "@/components/CustomMilestoneDialog" ;
4747import useMilestones from "@/hooks/useMilestones" ;
4848import { twColorToHex } from "@/utils/colorUtil" ;
49- import useStorage from "@/hooks/useStorage" ;
49+ import useStorage , { StorageSchema } from "@/hooks/useStorage" ;
5050
5151export default function Home ( ) {
5252 const [ maxYear , setMaxYear ] = useState ( 80 )
5353 const [ birthday , setBirthday ] = useState < Date | undefined > ( undefined )
5454 const [ unit , setUnit ] = useState ( 12 )
5555 const [ validDate , setValidDate ] = useState ( false )
56- const router = useRouter ( )
57- const searchParams = useSearchParams ( )
58- const pathname = usePathname ( )
5956
6057 const { save, load} = useStorage ( )
6158
@@ -64,7 +61,7 @@ export default function Home() {
6461 } , [ unit , maxYear ] )
6562
6663 const prefersDarkMode = useMediaQuery ( '(prefers-color-scheme: dark)' ) ;
67- const { milestones, addMilestone, removeMilestone, confirmDefaultMilestone} = useMilestones ( )
64+ const { milestones, addMilestone, removeMilestone, confirmDefaultMilestone, getCoveredMilestone } = useMilestones ( )
6865
6966 const theme = useMemo (
7067 ( ) =>
@@ -76,7 +73,7 @@ export default function Home() {
7673 [ prefersDarkMode ] ,
7774 ) ;
7875
79- const handleChangeBirthday = useDebouncedCallback ( ( value ) => {
76+ const handleChangeBirthday = useDebouncedCallback ( ( value : Date | null ) => {
8077 if ( value ) {
8178 setBirthday ( value )
8279 try {
@@ -85,7 +82,7 @@ export default function Home() {
8582 confirmDefaultMilestone ( value )
8683 save ( {
8784 user : {
88- birthday : value
85+ birthday : value . getTime ( )
8986 }
9087 } )
9188 } catch ( e ) {
@@ -120,7 +117,7 @@ export default function Home() {
120117 return days ;
121118 } , [ unit , validDate , birthday , maxYear ] )
122119
123- const getBackgroundColor = useCallback ( ( day : number ) => {
120+ const getBackgroundColors = useCallback ( ( day : number ) => {
124121 // 今天
125122 if ( day === liveDays ) {
126123 return twColorToHex ( 'bg-sky-600' )
@@ -150,23 +147,19 @@ export default function Home() {
150147 break
151148 }
152149 }
153- const colors = milestones . filter ( it => {
154- return isEqual ( it . startDate ! , date ) ||
155- ( isBefore ( date , it . endDate ! ) && isAfter ( date , it . startDate ! ) ) ;
156- } )
150+ const colors = getCoveredMilestone ( date , unit )
157151 . map ( it => twColorToHex ( it . color ) )
158152 if ( colors . length ) {
159153 return colors
160154 }
161155 }
162156
163157 return twColorToHex ( 'bg-green-200' )
164- } , [ liveDays , milestones , birthday , unit ] )
158+ } , [ liveDays , birthday , unit , getCoveredMilestone ] )
165159
166160
167161 const rectangles = useMemo ( ( ) => {
168162 return array . map ( ( it ) => {
169- const backgroundColor = getBackgroundColor ( it )
170163 let date : Date = new Date ( )
171164 if ( validDate && birthday ) {
172165 switch ( unit ) {
@@ -188,14 +181,13 @@ export default function Home() {
188181 }
189182 }
190183 }
184+ const backgroundColor = getBackgroundColors ( it )
191185
192- const validMilestones = milestones . filter ( item =>
193- isEqual ( item . startDate ! , date ) ||
194- ( isBefore ( date , item . endDate || date ) && isAfter ( date , item . startDate || date ) )
195- )
186+ const validMilestones = getCoveredMilestone ( date , unit )
196187 return < Rectangle
197188 key = { it }
198- date = { validDate ? format ( date , 'yyyy-MM-dd' ) : undefined }
189+ date = { validDate ? date : undefined }
190+ unit = { unit }
199191 onClick = { ( ) => {
200192 customMilestoneRef . current ?. open ( {
201193 startDate : date ,
@@ -206,7 +198,7 @@ export default function Home() {
206198 milestones = { validMilestones }
207199 />
208200 } )
209- } , [ getBackgroundColor , array , unit , validDate , birthday , milestones ] )
201+ } , [ getBackgroundColors , array , unit , validDate , birthday , getCoveredMilestone ] )
210202
211203 const aliveDisplay = useMemo ( ( ) => {
212204 if ( validDate && birthday ) {
@@ -258,7 +250,7 @@ export default function Home() {
258250
259251 const timelineItems = useMemo ( ( ) => {
260252 if ( validDate ) {
261- return milestones . filter ( it => it . startDate !== undefined )
253+ return milestones . filter ( it => it . startDate !== undefined && isBefore ( it . startDate , new Date ( ) ) )
262254 . map ( it => {
263255 return {
264256 startDate : it . startDate ,
@@ -271,21 +263,11 @@ export default function Home() {
271263 }
272264 } , [ validDate , milestones ] )
273265
274- const createQueryString = useCallback (
275- ( name : string , value : string ) => {
276- const params = new URLSearchParams ( searchParams )
277- params . set ( name , value )
278-
279- return params . toString ( )
280- } ,
281- [ searchParams ]
282- )
283-
284266 useEffect ( ( ) => {
285267 const data = load ( )
286268 if ( data ?. user ) {
287269 if ( data . user . birthday ) {
288- setBirthday ( parseISO ( data . user . birthday ) )
270+ setBirthday ( toDate ( data . user . birthday ) )
289271 setValidDate ( true )
290272 }
291273 data . user . maxYear && setMaxYear ( data . user . maxYear )
@@ -317,10 +299,11 @@ export default function Home() {
317299 value = { maxYear }
318300 type = 'number'
319301 onChange = { ( e ) => {
320- setMaxYear ( parseInt ( e . target . value ) )
302+ const maxYear = Math . min ( parseInt ( e . target . value ) , 120 )
303+ setMaxYear ( maxYear )
321304 save ( {
322305 user : {
323- maxYear : parseInt ( e . target . value )
306+ maxYear
324307 }
325308 } )
326309 } } />
0 commit comments