1
0
mirror of https://github.com/h3poteto/whalebird-desktop synced 2024-12-27 01:05:21 +01:00
Whalebird-desktop-client-ma.../renderer/components/timelines/FollowRequests.tsx
2024-10-12 14:46:04 +09:00

76 lines
2.2 KiB
TypeScript

import { Entity, MegalodonInterface } from 'megalodon'
import { useRouter } from 'next/router'
import { useEffect, useState } from 'react'
import { FormattedMessage } from 'react-intl'
import User from './followRequests/User'
import Detail from '../detail/Detail'
import { Account } from '@/db'
import { useUnreads } from '@/provider/unreads'
type Props = {
client: MegalodonInterface
account: Account
openMedia: (media: Array<Entity.Attachment>, index: number) => void
}
export default function FollowRequests(props: Props) {
const router = useRouter()
const { setUnreads } = useUnreads()
const [requests, setRequests] = useState<Array<Entity.FollowRequest | Entity.Account>>([])
useEffect(() => {
refreshRequests()
}, [])
const refreshRequests = async () => {
const res = await props.client.getFollowRequests()
setRequests(res.data)
return res.data
}
const updateUnreads = (length: number) => {
setUnreads(current =>
Object.assign({}, current, {
[`${props.account.id?.toString()}_follow_requests`]: length
})
)
}
const timelineClass = () => {
if (router.query.detail) {
return 'timeline-with-drawer'
}
return 'timeline'
}
return (
<>
<div className="flex timeline-wrapper">
<section className={`h-full ${timelineClass()}`}>
<div className="w-full theme-bg theme-text-primary p-2 flex justify-between">
<div className="text-lg font-bold cursor-pointer">
<FormattedMessage id="timeline.follow_requests" />
</div>
</div>
<div className="timeline overflow-y-auto w-full overflow-x-hidden" style={{ height: 'calc(100% - 44px)' }}>
{requests.map(r => (
<>
<User
key={r.id}
user={r}
client={props.client}
refresh={async () => {
const data = await refreshRequests()
updateUnreads(data.length)
}}
/>
</>
))}
</div>
</section>
<Detail client={props.client} account={props.account} className="detail" openMedia={props.openMedia} />
</div>
</>
)
}