1
0
mirror of https://github.com/tooot-app/app synced 2025-06-05 22:19:13 +02:00

619 restructure local storage (#628)

* To MMKV migration working

* POC migrated font size settings

* Moved settings to mmkv

* Fix typos

* Migrated contexts slice

* Migrated app slice

* POC instance emoji update

* Migrated drafts

* Migrated simple instance properties

* All migrated!

* Re-structure files

* Tolerant of undefined settings

* Can properly logging in and out including empty state
This commit is contained in:
xmflsct
2022-12-28 23:41:36 +01:00
committed by GitHub
parent 71ccb4a93c
commit 1ea6aff328
214 changed files with 2151 additions and 3694 deletions

View File

@ -1,6 +1,6 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyAccount = ['Account', { id: Mastodon.Account['id'] }]

View File

@ -1,12 +1,12 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import {
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
type QueryKeyAnnouncement = ['Announcements', { showAll?: boolean }]

View File

@ -1,14 +1,14 @@
import apiGeneral from '@api/general'
import apiInstance from '@api/instance'
import {
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
import apiGeneral from '@utils/api/general'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
import * as AuthSession from 'expo-auth-session'
import {
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
export type QueryKeyApps = ['Apps']

View File

@ -1,6 +1,7 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { getAccountStorage, setAccountStorage } from '@utils/storage/actions'
import { AxiosError } from 'axios'
type QueryKeyEmojis = ['Emojis']
@ -12,13 +13,30 @@ const queryFunction = async () => {
return res.body
}
const useEmojisQuery = ({
options
}: {
options?: UseQueryOptions<Mastodon.Emoji[], AxiosError>
}) => {
const useEmojisQuery = (params?: { options?: UseQueryOptions<Mastodon.Emoji[], AxiosError> }) => {
const queryKey: QueryKeyEmojis = ['Emojis']
return useQuery(queryKey, queryFunction, options)
return useQuery(queryKey, queryFunction, {
...params?.options,
staleTime: Infinity,
cacheTime: Infinity,
onSuccess: data => {
if (!data.length) return
const currEmojis = getAccountStorage.object('emojis_frequent')
if (!Array.isArray(currEmojis)) {
setAccountStorage([{ key: 'emojis_frequent', value: [] }])
} else {
setAccountStorage([
{
key: 'emojis_frequent',
value: currEmojis?.filter(emoji =>
data.find(e => e.shortcode === emoji.emoji.shortcode)
)
}
])
}
}
})
}
export { useEmojisQuery }

View File

@ -0,0 +1,24 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyFilters = ['Filters']
const queryFunction = () =>
apiInstance<Mastodon.Filter<'v1'>[]>({
method: 'get',
url: 'filters'
}).then(res => res.body)
const useFiltersQuery = (params?: {
options: UseQueryOptions<Mastodon.Filter<'v1'>[], AxiosError>
}) => {
const queryKey: QueryKeyFilters = ['Filters']
return useQuery(queryKey, queryFunction, {
...params?.options,
staleTime: Infinity,
cacheTime: Infinity
})
}
export { useFiltersQuery }

View File

@ -0,0 +1,21 @@
import { QueryClient } from '@tanstack/react-query'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5,
retry: (failureCount, error: any) => {
if (error?.status === 404) {
return false
}
if (failureCount <= 3) {
return true
} else {
return false
}
}
}
}
})
export default queryClient

View File

@ -1,36 +1,66 @@
import apiGeneral from '@api/general'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiGeneral from '@utils/api/general'
import apiInstance from '@utils/api/instance'
import { featureCheck } from '@utils/helpers/featureCheck'
import { setAccountStorage } from '@utils/storage/actions'
import { AxiosError } from 'axios'
export type QueryKeyInstance = ['Instance', { domain?: string }]
export type QueryKeyInstance = ['Instance'] | ['Instance', { domain?: string }]
const queryFunction = async ({
queryKey
}: QueryFunctionContext<QueryKeyInstance>) => {
const { domain } = queryKey[1]
if (!domain) {
return Promise.reject()
const queryFunction = async ({ queryKey }: QueryFunctionContext<QueryKeyInstance>) => {
const domain = queryKey[1]?.domain
if (domain) {
return await apiGeneral<Mastodon.Instance<'v2'>>({
method: 'get',
domain,
url: 'api/v2/instance'
})
.then(res => res.body)
.catch(
async () =>
await apiGeneral<Mastodon.Instance<'v1'>>({
method: 'get',
domain,
url: 'api/v1/instance'
}).then(res => res.body)
)
} else {
const hasInstanceNewPath = featureCheck('instance_new_path')
return hasInstanceNewPath
? await apiInstance<Mastodon.Instance<'v2'>>({
method: 'get',
version: 'v2',
url: 'instance'
})
.then(res => res.body)
.catch(
async () =>
await apiInstance<Mastodon.Instance<'v1'>>({
method: 'get',
version: 'v1',
url: 'instance'
}).then(res => res.body)
)
: await apiInstance<Mastodon.Instance<'v1'>>({
method: 'get',
version: 'v1',
url: 'instance'
}).then(res => res.body)
}
const res = await apiGeneral<Mastodon.Instance>({
method: 'get',
domain: domain,
url: `api/v1/instance`
})
return res.body
}
const useInstanceQuery = ({
options,
...queryKeyParams
}: QueryKeyInstance[1] & {
options?: UseQueryOptions<
Mastodon.Instance & { publicAllow?: boolean },
AxiosError
>
}) => {
const queryKey: QueryKeyInstance = ['Instance', { ...queryKeyParams }]
return useQuery(queryKey, queryFunction, options)
const useInstanceQuery = (
params?: QueryKeyInstance[1] & {
options?: UseQueryOptions<Mastodon.Instance<any>, AxiosError>
}
) => {
const queryKey: QueryKeyInstance = params?.domain ? ['Instance', params] : ['Instance']
return useQuery(queryKey, queryFunction, {
...params?.options,
staleTime: Infinity,
cacheTime: Infinity,
onSuccess: data => setAccountStorage([{ key: 'version', value: data.version }])
})
}
export { useInstanceQuery }

View File

@ -1,15 +1,15 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import {
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
import { PagedResponse } from '@api/helpers'
import { PagedResponse } from '@utils/api/helpers'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyLists = ['Lists']

View File

@ -0,0 +1,27 @@
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { getAccountStorage, setAccountStorage } from '@utils/storage/actions'
import { AxiosError } from 'axios'
export type QueryKeyPreferences = ['Preferences']
const queryFunction = () =>
apiInstance<Mastodon.Preferences>({
method: 'get',
url: 'preferences'
}).then(res => res.body)
const usePreferencesQuery = (params?: {
options: UseQueryOptions<Mastodon.Preferences, AxiosError>
}) => {
const queryKey: QueryKeyPreferences = ['Preferences']
return useQuery(queryKey, queryFunction, {
...params?.options,
staleTime: Infinity,
cacheTime: Infinity,
initialData: getAccountStorage.object('preferences'),
onSuccess: data => setAccountStorage([{ key: 'preferences', value: data }])
})
}
export { usePreferencesQuery }

View File

@ -1,12 +1,12 @@
import apiInstance from '@api/instance'
import haptics from '@components/haptics'
import { displayMessage } from '@components/Message'
import queryClient from '@helpers/queryClient'
import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import queryClient from '@utils/queryHooks'
import { AxiosError } from 'axios'
import i18next from 'i18next'
import { RefObject } from 'react'
import FlashMessage from 'react-native-flash-message'
import { useMutation, useQuery, UseQueryOptions } from '@tanstack/react-query'
type AccountWithSource = Mastodon.Account & Required<Pick<Mastodon.Account, 'source'>>

View File

@ -1,12 +1,12 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import {
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
QueryFunctionContext,
useMutation,
UseMutationOptions,
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyRelationship = ['Relationship', { id: Mastodon.Account['id'] }]

View File

@ -1,6 +1,6 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyRules = ['Rules']

View File

@ -1,6 +1,6 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeySearch = [
'Search',

View File

@ -1,6 +1,6 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyStatus = ['Status', { id: Mastodon.Status['id'] }]

View File

@ -1,6 +1,6 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { AxiosError } from 'axios'
export type QueryKeyStatusesHistory = [
'StatusesHistory',

View File

@ -1,5 +1,3 @@
import apiInstance from '@api/instance'
import { AxiosError } from 'axios'
import {
QueryFunctionContext,
useInfiniteQuery,
@ -9,10 +7,11 @@ import {
useQuery,
UseQueryOptions
} from '@tanstack/react-query'
import { PagedResponse } from '@utils/api/helpers'
import apiInstance from '@utils/api/instance'
import { featureCheck } from '@utils/helpers/featureCheck'
import { AxiosError } from 'axios'
import { infinitePageParams } from './utils'
import { PagedResponse } from '@api/helpers'
import { useSelector } from 'react-redux'
import { checkInstanceFeature } from '@utils/slices/instancesSlice'
export type QueryKeyFollowedTags = ['FollowedTags']
const useFollowedTagsQuery = (
@ -23,7 +22,7 @@ const useFollowedTagsQuery = (
>
} | void
) => {
const canFollowTags = useSelector(checkInstanceFeature('follow_tags'))
const canFollowTags = featureCheck('follow_tags')
const queryKey: QueryKeyFollowedTags = ['FollowedTags']
return useInfiniteQuery(

View File

@ -1,21 +1,21 @@
import apiInstance from '@api/instance'
import haptics from '@components/haptics'
import queryClient from '@helpers/queryClient'
import { store } from '@root/store'
import { checkInstanceFeature, getInstanceNotificationsFilter } from '@utils/slices/instancesSlice'
import {
MutationOptions,
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions,
useMutation
} from '@tanstack/react-query'
import { PagedResponse } from '@utils/api/helpers'
import apiInstance from '@utils/api/instance'
import { featureCheck } from '@utils/helpers/featureCheck'
import queryClient from '@utils/queryHooks'
import { getAccountStorage } from '@utils/storage/actions'
import { AxiosError } from 'axios'
import { uniqBy } from 'lodash'
import {
MutationOptions,
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions,
useMutation
} from '@tanstack/react-query'
import deleteItem from './timeline/deleteItem'
import editItem from './timeline/editItem'
import updateStatusProperty from './timeline/updateStatusProperty'
import { PagedResponse } from '@api/helpers'
export type QueryKeyTimeline = [
'Timeline',
@ -82,7 +82,6 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
})
case 'Local':
console.log('local', params)
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: 'timelines/public',
@ -100,7 +99,6 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
})
case 'Trending':
console.log('trending', params)
return apiInstance<Mastodon.Status[]>({
method: 'get',
url: 'trends/statuses',
@ -108,11 +106,8 @@ const queryFunction = async ({ queryKey, pageParam }: QueryFunctionContext<Query
})
case 'Notifications':
const rootStore = store.getState()
const notificationsFilter = getInstanceNotificationsFilter(rootStore)
const usePositiveFilter = checkInstanceFeature('notification_types_positive_filter')(
rootStore
)
const notificationsFilter = getAccountStorage.object('notifications')
const usePositiveFilter = featureCheck('notification_types_positive_filter')
return apiInstance<Mastodon.Notification[]>({
method: 'get',
url: 'notifications',

View File

@ -1,5 +1,5 @@
import queryClient from '@helpers/queryClient'
import { InfiniteData } from '@tanstack/react-query'
import queryClient from '@utils/queryHooks'
import { MutationVarsTimelineDeleteItem } from '../timeline'
const deleteItem = ({

View File

@ -1,5 +1,5 @@
import queryClient from '@helpers/queryClient'
import { InfiniteData } from '@tanstack/react-query'
import queryClient from '@utils/queryHooks'
import { MutationVarsTimelineEditItem } from '../timeline'
const editItem = ({

View File

@ -1,5 +1,5 @@
import queryClient from '@helpers/queryClient'
import { InfiniteData } from '@tanstack/react-query'
import queryClient from '@utils/queryHooks'
import { MutationVarsTimelineUpdateStatusProperty, TimelineData } from '../timeline'
import updateConversation from './update/conversation'
import updateNotification from './update/notification'

View File

@ -1,7 +1,7 @@
import apiTooot from '@api/tooot'
import haptics from '@components/haptics'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiTooot from '@utils/api/tooot'
import { AxiosError } from 'axios'
type Translations =
| {

View File

@ -1,13 +1,12 @@
import apiInstance from '@api/instance'
import { store } from '@root/store'
import { checkInstanceFeature } from '@utils/slices/instancesSlice'
import { AxiosError } from 'axios'
import { QueryFunctionContext, useQuery, UseQueryOptions } from '@tanstack/react-query'
import apiInstance from '@utils/api/instance'
import { featureCheck } from '@utils/helpers/featureCheck'
import { AxiosError } from 'axios'
export type QueryKeyTrends = ['Trends', { type: 'tags' | 'statuses' | 'links' }]
const queryFunction = ({ queryKey }: QueryFunctionContext<QueryKeyTrends>) => {
const trendsNewPath = checkInstanceFeature('trends_new_path')(store.getState())
const trendsNewPath = featureCheck('trends_new_path')
if (!trendsNewPath && queryKey[1].type !== 'tags') {
return []

View File

@ -1,14 +1,14 @@
import apiInstance from '@api/instance'
import {
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions
} from '@tanstack/react-query'
import apiGeneral from '@utils/api/general'
import { PagedResponse } from '@utils/api/helpers'
import apiInstance from '@utils/api/instance'
import { getHost } from '@utils/helpers/urlMatcher'
import { TabSharedStackParamList } from '@utils/navigation/navigators'
import { AxiosError } from 'axios'
import {
QueryFunctionContext,
useInfiniteQuery,
UseInfiniteQueryOptions
} from '@tanstack/react-query'
import apiGeneral from '@api/general'
import { PagedResponse } from '@api/helpers'
import { getHost } from '@helpers/urlMatcher'
export type QueryKeyUsers = ['Users', TabSharedStackParamList['Tab-Shared-Users']]

View File

@ -1,4 +1,4 @@
import { PagedResponse } from '@api/helpers'
import { PagedResponse } from '@utils/api/helpers'
export const infinitePageParams = {
getPreviousPageParam: (firstPage: PagedResponse<any>) =>