2025-06-12 22:18:52 +07:00
|
|
|
/*
|
|
|
|
|
Only one tooltip can be visible at a time, so we use a global state to control the visibility of the tooltip.
|
|
|
|
|
Why? Because we don't want to run useTooltip on every single plugin card. This is ugly, but it works.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
import { Design } from '@revenge-mod/discord/design'
|
|
|
|
|
import { useEffect, useState } from 'react'
|
2025-07-25 21:19:59 +07:00
|
|
|
import { useClickOutside } from 'react-native-click-outside'
|
2025-07-13 15:59:21 +07:00
|
|
|
import type { RefObject } from 'react'
|
2025-06-12 22:18:52 +07:00
|
|
|
import type { View } from 'react-native'
|
|
|
|
|
|
|
|
|
|
const { useTooltip } = Design
|
|
|
|
|
|
|
|
|
|
export let setEnablePluginTooltipVisible: ((v: boolean) => void) | undefined
|
2025-07-13 15:59:21 +07:00
|
|
|
export const enableTooltipTarget: RefObject<View | null> = {
|
2025-06-12 22:18:52 +07:00
|
|
|
current: null,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function EnablePluginTooltipProvider({
|
|
|
|
|
children,
|
|
|
|
|
}: {
|
|
|
|
|
children: React.ReactNode
|
|
|
|
|
}) {
|
|
|
|
|
const [visible, setVisible] = useState(false)
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setEnablePluginTooltipVisible = setVisible
|
|
|
|
|
return () => {
|
|
|
|
|
enableTooltipTarget.current = null
|
|
|
|
|
setEnablePluginTooltipVisible = undefined
|
|
|
|
|
}
|
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
|
|
useTooltip(enableTooltipTarget, {
|
|
|
|
|
label: 'Plugin must be enabled first',
|
|
|
|
|
position: 'top',
|
|
|
|
|
visible,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return children
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export let setEssentialPluginTooltipVisible: ((v: boolean) => void) | undefined
|
2025-07-13 15:59:21 +07:00
|
|
|
export const essentialTooltipTarget: RefObject<View | null> = {
|
2025-06-12 22:18:52 +07:00
|
|
|
current: null,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function EssentialPluginTooltipProvider({
|
|
|
|
|
children,
|
|
|
|
|
}: {
|
|
|
|
|
children: React.ReactNode
|
|
|
|
|
}) {
|
|
|
|
|
const [visible, setVisible] = useState(false)
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setEssentialPluginTooltipVisible = setVisible
|
|
|
|
|
return () => {
|
|
|
|
|
essentialTooltipTarget.current = null
|
|
|
|
|
setEssentialPluginTooltipVisible = undefined
|
|
|
|
|
}
|
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
|
|
useTooltip(essentialTooltipTarget, {
|
|
|
|
|
label: 'Plugin needed for Revenge to function properly',
|
|
|
|
|
position: 'top',
|
|
|
|
|
visible,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return children
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function resetTooltips() {
|
|
|
|
|
setEnablePluginTooltipVisible?.(false)
|
|
|
|
|
setEssentialPluginTooltipVisible?.(false)
|
|
|
|
|
}
|
2025-07-25 21:19:59 +07:00
|
|
|
|
|
|
|
|
export function useClickOutsideTooltip(
|
|
|
|
|
target: RefObject<View | null>,
|
|
|
|
|
onClickOutside: () => void,
|
|
|
|
|
) {
|
|
|
|
|
const ref = useClickOutside<View>(() => {
|
|
|
|
|
resetTooltips()
|
|
|
|
|
if (target.current === ref.current) onClickOutside()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return ref
|
|
|
|
|
}
|