mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2import * as persisted from '#/state/persisted'
3import {track} from '#/lib/analytics/analytics'
4
5type StateContext = persisted.Schema['mutedThreads']
6type ToggleContext = (uri: string) => boolean
7
8const stateContext = React.createContext<StateContext>(
9 persisted.defaults.mutedThreads,
10)
11const toggleContext = React.createContext<ToggleContext>((_: string) => false)
12
13export function Provider({children}: React.PropsWithChildren<{}>) {
14 const [state, setState] = React.useState(persisted.get('mutedThreads'))
15
16 const toggleThreadMute = React.useCallback(
17 (uri: string) => {
18 let muted = false
19 setState((arr: string[]) => {
20 if (arr.includes(uri)) {
21 arr = arr.filter(v => v !== uri)
22 muted = false
23 track('Post:ThreadUnmute')
24 } else {
25 arr = arr.concat([uri])
26 muted = true
27 track('Post:ThreadMute')
28 }
29 persisted.write('mutedThreads', arr)
30 return arr
31 })
32 return muted
33 },
34 [setState],
35 )
36
37 React.useEffect(() => {
38 return persisted.onUpdate(() => {
39 setState(persisted.get('mutedThreads'))
40 })
41 }, [setState])
42
43 return (
44 <stateContext.Provider value={state}>
45 <toggleContext.Provider value={toggleThreadMute}>
46 {children}
47 </toggleContext.Provider>
48 </stateContext.Provider>
49 )
50}
51
52export function useMutedThreads() {
53 return React.useContext(stateContext)
54}
55
56export function useToggleThreadMute() {
57 return React.useContext(toggleContext)
58}
59
60export function isThreadMuted(uri: string) {
61 return persisted.get('mutedThreads').includes(uri)
62}