about summary refs log tree commit diff
path: root/src/view/com/modals
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/modals')
-rw-r--r--src/view/com/modals/SharePost.native.tsx113
-rw-r--r--src/view/com/modals/SharePost.tsx57
-rw-r--r--src/view/com/modals/WebModal.tsx20
3 files changed, 190 insertions, 0 deletions
diff --git a/src/view/com/modals/SharePost.native.tsx b/src/view/com/modals/SharePost.native.tsx
new file mode 100644
index 000000000..0e99bd4d1
--- /dev/null
+++ b/src/view/com/modals/SharePost.native.tsx
@@ -0,0 +1,113 @@
+import React, {
+  forwardRef,
+  useState,
+  useMemo,
+  useImperativeHandle,
+  useRef,
+} from 'react'
+import {
+  Button,
+  StyleSheet,
+  Text,
+  TouchableOpacity,
+  TouchableWithoutFeedback,
+  View,
+} from 'react-native'
+import BottomSheet, {BottomSheetBackdropProps} from '@gorhom/bottom-sheet'
+import Animated, {
+  Extrapolate,
+  interpolate,
+  useAnimatedStyle,
+} from 'react-native-reanimated'
+import Toast from '../util/Toast'
+import Clipboard from '@react-native-clipboard/clipboard'
+import {s} from '../../lib/styles'
+
+export const ShareModal = forwardRef(function ShareModal({}: {}, ref) {
+  const [isOpen, setIsOpen] = useState<boolean>(false)
+  const [uri, setUri] = useState<string>('')
+  const bottomSheetRef = useRef<BottomSheet>(null)
+
+  useImperativeHandle(ref, () => ({
+    open(uri: string) {
+      console.log('sharing', uri)
+      setUri(uri)
+      setIsOpen(true)
+    },
+  }))
+
+  const onPressCopy = () => {
+    Clipboard.setString(uri)
+    console.log('showing')
+    console.log(Toast)
+    console.log(Toast.show)
+    Toast.show('Link copied', {
+      position: Toast.positions.TOP,
+    })
+  }
+  const onShareBottomSheetChange = (snapPoint: number) => {
+    if (snapPoint === -1) {
+      console.log('unsharing')
+      setIsOpen(false)
+    }
+  }
+  const onClose = () => {
+    bottomSheetRef.current?.close()
+  }
+
+  const CustomBackdrop = ({animatedIndex, style}: BottomSheetBackdropProps) => {
+    // animated variables
+    const opacity = useAnimatedStyle(() => ({
+      opacity: interpolate(
+        animatedIndex.value, // current snap index
+        [-1, 0], // input range
+        [0, 0.5], // output range
+        Extrapolate.CLAMP,
+      ),
+    }))
+
+    const containerStyle = useMemo(
+      () => [style, {backgroundColor: '#000'}, opacity],
+      [style, opacity],
+    )
+
+    return (
+      <TouchableWithoutFeedback onPress={onClose}>
+        <Animated.View style={containerStyle} />
+      </TouchableWithoutFeedback>
+    )
+  }
+  return (
+    <>
+      {isOpen && (
+        <BottomSheet
+          ref={bottomSheetRef}
+          snapPoints={['50%']}
+          enablePanDownToClose
+          backdropComponent={CustomBackdrop}
+          onChange={onShareBottomSheetChange}>
+          <View>
+            <Text style={[s.textCenter, s.bold, s.mb10]}>Share this post</Text>
+            <Text style={[s.textCenter, s.mb10]}>{uri}</Text>
+            <Button title="Copy to clipboard" onPress={onPressCopy} />
+            <View style={s.p10}>
+              <TouchableOpacity onPress={onClose} style={styles.closeBtn}>
+                <Text style={s.textCenter}>Close</Text>
+              </TouchableOpacity>
+            </View>
+          </View>
+        </BottomSheet>
+      )}
+    </>
+  )
+})
+
+const styles = StyleSheet.create({
+  closeBtn: {
+    width: '100%',
+    borderColor: '#000',
+    borderWidth: 1,
+    borderRadius: 4,
+    padding: 10,
+  },
+})
diff --git a/src/view/com/modals/SharePost.tsx b/src/view/com/modals/SharePost.tsx
new file mode 100644
index 000000000..d6d4bb5c1
--- /dev/null
+++ b/src/view/com/modals/SharePost.tsx
@@ -0,0 +1,57 @@
+import React, {forwardRef, useState, useImperativeHandle} from 'react'
+import {Button, StyleSheet, Text, TouchableOpacity, View} from 'react-native'
+import {Modal} from './WebModal'
+import Toast from '../util/Toast'
+import {s} from '../../lib/styles'
+
+export const ShareModal = forwardRef(function ShareModal({}: {}, ref) {
+  const [isOpen, setIsOpen] = useState<boolean>(false)
+  const [uri, setUri] = useState<string>('')
+
+  useImperativeHandle(ref, () => ({
+    open(uri: string) {
+      console.log('sharing', uri)
+      setUri(uri)
+      setIsOpen(true)
+    },
+  }))
+
+  const onPressCopy = () => {
+    // TODO
+    Toast.show('Link copied', {
+      position: Toast.positions.TOP,
+    })
+  }
+  const onClose = () => {
+    setIsOpen(false)
+  }
+
+  return (
+    <>
+      {isOpen && (
+        <Modal onClose={onClose}>
+          <View>
+            <Text style={[s.textCenter, s.bold, s.mb10]}>Share this post</Text>
+            <Text style={[s.textCenter, s.mb10]}>{uri}</Text>
+            <Button title="Copy to clipboard" onPress={onPressCopy} />
+            <View style={s.p10}>
+              <TouchableOpacity onPress={onClose} style={styles.closeBtn}>
+                <Text style={s.textCenter}>Close</Text>
+              </TouchableOpacity>
+            </View>
+          </View>
+        </Modal>
+      )}
+    </>
+  )
+})
+
+const styles = StyleSheet.create({
+  closeBtn: {
+    width: '100%',
+    borderColor: '#000',
+    borderWidth: 1,
+    borderRadius: 4,
+    padding: 10,
+  },
+})
diff --git a/src/view/com/modals/WebModal.tsx b/src/view/com/modals/WebModal.tsx
new file mode 100644
index 000000000..fed2fae91
--- /dev/null
+++ b/src/view/com/modals/WebModal.tsx
@@ -0,0 +1,20 @@
+/**
+ * Use this for the Web build only.
+ * It's intended to replace the BottomSheet.
+ *
+ * Note: the dataSet properties are used to leverage custom CSS in public/index.html
+ */
+import React from 'react'
+// @ts-ignore no declarations available -prf
+import {TouchableWithoutFeedback, View} from 'react-native-web'
+
+type Props = {onClose: () => void}
+export const Modal: React.FC<Props> = ({onClose, children}) => {
+  return (
+    <TouchableWithoutFeedback onPress={onClose}>
+      <View dataSet={{'modal-overlay': 1}}>
+        <View dataSet={{'modal-container': 1}}>{children}</View>
+      </View>
+    </TouchableWithoutFeedback>
+  )
+}