improved back navigation with file URIs and drawer menu items (#443)
This commit is contained in:
parent
8f609fa900
commit
b5af71d798
9 changed files with 55 additions and 33 deletions
|
@ -28,7 +28,7 @@ install:
|
||||||
- cd ..
|
- cd ..
|
||||||
- mv buildozer.spec.travis buildozer.spec
|
- mv buildozer.spec.travis buildozer.spec
|
||||||
- mkdir -p cd ~/.buildozer/android/platform/
|
- mkdir -p cd ~/.buildozer/android/platform/
|
||||||
- wget -q 'https://us.crystax.net/download/crystax-ndk-10.3.2-linux-x86_64.tar.xz' -P ~/.buildozer/android/
|
- wget -q 'https://dist.testnet.lbry.tech/crystax-ndk-10.3.2-linux-x86_64.tar.xz' -P ~/.buildozer/android/
|
||||||
- wget -q 'https://dl.google.com/android/android-sdk_r23-linux.tgz' -P ~/.buildozer/android/platform/
|
- wget -q 'https://dl.google.com/android/android-sdk_r23-linux.tgz' -P ~/.buildozer/android/platform/
|
||||||
- wget -q 'https://dl.google.com/android/repository/platform-27_r01.zip' -P ~/.buildozer/android/platform/
|
- wget -q 'https://dl.google.com/android/repository/platform-27_r01.zip' -P ~/.buildozer/android/platform/
|
||||||
- wget -q 'https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip' -P ~/.buildozer/android/platform/
|
- wget -q 'https://dl.google.com/android/repository/build-tools_r26.0.1-linux.zip' -P ~/.buildozer/android/platform/
|
||||||
|
|
|
@ -33,7 +33,6 @@ import {
|
||||||
TextInput,
|
TextInput,
|
||||||
ToastAndroid
|
ToastAndroid
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { doPopDrawerStack } from 'redux/actions/drawer';
|
|
||||||
import { doDeleteCompleteBlobs } from 'redux/actions/file';
|
import { doDeleteCompleteBlobs } from 'redux/actions/file';
|
||||||
import { selectDrawerStack } from 'redux/selectors/drawer';
|
import { selectDrawerStack } from 'redux/selectors/drawer';
|
||||||
import { SETTINGS, doDismissToast, doToast, selectToast } from 'lbry-redux';
|
import { SETTINGS, doDismissToast, doToast, selectToast } from 'lbry-redux';
|
||||||
|
@ -246,7 +245,7 @@ class AppWithNavigationState extends React.Component {
|
||||||
componentWillMount() {
|
componentWillMount() {
|
||||||
AppState.addEventListener('change', this._handleAppStateChange);
|
AppState.addEventListener('change', this._handleAppStateChange);
|
||||||
BackHandler.addEventListener('hardwareBackPress', function() {
|
BackHandler.addEventListener('hardwareBackPress', function() {
|
||||||
const { dispatch, nav, drawerStack, popDrawerStack } = this.props;
|
const { dispatch, nav, drawerStack } = this.props;
|
||||||
// There should be a better way to check this
|
// There should be a better way to check this
|
||||||
if (nav.routes.length > 0) {
|
if (nav.routes.length > 0) {
|
||||||
if (nav.routes[0].routeName === 'Main') {
|
if (nav.routes[0].routeName === 'Main') {
|
||||||
|
@ -255,7 +254,7 @@ class AppWithNavigationState extends React.Component {
|
||||||
mainRoute.routes[0].index > 0 /* Discover stack index */ ||
|
mainRoute.routes[0].index > 0 /* Discover stack index */ ||
|
||||||
mainRoute.routes[4].index > 0 /* Wallet stack index */ ||
|
mainRoute.routes[4].index > 0 /* Wallet stack index */ ||
|
||||||
mainRoute.index >= 5 /* Settings and About screens */) {
|
mainRoute.index >= 5 /* Settings and About screens */) {
|
||||||
dispatchNavigateBack(dispatch, nav, drawerStack, doPopDrawerStack);
|
dispatchNavigateBack(dispatch, nav, drawerStack);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,8 @@ const Constants = {
|
||||||
DRAWER_ROUTE_WALLET: "Wallet",
|
DRAWER_ROUTE_WALLET: "Wallet",
|
||||||
DRAWER_ROUTE_SETTINGS: "Settings",
|
DRAWER_ROUTE_SETTINGS: "Settings",
|
||||||
DRAWER_ROUTE_ABOUT: "About",
|
DRAWER_ROUTE_ABOUT: "About",
|
||||||
|
DRAWER_ROUTE_SEARCH: "Search",
|
||||||
|
DRAWER_ROUTE_TRANSACTION_HISTORY: "TransactionHistory",
|
||||||
|
|
||||||
SUBSCRIPTIONS_VIEW_ALL: 'view_all',
|
SUBSCRIPTIONS_VIEW_ALL: 'view_all',
|
||||||
SUBSCRIPTIONS_VIEW_LATEST_FIRST: 'view_latest_first',
|
SUBSCRIPTIONS_VIEW_LATEST_FIRST: 'view_latest_first',
|
||||||
|
@ -45,5 +47,7 @@ export const DrawerRoutes = [
|
||||||
Constants.DRAWER_ROUTE_REWARDS,
|
Constants.DRAWER_ROUTE_REWARDS,
|
||||||
Constants.DRAWER_ROUTE_WALLET,
|
Constants.DRAWER_ROUTE_WALLET,
|
||||||
Constants.DRAWER_ROUTE_SETTINGS,
|
Constants.DRAWER_ROUTE_SETTINGS,
|
||||||
Constants.DRAWER_ROUTE_ABOUT
|
Constants.DRAWER_ROUTE_ABOUT,
|
||||||
|
Constants.DRAWER_ROUTE_SEARCH,
|
||||||
|
Constants.DRAWER_ROUTE_TRANSACTION_HISTORY
|
||||||
];
|
];
|
||||||
|
|
|
@ -5,6 +5,8 @@ import {
|
||||||
selectIsSearching,
|
selectIsSearching,
|
||||||
selectSearchValue
|
selectSearchValue
|
||||||
} from 'lbry-redux';
|
} from 'lbry-redux';
|
||||||
|
import { doPushDrawerStack } from 'redux/actions/drawer';
|
||||||
|
import Constants from 'constants';
|
||||||
import SearchPage from './view';
|
import SearchPage from './view';
|
||||||
|
|
||||||
const select = (state) => ({
|
const select = (state) => ({
|
||||||
|
@ -14,7 +16,8 @@ const select = (state) => ({
|
||||||
});
|
});
|
||||||
|
|
||||||
const perform = dispatch => ({
|
const perform = dispatch => ({
|
||||||
search: (query) => dispatch(doSearch(query, 25))
|
search: (query) => dispatch(doSearch(query, 25)),
|
||||||
|
pushDrawerStack: () => dispatch(doPushDrawerStack(Constants.DRAWER_ROUTE_SEARCH)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(select, perform)(SearchPage);
|
export default connect(select, perform)(SearchPage);
|
||||||
|
|
|
@ -21,6 +21,10 @@ class SearchPage extends React.PureComponent {
|
||||||
title: 'Search Results'
|
title: 'Search Results'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
componentWillMount() {
|
||||||
|
this.props.pushDrawerStack();
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
const { navigation, search } = this.props;
|
const { navigation, search } = this.props;
|
||||||
const { searchQuery } = navigation.state.params;
|
const { searchQuery } = navigation.state.params;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import {
|
||||||
selectTransactionItems,
|
selectTransactionItems,
|
||||||
selectIsFetchingTransactions,
|
selectIsFetchingTransactions,
|
||||||
} from 'lbry-redux';
|
} from 'lbry-redux';
|
||||||
|
import { doPushDrawerStack } from 'redux/actions/drawer';
|
||||||
import TransactionHistoryPage from './view';
|
import TransactionHistoryPage from './view';
|
||||||
|
|
||||||
const select = state => ({
|
const select = state => ({
|
||||||
|
@ -13,6 +14,7 @@ const select = state => ({
|
||||||
|
|
||||||
const perform = dispatch => ({
|
const perform = dispatch => ({
|
||||||
fetchTransactions: () => dispatch(doFetchTransactions()),
|
fetchTransactions: () => dispatch(doFetchTransactions()),
|
||||||
|
pushDrawerStack: () => dispatch(doPushDrawerStack(Constants.DRAWER_ROUTE_TRANSACTION_HISTORY)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(select, perform)(TransactionHistoryPage);
|
export default connect(select, perform)(TransactionHistoryPage);
|
||||||
|
|
|
@ -4,6 +4,10 @@ import TransactionList from '../../component/transactionList';
|
||||||
import walletStyle from '../../styles/wallet';
|
import walletStyle from '../../styles/wallet';
|
||||||
|
|
||||||
class TransactionHistoryPage extends React.PureComponent {
|
class TransactionHistoryPage extends React.PureComponent {
|
||||||
|
componentWillMount() {
|
||||||
|
this.props.pushDrawerStack();
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.fetchTransactions();
|
this.props.fetchTransactions();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ reducers[Constants.ACTION_PUSH_DRAWER_STACK] = (state, action) => {
|
||||||
const routeName = action.data;
|
const routeName = action.data;
|
||||||
const newStack = state.stack.slice();
|
const newStack = state.stack.slice();
|
||||||
|
|
||||||
if (routeName !== newStack[newStack.length -1]) {
|
if (routeName !== newStack[newStack.length - 1]) {
|
||||||
newStack.push(routeName);
|
newStack.push(routeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { NavigationActions, StackActions } from 'react-navigation';
|
import { NavigationActions, StackActions } from 'react-navigation';
|
||||||
import { buildURI } from 'lbry-redux';
|
import { buildURI, isURIValid } from 'lbry-redux';
|
||||||
|
import { doPopDrawerStack, doPushDrawerStack } from 'redux/actions/drawer';
|
||||||
import { DrawerRoutes } from 'constants';
|
import { DrawerRoutes } from 'constants';
|
||||||
import Constants from 'constants';
|
import Constants from 'constants';
|
||||||
|
|
||||||
|
@ -18,7 +19,7 @@ function getRouteForSpecialUri(uri) {
|
||||||
return targetRoute;
|
return targetRoute;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function dispatchNavigateToUri(dispatch, nav, uri) {
|
export function dispatchNavigateToUri(dispatch, nav, uri, isNavigatingBack) {
|
||||||
if (uri.startsWith('lbry://?')) {
|
if (uri.startsWith('lbry://?')) {
|
||||||
dispatch(NavigationActions.navigate({ routeName: getRouteForSpecialUri(uri) }));
|
dispatch(NavigationActions.navigate({ routeName: getRouteForSpecialUri(uri) }));
|
||||||
return;
|
return;
|
||||||
|
@ -32,6 +33,11 @@ export function dispatchNavigateToUri(dispatch, nav, uri) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const params = { uri, uriVars };
|
const params = { uri, uriVars };
|
||||||
|
|
||||||
|
if (!isNavigatingBack) {
|
||||||
|
dispatch(doPushDrawerStack(uri));
|
||||||
|
}
|
||||||
|
|
||||||
if (nav && nav.routes && nav.routes.length > 0 && 'Main' === nav.routes[0].routeName) {
|
if (nav && nav.routes && nav.routes.length > 0 && 'Main' === nav.routes[0].routeName) {
|
||||||
const mainRoute = nav.routes[0];
|
const mainRoute = nav.routes[0];
|
||||||
const discoverRoute = mainRoute.routes[0];
|
const discoverRoute = mainRoute.routes[0];
|
||||||
|
@ -86,7 +92,7 @@ function parseUriVars(vars) {
|
||||||
return uriVars;
|
return uriVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function navigateToUri(navigation, uri, additionalParams) {
|
export function navigateToUri(navigation, uri, additionalParams, isNavigatingBack) {
|
||||||
if (!navigation) {
|
if (!navigation) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -107,49 +113,49 @@ export function navigateToUri(navigation, uri, additionalParams) {
|
||||||
uriVars = parseUriVars(uriVarsStr);
|
uriVars = parseUriVars(uriVarsStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { store } = window;
|
||||||
const params = Object.assign({ uri, uriVars }, additionalParams);
|
const params = Object.assign({ uri, uriVars }, additionalParams);
|
||||||
if ('File' === navigation.state.routeName) {
|
if ('File' === navigation.state.routeName) {
|
||||||
const stackAction = StackActions.replace({ routeName: 'File', newKey: uri, params });
|
const stackAction = StackActions.replace({ routeName: 'File', newKey: uri, params });
|
||||||
navigation.dispatch(stackAction);
|
navigation.dispatch(stackAction);
|
||||||
|
if (store && store.dispatch && !isNavigatingBack) {
|
||||||
|
store.dispatch(doPushDrawerStack(uri));
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
navigation.navigate({ routeName: 'File', key: uri, params });
|
navigation.navigate({ routeName: 'File', key: uri, params });
|
||||||
|
if (store && store.dispatch && !isNavigatingBack) {
|
||||||
|
store.dispatch(doPushDrawerStack(uri));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function navigateBack(navigation, drawerStack, popDrawerStack) {
|
export function navigateBack(navigation, drawerStack, popDrawerStack) {
|
||||||
const shouldPopStack = DrawerRoutes.indexOf(navigation.state.routeName) > -1;
|
if (popDrawerStack) {
|
||||||
if (shouldPopStack) {
|
popDrawerStack();
|
||||||
navigation.goBack();
|
|
||||||
if (popDrawerStack) {
|
|
||||||
popDrawerStack();
|
|
||||||
}
|
|
||||||
|
|
||||||
navigation.navigate({ routeName: drawerStack[drawerStack.length > 1 ? drawerStack.length - 2 : 0] });
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const target = drawerStack[drawerStack.length > 1 ? drawerStack.length - 2 : 0];
|
||||||
navigation.goBack(navigation.state.key);
|
navigation.goBack(navigation.state.key);
|
||||||
|
if (DrawerRoutes.indexOf(target) === -1 && isURIValid(target)) {
|
||||||
|
navigateToUri(navigation, target, null, true);
|
||||||
|
} else {
|
||||||
|
navigation.navigate({ routeName: target });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function dispatchNavigateBack(dispatch, nav, drawerStack, popDrawerStack) {
|
export function dispatchNavigateBack(dispatch, nav, drawerStack) {
|
||||||
const drawerRouteIndex = nav.routes[0].index;
|
dispatch(doPopDrawerStack());
|
||||||
const shouldPopStack = (
|
|
||||||
(drawerRouteIndex > 0 && drawerRouteIndex !== 3) || // not the discover nor wallet stack
|
|
||||||
(drawerRouteIndex === 3 && nav.routes[0].routes[drawerRouteIndex].index === 0) // wallet stack, and tx history page not active
|
|
||||||
);
|
|
||||||
if (shouldPopStack) {
|
|
||||||
dispatch(NavigationActions.back());
|
|
||||||
if (popDrawerStack) {
|
|
||||||
dispatch(popDrawerStack());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const target = drawerStack[drawerStack.length > 1 ? drawerStack.length - 2 : 0];
|
||||||
|
dispatch(NavigationActions.back());
|
||||||
|
|
||||||
|
if (DrawerRoutes.indexOf(target) === -1 && isURIValid(target)) {
|
||||||
|
dispatchNavigateToUri(dispatch, nav, target, true);
|
||||||
|
} else {
|
||||||
const navigateAction = NavigationActions.navigate({ routeName: drawerStack[drawerStack.length > 1 ? drawerStack.length - 2 : 0] });
|
const navigateAction = NavigationActions.navigate({ routeName: drawerStack[drawerStack.length > 1 ? drawerStack.length - 2 : 0] });
|
||||||
dispatch(navigateAction);
|
dispatch(navigateAction);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch(NavigationActions.back());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function uriFromFileInfo(fileInfo) {
|
export function uriFromFileInfo(fileInfo) {
|
||||||
|
|
Loading…
Reference in a new issue