Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tablet mode #11698

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 5 additions & 159 deletions README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ const useSource = (tempDirPath: string, themeId: number) => {
`;
}, [tempDirPath]);

const [paddingLeft, paddingRight] = useMemo(() => {
const [paddingLeft, paddingRight, extraRawCss] = useMemo(() => {
const theme = themeStyle(themeId);
return [theme.marginLeft, theme.marginRight];
return [theme.marginLeft, theme.marginRight, theme.extraRawCss];
}, [themeId]);

const html = useMemo(() => {
Expand Down Expand Up @@ -75,6 +75,7 @@ const useSource = (tempDirPath: string, themeId: number) => {
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
${defaultCss}
${extraRawCss || ''}
${shim.mobilePlatform() === 'ios' ? iOSSpecificCss : ''}
</style>
</head>
Expand Down
34 changes: 16 additions & 18 deletions packages/app-mobile/components/SideMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import * as React from 'react';
import { connect } from 'react-redux';
import { AccessibilityInfo, Animated, Dimensions, Easing, I18nManager, LayoutChangeEvent, PanResponder, Pressable, StyleSheet, useWindowDimensions, View } from 'react-native';
import { State } from '@joplin/lib/reducer';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import AccessibleView from './accessibility/AccessibleView';
import { _ } from '@joplin/lib/locale';
import useReduceMotionEnabled from '../utils/hooks/useReduceMotionEnabled';
import { themeStyle } from './global-style';
import { AppState } from '../utils/types';

export enum SideMenuPosition {
Left = 'left',
Right = 'right',
}

export type OnChangeCallback = (isOpen: boolean)=> void;
const isTablet = true;// DeviceInfo.isTablet();

interface Props {
themeId: number;
Expand All @@ -29,16 +30,18 @@ interface Props {

onChange: OnChangeCallback;
disableGestures: boolean;
editMode: boolean;
}

interface UseStylesProps {
themeId: number;
isLeftMenu: boolean;
menuWidth: number;
menuOpenFraction: Animated.AnimatedInterpolation<number>;
isMenuOpen: boolean;
}

const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStylesProps) => {
const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction, isMenuOpen }: UseStylesProps) => {
const { height: windowHeight, width: windowWidth } = useWindowDimensions();
return useMemo(() => {
const theme = themeStyle(themeId);
Expand All @@ -53,16 +56,9 @@ const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStyl
contentOuterWrapper: {
flexGrow: 1,
flexShrink: 1,
width: windowWidth,
width: windowWidth - (isMenuOpen ? menuWidth : 0),
height: windowHeight,
transform: [{
translateX: menuOpenFraction.interpolate({
inputRange: [0, 1],
outputRange: [0, isLeftMenu ? menuWidth : -menuWidth],
}),
// The RN Animation docs suggests setting "perspective" while setting other transform styles:
// https://reactnative.dev/docs/animations#bear-in-mind
}, { perspective: 1000 }],
transform: isMenuOpen ? 'translateX(' + menuWidth + 'px)' : 'none',
},
contentWrapper: {
display: 'flex',
Expand Down Expand Up @@ -107,7 +103,7 @@ const useStyles = ({ themeId, isLeftMenu, menuWidth, menuOpenFraction }: UseStyl
width: windowWidth,
},
});
}, [themeId, isLeftMenu, windowWidth, windowHeight, menuWidth, menuOpenFraction]);
}, [themeId, isLeftMenu, windowWidth, windowHeight, menuWidth, menuOpenFraction, isMenuOpen]);
};

interface UseAnimationsProps {
Expand Down Expand Up @@ -265,11 +261,11 @@ const SideMenuComponent: React.FC<Props> = props => {
setIsAnimating(true);
}, [setIsAnimating]);

const styles = useStyles({ themeId: props.themeId, menuOpenFraction, menuWidth, isLeftMenu });

const styles = useStyles({ themeId: props.themeId, menuOpenFraction, menuWidth, isLeftMenu, isMenuOpen: open });
const menuComponent = (
<AccessibleView
inert={!open}
inert={isTablet ? false : !open}
style={styles.menuWrapper}
>
<AccessibleView
Expand All @@ -285,7 +281,7 @@ const SideMenuComponent: React.FC<Props> = props => {

const contentComponent = (
<AccessibleView
inert={open}
inert={isTablet ? false : open}
style={styles.contentWrapper}
>
<AccessibleView refocusCounter={open ? 1 : undefined} />
Expand Down Expand Up @@ -314,16 +310,18 @@ const SideMenuComponent: React.FC<Props> = props => {
{menuComponent}
<Animated.View style={styles.contentOuterWrapper}>
{contentComponent}
{closeButtonOverlay}
{!isTablet && closeButtonOverlay}
</Animated.View>
</View>
);
};

const SideMenu = connect((state: State) => {
const SideMenu = connect((state: AppState) => {
return {
route: state.route,
themeId: state.settings.theme,
isOpen: state.showSideMenu,
editMode: state.editMode,
};
})(SideMenuComponent);

Expand Down
13 changes: 12 additions & 1 deletion packages/app-mobile/components/screens/Note/Note.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import { BaseScreenComponent } from '../../base-screen';
import { themeStyle, editorFont } from '../../global-style';
import shared, { BaseNoteScreenComponent, Props as BaseProps } from '@joplin/lib/components/shared/note-screen-shared';
import SelectDateTimeDialog from '../../SelectDateTimeDialog';
import ShareExtension from '../../../utils/ShareExtension.js';
import ShareExtension from '../../../utils/ShareExtension';
import CameraView from '../../CameraView/CameraView';
import { FolderEntity, NoteEntity, ResourceEntity } from '@joplin/lib/services/database/types';
import Logger from '@joplin/utils/Logger';
Expand Down Expand Up @@ -338,6 +338,12 @@ class NoteScreenComponent extends BaseScreenComponent<ComponentProps, State> imp
getMode: () => this.state.mode,
setMode: (mode: 'view'|'edit') => {
this.setState({ mode });
if (mode === 'view') {
this.props.dispatch({
type: 'SET_EDIT_MODE',
payload: false,
});
}
},
},
commands,
Expand Down Expand Up @@ -486,6 +492,7 @@ class NoteScreenComponent extends BaseScreenComponent<ComponentProps, State> imp
fontSize: theme.fontSize,
paddingTop: 10, // Added for iOS (Not needed for Android??)
paddingBottom: 10, // Added for iOS (Not needed for Android??)
...theme.titleTextInput,
};

this.styles_[cacheKey] = StyleSheet.create(styles);
Expand Down Expand Up @@ -1543,6 +1550,10 @@ class NoteScreenComponent extends BaseScreenComponent<ComponentProps, State> imp
icon: 'create',
onPress: () => {
this.setState({ mode: 'edit' });
this.props.dispatch({
type: 'SET_EDIT_MODE',
payload: true,
})

this.doFocusUpdate_ = true;
},
Expand Down
5 changes: 3 additions & 2 deletions packages/app-mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,15 @@
"crypto-browserify": "3.12.0",
"deprecated-react-native-prop-types": "5.0.0",
"events": "3.3.0",
"expo": "51.0.26",
"expo": "52.0.*",
"expo-camera": "15.0.16",
"lodash": "4.17.21",
"md5": "2.3.0",
"path-browserify": "1.0.1",
"prop-types": "15.8.1",
"punycode": "2.3.1",
"react": "18.3.1",
"react-native": "0.74.1",
"react-native": "0.75.*",
"react-native-device-info": "10.14.0",
"react-native-document-picker": "9.3.0",
"react-native-dropdownalert": "5.1.0",
Expand Down Expand Up @@ -125,6 +125,7 @@
"react-test-renderer": "18.3.1",
"sharp": "0.33.4",
"sqlite3": "5.1.6",
"tesseract": "^0.0.3",
"timers-browserify": "2.0.12",
"ts-jest": "29.1.5",
"ts-loader": "9.5.1",
Expand Down
40 changes: 25 additions & 15 deletions packages/app-mobile/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ import NavService from '@joplin/lib/services/NavService';
import { createStore, applyMiddleware, Dispatch } from 'redux';
import reduxSharedMiddleware from '@joplin/lib/components/shared/reduxSharedMiddleware';
import shimInit from './utils/shim-init-react';
const { AppNav } = require('./components/app-nav.js');
const { AppNav } = require('./components/app-nav');
import Note from '@joplin/lib/models/Note';
import Folder from '@joplin/lib/models/Folder';
import BaseSyncTarget from '@joplin/lib/BaseSyncTarget';
Expand All @@ -58,13 +58,13 @@ import Database from '@joplin/lib/database';
import NotesScreen from './components/screens/Notes';
import TagsScreen from './components/screens/tags';
import ConfigScreen from './components/screens/ConfigScreen/ConfigScreen';
const { FolderScreen } = require('./components/screens/folder.js');
const { FolderScreen } = require('./components/screens/folder');
import LogScreen from './components/screens/LogScreen';
import StatusScreen from './components/screens/status';
import SearchScreen from './components/screens/SearchScreen';
const { OneDriveLoginScreen } = require('./components/screens/onedrive-login.js');
const { OneDriveLoginScreen } = require('./components/screens/onedrive-login');
import EncryptionConfigScreen from './components/screens/encryption-config';
import DropboxLoginScreen from './components/screens/dropbox-login.js';
import DropboxLoginScreen from './components/screens/dropbox-login';
import { MenuProvider } from 'react-native-popup-menu';
import SideMenu, { SideMenuPosition } from './components/SideMenu';
import SideMenuContent from './components/side-menu-content';
Expand All @@ -78,10 +78,10 @@ import WelcomeUtils from '@joplin/lib/WelcomeUtils';
import { themeStyle } from './components/global-style';
import SyncTargetRegistry from '@joplin/lib/SyncTargetRegistry';
import SyncTargetFilesystem from '@joplin/lib/SyncTargetFilesystem';
const SyncTargetNextcloud = require('@joplin/lib/SyncTargetNextcloud.js');
const SyncTargetWebDAV = require('@joplin/lib/SyncTargetWebDAV.js');
const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox.js');
const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3.js');
const SyncTargetNextcloud = require('@joplin/lib/SyncTargetNextcloud');
const SyncTargetWebDAV = require('@joplin/lib/SyncTargetWebDAV');
const SyncTargetDropbox = require('@joplin/lib/SyncTargetDropbox');
const SyncTargetAmazonS3 = require('@joplin/lib/SyncTargetAmazonS3');
import BiometricPopup from './components/biometrics/BiometricPopup';
import initLib from '@joplin/lib/initLib';
import { isCallbackUrl, parseCallbackUrl, CallbackUrlCommand } from '@joplin/lib/callbackUrlUtils';
Expand Down Expand Up @@ -141,6 +141,7 @@ import { AppState } from './utils/types';
import { getDisplayParentId } from '@joplin/lib/services/trash';

const logger = Logger.create('root');
const isTablet = true;// DeviceInfo.isTablet();

// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Old code before rule was applied
let storeDispatch: any = function(_action: any) {};
Expand Down Expand Up @@ -284,10 +285,18 @@ function historyCanGoBackTo(route: any) {
const appReducer = (state = appDefaultState, action: any) => {
let newState = state;
let historyGoingBack = false;

try {
switch (action.type) {

case 'SET_EDIT_MODE':
newState = {
...state,
editMode: action.payload,
showSideMenu: !action.payload,
};
break;

case 'NAV_BACK':
case 'NAV_GO':

Expand Down Expand Up @@ -318,7 +327,7 @@ const appReducer = (state = appDefaultState, action: any) => {
navHistory.splice(0, navHistory.length);
}

newState = { ...state };
newState = { ...state, editMode: false };

newState.selectedNoteHash = '';

Expand Down Expand Up @@ -384,9 +393,10 @@ const appReducer = (state = appDefaultState, action: any) => {
break;

case 'SIDE_MENU_CLOSE':

newState = { ...state };
newState.showSideMenu = false;
if (!isTablet) {
newState = { ...state };
newState.showSideMenu = false;
}
break;

case 'SET_PLUGIN_PANELS_DIALOG_VISIBLE':
Expand Down Expand Up @@ -1256,7 +1266,7 @@ class AppComponent extends React.Component {
let menuPosition = SideMenuPosition.Left;
let disableSideMenuGestures = this.props.disableSideMenuGestures;

if (this.props.routeName === 'Note') {
if (this.props.routeName === 'Note' && !isTablet) {
sideMenuContent = <SafeAreaView style={{ flex: 1, backgroundColor: theme.backgroundColor }}><SideMenuContentNote options={this.props.noteSideMenuOptions}/></SafeAreaView>;
menuPosition = SideMenuPosition.Right;
} else if (this.props.routeName === 'Config') {
Expand Down Expand Up @@ -1311,7 +1321,7 @@ class AppComponent extends React.Component {
toleranceY={20}
openMenuOffset={this.state.sideMenuWidth}
menuPosition={menuPosition}
onChange={(isOpen: boolean) => this.sideMenu_change(isOpen)}
onChange={(isOpen: boolean) => !isTablet && this.sideMenu_change(isOpen)}
disableGestures={disableSideMenuGestures}
>
<StatusBar barStyle={statusBarStyle} />
Expand Down
4 changes: 3 additions & 1 deletion packages/app-mobile/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
],
"compilerOptions": {
"types": ["jest", "node"],
"moduleSuffixes": [".ios", ".android", ".native", ""]
"moduleSuffixes": [".ios", ".android", ".native", ""],
"allowSyntheticDefaultImports": true,
"noImplicitAny": false
}
}
4 changes: 4 additions & 0 deletions packages/app-mobile/utils/appDefaultState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export const DEFAULT_ROUTE = {
smartFilterId: 'c3176726992c11e9ac940492261af972',
};

const isTablet = true;//DeviceInfo.isTablet();

const appDefaultState: AppState = {
smartFilterId: undefined,
keyboardVisible: false,
Expand All @@ -18,6 +20,8 @@ const appDefaultState: AppState = {
showPanelsDialog: false,
newNoteAttachFileAction: null,
...defaultState,
editMode: false,
showSideMenu: isTablet,

// On mobile, it's possible to select notes that aren't in the selected folder/tag/etc.
allowSelectionInOtherFolders: true,
Expand Down
1 change: 1 addition & 0 deletions packages/app-mobile/utils/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ export interface AppState extends State {
disableSideMenuGestures: boolean;

newNoteAttachFileAction: AttachFileAction | null;
editMode?: boolean;
}
1 change: 1 addition & 0 deletions packages/lib/models/Setting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ class Setting extends BaseModel {
public static THEME_DRACULA = 5;
public static THEME_NORD = 6;
public static THEME_ARITIM_DARK = 7;
public static THEME_TOPLIN = 8;

public static FONT_DEFAULT = 0;
public static FONT_MENLO = 1;
Expand Down
2 changes: 2 additions & 0 deletions packages/lib/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import theme_solarizedDark from './themes/solarizedDark';
import theme_nord from './themes/nord';
import theme_aritimDark from './themes/aritimDark';
import theme_oledDark from './themes/oledDark';
import theme_toplin from './themes/toplin';
import Setting from './models/Setting';
import { Theme, ThemeAppearance } from './themes/type';

Expand All @@ -20,6 +21,7 @@ const themes: Record<number, Theme> = {
[Setting.THEME_NORD]: theme_nord,
[Setting.THEME_ARITIM_DARK]: theme_aritimDark,
[Setting.THEME_OLED_DARK]: theme_oledDark,
[Setting.THEME_TOPLIN]: theme_toplin,
};

export function themeById(themeId: number) {
Expand Down
1 change: 1 addition & 0 deletions packages/lib/themes/solarizedLight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const theme: Theme = {

codeMirrorTheme: 'solarized light',
codeThemeCss: 'atom-one-light.css',
useNormalization: true,
};

export default theme;
Loading
Loading