1
1
"use client" ;
2
2
3
3
import { Button } from "@/components/ui/button" ;
4
- import { Input } from "@/components/ui/input" ;
5
4
import { auth } from "@/firebase/client-app" ;
6
5
import { createEvent , readEvents } from "@/lib/events" ;
7
6
import { createNotification } from "@/lib/notifications" ;
@@ -17,21 +16,17 @@ import {
17
16
subMonths ,
18
17
} from "date-fns" ;
19
18
import { ja } from "date-fns/locale" ;
20
- import { AnimatePresence , motion , useDragControls } from "framer-motion" ;
21
19
import {
22
20
ChevronLeft ,
23
21
ChevronRight ,
24
- ChevronUp ,
25
- X ,
26
22
} from "lucide-react" ;
27
23
import { useRouter } from "next/navigation" ;
28
- import { useEffect , useMemo , useRef , useState } from "react" ;
24
+ import { useEffect , useMemo , useState } from "react" ;
29
25
import { generateStickyNoteServer } from "./actions" ;
30
26
import { Event , Todo , StickyNote } from "@/components/types" ;
31
27
import { Navigation } from "@/components/navigation" ;
32
28
import { EditWantodoDialog } from "@/components/edit-wantodo-dialog" ;
33
29
import { CreateEventDialog } from "@/components/create-event-dialog" ;
34
- import { StickyNoteItem } from "@/components/sticky-note-item" ;
35
30
import { CalendarRenderer } from "@/components/calendar-renderer" ;
36
31
import { WantodoView } from "@/components/wantodo-view" ;
37
32
@@ -42,10 +37,6 @@ export default function Home() {
42
37
const [ newStickyNote , setNewStickyNote ] = useState ( "" ) ;
43
38
const [ selectedDate , setSelectedDate ] = useState < Date > ( new Date ( ) ) ;
44
39
const [ currentMonth , setCurrentMonth ] = useState ( new Date ( ) ) ;
45
- const [ isModalOpen , setIsModalOpen ] = useState ( false ) ;
46
- const [ modalState , setModalState ] = useState <
47
- "minimized" | "partial" | "full"
48
- > ( "partial" ) ;
49
40
const [ searchTerm , setSearchTerm ] = useState ( "" ) ;
50
41
const [ editingStickyNote , setEditingStickyNote ] = useState < StickyNote | null > (
51
42
null ,
@@ -58,8 +49,6 @@ export default function Home() {
58
49
const [ removedStickyNote , setRemovedStickyNote ] = useState < StickyNote | null > (
59
50
null ,
60
51
) ;
61
- const dragControls = useDragControls ( ) ;
62
- const modalRef = useRef < HTMLDivElement > ( null ) ;
63
52
const router = useRouter ( ) ;
64
53
65
54
useEffect ( ( ) => {
@@ -204,14 +193,6 @@ export default function Home() {
204
193
) ;
205
194
} , [ stickyNotes , searchTerm ] ) ;
206
195
207
- const handleStatusBarClick = ( ) => {
208
- setModalState ( ( prevState ) => {
209
- if ( prevState === "minimized" ) return "partial" ;
210
- if ( prevState === "partial" ) return "full" ;
211
- return "partial" ;
212
- } ) ;
213
- } ;
214
-
215
196
return (
216
197
< div
217
198
className = { `relative h-screen bg-gray-100 dark:bg-gray-900 overflow-hidden ${ isDarkMode ? "dark" : "" } ` }
@@ -267,144 +248,6 @@ export default function Home() {
267
248
</ div >
268
249
</ div >
269
250
270
- < AnimatePresence >
271
- { isModalOpen && (
272
- < motion . div
273
- initial = { { opacity : 0 } }
274
- animate = { {
275
- opacity : modalState === "minimized" ? 0 : 1 ,
276
- } }
277
- exit = { { opacity : 0 } }
278
- className = "fixed inset-0 bg-black flex items-end justify-center z-50 lg:hidden"
279
- style = { {
280
- backgroundColor :
281
- modalState === "minimized"
282
- ? "transparent"
283
- : "rgba(0, 0, 0, 0.5)" ,
284
- pointerEvents : modalState === "minimized" ? "none" : "auto" ,
285
- } }
286
- onClick = { ( e ) => {
287
- if ( e . target === e . currentTarget && modalState !== "minimized" ) {
288
- setIsModalOpen ( false ) ;
289
- }
290
- } }
291
- >
292
- < motion . div
293
- ref = { modalRef }
294
- initial = { { y : "100%" } }
295
- animate = { {
296
- y :
297
- modalState === "minimized"
298
- ? "calc(100% - 40px)"
299
- : modalState === "partial"
300
- ? "calc(100% - 400px)"
301
- : "0%" ,
302
- height :
303
- modalState === "full"
304
- ? "100%"
305
- : modalState === "partial"
306
- ? "400px"
307
- : "40px" ,
308
- transition : {
309
- type : "spring" ,
310
- damping : 30 ,
311
- stiffness : 300 ,
312
- } ,
313
- } }
314
- exit = { { y : "100%" } }
315
- transition = { { type : "spring" , damping : 25 , stiffness : 500 } }
316
- drag = "y"
317
- dragControls = { dragControls }
318
- dragConstraints = { { top : 0 , bottom : 0 } }
319
- dragElastic = { 0.2 }
320
- onDragEnd = { ( _ , info ) => {
321
- if ( info . offset . y > 200 ) {
322
- setIsModalOpen ( false ) ;
323
- } else if ( info . offset . y < - 20 ) {
324
- setModalState ( "full" ) ;
325
- } else if ( info . offset . y > 20 && info . offset . y <= 100 ) {
326
- setModalState ( "partial" ) ;
327
- } else if ( info . offset . y > 100 ) {
328
- setModalState ( "minimized" ) ;
329
- }
330
- } }
331
- className = "bg-white dark:bg-gray-800 w-full sm:w-96 md:w-[512px] rounded-t-xl shadow-lg overflow-hidden"
332
- style = { {
333
- maxWidth : "calc(100% - 2rem)" ,
334
- margin : "0 1rem" ,
335
- height : modalState === "full" ? "calc(100% - 2rem)" : "auto" ,
336
- maxHeight : "calc(100% - 2rem)" ,
337
- zIndex : 60 ,
338
- } }
339
- >
340
- < div
341
- className = "h-10 flex items-center justify-start cursor-pointer overflow-x-auto whitespace-nowrap px-4"
342
- onClick = { handleStatusBarClick }
343
- onPointerDown = { ( e ) => dragControls . start ( e ) }
344
- >
345
- < ChevronUp className = "h-6 w-6 text-gray-400 flex-shrink-0" />
346
- < span className = "ml-2 text-sm text-gray-600 dark:text-gray-300" >
347
- { format ( selectedDate , "yyyy年MM月dd日" , { locale : ja } ) }
348
- のwanTODO
349
- </ span >
350
- { filteredStickyNotes . length > 0 && (
351
- < span className = "ml-2 text-sm text-gray-600 dark:text-gray-300" >
352
- ({ filteredStickyNotes . length } 件)
353
- </ span >
354
- ) }
355
- </ div >
356
- < div
357
- className = "p-4 overflow-y-auto"
358
- style = { { maxHeight : "calc(100% - 40px)" } }
359
- >
360
- < div className = "flex justify-between items-center mb-4" >
361
- < h3 className = "text-lg font-semibold dark:text-white" >
362
- { format ( selectedDate , "yyyy年MM月dd日" , { locale : ja } ) }
363
- のwanTODO
364
- </ h3 >
365
- < Button
366
- variant = "ghost"
367
- size = "icon"
368
- onClick = { ( ) => setIsModalOpen ( false ) }
369
- >
370
- < X className = "h-6 w-6" />
371
- </ Button >
372
- </ div >
373
- < div className = "space-y-4" >
374
- < Input
375
- type = "text"
376
- value = { newStickyNote }
377
- onChange = { ( e ) => setNewStickyNote ( e . target . value ) }
378
- placeholder = "新しいwanTODOのタイトルを入力"
379
- className = "w-full"
380
- />
381
- < Button onClick = { addStickyNote } className = "w-full" >
382
- 追加
383
- </ Button >
384
- { filteredStickyNotes . length > 0 ? (
385
- < div className = "grid grid-cols-1 gap-4" >
386
- { filteredStickyNotes . map ( ( note ) => (
387
- < StickyNoteItem
388
- key = { note . id } note = { note }
389
- setDraggedStickyNote = { setDraggedStickyNote }
390
- generateStickyNote = { generateStickyNote }
391
- editStickyNote = { editStickyNote }
392
- deleteStickyNote = { deleteStickyNote }
393
- />
394
- ) ) }
395
- </ div >
396
- ) : (
397
- < p className = "dark:text-gray-300" >
398
- この日のwanTODOはありません。
399
- </ p >
400
- ) }
401
- </ div >
402
- </ div >
403
- </ motion . div >
404
- </ motion . div >
405
- ) }
406
- </ AnimatePresence >
407
-
408
251
< EditWantodoDialog
409
252
editingStickyNote = { editingStickyNote }
410
253
setEditingStickyNote = { setEditingStickyNote }
0 commit comments