Massive/MassiveSnack.tsx

50 lines
1.3 KiB
TypeScript
Raw Normal View History

2022-10-31 04:22:08 +00:00
import {createContext, useContext, useState} from 'react'
import {Snackbar} from 'react-native-paper'
import {CombinedDarkTheme, CombinedDefaultTheme} from './App'
import useDark from './use-dark'
export const SnackbarContext = createContext<{
2022-10-31 04:22:08 +00:00
toast: (value: string, timeout: number) => void
}>({toast: () => null})
2022-10-14 04:27:19 +00:00
export const useSnackbar = () => {
2022-10-31 04:22:08 +00:00
return useContext(SnackbarContext)
}
2022-10-14 04:27:19 +00:00
2022-09-24 03:29:24 +00:00
export default function MassiveSnack({
children,
}: {
2022-10-31 04:22:08 +00:00
children?: JSX.Element[] | JSX.Element
2022-09-24 03:29:24 +00:00
}) {
2022-10-31 04:22:08 +00:00
const [snackbar, setSnackbar] = useState('')
const [timeoutId, setTimeoutId] = useState(0)
const dark = useDark()
const toast = (value: string, timeout: number) => {
2022-10-31 04:22:08 +00:00
setSnackbar(value)
clearTimeout(timeoutId)
const id = setTimeout(() => setSnackbar(''), timeout)
setTimeoutId(id)
}
return (
<>
<SnackbarContext.Provider value={{toast}}>
{children}
</SnackbarContext.Provider>
<Snackbar
onDismiss={() => setSnackbar('')}
visible={!!snackbar}
action={{
label: 'Close',
onPress: () => setSnackbar(''),
color: dark
? CombinedDarkTheme.colors.background
: CombinedDefaultTheme.colors.background,
}}>
{snackbar}
</Snackbar>
</>
2022-10-31 04:22:08 +00:00
)
2022-09-24 03:29:24 +00:00
}