parent
cff7cbb4aa
commit
ae71f5ce84
|
@ -52,7 +52,7 @@
|
||||||
"open-analyzer": "EXPO_PUBLIC_OPEN_ANALYZER=1 yarn build-web"
|
"open-analyzer": "EXPO_PUBLIC_OPEN_ANALYZER=1 yarn build-web"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@atproto/api": "0.13.5",
|
"@atproto/api": "^0.13.7",
|
||||||
"@bam.tech/react-native-image-resizer": "^3.0.4",
|
"@bam.tech/react-native-image-resizer": "^3.0.4",
|
||||||
"@braintree/sanitize-url": "^6.0.2",
|
"@braintree/sanitize-url": "^6.0.2",
|
||||||
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
|
"@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet",
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
import zod from 'zod'
|
||||||
|
|
||||||
|
import {BaseNux} from '#/state/queries/nuxs/types'
|
||||||
|
|
||||||
|
export enum Nux {
|
||||||
|
One = 'one',
|
||||||
|
Two = 'two',
|
||||||
|
}
|
||||||
|
|
||||||
|
export const nuxNames = new Set(Object.values(Nux))
|
||||||
|
|
||||||
|
export type AppNux =
|
||||||
|
| BaseNux<{
|
||||||
|
id: Nux.One
|
||||||
|
data: {
|
||||||
|
likes: number
|
||||||
|
}
|
||||||
|
}>
|
||||||
|
| BaseNux<{
|
||||||
|
id: Nux.Two
|
||||||
|
data: undefined
|
||||||
|
}>
|
||||||
|
|
||||||
|
export const NuxSchemas = {
|
||||||
|
[Nux.One]: zod.object({
|
||||||
|
likes: zod.number(),
|
||||||
|
}),
|
||||||
|
[Nux.Two]: undefined,
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
import {useMutation, useQueryClient} from '@tanstack/react-query'
|
||||||
|
|
||||||
|
import {AppNux, 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() {
|
||||||
|
const {data, ...rest} = usePreferencesQuery()
|
||||||
|
|
||||||
|
if (data && rest.isSuccess) {
|
||||||
|
const nuxs = data.bskyAppState.nuxs
|
||||||
|
?.map(parseAppNux)
|
||||||
|
?.filter(Boolean) as AppNux[]
|
||||||
|
|
||||||
|
if (nuxs) {
|
||||||
|
return {
|
||||||
|
nuxs,
|
||||||
|
...rest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
nuxs: undefined,
|
||||||
|
...rest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useNux<T extends Nux>(id: T) {
|
||||||
|
const {nuxs, ...rest} = useNuxs()
|
||||||
|
|
||||||
|
if (nuxs && rest.isSuccess) {
|
||||||
|
const nux = nuxs.find(nux => nux.id === id)
|
||||||
|
|
||||||
|
if (nux) {
|
||||||
|
return {
|
||||||
|
nux: nux as Extract<AppNux, {id: T}>,
|
||||||
|
...rest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
nux: undefined,
|
||||||
|
...rest,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useUpsertNuxMutation() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const agent = useAgent()
|
||||||
|
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: async (nux: AppNux) => {
|
||||||
|
await agent.bskyAppUpsertNux(serializeAppNux(nux))
|
||||||
|
// triggers a refetch
|
||||||
|
await queryClient.invalidateQueries({
|
||||||
|
queryKey: preferencesQueryKey,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useRemoveNuxsMutation() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const agent = useAgent()
|
||||||
|
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: async (ids: string[]) => {
|
||||||
|
await agent.bskyAppRemoveNuxs(ids)
|
||||||
|
// triggers a refetch
|
||||||
|
await queryClient.invalidateQueries({
|
||||||
|
queryKey: preferencesQueryKey,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import {AppBskyActorDefs} from '@atproto/api'
|
||||||
|
|
||||||
|
export type Data = Record<string, unknown> | undefined
|
||||||
|
|
||||||
|
export type BaseNux<
|
||||||
|
T extends Pick<AppBskyActorDefs.Nux, 'id' | 'expiresAt'> & {data: Data},
|
||||||
|
> = T & {
|
||||||
|
completed: boolean
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
import {AppBskyActorDefs, nuxSchema} from '@atproto/api'
|
||||||
|
|
||||||
|
import {
|
||||||
|
AppNux,
|
||||||
|
Nux,
|
||||||
|
nuxNames,
|
||||||
|
NuxSchemas,
|
||||||
|
} from '#/state/queries/nuxs/definitions'
|
||||||
|
|
||||||
|
export function parseAppNux(nux: AppBskyActorDefs.Nux): AppNux | undefined {
|
||||||
|
if (!nuxNames.has(nux.id as Nux)) return
|
||||||
|
if (!nuxSchema.safeParse(nux).success) return
|
||||||
|
|
||||||
|
const {data, ...rest} = nux
|
||||||
|
|
||||||
|
const schema = NuxSchemas[nux.id as Nux]
|
||||||
|
|
||||||
|
if (schema && data) {
|
||||||
|
const parsedData = JSON.parse(data)
|
||||||
|
|
||||||
|
if (!schema.safeParse(parsedData).success) return
|
||||||
|
|
||||||
|
return {
|
||||||
|
...rest,
|
||||||
|
data: parsedData,
|
||||||
|
} as AppNux
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...rest,
|
||||||
|
data: undefined,
|
||||||
|
} as AppNux
|
||||||
|
}
|
||||||
|
|
||||||
|
export function serializeAppNux(nux: AppNux): AppBskyActorDefs.Nux {
|
||||||
|
const {data, ...rest} = nux
|
||||||
|
const schema = NuxSchemas[nux.id as Nux]
|
||||||
|
|
||||||
|
const result: AppBskyActorDefs.Nux = {
|
||||||
|
...rest,
|
||||||
|
data: undefined,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (schema) {
|
||||||
|
schema.parse(data)
|
||||||
|
result.data = JSON.stringify(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
nuxSchema.parse(result)
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
|
@ -37,5 +37,6 @@ export const DEFAULT_LOGGED_OUT_PREFERENCES: UsePreferencesQueryResponse = {
|
||||||
bskyAppState: {
|
bskyAppState: {
|
||||||
queuedNudges: [],
|
queuedNudges: [],
|
||||||
activeProgressGuide: undefined,
|
activeProgressGuide: undefined,
|
||||||
|
nuxs: [],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
35
yarn.lock
35
yarn.lock
|
@ -72,19 +72,6 @@
|
||||||
resolved "https://registry.yarnpkg.com/@atproto-labs/simple-store/-/simple-store-0.1.1.tgz#e743a2722b5d8732166f0a72aca8bd10e9bff106"
|
resolved "https://registry.yarnpkg.com/@atproto-labs/simple-store/-/simple-store-0.1.1.tgz#e743a2722b5d8732166f0a72aca8bd10e9bff106"
|
||||||
integrity sha512-WKILW2b3QbAYKh+w5U2x6p5FqqLl0nAeLwGeDY+KjX01K4Dq3vQTR9b/qNp0jZm48CabPQVrqCv0PPU9LgRRRg==
|
integrity sha512-WKILW2b3QbAYKh+w5U2x6p5FqqLl0nAeLwGeDY+KjX01K4Dq3vQTR9b/qNp0jZm48CabPQVrqCv0PPU9LgRRRg==
|
||||||
|
|
||||||
"@atproto/api@0.13.5":
|
|
||||||
version "0.13.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.13.5.tgz#04305cdb0a467ba366305c5e95cebb7ce0d39735"
|
|
||||||
integrity sha512-yT/YimcKYkrI0d282Zxo7O30OSYR+KDW89f81C6oYZfDRBcShC1aniVV8kluP5LrEAg8O27yrOSnBgx2v7XPew==
|
|
||||||
dependencies:
|
|
||||||
"@atproto/common-web" "^0.3.0"
|
|
||||||
"@atproto/lexicon" "^0.4.1"
|
|
||||||
"@atproto/syntax" "^0.3.0"
|
|
||||||
"@atproto/xrpc" "^0.6.1"
|
|
||||||
await-lock "^2.2.2"
|
|
||||||
multiformats "^9.9.0"
|
|
||||||
tlds "^1.234.0"
|
|
||||||
|
|
||||||
"@atproto/api@^0.13.0":
|
"@atproto/api@^0.13.0":
|
||||||
version "0.13.0"
|
version "0.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.13.0.tgz#d1c65a407f1c3c6aba5be9425f4f739a01419bd8"
|
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.13.0.tgz#d1c65a407f1c3c6aba5be9425f4f739a01419bd8"
|
||||||
|
@ -98,6 +85,20 @@
|
||||||
multiformats "^9.9.0"
|
multiformats "^9.9.0"
|
||||||
tlds "^1.234.0"
|
tlds "^1.234.0"
|
||||||
|
|
||||||
|
"@atproto/api@^0.13.7":
|
||||||
|
version "0.13.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.13.7.tgz#072eba2025d5251505f17b0b5d2de33749ea5ee4"
|
||||||
|
integrity sha512-41kSLmFWDbuPOenb52WRq1lnBkSZrL+X29tWcvEt6SZXK4xBoKAalw1MjF+oabhzff12iMtNaNvmmt2fu1L+cw==
|
||||||
|
dependencies:
|
||||||
|
"@atproto/common-web" "^0.3.0"
|
||||||
|
"@atproto/lexicon" "^0.4.1"
|
||||||
|
"@atproto/syntax" "^0.3.0"
|
||||||
|
"@atproto/xrpc" "^0.6.2"
|
||||||
|
await-lock "^2.2.2"
|
||||||
|
multiformats "^9.9.0"
|
||||||
|
tlds "^1.234.0"
|
||||||
|
zod "^3.23.8"
|
||||||
|
|
||||||
"@atproto/aws@^0.2.2":
|
"@atproto/aws@^0.2.2":
|
||||||
version "0.2.2"
|
version "0.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.2.tgz#703e5e06f288bcf61c6d99a990738f1e7299e653"
|
resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.2.tgz#703e5e06f288bcf61c6d99a990738f1e7299e653"
|
||||||
|
@ -443,10 +444,10 @@
|
||||||
"@atproto/lexicon" "^0.4.1"
|
"@atproto/lexicon" "^0.4.1"
|
||||||
zod "^3.23.8"
|
zod "^3.23.8"
|
||||||
|
|
||||||
"@atproto/xrpc@^0.6.1":
|
"@atproto/xrpc@^0.6.2":
|
||||||
version "0.6.1"
|
version "0.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.6.1.tgz#dcd1315c8c60eef5af2db7fa4e35a38ebc6d79d5"
|
resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.6.2.tgz#634228a7e533de01bda2214837d11574fdadad55"
|
||||||
integrity sha512-Zy5ydXEdk6sY7FDUZcEVfCL1jvbL4tXu5CcdPqbEaW6LQtk9GLds/DK1bCX9kswTGaBC88EMuqQMfkxOhp2t4A==
|
integrity sha512-as/gb08xJb02HAGNrSQSumCe10WnOAcnM6bR6KMatQyQJuEu7OY6ZDSTM/4HfjjoxsNqdvPmbYuoUab1bKTNlA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@atproto/lexicon" "^0.4.1"
|
"@atproto/lexicon" "^0.4.1"
|
||||||
zod "^3.23.8"
|
zod "^3.23.8"
|
||||||
|
|
Loading…
Reference in New Issue