about summary refs log tree commit diff
path: root/src/state/queries/nuxs/index.ts
blob: b9650d0579fb30fca84cd0e73f4d17569b974ecf (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import {useMutation, useQueryClient} from '@tanstack/react-query'

import {type AppNux, type Nux} from '#/state/queries/nuxs/definitions'
import {parseAppNux, serializeAppNux} from '#/state/queries/nuxs/util'
import {
  preferencesQueryKey,
  usePreferencesQuery,
} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'

export {Nux} from '#/state/queries/nuxs/definitions'

export function useNuxs():
  | {
      nuxs: AppNux[]
      status: 'ready'
    }
  | {
      nuxs: undefined
      status: 'loading' | 'error'
    } {
  const {data, isSuccess, isError} = usePreferencesQuery()
  const status = isSuccess ? 'ready' : isError ? 'error' : 'loading'

  if (status === 'ready') {
    const nuxs = data?.bskyAppState?.nuxs
      ?.map(parseAppNux)
      ?.filter(Boolean) as AppNux[]

    if (nuxs) {
      return {
        nuxs,
        status,
      }
    } else {
      return {
        nuxs: [],
        status,
      }
    }
  }

  // if (__DEV__) {
  //   const queryClient = useQueryClient()
  //   const agent = useAgent()

  //   // @ts-ignore
  //   window.clearNux = async (ids: string[]) => {
  //     await agent.bskyAppRemoveNuxs(ids)
  //     // triggers a refetch
  //     await queryClient.invalidateQueries({
  //       queryKey: preferencesQueryKey,
  //     })
  //   }
  // }

  return {
    nuxs: undefined,
    status,
  }
}

export function useNux<T extends Nux>(
  id: T,
):
  | {
      nux: Extract<AppNux, {id: T}> | undefined
      status: 'ready'
    }
  | {
      nux: undefined
      status: 'loading' | 'error'
    } {
  const {nuxs, status} = useNuxs()

  if (status === 'ready') {
    const nux = nuxs.find(nux => nux.id === id)

    if (nux) {
      return {
        nux: nux as Extract<AppNux, {id: T}>,
        status,
      }
    } else {
      return {
        nux: undefined,
        status,
      }
    }
  }

  return {
    nux: undefined,
    status,
  }
}

export function useSaveNux() {
  const queryClient = useQueryClient()
  const agent = useAgent()

  return useMutation({
    retry: 3,
    mutationFn: async (nux: AppNux) => {
      await agent.bskyAppUpsertNux(serializeAppNux(nux))
      // triggers a refetch
      await queryClient.invalidateQueries({
        queryKey: preferencesQueryKey,
      })
    },
  })
}

export function useResetNuxs() {
  const queryClient = useQueryClient()
  const agent = useAgent()

  return useMutation({
    retry: 3,
    mutationFn: async (ids: string[]) => {
      await agent.bskyAppRemoveNuxs(ids)
      // triggers a refetch
      await queryClient.invalidateQueries({
        queryKey: preferencesQueryKey,
      })
    },
  })
}