import React, { useState, useRef, useEffect } from 'react' import { NoteModal } from './NoteModal' import { NoteList } from './NoteList' import { Button, Badge } from '@/components/ui' import { FaChevronLeft, FaChevronRight, FaPlus, FaTimes, FaGripVertical, FaChevronUp, FaChevronDown, } from 'react-icons/fa' import { noteService } from '@/services/note.service' import { NoteDto } from '@/proxy/note/models' interface NotePanelProps { entityName: string entityId: string isVisible: boolean onToggle: () => void } export const NotePanel: React.FC = ({ entityName, entityId, isVisible, onToggle, }) => { const [showAddModal, setShowAddModal] = useState(false) const [activities, setActivities] = useState([]) const [buttonPosition, setButtonPosition] = useState({ top: '75%' }) const [isDragging, setIsDragging] = useState(false) const [dragStart, setDragStart] = useState({ y: 0, startTop: 0 }) const buttonRef = useRef(null) const [showEntityInfo, setShowEntityInfo] = useState(false) // Fetch activities const fetchActivities = async () => { try { const res = await noteService.getList({ entityName, entityId }) if (res?.items) setActivities(res.items) } catch (err) { console.error(err) } } useEffect(() => { if (isVisible) fetchActivities() }, [isVisible]) const handleDownloadFile = async (fileData: any) => { if (!fileData?.SavedFileName) return try { await noteService.downloadFile( fileData.SavedFileName, fileData.FileName, fileData.FileType, ) } catch (err) { console.error('Dosya indirilemedi', err) } } const handleDeleteActivity = async (activityId: string) => { if (!confirm('Bu aktiviteyi silmek istediğinize emin misiniz?')) return try { await noteService.delete(activityId) setActivities((prev) => prev.filter((a) => a.id !== activityId)) } catch (err) { console.error(err) } } const getTotalCount = () => activities.length // Draggable button handlers const handleMouseDown = (e: React.MouseEvent) => { if (!buttonRef.current) return e.preventDefault() setIsDragging(true) setDragStart({ y: e.clientY, startTop: buttonRef.current.getBoundingClientRect().top }) } const handleMouseMove = (e: MouseEvent) => { if (!isDragging || !buttonRef.current) return e.preventDefault() const deltaY = e.clientY - dragStart.y const newTop = dragStart.startTop + deltaY const viewportHeight = window.innerHeight const buttonHeight = buttonRef.current.offsetHeight const constrainedTop = Math.max(0, Math.min(viewportHeight - buttonHeight, newTop)) const topPercentage = (constrainedTop / viewportHeight) * 100 setButtonPosition({ top: `${topPercentage}%` }) } const handleMouseUp = () => setIsDragging(false) useEffect(() => { if (isDragging) { document.body.style.userSelect = 'none' document.addEventListener('mousemove', handleMouseMove, { passive: false }) document.addEventListener('mouseup', handleMouseUp) return () => { document.body.style.userSelect = '' document.removeEventListener('mousemove', handleMouseMove) document.removeEventListener('mouseup', handleMouseUp) } } }, [isDragging, dragStart]) if (!entityName || !entityId) return null return ( <> {/* Draggable toggle button */}
{/* Overlay */} {isVisible && (
)} {/* Panel */}
e.stopPropagation()} >
{/* Üst Satır: Başlık, Kayıt Bilgisi Toggle ve Kapat Butonu */}

Notlar

{/* 👇 Kayıt Bilgisi Aç/Kapa Butonu */} {/* Kapat Butonu */}
{/* 👇 Açılır Kayıt Bilgisi İçeriği */}
{entityName}
{/* Alt buton: Not Ekle */}
{/* Modal */} setShowAddModal(false)} onNoteAdded={(act) => setActivities((prev) => [act, ...prev])} /> ) }