diff --git a/__mocks__/styleMock.js b/__mocks__/styleMock.js index d81ded5dd3..f7b7e1601a 100644 --- a/__mocks__/styleMock.js +++ b/__mocks__/styleMock.js @@ -1,4 +1,10 @@ /** @flow * @format */ -module.exports = {}; +module.exports = { + + //Mock block paragraph style with minimum height + blockText: { + minHeight: 50, + }, +}; diff --git a/gutenberg b/gutenberg index 3511dd8e45..26ccc159f3 160000 --- a/gutenberg +++ b/gutenberg @@ -1 +1 @@ -Subproject commit 3511dd8e453920e464b1a0a6e8d9ce1158945cd6 +Subproject commit 26ccc159f373e5412d4fabf20fa00431d8fce7b6 diff --git a/package.json b/package.json index bea9c1f4c4..4eeef61470 100644 --- a/package.json +++ b/package.json @@ -90,20 +90,25 @@ "jsdom-jscore": "git+https://github.com/iamcco/jsdom-jscore-rn.git#6eac88dd5d5e7c21ce6382abde7dbc376d7f7f59", "jsx-to-string": "^1.3.1", "memize": "^1.0.5", + "moment": "^2.22.1", + "moment-timezone": "^0.5.16", "node-libs-react-native": "^1.0.2", "node-sass": "^4.8.3", "react": "16.5.0", "react-native": "0.57.1", + "react-native-hr": "git+https://github.com/Riglerr/react-native-hr.git#2d01a5cf77212d100e8b99e0310cce5234f977b3", "react-native-modal": "^6.5.0", "react-native-recyclerview-list": "git+https://github.com/wordpress-mobile/react-native-recyclerview-list.git#336f7159eb6e7bad467c041b3f34667d485e7b58", "react-native-svg": "^6.5.2", - "react-native-hr": "git+https://github.com/Riglerr/react-native-hr.git#2d01a5cf77212d100e8b99e0310cce5234f977b3", "react-redux": "^5.0.7", "redux": "^3.7.2", + "redux-multi": "^0.1.12", + "redux-optimist": "^1.0.0", + "refx": "^3.0.0", "rememo": "^3.0.0", "shallowequal": "^1.0.2", "simple-html-tokenizer": "^0.5.1", "tinycolor2": "^1.4.1", "turbo-combine-reducers": "^1.0.2" } -} +} \ No newline at end of file diff --git a/react-native-aztec b/react-native-aztec index e25607f813..9d96ffff5d 160000 --- a/react-native-aztec +++ b/react-native-aztec @@ -1 +1 @@ -Subproject commit e25607f81354dcf8a678e0354a62a8c7f4d42355 +Subproject commit 9d96ffff5df55bc2aaf01aa7843cb1365ee1fc89 diff --git a/src/app/App.test.js b/src/app/App.test.js index 35002788a2..ac6e8fd4cd 100644 --- a/src/app/App.test.js +++ b/src/app/App.test.js @@ -43,7 +43,7 @@ describe( 'App', () => { const contentComponent = blockHolderContainer.children[ 0 ]; const inputComponent = contentComponent.children[ 0 ].children[ 0 ].children[ 0 ].children[ 0 ].children[ 0 ] - .children[ 0 ].children[ 0 ]; + .children[ 0 ].children[ 0 ].children[ 0 ].children[ 0 ].children[ 0 ]; expect( inputComponent.type ).toBe( 'TextInput' ); } } ); diff --git a/src/app/MainApp.js b/src/app/MainApp.js index 16636dc722..118823751e 100644 --- a/src/app/MainApp.js +++ b/src/app/MainApp.js @@ -5,6 +5,7 @@ import React from 'react'; import { subscribeParentGetHtml } from 'react-native-gutenberg-bridge'; import BlockManager, { type BlockListType } from '../block-management/block-manager'; +import { SlotFillProvider } from '@wordpress/components'; import type { EmitterSubscription } from 'react-native'; @@ -27,6 +28,10 @@ export default class MainScreen extends React.Component { } render() { - return ; + return ( + + + + ); } } diff --git a/src/block-management/block-holder.js b/src/block-management/block-holder.js index 6d05be9dba..0abf103617 100644 --- a/src/block-management/block-holder.js +++ b/src/block-management/block-holder.js @@ -5,19 +5,19 @@ import React from 'react'; import { View, Text, TouchableWithoutFeedback } from 'react-native'; -import Toolbar from './toolbar'; +import InlineToolbar from './inline-toolbar'; import type { BlockType } from '../store/'; import styles from './block-holder.scss'; // Gutenberg imports -import { getBlockType, getUnregisteredTypeHandlerName } from '@wordpress/blocks'; +import { BlockEdit } from '@wordpress/editor'; type PropsType = BlockType & { showTitle: boolean, onChange: ( clientId: string, attributes: mixed ) => void, - onToolbarButtonPressed: ( button: number, clientId: string ) => void, + onInlineToolbarButtonPressed: ( button: number, clientId: string ) => void, onBlockHolderPressed: ( clientId: string ) => void, insertBlocksAfter: ( blocks: Array ) => void, mergeBlocks: ( forward: boolean ) => void, @@ -40,9 +40,9 @@ export default class BlockHolder extends React.Component { renderToolbarIfBlockFocused() { if ( this.props.focused ) { return ( - ); } @@ -52,20 +52,9 @@ export default class BlockHolder extends React.Component { } getBlockForType() { - // Since unsupported blocks are handled in block-manager.js, at this point the block should definitely - // be supported. - const blockType = getBlockType( this.props.name ); - const Block = blockType.edit; - - let style; - if ( blockType.name === 'core/code' ) { - style = styles.blockCode; - } else if ( blockType.name === 'core/paragraph' ) { - style = styles.blockText; - } - return ( - @@ -74,22 +63,10 @@ export default class BlockHolder extends React.Component { insertBlocksAfter={ this.props.insertBlocksAfter } mergeBlocks={ this.props.mergeBlocks } isSelected={ this.props.focused } - style={ style } /> ); } - getBlockType( blockName: String ) { - let blockType = getBlockType( blockName ); - - if ( ! blockType ) { - const fallbackBlockName = getUnregisteredTypeHandlerName(); - blockType = getBlockType( fallbackBlockName ); - } - - return blockType; - } - renderBlockTitle() { return ( diff --git a/src/block-management/block-manager.js b/src/block-management/block-manager.js index eabba2d52b..4024017569 100644 --- a/src/block-management/block-manager.js +++ b/src/block-management/block-manager.js @@ -7,11 +7,12 @@ import React from 'react'; import { Platform, Switch, Text, View, FlatList, KeyboardAvoidingView } from 'react-native'; import RecyclerViewList, { DataSource } from 'react-native-recyclerview-list'; import BlockHolder from './block-holder'; -import { ToolbarButton } from './constants'; +import { InlineToolbarButton } from './constants'; import type { BlockType } from '../store/'; import styles from './block-manager.scss'; import BlockPicker from './block-picker'; import HTMLTextInput from '../components/html-text-input'; +import BlockToolbar from './block-toolbar'; // Gutenberg imports import { createBlock, getBlockType, switchToBlockType } from '@wordpress/blocks'; @@ -53,9 +54,21 @@ export default class BlockManager extends React.Component } onBlockHolderPressed( clientId: string ) { + this.focusDataSourceItem( clientId ); this.props.focusBlockAction( clientId ); } + focusDataSourceItem( clientId: string ) { + for ( let i = 0; i < this.state.dataSource.size(); ++i ) { + const block = this.state.dataSource.get( i ); + if ( block.clientId === clientId ) { + block.focused = true; + } else { + block.focused = false; + } + } + } + getDataSourceIndexFromClientId( clientId: string ) { for ( let i = 0; i < this.state.dataSource.size(); ++i ) { const block = this.state.dataSource.get( i ); @@ -112,25 +125,25 @@ export default class BlockManager extends React.Component return null; } - onToolbarButtonPressed( button: number, clientId: string ) { + onInlineToolbarButtonPressed( button: number, clientId: string ) { const dataSourceBlockIndex = this.getDataSourceIndexFromClientId( clientId ); switch ( button ) { - case ToolbarButton.UP: + case InlineToolbarButton.UP: this.state.dataSource.moveUp( dataSourceBlockIndex ); this.props.moveBlockUpAction( clientId ); break; - case ToolbarButton.DOWN: + case InlineToolbarButton.DOWN: this.state.dataSource.moveDown( dataSourceBlockIndex ); this.props.moveBlockDownAction( clientId ); break; - case ToolbarButton.DELETE: + case InlineToolbarButton.DELETE: this.state.dataSource.splice( dataSourceBlockIndex, 1 ); this.props.deleteBlockAction( clientId ); break; - case ToolbarButton.PLUS: + case InlineToolbarButton.PLUS: this.showBlockTypePicker( true ); break; - case ToolbarButton.SETTINGS: + case InlineToolbarButton.SETTINGS: // TODO: implement settings break; } @@ -260,6 +273,7 @@ export default class BlockManager extends React.Component return ( { list } + ); } @@ -324,7 +338,7 @@ export default class BlockManager extends React.Component + + + + ); + } +} diff --git a/src/block-management/constants.js b/src/block-management/constants.js index 38c1ff8d24..2a4979461b 100644 --- a/src/block-management/constants.js +++ b/src/block-management/constants.js @@ -3,7 +3,7 @@ * @flow */ -const ToolbarButton = { +const InlineToolbarButton = { UP: 1, DOWN: 2, SETTINGS: 3, @@ -11,4 +11,4 @@ const ToolbarButton = { PLUS: 5, }; -export { ToolbarButton }; +export { InlineToolbarButton }; diff --git a/src/block-management/toolbar.js b/src/block-management/inline-toolbar.js similarity index 66% rename from src/block-management/toolbar.js rename to src/block-management/inline-toolbar.js index 3941cc9e2e..7261e56f6b 100644 --- a/src/block-management/toolbar.js +++ b/src/block-management/inline-toolbar.js @@ -3,35 +3,35 @@ import React from 'react'; import { View, TouchableOpacity, Text } from 'react-native'; -import { ToolbarButton } from './constants'; +import { InlineToolbarButton } from './constants'; -import styles from './toolbar.scss'; +import styles from './inline-toolbar.scss'; type PropsType = { clientId: string, onButtonPressed: ( button: number, clientId: string ) => void, }; -export default class Toolbar extends React.Component { +export default class InlineToolbar extends React.Component { render() { return ( - + - + + - + @@ -39,11 +39,11 @@ export default class Toolbar extends React.Component { - + @@ -51,11 +51,11 @@ export default class Toolbar extends React.Component { - + { /* eslint-disable-next-line jsx-a11y/accessible-emoji */ } ⚙️ @@ -64,11 +64,11 @@ export default class Toolbar extends React.Component { - + 🗑 diff --git a/src/block-management/toolbar.scss b/src/block-management/inline-toolbar.scss similarity index 84% rename from src/block-management/toolbar.scss rename to src/block-management/inline-toolbar.scss index 464a2613f0..1c73566c68 100644 --- a/src/block-management/toolbar.scss +++ b/src/block-management/inline-toolbar.scss @@ -1,6 +1,6 @@ /** @format */ -.toolbar { +.inlineToolbar { height: 34; background-color: white; flex-direction: row; @@ -8,7 +8,7 @@ padding-right: 8; } -.toolbarButton { +.inlineToolbarButton { width: 50; justify-content: center; align-items: center; diff --git a/symlinked-packages-in-parent/@wordpress/date b/symlinked-packages-in-parent/@wordpress/date new file mode 120000 index 0000000000..8962e5ffea --- /dev/null +++ b/symlinked-packages-in-parent/@wordpress/date @@ -0,0 +1 @@ +../../../packages/date/build/ \ No newline at end of file diff --git a/symlinked-packages/@wordpress/date b/symlinked-packages/@wordpress/date new file mode 120000 index 0000000000..cd7cfa1aab --- /dev/null +++ b/symlinked-packages/@wordpress/date @@ -0,0 +1 @@ +../../gutenberg/packages/date/src/ \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index dbe03068dd..1e08135ec7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6129,6 +6129,18 @@ mixin-deep@^1.2.0: dependencies: minimist "0.0.8" +moment-timezone@^0.5.16: + version "0.5.23" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.23.tgz#7cbb00db2c14c71b19303cb47b0fb0a6d8651463" + integrity sha512-WHFH85DkCfiNMDX5D3X7hpNH3/PUhjTGcD0U1SgfBGZxJ3qUmJh5FdvaFjcClxOvB3rzdfj4oRffbI38jEnC1w== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.22.1: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + integrity sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y= + morgan@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" @@ -7478,6 +7490,16 @@ redux-devtools-instrument@^1.3.3: lodash "^4.2.0" symbol-observable "^1.0.2" +redux-multi@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/redux-multi/-/redux-multi-0.1.12.tgz#28e1fe5e49672cbc5bd8a07f0b2aeaf0ef8355c2" + integrity sha1-KOH+XklnLLxb2KB/Cyrq8O+DVcI= + +redux-optimist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redux-optimist/-/redux-optimist-1.0.0.tgz#1f3d4ffbcd11573159bb90e96c68e35e3b875818" + integrity sha512-AG1v8o6UZcGXTEH2jVcWG6KD+gEix+Cj9JXAAzln9MPkauSVd98H7N7EOOyT/v4c9N1mJB4sm1zfspGlLDkUEw== + redux@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" @@ -7488,6 +7510,11 @@ redux@^3.7.2: loose-envify "^1.1.0" symbol-observable "^1.0.3" +refx@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/refx/-/refx-3.1.1.tgz#8ca1b4844ac81ff8e8b79523fdd082cac9b05517" + integrity sha512-lwN27W5iYyagpCxxYDYDl0IIiKh0Vgi3wvafqfthbzTfBgLOYAstcftp+G2X612xVaB8rhn5wDxd4er4KEeb8A== + regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"