Checkpoint move state into meta query

This commit is contained in:
Eric Bailey
2025-06-04 10:57:38 -05:00
parent 11001172b3
commit ce776fd050
10 changed files with 227 additions and 163 deletions
@@ -1,23 +1,42 @@
import {useMemo, useState} from 'react'
import {type AppBskyUnspeccedGetPostThreadV2} from '@atproto/api'
import {usePreferencesQuery} from '#/state/queries/preferences'
import {type Literal} from '#/types/utils'
export function useThreadPreferences() {
export type ThreadSortOption = Literal<
AppBskyUnspeccedGetPostThreadV2.QueryParams['sort'],
string
>
export type ThreadViewOption = 'linear' | 'tree'
export type ThreadPreferences = {
isLoaded: boolean
sort: ThreadSortOption
setSort: (sort: ThreadSortOption) => void
view: ThreadViewOption
setView: (view: ThreadViewOption) => void
prioritizeFollowedUsers: boolean
setPrioritizeFollowedUsers: (prioritize: boolean) => void
}
export function useThreadPreferences(): ThreadPreferences {
const {data: preferences} = usePreferencesQuery()
const nextThreadPreferences = preferences?.threadViewPrefs
/*
* Create local state representations of server state
*/
const [sortReplies, setSortReplies] = useState(
nextThreadPreferences?.sort ?? 'hotness',
const [sort, setSort] = useState(
migrateFromSortV1(nextThreadPreferences?.sort || 'top'),
)
const [view, setView] = useState(
computeView({
treeViewEnabled: !!nextThreadPreferences?.lab_treeViewEnabled,
}),
)
const [prioritizeFollowedUsers, setPrioritizeFollowedUsers] = useState(
!!nextThreadPreferences?.prioritizeFollowedUsers,
)
const [treeViewEnabled, setTreeViewEnabled] = useState(
!!nextThreadPreferences?.lab_treeViewEnabled,
)
/**
* Cache existing and if we get a server update, reset local state
@@ -29,9 +48,13 @@ export function useThreadPreferences() {
/*
* Reset
*/
setSortReplies(nextThreadPreferences.sort)
setSort(migrateFromSortV1(nextThreadPreferences.sort))
setPrioritizeFollowedUsers(nextThreadPreferences.prioritizeFollowedUsers)
setTreeViewEnabled(!!nextThreadPreferences.lab_treeViewEnabled)
setView(
computeView({
treeViewEnabled: !!nextThreadPreferences.lab_treeViewEnabled,
}),
)
}
const isLoaded = !!prevServerPrefs
@@ -39,21 +62,46 @@ export function useThreadPreferences() {
return useMemo(
() => ({
isLoaded,
sortReplies,
setSortReplies,
sort,
setSort,
prioritizeFollowedUsers,
setPrioritizeFollowedUsers,
treeViewEnabled,
setTreeViewEnabled,
view,
setView,
}),
[
isLoaded,
sortReplies,
setSortReplies,
sort,
setSort,
prioritizeFollowedUsers,
setPrioritizeFollowedUsers,
treeViewEnabled,
setTreeViewEnabled,
view,
setView,
],
)
}
/**
* Migrates user thread preferences from the old sort values to V2
*/
function migrateFromSortV1(sort: string): ThreadSortOption {
switch (sort) {
case 'oldest':
return 'oldest'
case 'newest':
return 'newest'
default:
return 'top'
}
}
/**
* Transforms existing treeViewEnabled preference into a ThreadViewOption
*/
function computeView({
treeViewEnabled,
}: {
treeViewEnabled: boolean
}): ThreadViewOption {
return treeViewEnabled ? 'tree' : 'linear'
}