import { Account } from '@/db' import { TextInput } from 'flowbite-react' import { Entity, MegalodonInterface } from 'megalodon' import { useEffect, useState, useCallback } from 'react' import { FormattedMessage, useIntl } from 'react-intl' import { Virtuoso } from 'react-virtuoso' import Notification from './notification/Notification' type Props = { account: Account client: MegalodonInterface } export default function Notifications(props: Props) { const { formatMessage } = useIntl() const [notifications, setNotifications] = useState>([]) useEffect(() => { const f = async () => { const res = await loadNotifications(props.client) setNotifications(res) } f() }, [props.client]) const loadNotifications = async (client: MegalodonInterface, maxId?: string): Promise> => { let options = { limit: 30 } if (maxId) { options = Object.assign({}, options, { max_id: maxId }) } const res = await client.getNotifications(options) return res.data } const updateStatus = (status: Entity.Status) => { const renew = notifications.map(n => { if (n.status === undefined || n.status === null) { return n } if (n.status.id === status.id) { return Object.assign({}, n, { status }) } else if (n.status.reblog && n.status.reblog.id === status.id) { const s = Object.assign({}, n.status, { reblog: status }) return Object.assign({}, n, { status: s }) } return n }) setNotifications(renew) } const loadMore = useCallback(async () => { console.debug('appending') try { const append = await loadNotifications(props.client, notifications[notifications.length - 1].id) setNotifications(last => [...last, ...append]) } catch (err) { console.error(err) } }, [props.client, notifications, setNotifications]) return (
( )} />
) }