about summary refs log tree commit diff
path: root/src/lib/hooks/useDesktopRightNavItems.ts
blob: f27efd28f0a4fa20fb7aa7d14a83a0aebcf85e05 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import {useEffect, useState} from 'react'
import {useStores} from 'state/index'
import isEqual from 'lodash.isequal'
import {AtUri} from '@atproto/api'
import {FeedSourceModel} from 'state/models/content/feed-source'

interface RightNavItem {
  uri: string
  href: string
  hostname: string
  collection: string
  rkey: string
  displayName: string
}

export function useDesktopRightNavItems(uris: string[]): RightNavItem[] {
  const store = useStores()
  const [items, setItems] = useState<RightNavItem[]>([])
  const [lastUris, setLastUris] = useState<string[]>([])

  useEffect(() => {
    if (isEqual(uris, lastUris)) {
      // no changes
      return
    }

    async function fetchFeedInfo() {
      const models = uris
        .slice(0, 25)
        .map(uri => new FeedSourceModel(store, uri))
      await Promise.all(models.map(m => m.setup()))
      setItems(
        models.map(model => {
          const {hostname, collection, rkey} = new AtUri(model.uri)
          return {
            uri: model.uri,
            href: model.href,
            hostname,
            collection,
            rkey,
            displayName: model.displayName,
          }
        }),
      )
      setLastUris(uris)
    }
    fetchFeedInfo()
  }, [store, uris, lastUris, setLastUris, setItems])

  return items
}