diff --git a/public/index.html b/public/index.html
index 50a27bfa..edc9d8e1 100644
--- a/public/index.html
+++ b/public/index.html
@@ -36,25 +36,6 @@
border-radius: 10px;
box-shadow: 0 5px 10px #0005;
}
-
- /* These styles are for src/view/com/util/Toast */
- div[data-toast-container] {
- position: fixed;
- bottom: 5vh;
- right: 5vh;
- width: 350px;
- padding: 20px;
- display: flex;
- flex-direction: row;
- align-items: center;
- background: #fff;
- border-radius: 10px;
- box-shadow: 0 5px 10px #0005;
- }
- div[data-toast-container] > div {
- font-size: 18px;
- margin-left: 10px;
- }
diff --git a/src/App.web.tsx b/src/App.web.tsx
index 67ef680a..4f9fd3e5 100644
--- a/src/App.web.tsx
+++ b/src/App.web.tsx
@@ -3,7 +3,7 @@ import {SafeAreaProvider} from 'react-native-safe-area-context'
import * as view from './view/index'
import {RootStoreModel, setupState, RootStoreProvider} from './state'
import {WebShell} from './view/shell/web'
-// import Toast from 'react-native-root-toast' TODO
+import {ToastContainer} from './view/com/util/Toast.web'
function App() {
const [rootStore, setRootStore] = useState(
@@ -26,9 +26,9 @@ function App() {
+
)
- // TODO
}
export default App
diff --git a/src/view/com/util/Toast.web.tsx b/src/view/com/util/Toast.web.tsx
new file mode 100644
index 00000000..bce178b4
--- /dev/null
+++ b/src/view/com/util/Toast.web.tsx
@@ -0,0 +1,75 @@
+/*
+ * Note: the dataSet properties are used to leverage custom CSS in public/index.html
+ */
+
+import React, {useState, useEffect} from 'react'
+import {StyleSheet, Text, View} from 'react-native'
+import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
+
+const DURATION = 3500
+
+interface ActiveToast {
+ text: string
+}
+type GlobalSetActiveToast = (_activeToast: ActiveToast | undefined) => void
+
+// globals
+// =
+let globalSetActiveToast: GlobalSetActiveToast | undefined
+let toastTimeout: NodeJS.Timeout | undefined
+
+// components
+// =
+type ToastContainerProps = {}
+export const ToastContainer: React.FC = ({}) => {
+ const [activeToast, setActiveToast] = useState()
+ useEffect(() => {
+ globalSetActiveToast = (t: ActiveToast | undefined) => {
+ setActiveToast(t)
+ }
+ })
+ return (
+ <>
+ {activeToast && (
+
+
+ {activeToast.text}
+
+ )}
+ >
+ )
+}
+
+// methods
+// =
+export function show(text: string) {
+ if (toastTimeout) {
+ clearTimeout(toastTimeout)
+ }
+ globalSetActiveToast?.({text})
+ toastTimeout = setTimeout(() => {
+ globalSetActiveToast?.(undefined)
+ }, DURATION)
+}
+
+const styles = StyleSheet.create({
+ container: {
+ position: 'absolute',
+ right: 20,
+ bottom: 20,
+ width: 350,
+ padding: 20,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#000c',
+ borderRadius: 10,
+ },
+ icon: {
+ color: '#fff',
+ },
+ text: {
+ color: '#fff',
+ fontSize: 18,
+ marginLeft: 10,
+ },
+})