45f0f7eefe
* Direct port of embeds to new arch (cherry picked from commit cc3fa1f6cea396dd9222486c633a508bfee1ecd6) * Re-org * Split out ListEmbed and FeedEmbed * Split out ImageEmbed * DRY up a bit * Port over ExternalLinkEmbed * Port over Player and Gif embeds * Migrate ComposerReplyTo * Replace other usages of old post-embeds * Migrate view contexts * Copy pasta VideoEmbed * Copy pasta GifEmbed * Swap in new file location * Clean up * Fix up native * Add back in correct moderation on List and Feed embeds * Format * Prettier * delete old video utils * move bandwidth-estimate.ts * Remove log * Add LazyQuoteEmbed for composer use * Clean up unused things * Remove remaining items * Prettier * Fix imports * Handle nested quotes same as prod * Add back silenced error handling * Fix lint --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com>
100 lines
2.6 KiB
TypeScript
100 lines
2.6 KiB
TypeScript
import React from 'react'
|
|
import {type AppBskyFeedThreadgate} from '@atproto/api'
|
|
|
|
type StateContext = {
|
|
uris: Set<string>
|
|
recentlyUnhiddenUris: Set<string>
|
|
}
|
|
type ApiContext = {
|
|
addHiddenReplyUri: (uri: string) => void
|
|
removeHiddenReplyUri: (uri: string) => void
|
|
}
|
|
|
|
const StateContext = React.createContext<StateContext>({
|
|
uris: new Set(),
|
|
recentlyUnhiddenUris: new Set(),
|
|
})
|
|
|
|
const ApiContext = React.createContext<ApiContext>({
|
|
addHiddenReplyUri: () => {},
|
|
removeHiddenReplyUri: () => {},
|
|
})
|
|
|
|
export function Provider({children}: {children: React.ReactNode}) {
|
|
const [uris, setHiddenReplyUris] = React.useState<Set<string>>(new Set())
|
|
const [recentlyUnhiddenUris, setRecentlyUnhiddenUris] = React.useState<
|
|
Set<string>
|
|
>(new Set())
|
|
|
|
const stateCtx = React.useMemo(
|
|
() => ({
|
|
uris,
|
|
recentlyUnhiddenUris,
|
|
}),
|
|
[uris, recentlyUnhiddenUris],
|
|
)
|
|
|
|
const apiCtx = React.useMemo(
|
|
() => ({
|
|
addHiddenReplyUri(uri: string) {
|
|
setHiddenReplyUris(prev => new Set(prev.add(uri)))
|
|
setRecentlyUnhiddenUris(prev => {
|
|
prev.delete(uri)
|
|
return new Set(prev)
|
|
})
|
|
},
|
|
removeHiddenReplyUri(uri: string) {
|
|
setHiddenReplyUris(prev => {
|
|
prev.delete(uri)
|
|
return new Set(prev)
|
|
})
|
|
setRecentlyUnhiddenUris(prev => new Set(prev.add(uri)))
|
|
},
|
|
}),
|
|
[setHiddenReplyUris],
|
|
)
|
|
|
|
return (
|
|
<ApiContext.Provider value={apiCtx}>
|
|
<StateContext.Provider value={stateCtx}>{children}</StateContext.Provider>
|
|
</ApiContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useThreadgateHiddenReplyUris() {
|
|
return React.useContext(StateContext)
|
|
}
|
|
|
|
export function useThreadgateHiddenReplyUrisAPI() {
|
|
return React.useContext(ApiContext)
|
|
}
|
|
|
|
export function useMergedThreadgateHiddenReplies({
|
|
threadgateRecord,
|
|
}: {
|
|
threadgateRecord?: AppBskyFeedThreadgate.Record
|
|
}) {
|
|
const {uris, recentlyUnhiddenUris} = useThreadgateHiddenReplyUris()
|
|
return React.useMemo(() => {
|
|
const set = new Set([...(threadgateRecord?.hiddenReplies || []), ...uris])
|
|
for (const uri of recentlyUnhiddenUris) {
|
|
set.delete(uri)
|
|
}
|
|
return set
|
|
}, [uris, recentlyUnhiddenUris, threadgateRecord])
|
|
}
|
|
|
|
export function useMergeThreadgateHiddenReplies() {
|
|
const {uris, recentlyUnhiddenUris} = useThreadgateHiddenReplyUris()
|
|
return React.useCallback(
|
|
(threadgate?: AppBskyFeedThreadgate.Record) => {
|
|
const set = new Set([...(threadgate?.hiddenReplies || []), ...uris])
|
|
for (const uri of recentlyUnhiddenUris) {
|
|
set.delete(uri)
|
|
}
|
|
return set
|
|
},
|
|
[uris, recentlyUnhiddenUris],
|
|
)
|
|
}
|