diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/view/com/util/LoadLatestBtn.tsx | 57 | ||||
-rw-r--r-- | src/view/com/util/LoadLatestBtn.web.tsx | 36 | ||||
-rw-r--r-- | src/view/screens/Home.tsx | 56 |
3 files changed, 99 insertions, 50 deletions
diff --git a/src/view/com/util/LoadLatestBtn.tsx b/src/view/com/util/LoadLatestBtn.tsx new file mode 100644 index 000000000..43fa97e6f --- /dev/null +++ b/src/view/com/util/LoadLatestBtn.tsx @@ -0,0 +1,57 @@ +import React from 'react' +import {StyleSheet, TouchableOpacity} from 'react-native' +import {observer} from 'mobx-react-lite' +import LinearGradient from 'react-native-linear-gradient' +import {useSafeAreaInsets} from 'react-native-safe-area-context' +import {Text} from './text/Text' +import {colors, gradients} from '../../lib/styles' +import {clamp} from 'lodash' +import {useStores} from '../../../state' + +const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20} + +export const LoadLatestBtn = observer(({onPress}: {onPress: () => void}) => { + const store = useStores() + const safeAreaInsets = useSafeAreaInsets() + return ( + <TouchableOpacity + style={[ + styles.loadLatest, + !store.shell.minimalShellMode && { + bottom: 60 + clamp(safeAreaInsets.bottom, 15, 30), + }, + ]} + onPress={onPress} + hitSlop={HITSLOP}> + <LinearGradient + colors={[gradients.blueLight.start, gradients.blueLight.end]} + start={{x: 0, y: 0}} + end={{x: 1, y: 1}} + style={styles.loadLatestInner}> + <Text type="md-bold" style={styles.loadLatestText}> + Load new posts + </Text> + </LinearGradient> + </TouchableOpacity> + ) +}) + +const styles = StyleSheet.create({ + loadLatest: { + position: 'absolute', + left: 20, + bottom: 35, + shadowColor: '#000', + shadowOpacity: 0.3, + shadowOffset: {width: 0, height: 1}, + }, + loadLatestInner: { + flexDirection: 'row', + paddingHorizontal: 14, + paddingVertical: 10, + borderRadius: 30, + }, + loadLatestText: { + color: colors.white, + }, +}) diff --git a/src/view/com/util/LoadLatestBtn.web.tsx b/src/view/com/util/LoadLatestBtn.web.tsx new file mode 100644 index 000000000..388927388 --- /dev/null +++ b/src/view/com/util/LoadLatestBtn.web.tsx @@ -0,0 +1,36 @@ +import React from 'react' +import {StyleSheet, TouchableOpacity} from 'react-native' +import {Text} from './text/Text' +import {usePalette} from '../../lib/hooks/usePalette' + +const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20} + +export const LoadLatestBtn = ({onPress}: {onPress: () => void}) => { + const pal = usePalette('default') + return ( + <TouchableOpacity + style={[pal.view, styles.loadLatest]} + onPress={onPress} + hitSlop={HITSLOP}> + <Text type="md-bold" style={pal.text}> + Load new posts + </Text> + </TouchableOpacity> + ) +} + +const styles = StyleSheet.create({ + loadLatest: { + flexDirection: 'row', + position: 'absolute', + left: 'calc(50vw - 80px)', + top: 30, + shadowColor: '#000', + shadowOpacity: 0.2, + shadowOffset: {width: 0, height: 2}, + shadowRadius: 4, + paddingHorizontal: 24, + paddingVertical: 10, + borderRadius: 30, + }, +}) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 384ee15e1..4222c7513 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -1,20 +1,15 @@ import React, {useEffect} from 'react' -import {StyleSheet, TouchableOpacity, View} from 'react-native' +import {View} from 'react-native' import {observer} from 'mobx-react-lite' import useAppState from 'react-native-appstate-hook' -import LinearGradient from 'react-native-linear-gradient' -import {useSafeAreaInsets} from 'react-native-safe-area-context' import {ViewHeader} from '../com/util/ViewHeader' import {Feed} from '../com/posts/Feed' -import {Text} from '../com/util/text/Text' import {FAB} from '../com/util/FAB' +import {LoadLatestBtn} from '../com/util/LoadLatestBtn' import {useStores} from '../../state' import {ScreenParams} from '../routes' -import {s, colors, gradients} from '../lib/styles' +import {s} from '../lib/styles' import {useOnMainScroll} from '../lib/hooks/useOnMainScroll' -import {clamp} from 'lodash' - -const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20} export const Home = observer(function Home({ navIdx, @@ -23,7 +18,6 @@ export const Home = observer(function Home({ }: ScreenParams) { const store = useStores() const onMainScroll = useOnMainScroll(store) - const safeAreaInsets = useSafeAreaInsets() const [wasVisible, setWasVisible] = React.useState<boolean>(false) const {appState} = useAppState({ onForeground: () => doPoll(true), @@ -95,48 +89,10 @@ export const Home = observer(function Home({ onPressTryAgain={onPressTryAgain} onScroll={onMainScroll} /> - {store.me.mainFeed.hasNewLatest && !store.me.mainFeed.isRefreshing ? ( - <TouchableOpacity - style={[ - styles.loadLatest, - !store.shell.minimalShellMode && { - bottom: 60 + clamp(safeAreaInsets.bottom, 15, 30), - }, - ]} - onPress={onPressLoadLatest} - hitSlop={HITSLOP}> - <LinearGradient - colors={[gradients.blueLight.start, gradients.blueLight.end]} - start={{x: 0, y: 0}} - end={{x: 1, y: 1}} - style={styles.loadLatestInner}> - <Text type="md-bold" style={styles.loadLatestText}> - Load new posts - </Text> - </LinearGradient> - </TouchableOpacity> - ) : undefined} + {store.me.mainFeed.hasNewLatest && !store.me.mainFeed.isRefreshing && ( + <LoadLatestBtn onPress={onPressLoadLatest} /> + )} <FAB icon="pen-nib" onPress={() => onPressCompose(false)} /> </View> ) }) - -const styles = StyleSheet.create({ - loadLatest: { - position: 'absolute', - left: 20, - bottom: 35, - shadowColor: '#000', - shadowOpacity: 0.3, - shadowOffset: {width: 0, height: 1}, - }, - loadLatestInner: { - flexDirection: 'row', - paddingHorizontal: 14, - paddingVertical: 10, - borderRadius: 30, - }, - loadLatestText: { - color: colors.white, - }, -}) |