import { useCallback, useContext, useEffect, useState, useRef } from 'react'
import PropTypes from 'prop-types'
import {
Card,
Button,
Space,
Typography,
Flex,
Modal,
Spin,
Alert,
Dropdown
} from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import PlusIcon from '../../Icons/PlusIcon'
import { AuthContext } from '../context/AuthContext'
import { ApiServerContext } from '../context/ApiServerContext'
import InfoCircleIcon from '../../Icons/InfoCircleIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
import NewNote from '../Management/Notes/NewNote'
import NoteItem from './NoteItem'
const { Text } = Typography
const NotesPanel = ({ _id, type }) => {
const [newNoteOpen, setNewNoteOpen] = useState(false)
const [loading, setLoading] = useState(true)
const [initialized, setInitialized] = useState(false)
const [error, setError] = useState(null)
const [notes, setNotes] = useState(null)
const [expandedNotes, setExpandedNotes] = useState({})
const subscribeToObjectTypeUpdatesRef = useRef(null)
const { token } = useContext(AuthContext)
const { fetchNotes, connected, subscribeToObjectTypeUpdates } =
useContext(ApiServerContext)
const fetchData = useCallback(
async (id) => {
try {
const newData = await fetchNotes(id)
return newData
} catch (error) {
setError(error)
return null
}
},
[fetchNotes]
)
const generateNotes = useCallback(
async (id) => {
const notesData = await fetchData(id)
setLoading(false)
if (notesData == null) {
return null
}
if (notesData.length <= 0) {
return (
No notes added.
)
}
return notesData.map((note) => (
))
},
[fetchData, expandedNotes]
)
const handleReloadData = useCallback(async () => {
setNotes(await generateNotes(_id))
}, [_id, generateNotes])
useEffect(() => {
if (connected == true && subscribeToObjectTypeUpdatesRef.current == null) {
subscribeToObjectTypeUpdatesRef.current = subscribeToObjectTypeUpdates(
'note',
(noteData) => {
if (noteData.parent._id == _id) {
handleReloadData()
}
}
)
}
return () => {
if (connected == true && subscribeToObjectTypeUpdatesRef.current) {
subscribeToObjectTypeUpdatesRef.current()
subscribeToObjectTypeUpdatesRef.current = null
}
}
}, [_id, subscribeToObjectTypeUpdates, connected, handleReloadData])
useEffect(() => {
if (connected == true && token != null && !initialized) {
handleReloadData()
setInitialized(true)
}
}, [token, handleReloadData, initialized, connected])
const actionItems = {
items: [
{
label: 'New Note',
key: 'newNote',
icon:
},
{ type: 'divider' },
{
label: 'Reload Notes',
key: 'reloadNotes',
icon:
}
],
onClick: ({ key }) => {
if (key === 'reloadNotes') {
setLoading(true)
handleReloadData()
} else if (key === 'newNote') {
setNewNoteOpen(true)
}
}
}
return (
}
disabled={loading}
onClick={() => {
setNewNoteOpen(true)
}}
/>
} spinning={loading}>
{error ? (
) : (
{notes}
)}
{
setNewNoteOpen(false)
}}
>
{
setNewNoteOpen(false)
}}
reset={newNoteOpen}
defaultValues={{
parent: { _id },
parentType: type
}}
/>
)
}
NotesPanel.propTypes = {
_id: PropTypes.string.isRequired,
type: PropTypes.string.isRequired,
onNewNote: PropTypes.func
}
export default NotesPanel