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

[RNMobile] Circle Progress for MediaUploadProgress #27429

Closed
wants to merge 11 commits into from

Conversation

jd-alexander
Copy link
Contributor

@jd-alexander jd-alexander commented Dec 2, 2020

WP Android wordpress-mobile/WordPress-Android#13516

Description

This PR introduces a circle progress component mode for the MediaUploadProgress component. This behavior works by

How has this been tested?

  1. Create a new post.
  2. Add a File Block.
  3. Choose a file from the device.
  4. Notice the circle progress circle updates.

Screenshots

Noticeable issues

  1. The progress component flickers when it's first drawn.
  2. The RichText component wraps on Android. Similar issue to the one that occurred with the placeholder issue.
  3. Margin needs to be added to the component.
  4. If you type a really long title the progress circle goes off-screen so we would need to have some form of flexbox styling that stops the RichText component from growing to the edge of the screen.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR.

@jd-alexander jd-alexander requested a review from etoledom December 2, 2020 01:19
@jd-alexander jd-alexander added the Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) label Dec 2, 2020
@github-actions
Copy link

github-actions bot commented Dec 2, 2020

Size Change: 0 B

Total Size: 1.19 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.8 kB 0 B
build/api-fetch/index.js 3.42 kB 0 B
build/autop/index.js 2.84 kB 0 B
build/blob/index.js 665 B 0 B
build/block-directory/index.js 8.72 kB 0 B
build/block-directory/style-rtl.css 943 B 0 B
build/block-directory/style.css 942 B 0 B
build/block-editor/index.js 128 kB 0 B
build/block-editor/style-rtl.css 11.2 kB 0 B
build/block-editor/style.css 11.2 kB 0 B
build/block-library/editor-rtl.css 8.86 kB 0 B
build/block-library/editor.css 8.87 kB 0 B
build/block-library/index.js 148 kB 0 B
build/block-library/style-rtl.css 8.27 kB 0 B
build/block-library/style.css 8.27 kB 0 B
build/block-library/theme-rtl.css 789 B 0 B
build/block-library/theme.css 790 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/blocks/index.js 48.1 kB 0 B
build/components/index.js 172 kB 0 B
build/components/style-rtl.css 15.3 kB 0 B
build/components/style.css 15.3 kB 0 B
build/compose/index.js 9.95 kB 0 B
build/core-data/index.js 14.8 kB 0 B
build/data-controls/index.js 827 B 0 B
build/data/index.js 8.98 kB 0 B
build/date/index.js 11.2 kB 0 B
build/deprecated/index.js 768 B 0 B
build/dom-ready/index.js 571 B 0 B
build/dom/index.js 4.95 kB 0 B
build/edit-navigation/index.js 11.1 kB 0 B
build/edit-navigation/style-rtl.css 881 B 0 B
build/edit-navigation/style.css 885 B 0 B
build/edit-post/index.js 306 kB 0 B
build/edit-post/style-rtl.css 6.42 kB 0 B
build/edit-post/style.css 6.4 kB 0 B
build/edit-site/index.js 24.1 kB 0 B
build/edit-site/style-rtl.css 4.06 kB 0 B
build/edit-site/style.css 4.06 kB 0 B
build/edit-widgets/index.js 26.3 kB 0 B
build/edit-widgets/style-rtl.css 3.13 kB 0 B
build/edit-widgets/style.css 3.13 kB 0 B
build/editor/editor-styles-rtl.css 476 B 0 B
build/editor/editor-styles.css 478 B 0 B
build/editor/index.js 43.3 kB 0 B
build/editor/style-rtl.css 3.85 kB 0 B
build/editor/style.css 3.85 kB 0 B
build/element/index.js 4.63 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/index.js 6.86 kB 0 B
build/format-library/style-rtl.css 547 B 0 B
build/format-library/style.css 548 B 0 B
build/hooks/index.js 2.27 kB 0 B
build/html-entities/index.js 623 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 698 B 0 B
build/keyboard-shortcuts/index.js 2.54 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.1 kB 0 B
build/list-reusable-blocks/style-rtl.css 476 B 0 B
build/list-reusable-blocks/style.css 476 B 0 B
build/media-utils/index.js 5.32 kB 0 B
build/notices/index.js 1.82 kB 0 B
build/nux/index.js 3.42 kB 0 B
build/nux/style-rtl.css 671 B 0 B
build/nux/style.css 668 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.43 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/index.js 2.92 kB 0 B
build/rich-text/index.js 13.4 kB 0 B
build/server-side-render/index.js 2.77 kB 0 B
build/shortcode/index.js 1.69 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 2.84 kB 0 B
build/viewport/index.js 1.86 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.22 kB 0 B

compressed-size-action

@jd-alexander
Copy link
Contributor Author

I see that the snapshots would be outdated with these changes. If we proceed, those would be updated.


const AnimatedCircle = Animated.createAnimatedComponent( Circle );

return (
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't want to hardcode the stroke colors. At first, I tried putting them in a style sheet but it didn't work. Just to verify, I can add a stroke attribute to a style with say $blue-wordpress and that should work, right? I am going to re-add the stylesheet tomorrow so the stroke and fill values are stored there.

Copy link
Contributor

@etoledom etoledom Dec 2, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since stroke is a property on its own, you would need to assign it directly. Something like this:
stroke={ styles.circleProgress.stroke }
This I think should work

The same can be done with fill.

import Svg, { Circle } from 'react-native-svg';
import Animated from 'react-native-reanimated';

/**
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will remove this.

Copy link
Contributor

@etoledom etoledom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pretty nice spike @jd-alexander !

I have left a code comment about the strategy used to add the component to the tree. Other than that looks quite good.

  1. The RichText component wraps on Android. Similar issue to the one that occurred with the placeholder issue.
  2. If you type a really long title the progress circle goes off-screen so we would need to have some form of flexbox styling that stops the RichText component from growing to the edge of the screen.

If we go down this path, I'd suggest we draw the ProgressCircle below the file name. This would avoid the issues mentioned before.
We also had the same issues on iOS that we had with the Download button, and the patch for that is pretty messy. (cc @iamthomasbishop )

Another small detail:
The circle feels like it's filling up in the opposite direction. Normally I think it would start at the top and fill clockwise 🤔

upload_circle

And, if we go down this path, we have also to consider right and centred alignments

Note that:

While this works, we are moving further away from the web way of doing uploads.
If we do an upload flow improvement mini-project, ideally we would create a compatible MediaUploadFlow component on mobile, that won't be able to present itself loading/progress indicators.

Comment on lines +123 to +133
const inlineProgressComponent = ( inlineView ) => {
return (
<View style={ styles.inlineProgressContainer }>
{ inlineView }
{ isUploadInProgress && (
<ProgressCircle progress={ progress } />
) }
</View>
);
};

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be more flexible to go the other way around:
Instead of forcing the ProgressCircle component to be inline in a row with other components, we could give back the ProgressCircle component to the parent so it can place it anywhere it wants to, in the same way we do with the media source picker.

So instead of a new isInline prop, we can create a progressStyle property that defaults to top-bar, and also has circular and maybe none that could be used by the Audio block

const { interpolate, multiply } = Animated;
const { PI } = Math;
const circumference = r * 2 * PI;
const α = interpolate( progress, {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hah, interesting constant name :)
Maybe we should continue using latin letter 🤔

@jd-alexander
Copy link
Contributor Author

Thanks for the review here @etoledom 🙇‍♂️

Note that:
While this works, we are moving further away from the web way of doing uploads.
If we do an upload flow improvement mini-project, ideally we would create a compatible MediaUploadFlow component on mobile, that won't be able to present itself loading/progress indicators.

With this said we can close this PR for now especially since we are sticking with the current behavior of the progress component for all blocks and we would be better served with n upload flow improvement mini-project as you said. If necessary logic and thoughts shared here can be revisited.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants