diff --git a/app/lib/hooks/navigation.ts b/app/lib/hooks/navigation.ts new file mode 100644 index 000000000..988bec90f --- /dev/null +++ b/app/lib/hooks/navigation.ts @@ -0,0 +1,43 @@ +import { RouteProp, useNavigation, useRoute } from '@react-navigation/native'; +import { StackNavigationProp } from '@react-navigation/stack'; + +import { TNavigation } from '../../stacks/stackType'; +import { + AdminPanelStackParamList, + ChatsStackParamList, + DisplayPrefStackParamList, + DrawerParamList, + E2EEnterYourPasswordStackParamList, + E2ESaveYourPasswordStackParamList, + InsideStackParamList, + NewMessageStackParamList, + OutsideModalParamList, + OutsideParamList, + ProfileStackParamList, + SettingsStackParamList +} from '../../stacks/types'; + +type TRoutes = + | ChatsStackParamList + | ProfileStackParamList + | SettingsStackParamList + | AdminPanelStackParamList + | DisplayPrefStackParamList + | DrawerParamList + | NewMessageStackParamList + | E2ESaveYourPasswordStackParamList + | E2EEnterYourPasswordStackParamList + | InsideStackParamList + | OutsideParamList + | OutsideModalParamList + | TNavigation; + +export function useAppNavigation() { + const navigation = useNavigation>(); + return navigation; +} + +export function useAppRoute() { + const route = useRoute>(); + return route; +} diff --git a/app/stacks/InsideStack.tsx b/app/stacks/InsideStack.tsx index b9f4e0a1e..844f26f35 100644 --- a/app/stacks/InsideStack.tsx +++ b/app/stacks/InsideStack.tsx @@ -82,6 +82,7 @@ import { SettingsStackParamList } from './types'; import { isIOS } from '../lib/methods/helpers'; +import { TNavigation } from './stackType'; // ChatsStackNavigator const ChatsStack = createStackNavigator(); @@ -306,7 +307,7 @@ const E2EEnterYourPasswordStackNavigator = () => { }; // InsideStackNavigator -const InsideStack = createStackNavigator(); +const InsideStack = createStackNavigator(); const InsideStackNavigator = () => { const { theme } = React.useContext(ThemeContext); diff --git a/app/stacks/MasterDetailStack/index.tsx b/app/stacks/MasterDetailStack/index.tsx index b1e99f51e..2d0151649 100644 --- a/app/stacks/MasterDetailStack/index.tsx +++ b/app/stacks/MasterDetailStack/index.tsx @@ -73,6 +73,7 @@ import { ModalStackParamList } from './types'; import { isIOS } from '../../lib/methods/helpers'; +import { TNavigation } from '../stackType'; // ChatsStackNavigator const ChatsStack = createStackNavigator(); @@ -206,7 +207,7 @@ const ModalStackNavigator = React.memo(({ navigation }: INavigation) => { }); // InsideStackNavigator -const InsideStack = createStackNavigator(); +const InsideStack = createStackNavigator(); const InsideStackNavigator = React.memo(() => { const { theme } = React.useContext(ThemeContext); return ( diff --git a/app/stacks/MasterDetailStack/types.ts b/app/stacks/MasterDetailStack/types.ts index 5c9a753d0..e86f52e0f 100644 --- a/app/stacks/MasterDetailStack/types.ts +++ b/app/stacks/MasterDetailStack/types.ts @@ -207,9 +207,6 @@ export type ModalStackParamList = { export type MasterDetailInsideStackParamList = { DrawerNavigator: NavigatorScreenParams>; // TODO: Change ModalStackNavigator: NavigatorScreenParams; - AttachmentView: { - attachment: IAttachment; - }; ModalBlockView: { data: any; // TODO: Change }; diff --git a/app/stacks/stackType.ts b/app/stacks/stackType.ts new file mode 100644 index 000000000..5e392d1ae --- /dev/null +++ b/app/stacks/stackType.ts @@ -0,0 +1,20 @@ +import { IAttachment } from '../definitions'; +import { IOptionsField } from '../views/NotificationPreferencesView/options'; + +export type TNavigation = { + PickerView: { + title: string; + data: IOptionsField[]; + value?: string; + onSearch: (text?: string, offset?: number) => Promise; + onEndReached?: (text?: string, offset?: number) => Promise; + total?: number; + onChangeValue: Function; + }; + ForwardLivechatView: { + rid: string; + }; + AttachmentView: { + attachment: IAttachment; + }; +}; diff --git a/app/stacks/types.ts b/app/stacks/types.ts index 1ef46a795..1c6218679 100644 --- a/app/stacks/types.ts +++ b/app/stacks/types.ts @@ -288,9 +288,6 @@ export type InsideStackParamList = { NewMessageStackNavigator: NavigatorScreenParams; E2ESaveYourPasswordStackNavigator: NavigatorScreenParams; E2EEnterYourPasswordStackNavigator: NavigatorScreenParams; - AttachmentView: { - attachment: IAttachment; - }; StatusView: undefined; ShareView: { attachments: IAttachment[]; diff --git a/app/views/AttachmentView.tsx b/app/views/AttachmentView.tsx index 36cf43c14..a9ec7c1dd 100644 --- a/app/views/AttachmentView.tsx +++ b/app/views/AttachmentView.tsx @@ -1,83 +1,114 @@ -import React from 'react'; -import { PermissionsAndroid, StyleSheet, View } from 'react-native'; -import { connect } from 'react-redux'; -import { StackNavigationOptions, StackNavigationProp } from '@react-navigation/stack'; -import { RouteProp } from '@react-navigation/native'; import CameraRoll from '@react-native-community/cameraroll'; -import * as mime from 'react-native-mime-types'; -import RNFetchBlob from 'rn-fetch-blob'; -import { Video, ResizeMode } from 'expo-av'; +import { HeaderBackground, useHeaderHeight } from '@react-navigation/elements'; +import { StackNavigationOptions } from '@react-navigation/stack'; +import { ResizeMode, Video } from 'expo-av'; import { sha256 } from 'js-sha256'; -import { withSafeAreaInsets } from 'react-native-safe-area-context'; -import { HeaderBackground, HeaderHeightContext } from '@react-navigation/elements'; +import React from 'react'; +import { PermissionsAndroid, useWindowDimensions, View } from 'react-native'; +import * as mime from 'react-native-mime-types'; +import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { shallowEqual } from 'react-redux'; +import RNFetchBlob from 'rn-fetch-blob'; -import { LISTENER } from '../containers/Toast'; -import EventEmitter from '../lib/methods/helpers/events'; -import I18n from '../i18n'; -import { TSupportedThemes, withTheme } from '../theme'; -import { ImageViewer } from '../containers/ImageViewer'; -import { themes } from '../lib/constants'; import RCActivityIndicator from '../containers/ActivityIndicator'; import * as HeaderButton from '../containers/HeaderButton'; -import { isAndroid, formatAttachmentUrl } from '../lib/methods/helpers'; -import { getUserSelector } from '../selectors/login'; -import { withDimensions } from '../dimensions'; +import { ImageViewer } from '../containers/ImageViewer'; import StatusBar from '../containers/StatusBar'; -import { InsideStackParamList } from '../stacks/types'; -import { IApplicationState, IUser, IAttachment } from '../definitions'; +import { LISTENER } from '../containers/Toast'; +import { IAttachment } from '../definitions'; +import I18n from '../i18n'; +import { useAppSelector } from '../lib/hooks'; +import { useAppNavigation, useAppRoute } from '../lib/hooks/navigation'; +import { formatAttachmentUrl, isAndroid } from '../lib/methods/helpers'; +import EventEmitter from '../lib/methods/helpers/events'; +import { getUserSelector } from '../selectors/login'; +import { TNavigation } from '../stacks/stackType'; +import { useTheme } from '../theme'; -const styles = StyleSheet.create({ - container: { - flex: 1 - } -}); - -interface IAttachmentViewState { +const RenderContent = ({ + setLoading, + attachment +}: { + setLoading: React.Dispatch>; attachment: IAttachment; - loading: boolean; -} +}) => { + const videoRef = React.useRef