about summary refs log tree commit diff
path: root/src/state/queries/video/video-upload.shared.ts
blob: 6b633bf213e8fef30568272a55da124ffa4b1474 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import {useCallback} from 'react'
import {msg} from '@lingui/macro'
import {useLingui} from '@lingui/react'

import {VIDEO_SERVICE_DID} from '#/lib/constants'
import {UploadLimitError} from '#/lib/media/video/errors'
import {getServiceAuthAudFromUrl} from '#/lib/strings/url-helpers'
import {useAgent} from '#/state/session'
import {useVideoAgent} from './util'

export function useServiceAuthToken({
  aud,
  lxm,
  exp,
}: {
  aud?: string
  lxm: string
  exp?: number
}) {
  const agent = useAgent()

  return useCallback(async () => {
    const pdsAud = getServiceAuthAudFromUrl(agent.dispatchUrl)

    if (!pdsAud) {
      throw new Error('Agent does not have a PDS URL')
    }

    const {data: serviceAuth} = await agent.com.atproto.server.getServiceAuth({
      aud: aud ?? pdsAud,
      lxm,
      exp,
    })

    return serviceAuth.token
  }, [agent, aud, lxm, exp])
}

export function useVideoUploadLimits() {
  const agent = useVideoAgent()
  const getToken = useServiceAuthToken({
    lxm: 'app.bsky.video.getUploadLimits',
    aud: VIDEO_SERVICE_DID,
  })
  const {_} = useLingui()

  return useCallback(async () => {
    const {data: limits} = await agent.app.bsky.video
      .getUploadLimits(
        {},
        {headers: {Authorization: `Bearer ${await getToken()}`}},
      )
      .catch(err => {
        if (err instanceof Error) {
          throw new UploadLimitError(err.message)
        } else {
          throw err
        }
      })

    if (!limits.canUpload) {
      if (limits.message) {
        throw new UploadLimitError(limits.message)
      } else {
        throw new UploadLimitError(
          _(
            msg`You have temporarily reached the limit for video uploads. Please try again later.`,
          ),
        )
      }
    }
  }, [agent, _, getToken])
}