58aaad704a
* Add bare minimum hashtags support (#2804) * Add bare minimum hashtags support As atproto/api already parses hashtags, this is as simple as hooking it up like link segments. This is "bare minimum" because: - Opening hashtag "#foo" is actually just a search for "foo" right now to work around #2491. - There is no integration in the composer. This hasn't stopped people from using hashtags already, and can be added later. - This change itself only had to hook things up - thank you for having already put the hashtag parsing in place. * Remove workaround for hash search not working now that it's fixed * Add RichTextTag and TagMenu * Sketch * Remove hackfix * Some cleanup * Sketch web * Mobile design * Mobile handling of tags search * Web only * Fix navigation woes * Use new callback * Hook it up * Integrate muted tags * Fix dropdown styles * Type error * Use close callback * Fix styles * Cleanup, install latest sdk * Quick muted words screen * Targets * Dir structure * Icons, list view * Move to dialog * Add removal confirmation * Swap copy * Improve checkboxees * Update matching, add tests * Moderate embeds * Create global dialogs concept again to prevent flashing * Add access from moderation screen * Highlight tags on native * Add web highlighting * Add close to web modal * Adjust close color * Rename toggles and adjust logic * Icon update * Load states * Improve regex * Improve regex * Improve regex * Revert link test * Hyphenated words * Improve matching * Enhance * Some tweaks * Muted words modal changes * Handle invalid handles, handle long tags * Remove main regex * Better test * Space/punct check drop to includes * Lowercase post text before comparison * Add better real world test case --------- Co-authored-by: Kisaragi Hiu <mail@kisaragi-hiu.com>
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import React from 'react'
|
|
import {DialogControlProps} from '#/components/Dialog'
|
|
import {Provider as GlobalDialogsProvider} from '#/components/dialogs/Context'
|
|
|
|
const DialogContext = React.createContext<{
|
|
activeDialogs: React.MutableRefObject<
|
|
Map<string, React.MutableRefObject<DialogControlProps>>
|
|
>
|
|
}>({
|
|
activeDialogs: {
|
|
current: new Map(),
|
|
},
|
|
})
|
|
|
|
const DialogControlContext = React.createContext<{
|
|
closeAllDialogs(): void
|
|
}>({
|
|
closeAllDialogs: () => {},
|
|
})
|
|
|
|
export function useDialogStateContext() {
|
|
return React.useContext(DialogContext)
|
|
}
|
|
|
|
export function useDialogStateControlContext() {
|
|
return React.useContext(DialogControlContext)
|
|
}
|
|
|
|
export function Provider({children}: React.PropsWithChildren<{}>) {
|
|
const activeDialogs = React.useRef<
|
|
Map<string, React.MutableRefObject<DialogControlProps>>
|
|
>(new Map())
|
|
const closeAllDialogs = React.useCallback(() => {
|
|
activeDialogs.current.forEach(dialog => dialog.current.close())
|
|
}, [])
|
|
const context = React.useMemo(() => ({activeDialogs}), [])
|
|
const controls = React.useMemo(() => ({closeAllDialogs}), [closeAllDialogs])
|
|
return (
|
|
<DialogContext.Provider value={context}>
|
|
<DialogControlContext.Provider value={controls}>
|
|
<GlobalDialogsProvider>{children}</GlobalDialogsProvider>
|
|
</DialogControlContext.Provider>
|
|
</DialogContext.Provider>
|
|
)
|
|
}
|