diff --git a/.eslintrc.js b/.eslintrc.js index add372a0b..31146aefe 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,6 +46,7 @@ module.exports = { "react/forbid-prop-types": 0, "jsx-quotes": [2, "prefer-single"], "jsx-a11y/href-no-hash": 0, + "jsx-a11y/aria-role": 0, "import/prefer-default-export": 0, "import/no-cycle": 0, "camelcase": 0, diff --git a/__tests__/__snapshots__/Storyshots.test.js.snap b/__tests__/__snapshots__/Storyshots.test.js.snap index 286e506ee..17607daf1 100644 --- a/__tests__/__snapshots__/Storyshots.test.js.snap +++ b/__tests__/__snapshots__/Storyshots.test.js.snap @@ -1,882 +1,316 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Storyshots Avatar list Avatar 1`] = ` - - - - Avatar by text - - - + - - - - - Avatar by roomId - - - - - - - - Avatar by url - - - + + +`; + +exports[`Storyshots Avatar Avatar by roomId 1`] = ` + + + - - - - - Avatar by path - - - - - - - - With ETag - - - + + +`; + +exports[`Storyshots Avatar Avatar by text 1`] = ` + + + - - - - - Without ETag - - - - - - - - Emoji - - - + + +`; + +exports[`Storyshots Avatar Avatar by url 1`] = ` + + + - - - - - Direct - - - - - - - - Channel - - - + + +`; + +exports[`Storyshots Avatar Channel 1`] = ` + + + - - - - - Touchable - - - - - - - - - - Static - - - + + +`; + +exports[`Storyshots Avatar Children 1`] = ` + + + - - - - - Custom borderRadius - - - - - - - + + - Children - - - - - - +  + + +`; + +exports[`Storyshots Avatar Custom borderRadius 1`] = ` + + + - -  - - - - - Wrong server - - + + +`; + +exports[`Storyshots Avatar Custom style 1`] = ` + + + + + +`; + +exports[`Storyshots Avatar Direct 1`] = ` + + + + + +`; + +exports[`Storyshots Avatar Emoji 1`] = ` + + - + - - - - - Custom style - + style={ + Object { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + + +`; + +exports[`Storyshots Avatar Static 1`] = ` + + + + + +`; + +exports[`Storyshots Avatar Touchable 1`] = ` + + - - - + } + /> - + +`; + +exports[`Storyshots Avatar With ETag 1`] = ` + + + + + +`; + +exports[`Storyshots Avatar Without ETag 1`] = ` + + + + + +`; + +exports[`Storyshots Avatar Wrong server 1`] = ` + + + + + +`; + +exports[`Storyshots BackgroundContainer basic 1`] = ` + + + + + +`; + +exports[`Storyshots BackgroundContainer black theme - loading 1`] = ` + + + + + + +`; + +exports[`Storyshots BackgroundContainer black theme - text 1`] = ` + + + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + +`; + +exports[`Storyshots BackgroundContainer dark theme - loading 1`] = ` + + + + + + +`; + +exports[`Storyshots BackgroundContainer dark theme - text 1`] = ` + + + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + +`; + +exports[`Storyshots BackgroundContainer loading 1`] = ` + + + + + + +`; + +exports[`Storyshots BackgroundContainer long text 1`] = ` + + + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + +`; + +exports[`Storyshots BackgroundContainer text 1`] = ` + + + + + + Text here + + `; exports[`Storyshots BackgroundContainer basic 1`] = ` @@ -10450,16 +10732,2090 @@ exports[`Storyshots List with small font 1`] = ` `; -exports[`Storyshots Markdown list Markdown 1`] = ` - + + + + + + This is block quote + + + + + + + this is a normal line + + + +`; + +exports[`Storyshots Markdown Code 1`] = ` + + + + This is + + + inline code + + + + + Inline + + + code + + + has + + + back-ticks around + + + it. + + + + Code block + + + +`; + +exports[`Storyshots Markdown Edited 1`] = ` + + + + This is edited + + + ( + edited + ) + + + +`; + +exports[`Storyshots Markdown Emoji 1`] = ` + + + + Unicode: 😃😇👍 + + + + + Shortnames: + + + 😂 + + + 👍 + + + + + Custom emojis: + + + + + + + + + + + + + + + + + + + + 😃 + + + 👍 + + + + + + + + + +`; + +exports[`Storyshots Markdown Hashtag 1`] = ` + + + + #test-channel + + + + + + #unknown + + + +`; + +exports[`Storyshots Markdown Headers 1`] = ` + + + + Header 1 + + + + + Header 2 + + + + + Header 3 + + + + + Header 4 + + + + + Header 5 + + + + + Header 6 + + + +`; + +exports[`Storyshots Markdown Image 1`] = ` + + + + + +`; + +exports[`Storyshots Markdown Links 1`] = ` + + + + + Markdown link + + + + : + + + [description](url) + + + + + + Formatted Link + + + + : + + + <url|description> + + + +`; + +exports[`Storyshots Markdown Lists 1`] = ` + + + + + • + + + + + + Open Source + + + + + + + + • + + + + + + Rocket.Chat + + + + + + ◦ + + + + + + nodejs + + + + + + + + ◦ + + + + + + ReactNative + + + + + + + + + + 1. + + + + + + Open Source + + + + + + + + 2. + + + + + + Rocket.Chat + + + + + +`; + +exports[`Storyshots Markdown Mentions 1`] = ` + - Short Text - - - - This is Rocket.Chat - - - - - Long Text - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - Line Break Text - - - - - a - - - - - - - b - - - - - - - c - - - - - - - - - - - d - - - - - - - - - - - - - - - e - - - - - Sequential empty spaces - - - - - a b c - - - - - Edited - - - - - This is edited - - - ( - edited - ) - - - - - Preview - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + rocket.cat - a b c d e - - - a b c - - - @rocket.cat @name1 @all @here @unknown #general #unknown - - - Testing: 😃 👍 :marioparty: - - - - Mentions - - - - - rocket.cat - - - - - - name1 - - - - - - all - - - - - - here - - - - - - @unknown - - - - - Mentions with Real Name - - - - - Rocket Cat - - - - - - Name - - - - - - all - - - - - - here - - - - - - @unknown - - - - - Hashtag - - - - - #test-channel - - - - - - #unknown - - - - - Emoji - - - - - Unicode: 😃😇👍 - - - - - Shortnames: - - - 😂 - - - 👍 - - - - - Custom emojis: - - - - - - - - - - - - - - - - - - - - 😃 - - - 👍 - - - - - - - - - - - Block Quote - - - - - - - - This is block quote - - - - - - - this is a normal line - - - - - Links - - - - - - Markdown link - - - - : - - - [description](url) - - - - - - Formatted Link - - - - : - - - <url|description> - - - - - Image - - - - - - - - Headers - - - - - Header 1 - - - - - Header 2 - - - - - Header 3 - - - - - Header 4 - - - - - Header 5 - - - - - Header 6 - - - - - Inline Code - - - - - This is - - - inline code - - - - - Code Block - - - - - Inline - - - code - - - has - - - back-ticks around - - - it. - - - - Code block - - - - - Lists - - - - - - • - - - - - - Open Source - - - - - - - - • - - - - - - Rocket.Chat - - - - - - ◦ - - - - - - nodejs - - - - - + + + + name1 + + - - - ◦ - - - - - - ReactNative - - - - - - - - - Numbered Lists - - - - - - 1. - - - - - - Open Source - - - - - + - - - 2. - - - + - - - Rocket.Chat - - - - - - - Emphasis - - + > + + + + here + + + + - - Strong emphasis, aka bold, with - - - asterisks - - - or - - - underscores - + @unknown - + - Table - - - - + - - - - - - - First Header - - - - - - - Second Header - - - - - - - - - Content from cell 1 - - - - - - - Content from cell 2 - - - - - - - - - Content in the first column - - - - - - - Content in the second column - - - - - - - - + + + + Name + + + + + + all + + - Click to see full table - - - + ], + ] + } + > + + + + here + + + + + + @unknown + + `; -exports[`Storyshots Message list message 1`] = ` +exports[`Storyshots Markdown Preview 1`] = ` + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + a b c d e + + + a b c + + + @rocket.cat @name1 @all @here @unknown #general #unknown + + + Testing: 😃 👍 :marioparty: + + +`; + +exports[`Storyshots Markdown Table 1`] = ` + + + + + + + + + + First Header + + + + + + + Second Header + + + + + + + + + Content from cell 1 + + + + + + + Content from cell 2 + + + + + + + + + Content in the first column + + + + + + + Content in the second column + + + + + + + + + Click to see full table + + + +`; + +exports[`Storyshots Markdown Text 1`] = ` + + + + This is Rocket.Chat + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + a + + + + + + + b + + + + + + + c + + + + + + + + + + + d + + + + + + + + + + + + + + + e + + + + + a b c + + + + + Strong emphasis, aka bold, with + + + asterisks + + + or + + + underscores + + + +`; + +exports[`Storyshots Message Archived 1`] = ` - - Simple - @@ -14615,8 +14449,261 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + This message is inside an archived room + + + + + + + + + + +`; + +exports[`Storyshots Message Basic 1`] = ` + + + + + + + + + + + + + + + + - - Long message - @@ -14875,8 +14942,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -14976,27 +15043,19 @@ exports[`Storyshots Message list message 1`] = ` - - Grouped messages - + + +`; + +exports[`Storyshots Message Block Quote 1`] = ` + + @@ -15135,8 +15195,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -15183,1422 +15243,91 @@ exports[`Storyshots Message list message 1`] = ` - - - ... - - - - - - - - - - - - - - - - - - - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - 10:00 AM - - - - - - Different user - - - - - - - - - - - - - - - - - This is the third message - - - - - - - - - - - - - - - - - This is the second message - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - This is the first message - - - - - - - - - - Without header - - - - - - - - - - Message - - - - - - - - - - With alias - - - - - - - - - - - - - - - - - Diego Mello - @ - diego.mello + + Testing block quote + - + - - 10:00 AM - - - - - - Message - - - - - - - - - - - - - - - - - - Diego Mello - - @ - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - 10:00 AM - - - - - - Message - - - - - - - - - - Edited - @@ -16737,8 +15467,2248 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + + + + Testing block quote + + + + + + + Testing block quote + + + + + + + + + + +`; + +exports[`Storyshots Message Broadcast 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Broadcasted message + + + + + + +  + + + Reply + + + + + + + + + + +`; + +exports[`Storyshots Message Colored attachments 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + Value 2 + + + + + + + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + Value 2 + + + + + + + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + Value 2 + + + + + + + + + + + + + +`; + +exports[`Storyshots Message Custom fields 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Message + + + + + + + + rocket.cat + + + + + Custom fields + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + Value 2 + + + + + + Field 3 + + + + Value 3 + + + + + + Field 4 + + + + Value 4 + + + + + + Field 5 + + + + Value 5 + + + + + + + + + + + + + +`; + +exports[`Storyshots Message Custom style 1`] = ` + + + + + + + + + + + + + + + + - + +`; + +exports[`Storyshots Message Date and Unread separators 1`] = ` + + + - Encrypted - + + + + + + + + + + + + + + + rocket.cat + + + + 10:00 AM + + + + + + Fourth message + + + + + + + + + + + unread + + + + November 10, 2017 + + @@ -16997,8 +18264,4493 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + Third message + + + + + + + + + + + unread + + + + + + + + + + + + Second message + + + + + + + + + + + + + + + + + + + + + + + + rocket.cat + + + + 10:00 AM + + + + + + Second message + + + + + + + + + + + + November 10, 2017 + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + First message + + + + + + + + + + +`; + +exports[`Storyshots Message Discussion 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + Started a discussion: + + + This is a discussion + + + + +  + + + No messages yet + + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + Started a discussion: + + + This is a discussion + + + + +  + + + 1 message + + + + November 10, 2017 + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + Started a discussion: + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + +  + + + 10 messages + + + + November 10, 2017 + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + Started a discussion: + + + This is a discussion + + + + +  + + + +999 messages + + + + November 10, 2017 + + + + + + + + + +`; + +exports[`Storyshots Message Edited 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Message + + + + + + + + + + +`; + +exports[`Storyshots Message Editing 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Message being edited + + + + + + + + + + +`; + +exports[`Storyshots Message Emojis 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + 👊🤙👏 + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + 👏 + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + 🤙 + + + + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + 🤙 + + + + + + 🤙🤙 + + + + + + + + + + +`; + +exports[`Storyshots Message Encrypted 1`] = ` + + + + + + + + + + + + + + + + @@ -17462,8 +23215,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -17649,7 +23402,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17671,7 +23424,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -17729,7 +23482,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17751,7 +23504,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -17831,7 +23584,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17853,7 +23606,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -18328,6 +24081,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18344,8 +24098,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -18635,6 +24389,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18651,8 +24406,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -18920,6 +24675,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18936,8 +24692,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -19267,6 +25023,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -19283,8 +25040,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -19654,76 +25411,127 @@ exports[`Storyshots Message list message 1`] = ` - - Block Quote - - + +`; + +exports[`Storyshots Message Error 1`] = ` + + + + - + > + + + + + + + - - - - - - - - - - diego.mello - - - 10:00 AM + diego.mello - - + 10:00 AM + + + - - - - - Testing block quote - - - - +  + + + + + This message has error + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + +  + + + + + + + This message has error too + + + + + + + + + +`; + +exports[`Storyshots Message Full name 1`] = ` + + @@ -20084,8 +26048,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -20108,7 +26072,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > - diego.mello + Diego Mello - - - - - - Testing block quote - - - - - Testing block quote + Message @@ -20264,27 +26149,19 @@ exports[`Storyshots Message list message 1`] = ` - - Lists - + + +`; + +exports[`Storyshots Message Grouped messages 1`] = ` + + @@ -20423,8 +26301,1100 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + ... + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + 10:00 AM + + + + + + Different user + + + + + + + + + + + + + + + + + This is the third message + + + + + + + + + + + + + + + + + This is the second message + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + This is the first message + + + + + + + + + + +`; + +exports[`Storyshots Message Ignored 1`] = ` + + + + + + + + + + + + + + + + + Message ignored. Tap to display it. + + + + + + + + + +`; + +exports[`Storyshots Message Lists 1`] = ` + + + + + + + + + + + + + + + + - - Numerated lists - @@ -20907,8 +27857,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -21139,27 +28089,6 @@ exports[`Storyshots Message list message 1`] = ` - - Numerated lists in separated messages - @@ -21298,8 +28228,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -21585,287 +28515,19 @@ exports[`Storyshots Message list message 1`] = ` - - Static avatar - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message - - - - - - - - - - Full name - + + +`; + +exports[`Storyshots Message Mentions 1`] = ` + + @@ -22004,268 +28667,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, - "flexDirection": "row", - "opacity": 1, - } - } - > - - Diego Mello - - - - 10:00 AM - - - - - - Message - - - - - - - - - - Mentions - - - - - - - - - - - - - - - @@ -22680,8 +29084,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -22986,27 +29390,19 @@ exports[`Storyshots Message list message 1`] = ` - - Emojis - + + +`; + +exports[`Storyshots Message Message with read receipt 1`] = ` + + @@ -23145,8 +29542,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -23212,7 +29609,7 @@ exports[`Storyshots Message list message 1`] = ` } > + I'm fine! + + + + + + + + + + + + + + + + + I'm fine! + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + I'm fine! + + + + + +  + + + + + + + + + + + + + + I'm fine! + + + + + +  + + + + + + + +`; + +exports[`Storyshots Message Message with reply 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + I'm fine! + + + + + + + + I'm a very long long title and I'll break + + + + - 👊🤙👏 + Array [ + Object {}, + Object { + "alignItems": "flex-start", + "flexDirection": "row", + "flexWrap": "wrap", + "justifyContent": "flex-start", + "marginBottom": 0, + "marginTop": 0, + }, + ], + ] + } + > + How are you? + - + - - Single Emoji - @@ -23411,8 +30634,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -23478,7 +30701,7 @@ exports[`Storyshots Message list message 1`] = ` } > + I'm fine! + + + + + + + + rocket.cat + + + + + How are you? + + - 👏 + Array [ + Object { + "height": 20, + "width": 20, + }, + Object {}, + ], + ] + } + > + + - + - - Custom Emojis - + + +`; + +exports[`Storyshots Message Message with thread 1`] = ` + + @@ -23677,680 +31033,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, - "flexDirection": "row", - "opacity": 1, - } - } - > - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - - - - - - - - - - - - - - - - Single Custom Emojis - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - - - - Normal Emoji + Custom Emojis - - - - - - - - - - - - - - - - 🤙 + How are you? - + + + + - + + + + + > + +  + + + 1 + + + + +  + + + 0 + + - + + + + +  + + + + - - Four emoji - + + +  + + + How are you? + + + +  + + + - - - - diego.mello - - - - 10:00 AM - - - - 🤙 - - - - - - 🤙🤙 - + I'm fine! @@ -24814,27 +31607,6 @@ exports[`Storyshots Message list message 1`] = ` - - Time format - + + +  + + + Thread with emoji🙂 😂 + + + +  + + + - - - - diego.mello - - - - 10 November 2017 - - - - Testing - + I'm fine! @@ -25074,27 +31847,977 @@ exports[`Storyshots Message list message 1`] = ` - - Reactions - + + + + +  + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + +  + + + + + + + + + + + + + + + I'm fine! + + + + + + + + + + + + +  + + + Thread with emoji🙂 😂 + + + +  + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + + + + + + + + +  + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + +  + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + + + + + + + + +  + + + Thread with attachment + + + +  + + + + + + + + + + + + + + + Sent an attachment + + + + + + + + + +`; + +exports[`Storyshots Message Reactions 1`] = ` + + @@ -25233,8 +32957,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -25358,7 +33082,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -25380,7 +33104,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -25414,7 +33138,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > - 3 + 1 @@ -25516,7 +33240,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > - 13 + 99 @@ -25596,7 +33320,87 @@ exports[`Storyshots Message list message 1`] = ` ] } > - 1 + 999 + + + + + + + 🤔 + + + 9999 @@ -25675,27 +33479,6 @@ exports[`Storyshots Message list message 1`] = ` - - Multiple reactions - @@ -25834,8 +33618,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -25959,7 +33743,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -25981,7 +33765,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26061,7 +33845,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26083,7 +33867,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26163,7 +33947,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26185,7 +33969,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26265,7 +34049,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26287,7 +34071,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26345,7 +34129,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26367,7 +34151,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26425,7 +34209,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26447,7 +34231,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26505,7 +34289,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26527,7 +34311,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26585,7 +34369,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -26607,7 +34391,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -26720,27 +34504,19 @@ exports[`Storyshots Message list message 1`] = ` - - Intercalated users - + + +`; + +exports[`Storyshots Message Sequential thread messages following thread button 1`] = ` + + @@ -26879,8 +34656,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -26903,7 +34680,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > - rocket.cat + diego.mello - Fourth message + How are you? + + + + Reply + + + + + + +  + + + 1 + + + + +  + + + 0 + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + I'm fine! + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + + + + + + + + + + + + + + + + + + Sent an attachment + + + + + + + + + +`; + +exports[`Storyshots Message Sequential thread messages following thread reply 1`] = ` + + + + + + + +  + + + How are you? + + + +  + + + + + + + + + + + + + + + I'm fine! + + + + + + + + + + + + + + + + + + + + + + Cool! + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + + + + + + + + + + + + + + + + + + Sent an attachment + + + + + + + + + +`; + +exports[`Storyshots Message Static avatar 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Message + + + + + + + + + + +`; + +exports[`Storyshots Message System messages 1`] = ` + + + + + + + + + + + + + + + + + diego.mello + + + + Message removed + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + has joined the channel + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + Message pinned + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + has left the channel + + + + + + + + + + + + + + + + + + + + + User rocket.cat removed by diego.mello + + + + + + + + + + + + + + + + + + + + User rocket.cat added by diego.mello + + + + + + + + + + + + + + + + + + + + User rocket.cat muted by diego.mello + + + + + + + + + + + + + + + + + + + + User rocket.cat unmuted by diego.mello + + + + + + + + + + + + + + + + + + + + rocket.cat was set admin by diego.mello + + + + + + + + + + + + + + + + + + + + rocket.cat is no longer admin by diego.mello + + + + + + + + + + + + + + + + + + + + Room name changed to: New name by diego.mello + + + + + + + + + + + + + + + + + + + + Room description changed to: new description by diego.mello + + + + + + + + + + + + + + + + + + + + Room announcement changed to: new announcement by diego.mello + + + + + + + + + + + + + + + + + + + + Room topic changed to: new topic by diego.mello + + + + + + + + + + + + + + + + + + + + Room type changed to: public by diego.mello + + + + + + + + + + + + + + + + + + + + This room's encryption has been disabled by diego.mello + + + + + + + + + + + + + + + + + + + + This room's encryption has been enabled by diego.mello + + + + + + + + +`; + +exports[`Storyshots Message Temp 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Broadcasted message + + + + + + +  + + + Reply + + + + + + + + + + +`; + +exports[`Storyshots Message Time format 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10 November 2017 + + + + + + Testing + + + + + + + + + + +`; + +exports[`Storyshots Message Two short custom fields with markdown 1`] = ` + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Message + + + + + + + + rocket.cat + + + + + Custom fields + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + + Value 2 + + + + + + + + + + + + rocket.cat + + + + + Custom fields 2 + + + + + + Field 1 + + + + Value 1 + + + + + + Field 2 + + + + Value 2 + + + + + + + + + + + + + +`; + +exports[`Storyshots Message URL 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + + + + + Rocket.Chat - Free, Open Source, Enterprise Team Chat + + + Rocket.Chat is the leading open source team chat software solution. Free, unlimited and completely customizable with on-premises and SaaS cloud hosting. + + + + + + + Google + + + Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. + + + @@ -27102,6 +40853,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -27118,8 +40870,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -27185,7 +40937,7 @@ exports[`Storyshots Message list message 1`] = ` } > - Third message + Message + + + - - - - - - - - - - - - - - - - - - - - rocket.cat - - - - 10:00 AM - - - - - - Second message - - - - - - - - - - - - - - - - - - - - - - diego.mello + Google - - - 10:00 AM - - - - - First message + Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. - + - - Date and Unread separators - - - - - - - - - - - - - - - - - rocket.cat - - - - 10:00 AM - - - - - - Fourth message - - - - - - - - - - - unread - - - - November 10, 2017 - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Third message - - - - - - - - - - - unread - - - - - - - Second message - - - - - - - - - - - - - - - - - - - - - - - - rocket.cat - - - - 10:00 AM - - - - - - Second message - - - - - - - - - - - - November 10, 2017 - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - First message - - - - - - - - - - With image - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - + - - - - + Google + + Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. + + + + + + + + + + +`; + +exports[`Storyshots Message With alias 1`] = ` + + + + + + + + + + + + + + + + + + Diego Mello - This is a description + @ + diego.mello - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - - - - - - - - - - This is a description - - - - - - - - - - - - - - With video - - - - - - - - - - - - - - - - - diego.mello - - + - 10:00 AM - - - - - -  - - - - - This is a description - - - - - + > + Message + + + @@ -30043,7 +41567,7 @@ exports[`Storyshots Message list message 1`] = ` Object { "headers": undefined, "priority": "high", - "uri": "https://open.rocket.chat/avatar/diego.mello?format=png&size=36", + "uri": "https://open.rocket.chat/avatar/Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.?format=png&size=36", } } style={ @@ -30078,6 +41602,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -30094,8 +41619,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -30118,7 +41643,26 @@ exports[`Storyshots Message list message 1`] = ` ] } > - diego.mello + Diego Mello + + @ + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + - - + -  + + Message + @@ -30191,27 +41739,19 @@ exports[`Storyshots Message list message 1`] = ` - - With audio - + + +`; + +exports[`Storyshots Message With audio 1`] = ` + + @@ -30350,8 +41891,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -31300,27 +42841,19 @@ exports[`Storyshots Message list message 1`] = ` - - With file - + + +`; + +exports[`Storyshots Message With file 1`] = ` + + @@ -31459,8 +42993,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -31892,27 +43426,19 @@ exports[`Storyshots Message list message 1`] = ` - - Message with reply - + + +`; + +exports[`Storyshots Message With image 1`] = ` + + - @@ -32051,8 +43579,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -32098,55 +43626,7 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - - - I'm fine! - - - + - + - - I'm a very long long title and I'll break - - - 10:00 AM - + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + - How are you? + This is a description @@ -32323,12 +43798,12 @@ exports[`Storyshots Message list message 1`] = ` style={ Array [ Object { - "borderRadius": 4, - "height": 36, - "width": 36, + "borderRadius": 2, + "height": 20, + "width": 20, }, Object { - "marginTop": 4, + "marginLeft": 16, }, ] } @@ -32356,9 +43831,9 @@ exports[`Storyshots Message list message 1`] = ` "overflow": "hidden", }, Object { - "borderRadius": 4, - "height": 36, - "width": 36, + "borderRadius": 2, + "height": 20, + "width": 20, }, ] } @@ -32398,12 +43873,14 @@ exports[`Storyshots Message list message 1`] = ` ] } > - @@ -32420,8 +43897,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -32467,55 +43944,7 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - - - I'm fine! - - - + - + - - rocket.cat - - - 10:00 AM - + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + - How are you? + This is a description - - Message with read receipt - + + +`; + +exports[`Storyshots Message With video 1`] = ` + + - - - - - diego.mello - - - - 10:00 AM - - - - - - I'm fine! - - - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - I'm fine! - - - - - -  - - - - - - - - - - - - - - I'm fine! - - - - - -  - - - - - - - Message with thread - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - How are you? - - - - - - - Reply - - - - - - -  - - - 1 - - - - -  - - - 0 - - - - - - - -  - - - - - - - - - - - - - - - -  - - - How are you? - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - -  - - - Thread with emoji🙂 😂 - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - -  - - - Markdown: link block code - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - -  - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - -  - - - How are you? - - - -  - - - - - - - - - - - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - - - - - - - - -  - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - -  - - - - - - - - - - - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - - - - - - - - -  - - - Thread with attachment - - - -  - - - - - - - - - - - - - - - Sent an attachment - - - - - - - - - Sequential thread messages following thread button - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - How are you? - - - - - - - Reply - - - - - - -  - - - 1 - - - - -  - - - 0 - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - - - - - - - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - - - - - - - - - - - - - - - - - - Sent an attachment - - - - - - - - - Sequential thread messages following thread reply - - - - - - -  - - - How are you? - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - - - - - - - - - - - - - - Cool! - - - - - - - - - - - - - - - - - - - - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - - - - - - - - - - - - - - - - - - - Sent an attachment - - - - - - - - - Discussion - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - Started a discussion: - - - This is a discussion - - - - -  - - - No messages yet - - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - Started a discussion: - - - This is a discussion - - - - -  - - - 1 message - - - - November 10, 2017 - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - Started a discussion: - - - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - - - - -  - - - 10 messages - - - - November 10, 2017 - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - Started a discussion: - - - This is a discussion - - - - -  - - - +999 messages - - - - November 10, 2017 - - - - - - - - - URL - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - Rocket.Chat - Free, Open Source, Enterprise Team Chat - - - Rocket.Chat is the leading open source team chat software solution. Free, unlimited and completely customizable with on-premises and SaaS cloud hosting. - - - - - - - Google - - - Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message - - - - - - - - - - Google - - - Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. - - - - - - - - - - - - - - - - - - Google - - - Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. - - - - - - - - - - Custom fields - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message - - - - - - - - rocket.cat - - - 10:00 AM - - - - - Custom fields - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - Field 3 - - - - Value 3 - - - - - - Field 4 - - - - Value 4 - - - - - - Field 5 - - - - Value 5 - - - - - - - - - - - - - Two short custom fields with markdown - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message - - - - - - - - rocket.cat - - - 10:00 AM - - - - - Custom fields - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - - Value 2 - - - - - - - - - - - - rocket.cat - - - 10:00 AM - - - - - Custom fields 2 - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - - - - - - - - Colored attachments - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - - - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - - - - - - - Invalid color - - - - - - - - - - - - Broadcast - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Broadcasted message - - - - - - -  - - - Reply - - - - - - - - - - Archived - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - This message is inside an archived room - - - - - - - - - - Error - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - -  - - - - - - - This message has error - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - -  - - - - - - - This message has error too - - - - - - - - - Temp - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Temp message - - - - - - - - - - Editing - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message being edited - - - - - - - - - - Removed - - - - - - - - - - - - - - - - diego.mello - - - - Message removed - - - - - - - - - Joined - - - - - - - - - - - - - - - - diego.mello - - - - has joined the channel - - - - - - - - - Room name changed - - - - - - - - - - - - - - - Room name changed to: New name by diego.mello - - - - - - - - Message pinned - - - - - - - - - - - - - - - - diego.mello - - - - Message pinned - - - - - - - - - Has left the channel - - - - - - - - - - - - - - - - diego.mello - - - - has left the channel - - - - - - - - - User removed - - - - - - - - - - - - - - - User rocket.cat removed by diego.mello - - - - - - - - User added - - - - - - - - - - - - - - - User rocket.cat added by diego.mello - - - - - - - - User muted - - - - - - - - - - - - - - - User rocket.cat muted by diego.mello - - - - - - - - User unmuted - - - - - - - - - - - - - - - User rocket.cat unmuted by diego.mello - - - - - - - - Role added - - - - - - - - - - - - - - - rocket.cat was set admin by diego.mello - - - - - - - - Role removed - - - - - - - - - - - - - - - rocket.cat is no longer admin by diego.mello - - - - - - - - Changed description - - - - - - - - - - - - - - - Room description changed to: new description by diego.mello - - - - - - - - Changed announcement - - - - - - - - - - - - - - - Room announcement changed to: new announcement by diego.mello - - - - - - - - Changed topic - - - - - - - - - - - - - - - Room topic changed to: new topic by diego.mello - - - - - - - - Changed type - - - - - - - - - - - - - - - Room type changed to: public by diego.mello - - - - - - - - Toggle e2e encryption - - - - - - - - - - - - + + diego.mello + + + + 10:00 AM + + + + + +  + + + + + This is a description + + - + - - Ignored - - + + + + diego.mello + + - Message ignored. Tap to display it. + 10:00 AM + + + + + +  @@ -46576,27 +44790,19 @@ exports[`Storyshots Message list message 1`] = ` - - Custom style - + + +`; + +exports[`Storyshots Message Without header 1`] = ` + + - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - Markdown emphasis - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Italic with single - - - underscore - - - or double - - - underscores - - - . Bold with single - - - asterisk - - - or double - - - asterisks - - - . Strikethrough with single - - - Strikethrough - - - or double - - - Strikethrough - - - - - - - - - - Markdown headers - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - H1 - - - - - H2 - - - - - H3 - - - - - H4 - - - - - H5 - - - - - H6 - - - - - - - - - - Markdown links - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Support - - - - Google - - - - - - - - I\`m an inline-style link - - - - - - - - https://google.com - - - - - - - - - - - Starting with empty link - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - <- No link should render - - - - - - - - - - Markdown image - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - - Markdown code - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Inline - - - code - - - has - - - back-ticks around - - - it. - - - - Code block - - - - - - - - - - Markdown quote - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - Quote - - - - - - - - - - - - Markdown table - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - First Header - - - - - - - Second Header - - - - - - - - - Content from cell 1 - - - - - - - Content from cell 2 - - - - - - - - - Content in the first column - - - - - - - Content in the second column - - - - - - - - - Click to see full table - - - - - - - - `; -exports[`Storyshots RoomHeader icons 1`] = ` -Array [ - - - - - - -  - - - private channel - - - - - - , - - - - - - -  - - - public channel - - - - - - , - - - - - - -  - - - discussion - - - - - - , - - - - - - -  - - - omnichannel - - - - - - , - - - - - - -  - - - private team - - - - - - , - - - - - - -  - - - public team - - - - - - , - - - - - - -  - - - group dm - - - - - - , - - - - - - -  - - - online dm - - - - - - , - - - - - - -  - - - away dm - - - - - - , - - - - - - -  - - - busy dm - - - - - - , - - - - - - -  - - - loading dm - - - - - - , - - - - - - -  - - - offline dm - - - - - - , -] -`; - -exports[`Storyshots RoomHeader landscape 1`] = ` -Array [ - - - - - - -  - - - title - - - - - - , - - - - - - -  - - - title - - - - subtitle - - - - - , - - - - - - -  - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - , -] -`; - -exports[`Storyshots RoomHeader themes 1`] = ` -Array [ - - - - - - -  - - - title - - - - subtitle - - - - - , - - - - - - -  - - - title - - - - subtitle - - - - - , - - - - - - -  - - - title - - - - subtitle - - - - - , -] -`; - -exports[`Storyshots RoomHeader thread 1`] = ` -Array [ - - - - - - - title - - - - -  - - - parent title - - - - - - , - - - - - - - markdown preview #3 4 5 - - - - -  - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - - , -] -`; - -exports[`Storyshots RoomHeader title and subtitle 1`] = ` -Array [ - - - - - - -  - - - title - - - - - - , - - - - - - -  - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - - , - - - - - - -  - - - title - - - - subtitle - - - - - , - - - - - - -  - - - title - - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - , - - - - - - -  - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - , -] -`; - -exports[`Storyshots RoomHeader typing 1`] = ` -Array [ - - - - - - -  - - - title - - - - - user 1 - - - is typing - ... - - - - - , - - - - - - -  - - - title - - - - - user 1 and user 2 - - - are typing - ... - - - - - , - - - - - - -  - - - title - - - - - user 1, user 2, user 3, user 4, user 5 - - - are typing - ... - - - - - , -] -`; - -exports[`Storyshots RoomItem list roomitem 1`] = ` +exports[`Storyshots Room Item Alerts 1`] = ` - - Basic - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - User - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - diego.mello - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries - - - - - - - - Type - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - User status - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - - - - -  - - - Read - - - - - - - -  - - - Favorite - - - - -  - - - Hide - - - - - - - - - - - - - -  - - - rocket.cat - - - - - - - - Alerts - @@ -63043,6 +47453,24 @@ exports[`Storyshots RoomItem list roomitem 1`] = ` + + User status + - + +`; + +exports[`Storyshots Room Item Basic 1`] = ` + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + - Last Message - + "transform": Array [ + Object { + "translateX": 0, + }, + ], + } + } + > + + + + + + + + + +  + + + rocket.cat + + + + + + + + +`; + +exports[`Storyshots Room Item Last Message 1`] = ` + + - rocket.cat + unread - rocket.cat + unread - rocket.cat + user mentions - rocket.cat + group mentions `; +exports[`Storyshots Room Item Type 1`] = ` + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + Last Message + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + +`; + +exports[`Storyshots Room Item User 1`] = ` + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + diego.mello + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + 1 + + + + + + + + + +`; + +exports[`Storyshots Room Item User status 1`] = ` + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + + + + +  + + + Read + + + + + + + +  + + + Favorite + + + + +  + + + Hide + + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + + +`; + exports[`Storyshots ServerItem content 1`] = ` Array [ + + + + + + + + + +  + + + rocket.cat + + + + + + + , + + + + + + + + Rocket.Chat + + + https://open.rocket.chat/ + + + + + + + + + + + + +  + + + rocket.cat + + + + + + + , +] +`; + +exports[`Storyshots ServerItem touchable 1`] = ` +Array [ + + + + + + + + Rocket.Chat + + + + + + + + + + +  + + + rocket.cat + + + + + + + , + + + + + + + + Rocket.Chat + + + + + + + + + + +  + + + rocket.cat + + + + + + + , +] +`; + +exports[`Storyshots RoomHeader icons 1`] = ` +Array [ + + + + + + +  + + + private channel + + + + + + , + + + + + + +  + + + public channel + + + + + + , + + + + + + +  + + + discussion + + + + + + , + + + + + + +  + + + omnichannel + + + + + + , + + + + + + +  + + + private team + + + + + + , + + + + + + +  + + + public team + + + + + + , + + + + + + +  + + + group dm + + + + + + , + + + + + + +  + + + online dm + + + + + + , + + + + + + +  + + + away dm + + + + + + , + + + + + + +  + + + busy dm + + + + + + , + + + + + + +  + + + loading dm + + + + + + , + + + + + + +  + + + offline dm + + + + + + , +] +`; + +exports[`Storyshots RoomHeader landscape 1`] = ` +Array [ + + + + + + +  + + + title + + + + + + , + + + + + + +  + + + title + + + + subtitle + + + + + , + + + + + + +  + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + + , +] +`; + +exports[`Storyshots RoomHeader themes 1`] = ` +Array [ + + + + + + +  + + + title + + + + subtitle + + + + + , + + + + + + +  + + + title + + + + subtitle + + + + + , + + + + + + +  + + + title + + + + subtitle + + + + + , +] +`; + +exports[`Storyshots RoomHeader thread 1`] = ` +Array [ + + + + + + + title + + + + +  + + + + +  + + + +999 + + + + + parent title + + + + + + , + + + + + + + markdown preview #3 4 5 + + + + +  + + + +  + + + 1 + + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + + + , +] +`; + +exports[`Storyshots RoomHeader title and subtitle 1`] = ` +Array [ + + + + + + +  + + + title + + + + + + , + + + + + + +  + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + + + , + + + + + + +  + + + title + + + + subtitle + + + + + , + + + + + + +  + + + title + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + + , + + + + + + +  + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industrys standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries + + + + + , +] +`; + +exports[`Storyshots RoomHeader typing 1`] = ` +Array [ + + + + + + +  + + + title + + + + + user 1 + + + is typing + ... + + + + + , + + + + + + +  + + + title + + + + + user 1 and user 2 + + + are typing + ... + + + + + , + + + + + + +  + + + title + + + + + user 1, user 2, user 3, user 4, user 5 + + + are typing + ... + + + + + , +] +`; + +exports[`Storyshots ServerItem content 1`] = ` +Array [ + + + + + + + + Rocket.Chat + + + https://open.rocket.chat/ + + + +  + + + , + + + + + + + + Super Long Server Name in Rocket.Chat + + + https://superlongservername.tologintoasuperlongservername/ + + + + , + + + + + + + + https://stable.rocket.chat/ + + + https://stable.rocket.chat/ + + + + , +] +`; + +exports[`Storyshots ServerItem themes 1`] = ` +Array [ + + + + + + + + Rocket.Chat + + + https://open.rocket.chat/ + + + +  + + + , + + + + + + + + Rocket.Chat + + + https://open.rocket.chat/ + + `; -exports[`Storyshots UiKitMessage list uikitmessage 1`] = ` - - + - - - Section - - - Section + Markdown List - - - Section + Overflow - - - Section + image - - - Section + button - - - Section + Select - - - Section + DatePicker - - - Section + Multi Select - - - Image - - - Context - - - Action - Buttons - - - Fields - - - Action - Select - - - - + } + /> + + `; -exports[`Storyshots UiKitModal list UiKitModal 1`] = ` - - + + + +`; + +exports[`Storyshots UiKitMessage Context 1`] = ` + + + - - - Modal - Section and Selects - - + + +`; + +exports[`Storyshots UiKitMessage Fields 1`] = ` + + + - Modal - Section Accessories - - + + +`; + +exports[`Storyshots UiKitMessage Image 1`] = ` + + + - Modal - Form Input - - + + +`; + +exports[`Storyshots UiKitMessage Section + DatePicker 1`] = ` + + + - Modal - Form TextArea - - + + +`; + +exports[`Storyshots UiKitMessage Section + Markdown List 1`] = ` + + + - Modal - Images - - + + +`; + +exports[`Storyshots UiKitMessage Section + Multi Select 1`] = ` + + + - Modal - Actions - - + + +`; + +exports[`Storyshots UiKitMessage Section + Overflow 1`] = ` + + + - Modal - Contexts and Dividers - - + + +`; + +exports[`Storyshots UiKitMessage Section + Select 1`] = ` + + + - Modal - Input with error - - + + +`; + +exports[`Storyshots UiKitMessage Section + button 1`] = ` + + + - Modal - Multilne with error - - + + +`; + +exports[`Storyshots UiKitMessage Section + image 1`] = ` + + + - Modal - DatePicker with error - - - - + } + /> + + +`; + +exports[`Storyshots UiKitMessage Section 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Actions 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Contexts and Dividers 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - DatePicker with error 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Form Input 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Form TextArea 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Images 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Input with error 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Multilne with error 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Section Accessories 1`] = ` + + + + + +`; + +exports[`Storyshots UiKitModal Modal - Section and Selects 1`] = ` + + + + + `; exports[`Storyshots Unread Badge all 1`] = ` diff --git a/android/app/build.gradle b/android/app/build.gradle index 8e55d11da..69975e5d7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -144,7 +144,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode VERSIONCODE as Integer - versionName "4.16.1" + versionName "4.16.2" vectorDrawables.useSupportLibrary = true if (!isFoss) { manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] diff --git a/app/containers/MessageBox/index.js b/app/containers/MessageBox/index.js index 1fc874f9f..213f27d51 100644 --- a/app/containers/MessageBox/index.js +++ b/app/containers/MessageBox/index.js @@ -876,7 +876,7 @@ class MessageBox extends Component { recording, showEmojiKeyboard, showSend, mentions, trackingType, commandPreview, showCommandPreview } = this.state; const { - editing, message, replying, replyCancel, user, getCustomEmoji, theme, Message_AudioRecorderEnabled, children, isActionsEnabled + editing, message, replying, replyCancel, user, getCustomEmoji, theme, Message_AudioRecorderEnabled, children, isActionsEnabled, tmid } = this.props; const isAndroidTablet = isTablet && isAndroid ? { @@ -936,7 +936,7 @@ class MessageBox extends Component { underlineColorAndroid='transparent' defaultValue='' multiline - testID='messagebox-input' + testID={`messagebox-input${ tmid ? '-thread' : '' }`} theme={theme} {...isAndroidTablet} /> diff --git a/app/containers/message/User.js b/app/containers/message/User.js index cd4559b42..98b449849 100644 --- a/app/containers/message/User.js +++ b/app/containers/message/User.js @@ -18,6 +18,7 @@ const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'row', + justifyContent: 'space-between', alignItems: 'center' }, username: { @@ -30,7 +31,7 @@ const styles = StyleSheet.create({ ...sharedStyles.textMedium }, titleContainer: { - flex: 1, + flexShrink: 1, flexDirection: 'row', alignItems: 'center' }, diff --git a/app/i18n/index.js b/app/i18n/index.js index c82e9e17e..ebe430769 100644 --- a/app/i18n/index.js +++ b/app/i18n/index.js @@ -95,6 +95,7 @@ export const setLanguage = (l) => { moment.locale(toMomentLocale(locale)); }; +i18n.translations = { en: translations.en?.() }; const defaultLanguage = { languageTag: 'en', isRTL: false }; const availableLanguages = Object.keys(translations); const { languageTag } = RNLocalize.findBestAvailableLanguage(availableLanguages) || defaultLanguage; diff --git a/app/i18n/locales/nl.json b/app/i18n/locales/nl.json index 903da5e1f..fee4b826f 100644 --- a/app/i18n/locales/nl.json +++ b/app/i18n/locales/nl.json @@ -123,7 +123,6 @@ "creating_invite": "uitnodiging maken", "Channel_Name": "Kanaal Name", "Channels": "Kanalen", - "Chats": "Chats", "Call_already_ended": "Gesprek al beeïndigd!", "Click_to_join": "Klik om lid te worden!", "Close": "Sluiten", diff --git a/app/utils/log/events.js b/app/utils/log/events.js index fc8d70420..c9c9579f8 100644 --- a/app/utils/log/events.js +++ b/app/utils/log/events.js @@ -51,6 +51,7 @@ export default { STATUS_F: 'status_f', STATUS_CUSTOM: 'status_custom', STATUS_CUSTOM_F: 'status_custom_f', + SET_STATUS_FAIL: 'set_status_fail', // ROOMS LIST VIEW RL_TOGGLE_SERVER_DROPDOWN: 'rl_toggle_server_dropdown', diff --git a/app/views/RoomActionsView/index.js b/app/views/RoomActionsView/index.js index 89bc5f229..ea833d758 100644 --- a/app/views/RoomActionsView/index.js +++ b/app/views/RoomActionsView/index.js @@ -595,7 +595,7 @@ class RoomActionsView extends React.Component { return ( - + {this.renderRoomInfo()} {this.renderJitsi()} {this.renderE2EEncryption()} diff --git a/app/views/StatusView.js b/app/views/StatusView.js index 4441169f5..2b6bc33d7 100644 --- a/app/views/StatusView.js +++ b/app/views/StatusView.js @@ -91,7 +91,7 @@ class StatusView extends React.Component { const { statusText } = this.state; const { user } = this.props; if (statusText !== user.statusText) { - await this.setCustomStatus(); + await this.setCustomStatus(statusText); } this.close(); } diff --git a/e2e/data.js b/e2e/data.js index 77f9f82c0..1a84ff9fb 100644 --- a/e2e/data.js +++ b/e2e/data.js @@ -57,6 +57,11 @@ const data = { password: `passwordthree${ value }`, email: `mobile+registeringthree${ value }@rocket.chat` }, + registeringUser4: { + username: `newuserfour${ value }`, + password: `passwordfour${ value }`, + email: `mobile+registeringfour${ value }@rocket.chat` + }, random: value } module.exports = data; diff --git a/e2e/helpers/app.js b/e2e/helpers/app.js index 2706eb2f6..af72f73d1 100644 --- a/e2e/helpers/app.js +++ b/e2e/helpers/app.js @@ -7,8 +7,7 @@ async function navigateToWorkspace(server = data.server) { await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(10000); await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).replaceText(server); - await element(by.id('new-server-view-button')).tap(); + await element(by.id('new-server-view-input')).typeText(`${server}\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); await expect(element(by.id('workspace-view'))).toBeVisible(); } @@ -33,7 +32,7 @@ async function login(username, password) { await element(by.id('login-view-email')).replaceText(username); await element(by.id('login-view-password')).replaceText(password); await element(by.id('login-view-submit')).tap(); - await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(30000); } async function logout() { @@ -52,24 +51,24 @@ async function logout() { await expect(element(by.id('onboarding-view'))).toBeVisible(); } -async function mockMessage(message) { - await element(by.id('messagebox-input')).atIndex(0).tap(); - await element(by.id('messagebox-input')).atIndex(0).typeText(`${ data.random }${ message }`); - await element(by.id('messagebox-send-message')).atIndex(0).tap(); - await waitFor(element(by.label(`${ data.random }${ message }`)).atIndex(0)).toExist().withTimeout(60000); - await expect(element(by.label(`${ data.random }${ message }`)).atIndex(0)).toExist(); +async function mockMessage(message, isThread = false) { + let input = isThread ? 'messagebox-input-thread' : 'messagebox-input'; + await element(by.id(input)).tap(); + await element(by.id(input)).typeText(`${ data.random }${ message }`); + await element(by.id('messagebox-send-message')).tap(); + await waitFor(element(by.label(`${ data.random }${ message }`))).toExist().withTimeout(60000); + await expect(element(by.label(`${ data.random }${ message }`))).toExist(); await element(by.label(`${ data.random }${ message }`)).atIndex(0).tap(); }; async function starMessage(message){ const messageLabel = `${ data.random }${ message }` - await waitFor(element(by.label(messageLabel))).toBeVisible().withTimeout(5000); await element(by.label(messageLabel)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); await element(by.label('Star')).tap(); - await waitFor(element(by.id('action-sheet'))).toNotExist().withTimeout(5000); + await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); }; async function pinMessage(message){ @@ -80,7 +79,7 @@ async function pinMessage(message){ await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); await element(by.label('Pin')).tap(); - await waitFor(element(by.id('action-sheet'))).toNotExist().withTimeout(5000); + await waitFor(element(by.id('action-sheet'))).not.toExist().withTimeout(5000); } async function dismissReviewNag(){ diff --git a/e2e/helpers/data_setup.js b/e2e/helpers/data_setup.js index 66c6ea086..1f8f8fb65 100644 --- a/e2e/helpers/data_setup.js +++ b/e2e/helpers/data_setup.js @@ -20,6 +20,7 @@ const login = async (username, password) => { const authToken = response.data.data.authToken rocketchat.defaults.headers.common['X-User-Id'] = userId rocketchat.defaults.headers.common['X-Auth-Token'] = authToken + return { authToken, userId }; } const createUser = async (username, password, name, email) => { @@ -91,11 +92,11 @@ const changeChannelJoinCode = async (roomId, joinCode) => { } } -const sendMessage = async (user, groupname, msg) => { - console.log(`Sending message to ${groupname}`) +const sendMessage = async (user, channel, msg) => { + console.log(`Sending message to ${channel}`) try { await login(user.username, user.password); - await rocketchat.post('chat.postMessage', { channel: `#${groupname}`, msg }); + await rocketchat.post('chat.postMessage', { channel, msg }); } catch (infoError) { console.log(JSON.stringify(infoError)) throw "Failed to find or create private group" @@ -146,5 +147,5 @@ const post = (endpoint, body) => { } module.exports = { - setup, sendMessage, get, post + setup, sendMessage, get, post, login } \ No newline at end of file diff --git a/e2e/tests/assorted/01-e2eencryption.spec.js b/e2e/tests/assorted/01-e2eencryption.spec.js index dc85cb7b5..423d96152 100644 --- a/e2e/tests/assorted/01-e2eencryption.spec.js +++ b/e2e/tests/assorted/01-e2eencryption.spec.js @@ -166,7 +166,7 @@ describe('E2E Encryption', () => { await navigateToLogin(); await login(testuser.username, testuser.password); await navigateToRoom(room); - await waitFor(element(by.label(`${ data.random }message`)).atIndex(0)).toNotExist().withTimeout(2000); + await waitFor(element(by.label(`${ data.random }message`)).atIndex(0)).not.toExist().withTimeout(2000); await expect(element(by.label('Encrypted message')).atIndex(0)).toExist(); }); @@ -178,7 +178,7 @@ describe('E2E Encryption', () => { await waitFor(element(by.id('e2e-enter-your-password-view'))).toBeVisible().withTimeout(2000); await element(by.id('e2e-enter-your-password-view-password')).typeText(newPassword); await element(by.id('e2e-enter-your-password-view-confirm')).tap(); - await waitFor(element(by.id('listheader-encryption'))).toNotExist().withTimeout(10000); + await waitFor(element(by.id('listheader-encryption'))).not.toExist().withTimeout(10000); await navigateToRoom(room); await waitFor(element(by.label(`${ data.random }message`)).atIndex(0)).toExist().withTimeout(2000); }); @@ -221,8 +221,7 @@ describe('E2E Encryption', () => { // TODO: refactor await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).replaceText(data.alternateServer); - await element(by.id('new-server-view-button')).tap(); + await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); await element(by.id('workspace-view-register')).tap(); await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); @@ -231,7 +230,7 @@ describe('E2E Encryption', () => { await element(by.id('register-view-name')).replaceText(data.registeringUser.username); await element(by.id('register-view-username')).replaceText(data.registeringUser.username); await element(by.id('register-view-email')).replaceText(data.registeringUser.email); - await element(by.id('register-view-password')).replaceText(data.registeringUser.password); + await element(by.id('register-view-password')).typeText(data.registeringUser.password); await element(by.id('register-view-submit')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(60000); diff --git a/e2e/tests/assorted/02-broadcast.spec.js b/e2e/tests/assorted/02-broadcast.spec.js index a11f71713..059643c02 100644 --- a/e2e/tests/assorted/02-broadcast.spec.js +++ b/e2e/tests/assorted/02-broadcast.spec.js @@ -75,7 +75,7 @@ describe('Broadcast room', () => { }); it('should have the message created earlier', async() => { - await waitFor(element(by.label(`${ data.random }message`)).atIndex(0)).toBeVisible().withTimeout(60000); + await waitFor(element(by.label(`${ data.random }message`))).toExist().withTimeout(60000); }); it('should have reply button', async() => { diff --git a/e2e/tests/assorted/03-profile.spec.js b/e2e/tests/assorted/03-profile.spec.js index f531ef18a..86fc001db 100644 --- a/e2e/tests/assorted/03-profile.spec.js +++ b/e2e/tests/assorted/03-profile.spec.js @@ -9,10 +9,10 @@ const profileChangeUser = data.users.profileChanges const scrollDown = 200; async function waitForToast() { - // await waitFor(element(by.id('toast'))).toBeVisible().withTimeout(10000); + // await waitFor(element(by.id('toast'))).toBeVisible().withTimeout(1000); // await expect(element(by.id('toast'))).toBeVisible(); - // await waitFor(element(by.id('toast'))).toBeNotVisible().withTimeout(10000); - // await expect(element(by.id('toast'))).toBeNotVisible(); + // await waitFor(element(by.id('toast'))).not.toBeNotVisible().withTimeout(1000); + // await expect(element(by.id('toast'))).not.toBeVisible(); await sleep(300); } @@ -76,9 +76,8 @@ describe('Profile screen', () => { describe('Usage', async() => { it('should change name and username', async() => { - await element(by.type('UIScrollView')).atIndex(1).swipe('down'); await element(by.id('profile-view-name')).replaceText(`${ profileChangeUser.username }new`); - await element(by.id('profile-view-username')).replaceText(`${ profileChangeUser.username }new`); + await element(by.id('profile-view-username')).typeText(`${ profileChangeUser.username }new`); await element(by.type('UIScrollView')).atIndex(1).swipe('up'); await element(by.id('profile-view-submit')).tap(); await waitForToast(); @@ -88,9 +87,7 @@ describe('Profile screen', () => { await element(by.id('profile-view-email')).replaceText(`mobile+profileChangesNew${ data.random }@rocket.chat`); await element(by.id('profile-view-new-password')).replaceText(`${ profileChangeUser.password }new`); await element(by.id('profile-view-submit')).tap(); - await element(by.type('_UIAlertControllerTextField')).replaceText(`${ profileChangeUser.password }`) - // For some reason, replaceText does some type of submit, which submits the alert for us - // await element(by.label('Save').and(by.type('_UIAlertControllerActionView'))).tap(); + await element(by.type('_UIAlertControllerTextField')).typeText(`${ profileChangeUser.password }\n`) await waitForToast(); }); diff --git a/e2e/tests/assorted/04-setting.spec.js b/e2e/tests/assorted/04-setting.spec.js index 201ac6200..14bdbe71f 100644 --- a/e2e/tests/assorted/04-setting.spec.js +++ b/e2e/tests/assorted/04-setting.spec.js @@ -63,31 +63,12 @@ describe('Settings screen', () => { }); describe('Usage', async() => { - it('should navigate to language view', async() => { - await element(by.id('settings-view-language')).tap(); - await waitFor(element(by.id('language-view'))).toBeVisible().withTimeout(60000); - await expect(element(by.id('language-view-zh-CN'))).toExist(); - await expect(element(by.id('language-view-de'))).toExist(); - await expect(element(by.id('language-view-en'))).toExist(); - await expect(element(by.id('language-view-fr'))).toExist(); - await expect(element(by.id('language-view-pt-BR'))).toExist(); - await expect(element(by.id('language-view-pt-PT'))).toExist(); - await expect(element(by.id('language-view-ru'))).toExist(); - await tapBack(); - }); - it('should tap clear cache and navigate to roomslistview', async() => { await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); await element(by.id('settings-view-clear-cache')).tap(); await waitFor(element(by.text('This will clear all your offline data.'))).toExist().withTimeout(2000); await element(by.label('Clear').and(by.type('_UIAlertControllerActionView'))).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(5000); - // Database was cleared, so the room shouldn't be there anymore while it's fetched again from the server - /** - * FIXME: rooms are fetched to quickly on docker and the test below fails - * We need to think on another way to test database being resetted - */ - // await waitFor(element(by.id(`rooms-list-view-item-${ data.groups.private.name }`))).toNotExist().withTimeout(10000); await waitFor(element(by.id(`rooms-list-view-item-${ data.groups.private.name }`))).toExist().withTimeout(10000); }) }); diff --git a/e2e/tests/assorted/05-joinpublicroom.spec.js b/e2e/tests/assorted/05-joinpublicroom.spec.js index 8e97a893e..9b92d33b3 100644 --- a/e2e/tests/assorted/05-joinpublicroom.spec.js +++ b/e2e/tests/assorted/05-joinpublicroom.spec.js @@ -63,7 +63,7 @@ describe('Join public room', () => { describe('Room Actions', async() => { before(async() => { - await navigateToRoomActions('c'); + await navigateToRoomActions(); }); it('should have room actions screen', async() => { @@ -103,7 +103,6 @@ describe('Join public room', () => { }); it('should have share', async() => { - await element(by.type('UIScrollView')).atIndex(1).swipe('down'); await expect(element(by.id('room-actions-share'))).toBeVisible(); }); @@ -142,7 +141,7 @@ describe('Join public room', () => { }); it('should have disable notifications and leave channel', async() => { - await navigateToRoomActions('c'); + await navigateToRoomActions(); await expect(element(by.id('room-actions-view'))).toBeVisible(); await expect(element(by.id('room-actions-info'))).toBeVisible(); // await expect(element(by.id('room-actions-voice'))).toBeVisible(); @@ -165,7 +164,6 @@ describe('Join public room', () => { await expect(element(by.text('Yes, leave it!'))).toBeVisible(); await element(by.text('Yes, leave it!')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); - // await element(by.id('rooms-list-view-search')).typeText(''); await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toBeNotVisible().withTimeout(60000); }); }); diff --git a/e2e/tests/assorted/06-status.spec.js b/e2e/tests/assorted/06-status.spec.js index 45c4c6f96..52c6f9b98 100644 --- a/e2e/tests/assorted/06-status.spec.js +++ b/e2e/tests/assorted/06-status.spec.js @@ -41,10 +41,10 @@ describe('Status screen', () => { }); it('should change status text', async () => { - await element(by.id('status-view-input')).replaceText('status-text-new'); + await element(by.id('status-view-input')).typeText('status-text-new'); await element(by.id('status-view-submit')).tap(); await waitForToast(); - await waitFor(element(by.label('status-text-new').withAncestor(by.id('sidebar-custom-status')))).toBeVisible().withTimeout(2000); + await waitFor(element(by.label('status-text-new').withAncestor(by.id('sidebar-custom-status')))).toExist().withTimeout(2000); }); }); }); \ No newline at end of file diff --git a/e2e/tests/assorted/07-changeserver.spec.js b/e2e/tests/assorted/07-changeserver.spec.js index a795e66c3..06ac7c36a 100644 --- a/e2e/tests/assorted/07-changeserver.spec.js +++ b/e2e/tests/assorted/07-changeserver.spec.js @@ -24,9 +24,8 @@ describe('Change server', () => { await element(by.id('rooms-list-header-server-add')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(6000); - await element(by.id('new-server-view-input')).replaceText(data.alternateServer); - await element(by.id('new-server-view-button')).tap(); - await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(6000); + await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); + await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(10000); await reopenAndCheckServer(data.server); }); diff --git a/e2e/tests/assorted/08-joinprotectedroom.spec.js b/e2e/tests/assorted/08-joinprotectedroom.spec.js index a07d541cd..9101a9659 100644 --- a/e2e/tests/assorted/08-joinprotectedroom.spec.js +++ b/e2e/tests/assorted/08-joinprotectedroom.spec.js @@ -14,17 +14,12 @@ async function navigateToRoom() { await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); } -async function navigateToRoomActions() { - await element(by.id('room-header')).tap(); - await waitFor(element(by.id('room-actions-view'))).toBeVisible().withTimeout(5000); -} - async function openJoinCode() { await element(by.id('room-view-join-button')).tap(); await waitFor(element(by.id('join-code'))).toBeVisible().withTimeout(5000); } -describe('Join public room', () => { +describe('Join protected room', () => { before(async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToLogin(); diff --git a/e2e/tests/assorted/10-deleteserver.spec.js b/e2e/tests/assorted/10-deleteserver.spec.js index bf7379104..8e260fd70 100644 --- a/e2e/tests/assorted/10-deleteserver.spec.js +++ b/e2e/tests/assorted/10-deleteserver.spec.js @@ -22,8 +22,7 @@ describe('Delete server', () => { await element(by.id('rooms-list-header-server-add')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(10000); - await element(by.id('new-server-view-input')).replaceText(data.alternateServer); - await element(by.id('new-server-view-button')).tap(); + await element(by.id('new-server-view-input')).typeText(`${data.alternateServer}\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(10000); await element(by.id('workspace-view-register')).tap(); await waitFor(element(by.id('register-view'))).toBeVisible().withTimeout(2000); @@ -32,7 +31,7 @@ describe('Delete server', () => { await element(by.id('register-view-name')).replaceText(data.registeringUser3.username); await element(by.id('register-view-username')).replaceText(data.registeringUser3.username); await element(by.id('register-view-email')).replaceText(data.registeringUser3.email); - await element(by.id('register-view-password')).replaceText(data.registeringUser3.password); + await element(by.id('register-view-password')).typeText(data.registeringUser3.password); await element(by.id('register-view-submit')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(60000); diff --git a/e2e/tests/assorted/11-deeplinking.spec.js b/e2e/tests/assorted/11-deeplinking.spec.js index cdde0323a..c40cff7bf 100644 --- a/e2e/tests/assorted/11-deeplinking.spec.js +++ b/e2e/tests/assorted/11-deeplinking.spec.js @@ -2,8 +2,8 @@ const { device, element, by, waitFor } = require('detox'); const data = require('../../data'); -const { tapBack, checkServer, navigateToRegister, login } = require('../../helpers/app'); -const { post, get } = require('../../helpers/data_setup'); +const { tapBack, checkServer, navigateToRegister } = require('../../helpers/app'); +const { post, get, login } = require('../../helpers/data_setup'); const DEEPLINK_METHODS = { AUTH: 'auth', ROOM: 'room' }; const getDeepLink = (method, server, params) => { @@ -14,35 +14,31 @@ const getDeepLink = (method, server, params) => { describe('Deep linking', () => { let userId; - let token; + let authToken; before(async() => { - const loginResult = await post('login', { - user: data.users.regular.username, - password: data.users.regular.password - }) - userId = loginResult.data.data.userId - token = loginResult.data.data.authToken + const loginResult = await login(data.users.regular.username, data.users.regular.password); + ({ userId, authToken } = loginResult); }); describe('Authentication', () => { it('should run a deep link to an invalid account and raise error', async() => { await device.launchApp({ permissions: { notifications: 'YES' }, - newInstance: true, + delete: true, url: getDeepLink(DEEPLINK_METHODS.AUTH, data.server, 'userId=123&token=abc'), sourceApp: 'com.apple.mobilesafari' }); - await waitFor(element(by.text('You\'ve been logged out by the server. Please log in again.'))).toExist().withTimeout(5000); // TODO: we need to improve this message + await waitFor(element(by.text('You\'ve been logged out by the server. Please log in again.'))).toExist().withTimeout(10000); // TODO: we need to improve this message }); const authAndNavigate = async() => { await device.launchApp({ permissions: { notifications: 'YES' }, newInstance: true, - url: getDeepLink(DEEPLINK_METHODS.AUTH, data.server, `userId=${ userId }&token=${ token }&path=group/${ data.groups.private.name }`), + url: getDeepLink(DEEPLINK_METHODS.AUTH, data.server, `userId=${ userId }&token=${ authToken }&path=group/${ data.groups.private.name }`), sourceApp: 'com.apple.mobilesafari' }); - await waitFor(element(by.id(`room-view-title-${ data.groups.private.name }`))).toExist().withTimeout(10000); + await waitFor(element(by.id(`room-view-title-${ data.groups.private.name }`))).toExist().withTimeout(30000); await tapBack(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); await checkServer(data.server); @@ -56,10 +52,10 @@ describe('Deep linking', () => { it('should authenticate while logged in another server', async() => { await device.launchApp({ permissions: { notifications: 'YES' }, delete: true }); await navigateToRegister(data.alternateServer); - await element(by.id('register-view-name')).replaceText(data.registeringUser.username); - await element(by.id('register-view-username')).replaceText(data.registeringUser.username); - await element(by.id('register-view-email')).replaceText(data.registeringUser.email); - await element(by.id('register-view-password')).replaceText(data.registeringUser.password); + await element(by.id('register-view-name')).replaceText(data.registeringUser4.username); + await element(by.id('register-view-username')).replaceText(data.registeringUser4.username); + await element(by.id('register-view-email')).replaceText(data.registeringUser4.email); + await element(by.id('register-view-password')).typeText(data.registeringUser4.password); await element(by.id('register-view-submit')).tap(); await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); await authAndNavigate(); @@ -86,7 +82,7 @@ describe('Deep linking', () => { url: getDeepLink(DEEPLINK_METHODS.ROOM, data.server, `rid=${ roomResult.data.group._id }`), sourceApp: 'com.apple.mobilesafari' }); - await waitFor(element(by.id(`room-view-title-${ data.groups.private.name }`))).toExist().withTimeout(10000); + await waitFor(element(by.id(`room-view-title-${ data.groups.private.name }`))).toExist().withTimeout(15000); await tapBack(); }); }); diff --git a/e2e/tests/assorted/12-i18n.spec.js b/e2e/tests/assorted/12-i18n.spec.js new file mode 100644 index 000000000..13e7c79be --- /dev/null +++ b/e2e/tests/assorted/12-i18n.spec.js @@ -0,0 +1,114 @@ +const { + device, element, by, waitFor +} = require('detox'); +const { navigateToLogin, login, sleep } = require('../../helpers/app'); +const { post } = require('../../helpers/data_setup'); + +const data = require('../../data'); +const testuser = data.users.regular +const defaultLaunchArgs = { permissions: { notifications: 'YES' } }; + +const navToLanguage = async() => { + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('sidebar-settings'))).toBeVisible().withTimeout(2000); + await element(by.id('sidebar-settings')).tap(); + await waitFor(element(by.id('settings-view'))).toBeVisible().withTimeout(2000); + await element(by.id('settings-view-language')).tap(); + await waitFor(element(by.id('language-view'))).toBeVisible().withTimeout(10000); +}; + +describe('i18n', () => { + describe('OS language', () => { + it('OS set to \'en\' and proper translate to \'en\'', async() => { + await device.launchApp({ + ...defaultLaunchArgs, + languageAndLocale: { + language: "en", + locale: "en" + }, + delete: true + }); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); + await expect(element(by.id('join-workspace').and(by.label('Join a workspace')))).toBeVisible(); + await expect(element(by.id('create-workspace-button').and(by.label('Create a new workspace')))).toBeVisible(); + }); + + it('OS set to unavailable language and fallback to \'en\'', async() => { + await device.launchApp({ + ...defaultLaunchArgs, + languageAndLocale: { + language: "es-MX", + locale: "es-MX" + } + }); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); + await expect(element(by.id('join-workspace').and(by.label('Join a workspace')))).toBeVisible(); + await expect(element(by.id('create-workspace-button').and(by.label('Create a new workspace')))).toBeVisible(); + }); + + /** + * This test might become outdated as soon as we support the language + * Although this seems to be a bad approach, that's the intention for having fallback enabled + */ + it('OS set to available language and fallback to \'en\' on strings missing translation', async() => { + await device.launchApp({ + ...defaultLaunchArgs, + languageAndLocale: { + language: "nl", + locale: "nl" + } + }); + await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(20000); + await expect(element(by.id('join-workspace').and(by.label('Join a workspace')))).toBeVisible(); // Missing nl translation + await expect(element(by.id('create-workspace-button').and(by.label('Een nieuwe workspace maken')))).toBeVisible(); + }); + }); + + describe('Rocket.Chat language', () => { + before(async() => { + await device.launchApp(defaultLaunchArgs); + await navigateToLogin(); + await login(testuser.username, testuser.password); + }); + + it('should select \'en\'', async() => { + await navToLanguage(); + await element(by.id('language-view-en')).tap(); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + await expect(element(by.id('sidebar-chats').withDescendant(by.label('Chats')))).toBeVisible(); + await expect(element(by.id('sidebar-profile').withDescendant(by.label('Profile')))).toBeVisible(); + await expect(element(by.id('sidebar-settings').withDescendant(by.label('Settings')))).toBeVisible(); + await element(by.id('sidebar-close-drawer')).tap(); + }); + + it('should select \'nl\' and fallback to \'en\'', async() => { + await navToLanguage(); + await element(by.id('language-view-nl')).tap(); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + await expect(element(by.id('sidebar-chats').withDescendant(by.label('Chats')))).toBeVisible(); // fallback to en + await expect(element(by.id('sidebar-profile').withDescendant(by.label('Profiel')))).toBeVisible(); + await expect(element(by.id('sidebar-settings').withDescendant(by.label('Instellingen')))).toBeVisible(); + await element(by.id('sidebar-close-drawer')).tap(); + }); + + it('should set unsupported language and fallback to \'en\'', async() => { + await post('users.setPreferences', { data: { language: 'eo' } }); // Set language to Esperanto + await device.launchApp(defaultLaunchArgs); + await waitFor(element(by.id('rooms-list-view'))).toBeVisible().withTimeout(10000); + await element(by.id('rooms-list-view-sidebar')).tap(); + await waitFor(element(by.id('sidebar-view'))).toBeVisible().withTimeout(2000); + // give the app some time to apply new language + await sleep(3000); + await expect(element(by.id('sidebar-chats').withDescendant(by.label('Chats')))).toBeVisible(); + await expect(element(by.id('sidebar-profile').withDescendant(by.label('Profile')))).toBeVisible(); + await expect(element(by.id('sidebar-settings').withDescendant(by.label('Settings')))).toBeVisible(); + await post('users.setPreferences', { data: { language: 'en' } }); // Set back to english + }); + }) +}); \ No newline at end of file diff --git a/e2e/tests/onboarding/01-onboarding.spec.js b/e2e/tests/onboarding/01-onboarding.spec.js index 4806dcb57..e38a83764 100644 --- a/e2e/tests/onboarding/01-onboarding.spec.js +++ b/e2e/tests/onboarding/01-onboarding.spec.js @@ -34,8 +34,7 @@ describe('Onboarding', () => { }); it('should enter an invalid server and get error', async() => { - await element(by.id('new-server-view-input')).replaceText('invalidtest'); - await element(by.id('new-server-view-button')).tap(); + await element(by.id('new-server-view-input')).typeText('invalidtest\n'); const errorText = 'Oops!'; await waitFor(element(by.text(errorText))).toBeVisible().withTimeout(60000); await element(by.text('OK')).tap(); @@ -51,8 +50,7 @@ describe('Onboarding', () => { await waitFor(element(by.id('onboarding-view'))).toBeVisible().withTimeout(2000); await element(by.id('join-workspace')).tap(); await waitFor(element(by.id('new-server-view'))).toBeVisible().withTimeout(60000); - await element(by.id('new-server-view-input')).replaceText(data.server); - await element(by.id('new-server-view-button')).tap(); + await element(by.id('new-server-view-input')).typeText(`${data.server}\n`); await waitFor(element(by.id('workspace-view'))).toBeVisible().withTimeout(60000); }); }); diff --git a/e2e/tests/onboarding/03-forgotpassword.spec.js b/e2e/tests/onboarding/03-forgotpassword.spec.js index 88d4c3e90..8b7fe9b5a 100644 --- a/e2e/tests/onboarding/03-forgotpassword.spec.js +++ b/e2e/tests/onboarding/03-forgotpassword.spec.js @@ -30,6 +30,7 @@ describe('Forgot password screen', () => { it('should reset password and navigate to login', async() => { await element(by.id('forgot-password-view-email')).replaceText(data.users.existing.email); await element(by.id('forgot-password-view-submit')).tap(); + await waitFor(element(by.text('OK'))).toExist().withTimeout(10000); await element(by.text('OK')).tap(); await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(60000); }); diff --git a/e2e/tests/onboarding/07-server-history.spec.js b/e2e/tests/onboarding/07-server-history.spec.js index d026965fb..fc1d6af9c 100644 --- a/e2e/tests/onboarding/07-server-history.spec.js +++ b/e2e/tests/onboarding/07-server-history.spec.js @@ -25,7 +25,7 @@ describe('Server history', () => { it('should tap on a server history and navigate to login', async() => { await element(by.id(`server-history-${ data.server }`)).tap(); - await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(2000); + await waitFor(element(by.id('login-view'))).toBeVisible().withTimeout(5000); await expect(element(by.id('login-view-email'))).toHaveText(data.users.regular.username); }); diff --git a/e2e/tests/room/01-createroom.spec.js b/e2e/tests/room/01-createroom.spec.js index 07ecd8030..5e7ae2ca5 100644 --- a/e2e/tests/room/01-createroom.spec.js +++ b/e2e/tests/room/01-createroom.spec.js @@ -94,7 +94,7 @@ describe('Create room screen', () => { describe('Usage', async() => { it('should get invalid room', async() => { - await element(by.id('create-channel-name')).replaceText('general'); + await element(by.id('create-channel-name')).typeText('general'); await element(by.id('create-channel-submit')).tap(); await waitFor(element(by.text(`A channel with name 'general' exists`))).toExist().withTimeout(60000); await expect(element(by.text(`A channel with name 'general' exists`))).toExist(); @@ -103,16 +103,17 @@ describe('Create room screen', () => { it('should create public room', async() => { const room = `public${ data.random }`; - await element(by.id('create-channel-name')).replaceText(room); + await element(by.id('create-channel-name')).replaceText(''); + await element(by.id('create-channel-name')).typeText(room); await element(by.id('create-channel-type')).tap(); await element(by.id('create-channel-submit')).tap(); - await waitFor(element(by.id('room-view'))).toExist().withTimeout(60000); + await waitFor(element(by.id('room-view'))).toExist().withTimeout(6000); await expect(element(by.id('room-view'))).toExist(); - await waitFor(element(by.id(`room-view-title-${ room }`))).toExist().withTimeout(60000); + await waitFor(element(by.id(`room-view-title-${ room }`))).toExist().withTimeout(6000); await expect(element(by.id(`room-view-title-${ room }`))).toExist(); await tapBack(); await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(10000); - await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toExist().withTimeout(60000); + await waitFor(element(by.id(`rooms-list-view-item-${ room }`))).toExist().withTimeout(6000); await expect(element(by.id(`rooms-list-view-item-${ room }`))).toExist(); }); @@ -127,7 +128,7 @@ describe('Create room screen', () => { await waitFor(element(by.id('selected-user-rocket.cat'))).toExist().withTimeout(5000); await element(by.id('selected-users-view-submit')).tap(); await waitFor(element(by.id('create-channel-view'))).toExist().withTimeout(5000); - await element(by.id('create-channel-name')).replaceText(room); + await element(by.id('create-channel-name')).typeText(room); await element(by.id('create-channel-submit')).tap(); await waitFor(element(by.id('room-view'))).toExist().withTimeout(60000); await expect(element(by.id('room-view'))).toExist(); @@ -149,7 +150,7 @@ describe('Create room screen', () => { await waitFor(element(by.id('select-users-view'))).toExist().withTimeout(5000); await element(by.id('selected-users-view-submit')).tap(); await waitFor(element(by.id('create-channel-view'))).toExist().withTimeout(10000); - await element(by.id('create-channel-name')).replaceText(room); + await element(by.id('create-channel-name')).typeText(room); await element(by.id('create-channel-submit')).tap(); await waitFor(element(by.id('room-view'))).toExist().withTimeout(60000); await expect(element(by.id('room-view'))).toExist(); diff --git a/e2e/tests/room/02-room.spec.js b/e2e/tests/room/02-room.spec.js index da83c1eb2..820536fb8 100644 --- a/e2e/tests/room/02-room.spec.js +++ b/e2e/tests/room/02-room.spec.js @@ -125,7 +125,6 @@ describe('Room screen', () => { }); it('should not show user autocomplete on @ in the middle of a string', async() => { - const username = data.users.regular.username await element(by.id('messagebox-input')).tap(); await element(by.id('messagebox-input')).typeText(`email@gmail`); await waitFor(element(by.id('messagebox-container'))).toNotExist().withTimeout(4000); @@ -149,8 +148,8 @@ describe('Room screen', () => { await element(by.id('messagebox-input')).clearText(); }); it('should draft message', async () => { - await element(by.id('messagebox-input')).atIndex(0).tap(); - await element(by.id('messagebox-input')).atIndex(0).typeText(`${ data.random }draft`); + await element(by.id('messagebox-input')).tap(); + await element(by.id('messagebox-input')).typeText(`${ data.random }draft`); await tapBack(); await navigateToRoom(mainRoom); @@ -191,9 +190,9 @@ describe('Room screen', () => { await element(by.label(`${ data.random }message`)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); - await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); - await waitFor(element(by.label('Unstar'))).toBeVisible().withTimeout(2000); - await element(by.id('action-sheet-backdrop')).tap(); + await element(by.id('action-sheet-handle')).swipe('up', 'slow', 0.5); + await waitFor(element(by.label('Unstar'))).toBeVisible().withTimeout(6000); + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.8); }); it('should react to message', async() => { @@ -267,14 +266,14 @@ describe('Room screen', () => { await mockMessage('pin') await pinMessage('pin') - await waitFor(element(by.label(`${ data.random }pin`)).atIndex(0)).toBeVisible().withTimeout(2000); - await waitFor(element(by.label(`${ data.users.regular.username } Message pinned`)).atIndex(0)).toBeVisible().withTimeout(2000); + await waitFor(element(by.label(`${ data.random }pin`)).atIndex(0)).toExist().withTimeout(5000); + await waitFor(element(by.label(`${ data.users.regular.username } Message pinned`)).atIndex(0)).toExist().withTimeout(5000); await element(by.label(`${ data.random }pin`)).atIndex(0).longPress(); await waitFor(element(by.id('action-sheet'))).toExist().withTimeout(1000); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); await waitFor(element(by.label('Unpin'))).toBeVisible().withTimeout(2000); - await element(by.id('action-sheet-backdrop')).tap(); + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.8); }); it('should delete message', async() => { @@ -285,6 +284,7 @@ describe('Room screen', () => { await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); + await waitFor(element(by.label('Delete'))).toExist().withTimeout(1000); await element(by.label('Delete')).tap(); const deleteAlertMessage = 'You will not be able to recover this message!'; @@ -294,12 +294,5 @@ describe('Room screen', () => { await waitFor(element(by.label(`${ data.random }delete`)).atIndex(0)).toNotExist().withTimeout(2000); }); }); - - // after(async() => { - // await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); - // await tapBack(); - // await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000); - // await expect(element(by.id('rooms-list-view'))).toExist(); - // }); }); }); diff --git a/e2e/tests/room/03-roomactions.spec.js b/e2e/tests/room/03-roomactions.spec.js index c7945f651..fcfc86711 100644 --- a/e2e/tests/room/03-roomactions.spec.js +++ b/e2e/tests/room/03-roomactions.spec.js @@ -223,10 +223,10 @@ describe('Room actions screen', () => { //Go to starred messages await element(by.id('room-actions-starred')).tap(); await waitFor(element(by.id('starred-messages-view'))).toExist().withTimeout(2000); - await waitFor(element(by.label(`${ data.random }messageToStar`).withAncestor(by.id('starred-messages-view')))).toBeVisible().withTimeout(60000); + await waitFor(element(by.label(`${ data.random }messageToStar`).withAncestor(by.id('starred-messages-view')))).toExist().withTimeout(60000); //Unstar message - await element(by.label(`${ data.random }messageToStar`).withAncestor(by.id('starred-messages-view'))).longPress(); + await element(by.label(`${ data.random }messageToStar`)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.label('Unstar')).tap(); @@ -247,18 +247,18 @@ describe('Room actions screen', () => { //Back into Room Actions await element(by.id('room-header')).tap(); await waitFor(element(by.id('room-actions-view'))).toExist().withTimeout(5000); - await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); + await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-pinned'))).toExist(); await element(by.id('room-actions-pinned')).tap(); await waitFor(element(by.id('pinned-messages-view'))).toExist().withTimeout(2000); - await waitFor(element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view')))).toBeVisible().withTimeout(60000); - await element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view'))).longPress(); + await waitFor(element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view')))).toExist().withTimeout(6000); + await element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view'))).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.label('Unpin')).tap(); - await waitFor(element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view')))).toBeNotVisible().withTimeout(60000); + await waitFor(element(by.label(`${ data.random }messageToPin`).withAncestor(by.id('pinned-messages-view')))).not.toExist().withTimeout(6000); await backToActions(); }); @@ -283,7 +283,7 @@ describe('Room actions screen', () => { describe('Notification', async() => { it('should navigate to notification preference view', async() => { - await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); + await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-notifications'))).toExist().withTimeout(2000); await element(by.id('room-actions-notifications')).tap(); await waitFor(element(by.id('notification-preference-view'))).toExist().withTimeout(2000); @@ -311,7 +311,7 @@ describe('Room actions screen', () => { it('should have notification sound option', async() => { // Ugly hack to scroll on detox - await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); + await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('notification-preference-view-sound'))).toExist().withTimeout(4000); }); @@ -335,7 +335,7 @@ describe('Room actions screen', () => { const user = data.users.alternate it('should tap on leave channel and raise alert', async() => { - await element(by.type('UIScrollView')).atIndex(1).scrollTo('bottom'); + await element(by.id('room-actions-scrollview')).scrollTo('bottom'); await waitFor(element(by.id('room-actions-leave-channel'))).toExist().withTimeout(2000); await element(by.id('room-actions-leave-channel')).tap(); await waitFor(element(by.text('Yes, leave it!'))).toExist().withTimeout(2000); @@ -368,7 +368,7 @@ describe('Room actions screen', () => { await element(by.id('room-actions-members')).tap(); await element(by.id('room-members-view-toggle-status')).tap(); await waitFor(element(by.id(`room-members-view-item-${ user.username }`))).toExist().withTimeout(60000); - await backToActions(1); + await backToActions(); }); describe('Room Members', async() => { @@ -414,7 +414,7 @@ describe('Room actions screen', () => { } const closeActionSheet = async() => { - await element(by.id('action-sheet-backdrop')).tap(); + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.6); } it('should set/remove as owner', async() => { @@ -483,7 +483,7 @@ describe('Room actions screen', () => { it('should ignore user', async() => { const message = `${ data.random }ignoredmessagecontent`; - const channelName = data.groups.private.name; + const channelName = `#${ data.groups.private.name }`; await sendMessage(user, channelName, message); await openActionSheet(user.username); await element(by.label('Ignore')).tap(); diff --git a/e2e/tests/room/05-threads.spec.js b/e2e/tests/room/05-threads.spec.js index e7dec4c70..40652df7d 100644 --- a/e2e/tests/room/05-threads.spec.js +++ b/e2e/tests/room/05-threads.spec.js @@ -81,7 +81,7 @@ describe('Threads', () => { it('should navigate to thread from button', async() => { await element(by.id(`message-thread-button-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); + await waitFor(element(by.id('room-view'))).toExist().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await expect(element(by.id(`room-view-title-${ thread }`))).toExist(); await tapBack(); @@ -89,7 +89,7 @@ describe('Threads', () => { it('should toggle follow thread', async() => { await element(by.id(`message-thread-button-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); + await waitFor(element(by.id('room-view'))).toExist().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await expect(element(by.id(`room-view-title-${ thread }`))).toExist(); await element(by.id('room-view-header-unfollow')).tap(); @@ -102,7 +102,7 @@ describe('Threads', () => { it('should send message in thread only', async() => { const messageText = 'threadonly'; - await mockMessage(messageText); + await mockMessage(messageText, true); await tapBack(); await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); @@ -113,7 +113,7 @@ describe('Threads', () => { it('should mark send to channel and show on main channel', async() => { const messageText = 'sendToChannel'; await element(by.id(`message-thread-button-${ thread }`)).tap(); - await element(by.id('messagebox-input')).atIndex(0).typeText(messageText); + await element(by.id('messagebox-input-thread')).typeText(messageText); await element(by.id('messagebox-send-to-channel')).tap(); await element(by.id('messagebox-send-message')).tap(); await tapBack(); @@ -128,16 +128,14 @@ describe('Threads', () => { await mockMessage('dummymessagebetweenthethread'); await dismissReviewNag() //TODO: Create a proper test for this elsewhere. await element(by.id(`message-thread-button-${ thread }`)).tap(); - await element(by.id('messagebox-input')).atIndex(0).typeText(messageText); + await element(by.id('messagebox-input-thread')).typeText(messageText); await element(by.id('messagebox-send-to-channel')).tap(); await element(by.id('messagebox-send-message')).tap(); await tapBack(); await waitFor(element(by.id('room-header').and(by.label(`${ mainRoom }`)))).toBeVisible().withTimeout(2000); await waitFor(element(by.id('room-header').and(by.label(`${ data.random }thread`)))).toBeNotVisible().withTimeout(2000); - await sleep(500) //TODO: Find a better way to wait for the animation to finish and the messagebox-input to be available and usable :( - + await waitFor(element(by.id(`message-thread-replied-on-${ thread }`))).toBeVisible().withTimeout(2000); await element(by.id(`message-thread-replied-on-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await expect(element(by.id(`room-view-title-${ thread }`))).toExist(); await tapBack(); @@ -149,7 +147,6 @@ describe('Threads', () => { await waitFor(element(by.id('thread-messages-view'))).toExist().withTimeout(5000); await expect(element(by.id('thread-messages-view'))).toExist(); await element(by.id(`thread-messages-view-${ thread }`)).atIndex(0).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); await expect(element(by.id(`room-view-title-${ thread }`))).toExist(); await tapBack(); @@ -160,31 +157,20 @@ describe('Threads', () => { it('should draft thread message', async () => { await element(by.id(`message-thread-button-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); - await element(by.id('messagebox-input')).atIndex(0).tap(); - await element(by.id('messagebox-input')).atIndex(0).typeText(`${ thread }draft`); + await element(by.id('messagebox-input-thread')).typeText(`${ thread }draft`); await tapBack(); await element(by.id(`message-thread-button-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); - await expect(element(by.id('messagebox-input')).atIndex(0)).toHaveText(`${ thread }draft`); - await element(by.id('messagebox-input')).atIndex(0).clearText(); + await expect(element(by.id('messagebox-input-thread'))).toHaveText(`${ thread }draft`); + await element(by.id('messagebox-input-thread')).clearText(); await tapBack(); await element(by.id(`message-thread-button-${ thread }`)).tap(); - await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); await waitFor(element(by.id(`room-view-title-${ thread }`))).toExist().withTimeout(5000); - await expect(element(by.id('messagebox-input')).atIndex(0)).toHaveText(''); + await expect(element(by.id('messagebox-input-thread'))).toHaveText(''); }); }); - - // after(async() => { - // await waitFor(element(by.id('room-view'))).toBeVisible().withTimeout(5000); - // await tapBack(); - // await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(2000); - // await expect(element(by.id('rooms-list-view'))).toExist(); - // }); }); }); diff --git a/e2e/tests/room/07-markasunread.spec.js b/e2e/tests/room/07-markasunread.spec.js index 9f425e8c4..dcbc50367 100644 --- a/e2e/tests/room/07-markasunread.spec.js +++ b/e2e/tests/room/07-markasunread.spec.js @@ -2,7 +2,8 @@ const { device, expect, element, by, waitFor } = require('detox'); const data = require('../../data'); -const { navigateToLogin, login, mockMessage, tapBack, searchRoom, logout } = require('../../helpers/app'); +const { navigateToLogin, login, searchRoom } = require('../../helpers/app'); +const { sendMessage } = require('../../helpers/data_setup') async function navigateToRoom(user) { await searchRoom(`${ user }`); @@ -20,23 +21,21 @@ describe('Mark as unread', () => { await navigateToRoom(user); }); + // TODO: Fix flakiness. If it fails, run it solo. describe('Usage', async() => { describe('Mark message as unread', async() => { it('should mark message as unread', async() => { - await mockMessage('message') - await expect(element(by.label(`${ data.random }message`)).atIndex(0)).toExist(); - await tapBack(); - await logout(); - await navigateToLogin(); - await login(data.users.alternate.username, data.users.alternate.password); - await navigateToRoom(data.users.regular.username); - await element(by.label(`${ data.random }message`)).atIndex(0).longPress(); + const message = `${ data.random }message`; + const channelName = `@${ data.users.regular.username }`; + await sendMessage(data.users.alternate, channelName, message); + await waitFor(element(by.label(message)).atIndex(0)).toExist().withTimeout(30000); + await element(by.label(message)).atIndex(0).longPress(); await expect(element(by.id('action-sheet'))).toExist(); await expect(element(by.id('action-sheet-handle'))).toBeVisible(); await element(by.id('action-sheet-handle')).swipe('up', 'fast', 0.5); await element(by.label('Mark Unread')).tap(); await waitFor(element(by.id('rooms-list-view'))).toExist().withTimeout(5000); - await expect(element(by.id(`rooms-list-view-item-${data.users.regular.username}`))).toExist(); + await expect(element(by.id(`rooms-list-view-item-${data.users.alternate.username}`))).toExist(); }); }); }); diff --git a/e2e/tests/room/08-roominfo.spec.js b/e2e/tests/room/08-roominfo.spec.js index 3cd339bac..fd6216cf9 100644 --- a/e2e/tests/room/08-roominfo.spec.js +++ b/e2e/tests/room/08-roominfo.spec.js @@ -119,7 +119,7 @@ describe('Room info screen', () => { it('should have type switch', async() => { // Ugly hack to scroll on detox - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.8); await expect(element(by.id('room-info-edit-view-t'))).toExist(); }); @@ -145,7 +145,7 @@ describe('Room info screen', () => { after(async() => { // Ugly hack to scroll on detox - await element(by.type('UIScrollView')).atIndex(1).swipe('down'); + await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); }); @@ -164,7 +164,7 @@ describe('Room info screen', () => { it('should change room name', async() => { await element(by.id('room-info-edit-view-name')).replaceText(`${ privateRoomName }new`); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); await tapBack(); @@ -174,10 +174,10 @@ describe('Room info screen', () => { await element(by.id('room-info-view-edit-button')).tap(); await waitFor(element(by.id('room-info-edit-view'))).toExist().withTimeout(2000); await element(by.id('room-info-edit-view-name')).replaceText(`${ privateRoomName }`); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); - await element(by.type('UIScrollView')).atIndex(1).swipe('down'); + await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); it('should reset form', async() => { @@ -186,7 +186,7 @@ describe('Room info screen', () => { await element(by.id('room-info-edit-view-topic')).replaceText('abc'); await element(by.id('room-info-edit-view-announcement')).replaceText('abc'); await element(by.id('room-info-edit-view-password')).replaceText('abc'); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-t')).tap(); await element(by.id('room-info-edit-view-ro')).longPress(); //https://github.com/facebook/react-native/issues/28032 await element(by.id('room-info-edit-view-react-when-ro')).tap(); @@ -200,12 +200,12 @@ describe('Room info screen', () => { await expect(element(by.id('room-info-edit-view-t'))).toHaveValue('1'); await expect(element(by.id('room-info-edit-view-ro'))).toHaveValue('0'); await expect(element(by.id('room-info-edit-view-react-when-ro'))).toBeNotVisible(); - await element(by.type('UIScrollView')).atIndex(1).swipe('down'); + await element(by.id('room-info-edit-view-list')).swipe('down', 'fast', 0.8); }); it('should change room description', async() => { await element(by.id('room-info-edit-view-description')).replaceText('new description'); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); await tapBack(); @@ -218,7 +218,7 @@ describe('Room info screen', () => { await element(by.id('room-info-view-edit-button')).tap(); await waitFor(element(by.id('room-info-edit-view'))).toExist().withTimeout(2000); await element(by.id('room-info-edit-view-topic')).replaceText('new topic'); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); await tapBack(); @@ -231,7 +231,7 @@ describe('Room info screen', () => { await element(by.id('room-info-view-edit-button')).tap(); await waitFor(element(by.id('room-info-edit-view'))).toExist().withTimeout(2000); await element(by.id('room-info-edit-view-announcement')).replaceText('new announcement'); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); await tapBack(); @@ -243,14 +243,14 @@ describe('Room info screen', () => { await waitFor(element(by.id('room-info-view-edit-button'))).toExist().withTimeout(10000); await element(by.id('room-info-view-edit-button')).tap(); await waitFor(element(by.id('room-info-edit-view'))).toExist().withTimeout(2000); - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-password')).replaceText('password'); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); }); it('should change room type', async() => { - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-t')).tap(); await element(by.id('room-info-edit-view-submit')).tap(); await waitForToast(); @@ -272,7 +272,7 @@ describe('Room info screen', () => { // }); it('should archive room', async() => { - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-archive')).tap(); await waitFor(element(by.text('Yes, archive it!'))).toExist().withTimeout(5000); await element(by.text('Yes, archive it!')).tap(); @@ -288,7 +288,7 @@ describe('Room info screen', () => { }); it('should delete room', async() => { - await element(by.type('UIScrollView')).atIndex(1).swipe('up'); + await element(by.id('room-info-edit-view-list')).swipe('up', 'fast', 0.5); await element(by.id('room-info-edit-view-delete')).tap(); await waitFor(element(by.text('Yes, delete it!'))).toExist().withTimeout(5000); await element(by.text('Yes, delete it!')).tap(); diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index 20ab4236d..6a123023f 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -1452,6 +1452,7 @@ DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -1567,6 +1568,7 @@ DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_ROOT}/Crashlytics/iOS\"", @@ -1683,11 +1685,12 @@ DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.16.1; + MARKETING_VERSION = 4.16.2; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; @@ -1724,7 +1727,7 @@ INFOPLIST_FILE = NotificationService/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 4.16.1; + MARKETING_VERSION = 4.16.2; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1752,6 +1755,7 @@ DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index dd599d645..e6129268e 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -23,7 +23,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.16.1 + 4.16.2 CFBundleSignature ???? CFBundleURLTypes diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist index 2f523baaa..38a2e4cf6 100644 --- a/ios/ShareRocketChatRN/Info.plist +++ b/ios/ShareRocketChatRN/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType XPC! CFBundleShortVersionString - 4.16.1 + 4.16.2 CFBundleVersion 1 KeychainGroup diff --git a/package.json b/package.json index d9d0dc051..0384fdc92 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket-chat-reactnative", - "version": "4.16.1", + "version": "4.16.2", "private": true, "scripts": { "start": "react-native start", @@ -67,6 +67,7 @@ "js-base64": "2.5.2", "js-sha256": "^0.9.0", "lodash": "4.17.20", + "mocha": "7.1.2", "moment": "2.27.0", "pretty-bytes": "^5.3.0", "prop-types": "15.7.2", @@ -144,7 +145,7 @@ "babel-runtime": "^6.26.0", "bugsnag-sourcemaps": "1.3.0", "codecov": "3.7.1", - "detox": "^16.9.0", + "detox": "^18.10.0", "emotion-theming": "10.0.27", "eslint": "6.8.0", "eslint-plugin-import": "2.22.0", @@ -156,7 +157,6 @@ "jest": "^25.1.0", "jest-cli": "^23.6.0", "metro-react-native-babel-preset": "^0.59.0", - "mocha": "7.1.2", "otp.js": "1.2.0", "patch-package": "6.2.2", "react-dom": "16.13.1", diff --git a/storybook/stories/Avatar.js b/storybook/stories/Avatar.js index fb642728b..9943f832e 100644 --- a/storybook/stories/Avatar.js +++ b/storybook/stories/Avatar.js @@ -1,11 +1,10 @@ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; -import { ScrollView, StyleSheet, View } from 'react-native'; -import PropTypes from 'prop-types'; +import { StyleSheet } from 'react-native'; +import { storiesOf } from '@storybook/react-native'; -import { themes } from '../../app/constants/colors'; import Avatar from '../../app/containers/Avatar/Avatar'; import Status from '../../app/containers/Status/Status'; -import StoriesSeparator from './StoriesSeparator'; import sharedStyles from '../../app/views/Styles'; const styles = StyleSheet.create({ @@ -16,125 +15,152 @@ const styles = StyleSheet.create({ const server = 'https://open.rocket.chat'; -const Separator = ({ title, theme }) => ; -Separator.propTypes = { - title: PropTypes.string, - theme: PropTypes.string -}; +const _theme = 'light'; -const AvatarStories = ({ theme }) => ( - - - ( + +)); + +stories.add('Avatar by roomId', () => ( + +)); + +stories.add('Avatar by url', () => ( + +)); + +stories.add('Avatar by path', () => ( + +)); + +stories.add('With ETag', () => ( + +)); + +stories.add('Without ETag', () => ( + +)); + +stories.add('Emoji', () => ( + ({ name: 'troll', extension: 'jpg' })} + server={server} + size={56} + /> +)); + +stories.add('Direct', () => ( + +)); + +stories.add('Channel', () => ( + +)); + +stories.add('Touchable', () => ( + console.log('Pressed!')} + size={56} + /> +)); + +stories.add('Static', () => ( + +)); + +stories.add('Avatar by roomId', () => ( + +)); + +stories.add('Custom borderRadius', () => ( + +)); + +stories.add('Children', () => ( + + - - - - - - - - - - - - ({ name: 'troll', extension: 'jpg' })} - server={server} - size={56} - /> - - - - - - console.log('Pressed!')} - size={56} - /> - - - - - - - - - - - - - - - -); -AvatarStories.propTypes = { - theme: PropTypes.string -}; -export default AvatarStories; + +)); + +stories.add('Wrong server', () => ( + +)); + +stories.add('Custom style', () => ( + +)); diff --git a/storybook/stories/Markdown.js b/storybook/stories/Markdown.js index 92c969501..bffd5a2aa 100644 --- a/storybook/stories/Markdown.js +++ b/storybook/stories/Markdown.js @@ -1,14 +1,19 @@ -/* eslint-disable react/prop-types */ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; import { ScrollView, StyleSheet, View } from 'react-native'; +import { storiesOf } from '@storybook/react-native'; import Markdown from '../../app/containers/markdown'; -import StoriesSeparator from './StoriesSeparator'; import { themes } from '../../app/constants/colors'; + +const theme = 'light'; + const styles = StyleSheet.create({ container: { - marginHorizontal: 15 + marginHorizontal: 15, + backgroundColor: themes[theme].backgroundColor, + marginVertical: 50 }, separator: { marginHorizontal: 10, @@ -37,258 +42,231 @@ const getCustomEmoji = (content) => { return customEmoji; }; -// eslint-disable-next-line arrow-body-style -export default ({ theme }) => { - return ( - - - - - +const stories = storiesOf('Markdown', module); - - - - +stories.add('Text', () => ( + + + + + + + +)); - - - - +stories.add('Edited', () => ( + + + +)); - - - - +stories.add('Preview', () => ( + + + + + + + +)); - - - - +stories.add('Mentions', () => ( + + + + +)); - - - - - - - - +stories.add('Hashtag', () => ( + + + +)); - - - - +stories.add('Emoji', () => ( + + + + + + +)); - - - - - - - - - - - - - - - - - - - - - This is block quote +stories.add('Block quote', () => ( + + This is block quote this is a normal line`} - theme={theme} - /> - + theme={theme} + /> + +)); - - - - - +stories.add('Links', () => ( + + + + +)); - - - - - - - - - - - - - +stories.add('Image', () => ( + + + +)); - - - - +stories.add('Headers', () => ( + + + + + + + + +)); - - - ( + + + - + theme={theme} + /> + +)); - - - - +stories.add('Lists', () => ( + + + + +)); - - - - - - - - - - - - - ( + + - - - ); -}; + theme={theme} + /> + +)); diff --git a/storybook/stories/Message.js b/storybook/stories/Message.js index 7be131dbc..82cfa1b03 100644 --- a/storybook/stories/Message.js +++ b/storybook/stories/Message.js @@ -1,21 +1,21 @@ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; -import { ScrollView, StyleSheet } from 'react-native'; +import { StyleSheet, ScrollView } from 'react-native'; +import { Provider } from 'react-redux'; +import { storiesOf } from '@storybook/react-native'; // import moment from 'moment'; import MessageComponent from '../../app/containers/message/Message'; -import StoriesSeparator from './StoriesSeparator'; import messagesStatus from '../../app/constants/messagesStatus'; import MessageSeparator from '../../app/views/RoomView/Separator'; +import MessageContext from '../../app/containers/message/Context'; import { themes } from '../../app/constants/colors'; +import { store } from './index'; -let _theme = 'light'; +const _theme = 'light'; const styles = StyleSheet.create({ - separator: { - marginTop: 30, - marginBottom: 0 - } }); const user = { @@ -40,6 +40,26 @@ const getCustomEmoji = (content) => { return customEmoji; }; +const messageDecorator = story => ( + {}, + onLongPress: () => {}, + reactionInit: () => {}, + onErrorPress: () => {}, + replyBroadcast: () => {}, + onReactionPress: () => {}, + onDiscussionPress: () => {}, + onReactionLongPress: () => {}, + threadBadgeColor: themes.light.tunreadColor + }} + > + {story()} + +); + const Message = props => ( ( /> ); -// eslint-disable-next-line react/prop-types -const Separator = ({ title, theme }) => ; -// eslint-disable-next-line react/prop-types -export default ({ theme }) => { - _theme = theme; - return ( - - - +const stories = storiesOf('Message', module) + .addDecorator(story => {story()}) + .addDecorator(story => {story()}) + .addDecorator(messageDecorator); - - +stories.add('Basic', () => ( + <> + + + +)); - - - - - - +stories.add('Grouped messages', () => ( + <> + + + + + + +)); - - +stories.add('Without header', () => ( + +)); - - - +stories.add('With alias', () => ( + <> + + + +)); - - +stories.add('Edited', () => ( + +)); - - - - ( + <> + + + {}} + type='e2e' + /> + + + + alert('Error pressed')} + type='e2e' + /> + + + +)); + +stories.add('Block Quote', () => ( + <> + + Testing block quote\nTesting block quote'} /> + +)); + +stories.add('Lists', () => ( + <> + + + + + +)); + +stories.add('Static avatar', () => ( + +)); + +stories.add('Full name', () => ( + +)); + +stories.add('Mentions', () => ( + <> + + + +)); + +stories.add('Emojis', () => ( + <> + + + + + + + +)); + +stories.add('Time format', () => ( + +)); + +stories.add('Reactions', () => ( + <> + {}} + /> + {}} + /> + +)); + +stories.add('Date and Unread separators', () => ( + <> + + + + + + + + + +)); + +stories.add('With image', () => ( + <> + + + +)); + +stories.add('With video', () => ( + <> + + + +)); + +stories.add('With audio', () => ( + <> + + + + + + +)); + +stories.add('With file', () => ( + <> + + + +)); + +stories.add('Message with reply', () => ( + <> + + + +)); + +stories.add('Message with read receipt', () => ( + <> + + + + + +)); + +stories.add('Message with thread', () => ( + <> + + + + + + + + +)); + +stories.add('Sequential thread messages following thread button', () => ( + <> + + + + + +)); + +stories.add('Sequential thread messages following thread reply', () => ( + <> + + + + + +)); + +stories.add('Discussion', () => ( + <> + + + + + +)); + +stories.add('URL', () => ( + <> + + + + +)); + +stories.add('Custom fields', () => ( + <> + {}} - type='e2e' - /> - - - - alert('Error pressed')} - type='e2e' - /> - - - - - - Testing block quote\nTesting block quote'} /> - - - - - - - - - - - - - - - - - - - - + title: 'Field 5', + value: 'Value 5' + }] + }]} + /> + +)); - - +stories.add('Two short custom fields with markdown', () => ( + +)); - - +stories.add('Colored attachments', () => ( + +)); - - +stories.add('Broadcast', () => ( + alert('broadcast!')} /> +)); - - +stories.add('Archived', () => ( + +)); - - +stories.add('Error', () => ( + <> + alert('Error pressed')} /> + alert('Error pressed')} isHeader={false} /> + +)); - - +stories.add('Temp', () => ( + +)); - - +stories.add('Editing', () => ( + +)); - - {}} - /> +stories.add('System messages', () => ( + <> + + + + + + + + + + + + + + + + + + +)); - - {}} - /> +stories.add('Ignored', () => ( + +)); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {/* - - - */} - - - - - - - {/* - - - */} - - - - - - - - - - - - - - - - - - alert('broadcast!')} /> - - - - - - alert('Error pressed')} /> - alert('Error pressed')} isHeader={false} /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; +stories.add('Custom style', () => ( + +)); diff --git a/storybook/stories/RoomItem.js b/storybook/stories/RoomItem.js index 819a149b2..d39e92082 100644 --- a/storybook/stories/RoomItem.js +++ b/storybook/stories/RoomItem.js @@ -1,15 +1,18 @@ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; import { ScrollView, Dimensions } from 'react-native'; +import { storiesOf } from '@storybook/react-native'; +import { Provider } from 'react-redux'; // import moment from 'moment'; import { themes } from '../../app/constants/colors'; import RoomItemComponent from '../../app/presentation/RoomItem/RoomItem'; import { longText } from '../utils'; -import StoriesSeparator from './StoriesSeparator'; +import { store } from './index'; const baseUrl = 'https://open.rocket.chat'; const { width } = Dimensions.get('window'); -let _theme = 'light'; +const _theme = 'light'; const lastMessage = { u: { username: 'diego.mello' @@ -22,7 +25,6 @@ const updatedAt = { const RoomItem = props => ( ( /> ); -// eslint-disable-next-line react/prop-types -const Separator = ({ title }) => ; +const stories = storiesOf('Room Item', module) + .addDecorator(story => {story()}) + .addDecorator(story => {story()}); -// eslint-disable-next-line react/prop-types -export default ({ theme }) => { - _theme = theme; - return ( - - - - - - +stories.add('Basic', () => ( + +)); - - - - - - - - - - - - - - - +stories.add('User', () => ( + <> + + + +)); - - - - - - - - - - - - +stories.add('Type', () => ( + <> + + + + + + + + +)); - - - - - - - - - - ); -}; +stories.add('User status', () => ( + <> + + + + + + + +)); + +stories.add('Alerts', () => ( + <> + + + + + + + + + + + + +)); + +stories.add('Last Message', () => ( + <> + + + + + + + + +)); diff --git a/storybook/stories/StoriesSeparator.js b/storybook/stories/StoriesSeparator.js deleted file mode 100644 index a24fa1d04..000000000 --- a/storybook/stories/StoriesSeparator.js +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { Text, StyleSheet } from 'react-native'; -import PropTypes from 'prop-types'; - -import { themes } from '../../app/constants/colors'; - -const styles = StyleSheet.create({ - separator: { - marginVertical: 30, - marginLeft: 10, - fontSize: 20, - fontWeight: '300' - } -}); - -const Separator = ({ title, style, theme }) => ( - - {title} - -); - -Separator.propTypes = { - title: PropTypes.string.isRequired, - theme: PropTypes.string, - style: PropTypes.object -}; - -export default Separator; diff --git a/storybook/stories/UiKitMessage.js b/storybook/stories/UiKitMessage.js index 68d81adc6..4fa2865f8 100644 --- a/storybook/stories/UiKitMessage.js +++ b/storybook/stories/UiKitMessage.js @@ -1,11 +1,11 @@ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; import { ScrollView, StyleSheet, SafeAreaView } from 'react-native'; +import { storiesOf } from '@storybook/react-native'; +import MessageContext from '../../app/containers/message/Context'; import { UiKitMessage } from '../../app/containers/UIKit'; -import StoriesSeparator from './StoriesSeparator'; - -// eslint-disable-next-line react/prop-types -const Separator = ({ title }) => ; +import { themes } from '../../app/constants/colors'; const styles = StyleSheet.create({ container: { @@ -17,426 +17,435 @@ const styles = StyleSheet.create({ } }); -export default () => ( - - - - { - UiKitMessage([{ - type: 'section', +const user = { + id: 'y8bd77ptZswPj3EW8', + username: 'diego.mello', + token: '79q6lH40W4ZRGLOshDiDiVlQaCc4f_lU9HNdHLAzuHz' +}; + +const baseUrl = 'https://open.rocket.chat'; + +const messageDecorator = story => ( + {}, + onLongPress: () => {}, + reactionInit: () => {}, + onErrorPress: () => {}, + replyBroadcast: () => {}, + onReactionPress: () => {}, + onDiscussionPress: () => {}, + onReactionLongPress: () => {}, + threadBadgeColor: themes.light.tunreadColor + }} + > + {story()} + +); + +const stories = storiesOf('UiKitMessage', module) + .addDecorator(story => {story()}) + .addDecorator(story => {story()}) + .addDecorator(messageDecorator); + +const Section = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section' + } +}]); +stories.add('Section', () =>
); + +const SectionMarkdownList = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: '*List*:\n1. Item' + } +}]); +stories.add('Section + Markdown List', () => ); + +const SectionOverflow = () => UiKitMessage([ + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + Overflow' + }, + accessory: { + type: 'overflow', + options: [ + { text: { - type: 'mrkdwn', - text: 'Section' - } - }]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: '*List*:\n1. Item' - } - }]) - } - - - { - UiKitMessage([ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + Overflow' - }, - accessory: { - type: 'overflow', - options: [ - { - text: { - type: 'plain_text', - text: 'Option 1', - emoji: true - }, - value: 'value-0' - }, - { - text: { - type: 'plain_text', - text: 'Option 2', - emoji: true - }, - value: 'value-1' - }, - { - text: { - type: 'plain_text', - text: 'Option 3', - emoji: true - }, - value: 'value-2' - }, - { - text: { - type: 'plain_text', - text: 'Option 4', - emoji: true - }, - value: 'value-3' - } - ] - } - } - ]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + Image' - }, - accessory: { - type: 'image', - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', - altText: 'plants' - } - }]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + button' - }, - accessory: { - type: 'button', - text: { - type: 'plain_text', - text: 'button' - } - } - }]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + select' - }, - accessory: { - type: 'static_select', - options: [ - { - value: 1, - text: { - type: 'plain_text', - text: 'button' - } - }, { - value: 2, - text: { - type: 'plain_text', - text: 'second button' - } - }] - } - }]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + DatePicker' - }, - accessory: { - type: 'datepicker', - initial_date: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true - } - } - }]) - } - - - { - UiKitMessage([{ - type: 'section', - text: { - type: 'mrkdwn', - text: 'Section + select' - }, - accessory: { - type: 'multi_static_select', - options: [{ - text: { - type: 'plain_text', - text: 'button' - }, - value: 1 - }, { - text: { - type: 'plain_text', - text: 'opt 1' - }, - value: 2 - }, { - text: { - type: 'plain_text', - text: 'opt 2' - }, - value: 3 - }, { - text: { - type: 'plain_text', - text: 'opt 3' - }, - value: 4 - }] - } - }]) - } - - - { - UiKitMessage([{ - type: 'image', - title: { type: 'plain_text', - text: 'Example Image', + text: 'Option 1', emoji: true }, - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', - altText: 'Example Image' - }]) - } - - - { - UiKitMessage([{ - type: 'context', - elements: [{ - type: 'image', - title: { - type: 'plain_text', - text: 'Example Image', - emoji: true - }, - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', - altText: 'Example Image' + value: 'value-0' + }, + { + text: { + type: 'plain_text', + text: 'Option 2', + emoji: true }, - { - type: 'mrkdwn', - text: 'context' - } - ] - }]) - } + value: 'value-1' + }, + { + text: { + type: 'plain_text', + text: 'Option 3', + emoji: true + }, + value: 'value-2' + }, + { + text: { + type: 'plain_text', + text: 'Option 4', + emoji: true + }, + value: 'value-3' + } + ] + } + } +]); +stories.add('Section + Overflow', () => ); - - { - UiKitMessage([{ - type: 'actions', - elements: [ - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Approve' - }, - style: 'primary', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - }, - { - type: 'button', - text: { - type: 'plain_text', - emoji: true, - text: 'Deny' - }, - style: 'danger', - value: 'click_me_123' - } - ] - }]) - } +const SectionImage = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + Image' + }, + accessory: { + type: 'image', + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', + altText: 'plants' + } +}]); +stories.add('Section + image', () => ); - - { - UiKitMessage([ - { - type: 'section', - fields: [ - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true - } - ] - }]) - } +const SectionButton = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + button' + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'button' + } + } +}]); +stories.add('Section + button', () => ); - +const SectionSelect = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + select' + }, + accessory: { + type: 'static_select', + options: [ { - UiKitMessage([{ - type: 'actions', - elements: [ - { - type: 'conversations_select', - placeholder: { - type: 'plain_text', - text: 'Select a conversation', - emoji: true - } - }, - { - type: 'channels_select', - placeholder: { - type: 'plain_text', - text: 'Select a channel', - emoji: true - } - }, - { - type: 'users_select', - placeholder: { - type: 'plain_text', - text: 'Select a user', - emoji: true - } - }, - { - type: 'static_select', - placeholder: { - type: 'plain_text', - text: 'Select an item', - emoji: true - }, - options: [ - { - text: { - type: 'plain_text', - text: 'Excellent item 1', - emoji: true - }, - value: 'value-0' - }, - { - text: { - type: 'plain_text', - text: 'Fantastic item 2', - emoji: true - }, - value: 'value-1' - }, - { - text: { - type: 'plain_text', - text: 'Nifty item 3', - emoji: true - }, - value: 'value-2' - }, - { - text: { - type: 'plain_text', - text: 'Pretty good item 4', - emoji: true - }, - value: 'value-3' - } - ] - } - ] - }]) + value: 1, + text: { + type: 'plain_text', + text: 'button' + } + }, { + value: 2, + text: { + type: 'plain_text', + text: 'second button' + } + }] + } +}]); +stories.add('Section + Select', () => ); + +const SectionDatePicker = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + DatePicker' + }, + accessory: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true + } + } +}]); +stories.add('Section + DatePicker', () => ); + +const SectionMultiSelect = () => UiKitMessage([{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Section + select' + }, + accessory: { + type: 'multi_static_select', + options: [{ + text: { + type: 'plain_text', + text: 'button' + }, + value: 1 + }, { + text: { + type: 'plain_text', + text: 'opt 1' + }, + value: 2 + }, { + text: { + type: 'plain_text', + text: 'opt 2' + }, + value: 3 + }, { + text: { + type: 'plain_text', + text: 'opt 3' + }, + value: 4 + }] + } +}]); +stories.add('Section + Multi Select', () => ); + +const Image = () => UiKitMessage([{ + type: 'image', + title: { + type: 'plain_text', + text: 'Example Image', + emoji: true + }, + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', + altText: 'Example Image' +}]); +stories.add('Image', () => ); + +const Context = () => UiKitMessage([{ + type: 'context', + elements: [{ + type: 'image', + title: { + type: 'plain_text', + text: 'Example Image', + emoji: true + }, + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', + altText: 'Example Image' + }, + { + type: 'mrkdwn', + text: 'context' + } + ] +}]); +stories.add('Context', () => ); + +const ActionButton = () => UiKitMessage([{ + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Approve' + }, + style: 'primary', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + }, + { + type: 'button', + text: { + type: 'plain_text', + emoji: true, + text: 'Deny' + }, + style: 'danger', + value: 'click_me_123' + } + ] +}]); +stories.add('Action - Buttons', () => ); + +const Fields = () => UiKitMessage([ + { + type: 'section', + fields: [ + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true + }, + { + type: 'plain_text', + text: '*this is plain_text text*', + emoji: true } - - -); + ] + }]); +stories.add('Fields', () => ); + +const ActionSelect = () => UiKitMessage([{ + type: 'actions', + elements: [ + { + type: 'conversations_select', + placeholder: { + type: 'plain_text', + text: 'Select a conversation', + emoji: true + } + }, + { + type: 'channels_select', + placeholder: { + type: 'plain_text', + text: 'Select a channel', + emoji: true + } + }, + { + type: 'users_select', + placeholder: { + type: 'plain_text', + text: 'Select a user', + emoji: true + } + }, + { + type: 'static_select', + placeholder: { + type: 'plain_text', + text: 'Select an item', + emoji: true + }, + options: [ + { + text: { + type: 'plain_text', + text: 'Excellent item 1', + emoji: true + }, + value: 'value-0' + }, + { + text: { + type: 'plain_text', + text: 'Fantastic item 2', + emoji: true + }, + value: 'value-1' + }, + { + text: { + type: 'plain_text', + text: 'Nifty item 3', + emoji: true + }, + value: 'value-2' + }, + { + text: { + type: 'plain_text', + text: 'Pretty good item 4', + emoji: true + }, + value: 'value-3' + } + ] + } + ] +}]); +stories.add('Action - Select', () => ); + +// stories.add('Section', () => UiKitMessage([{ +// type: 'section', +// text: { +// type: 'mrkdwn', +// text: 'Section' +// } +// }])); diff --git a/storybook/stories/UiKitModal.js b/storybook/stories/UiKitModal.js index ddbfab6a6..2ec9e1da6 100644 --- a/storybook/stories/UiKitModal.js +++ b/storybook/stories/UiKitModal.js @@ -1,12 +1,12 @@ +/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; import { ScrollView, StyleSheet, SafeAreaView } from 'react-native'; +import { storiesOf } from '@storybook/react-native'; import { UiKitModal, UiKitComponent } from '../../app/containers/UIKit'; import { KitContext, defaultContext } from '../../app/containers/UIKit/utils'; -import StoriesSeparator from './StoriesSeparator'; - -// eslint-disable-next-line react/prop-types -const Separator = ({ title }) => ; +import MessageContext from '../../app/containers/message/Context'; +import { themes } from '../../app/constants/colors'; const styles = StyleSheet.create({ container: { @@ -18,547 +18,566 @@ const styles = StyleSheet.create({ } }); -export default () => ( - - - - { - UiKitModal([ - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Rocket.Chat is free, unlimited and open source* 🚀\nIf you have any doubt ask to @rocketcat' - } - }, - { - type: 'divider' - }, - { - type: 'section', - fields: [ - { - type: 'mrkdwn', - text: '*Text 1*\nDescription, Mussum Ipsum, cacilds vidis litro' - }, - { - type: 'mrkdwn', - text: '*Text 2*\nDescription, Mussum Ipsum, cacilds vidis litro' - } - ] - }, - { - type: 'section', - fields: [ - { - type: 'mrkdwn', - text: '*Text 3*\nDescription, Mussum Ipsum, cacilds vidis litro' - }, - { - type: 'mrkdwn', - text: '*Text 4*\nDescription, Mussum Ipsum, cacilds vidis litro' - } - ] - } - ]) - } +const user = { + id: 'y8bd77ptZswPj3EW8', + username: 'diego.mello', + token: '79q6lH40W4ZRGLOshDiDiVlQaCc4f_lU9HNdHLAzuHz' +}; - - { - UiKitModal([ - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Bruno Quadros*,\nPlease review your details for your *travel expense*.\nExpense no. *DA921*.' - }, - accessory: { - type: 'image', - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png' - } - }, - { - type: 'divider' - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Date:*\n11/02/2020' - } - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Category:*\nTravel' - } - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Cost:*\n$150.00 USD' - } - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Notes:*\nWebSummit Conference' - } - } - ]) - } +const baseUrl = 'https://open.rocket.chat'; - - { - UiKitModal([ - { - type: 'input', - element: { - type: 'plain_text_input' - }, - label: { - type: 'plain_text', - text: 'Outgoing Title', - emoji: true - }, - hint: { - type: 'plain_text', - text: 'Pick something unique!', - emoji: true - } - }, - { - type: 'input', - element: { - type: 'datepicker', - initial_date: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true - } - }, - label: { - type: 'plain_text', - text: 'Set a date', - emoji: true - } - }, - { - type: 'input', - element: { - type: 'multi_static_select', - options: [{ - text: { - type: 'plain_text', - text: 'John' - }, - value: 1 - }, { - text: { - type: 'plain_text', - text: 'Dog' - }, - value: 2 - }] - }, - label: { - type: 'plain_text', - text: 'Share with...', - emoji: true - } - } - ]) - } +const messageDecorator = story => ( + {}, + onLongPress: () => {}, + reactionInit: () => {}, + onErrorPress: () => {}, + replyBroadcast: () => {}, + onReactionPress: () => {}, + onDiscussionPress: () => {}, + onReactionLongPress: () => {}, + threadBadgeColor: themes.light.tunreadColor + }} + > + {story()} + +); - - { - UiKitModal([ - { - type: 'context', - elements: [{ - type: 'mrkdwn', - text: 'Task: ZOL-994' - }] - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'Update Spec final assets' - }, - accessory: { - type: 'button', - text: { - type: 'plain_text', - text: 'Change' - } - } - }, - { - type: 'divider' - }, - { - type: 'input', - element: { - type: 'plain_text_input', - multiline: true - }, - placeholder: { - type: 'plain_text', - text: 'Write Something', - emoji: true - }, - label: { - type: 'plain_text', - text: 'Notes', - emoji: true - }, - hint: { - type: 'plain_text', - text: 'Please take the time to compose something short', - emoji: true - }, - description: { - type: 'plain_text', - text: 'Describe your update', - emoji: true - } - } - ]) - } +const stories = storiesOf('UiKitModal', module) + .addDecorator(story => {story()}) + .addDecorator(story => {story()}) + .addDecorator(messageDecorator); - +const ModalSectionSelects = () => UiKitModal([ + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Rocket.Chat is free, unlimited and open source* 🚀\nIf you have any doubt ask to @rocketcat' + } + }, + { + type: 'divider' + }, + { + type: 'section', + fields: [ { - UiKitModal([ - { - type: 'image', - title: { - type: 'plain_text', - text: 'Example Image', - emoji: true - }, - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', - alt_text: 'Example Image' - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'How could be the life in Mars?' - } - }, - { - type: 'context', - elements: [ - { - type: 'image', - imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png' - }, - { - type: 'mrkdwn', - text: 'November 25, 2019' - } - ] - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: '*Next stop, Mars!*\nMussum Ipsum, cacilds vidis litro abertis. Admodum accumsan disputationi eu sit. Vide electram sadipscing et per. Diuretics paradis num copo é motivis de denguis. Mais vale um bebadis conhecidiss, que um alcoolatra anonimis. Aenean aliquam molestie leo, vitae iaculis nisl.' - } - } - ]) + type: 'mrkdwn', + text: '*Text 1*\nDescription, Mussum Ipsum, cacilds vidis litro' + }, + { + type: 'mrkdwn', + text: '*Text 2*\nDescription, Mussum Ipsum, cacilds vidis litro' } - - + ] + }, + { + type: 'section', + fields: [ { - UiKitModal([{ - type: 'input', - element: { - type: 'plain_text_input' - }, - label: { - type: 'plain_text', - text: 'Title', - emoji: true - } + type: 'mrkdwn', + text: '*Text 3*\nDescription, Mussum Ipsum, cacilds vidis litro' + }, + { + type: 'mrkdwn', + text: '*Text 4*\nDescription, Mussum Ipsum, cacilds vidis litro' + } + ] + } +]); +stories.add('Modal - Section and Selects', () => ); + +const ModalSectionAccessories = () => UiKitModal([ + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Bruno Quadros*,\nPlease review your details for your *travel expense*.\nExpense no. *DA921*.' + }, + accessory: { + type: 'image', + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png' + } + }, + { + type: 'divider' + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Date:*\n11/02/2020' + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Category:*\nTravel' + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Cost:*\n$150.00 USD' + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Notes:*\nWebSummit Conference' + } + } +]); +stories.add('Modal - Section Accessories', () => ); + +const ModalFormInput = () => UiKitModal([ + { + type: 'input', + element: { + type: 'plain_text_input' + }, + label: { + type: 'plain_text', + text: 'Outgoing Title', + emoji: true + }, + hint: { + type: 'plain_text', + text: 'Pick something unique!', + emoji: true + } + }, + { + type: 'input', + element: { + type: 'datepicker', + initial_date: '1990-04-28', + placeholder: { + type: 'plain_text', + text: 'Select a date', + emoji: true + } + }, + label: { + type: 'plain_text', + text: 'Set a date', + emoji: true + } + }, + { + type: 'input', + element: { + type: 'multi_static_select', + options: [{ + text: { + type: 'plain_text', + text: 'John' }, + value: 1 + }, { + text: { + type: 'plain_text', + text: 'Dog' + }, + value: 2 + }] + }, + label: { + type: 'plain_text', + text: 'Share with...', + emoji: true + } + } +]); +stories.add('Modal - Form Input', () => ); + +const ModalFormTextArea = () => UiKitModal([ + { + type: 'context', + elements: [{ + type: 'mrkdwn', + text: 'Task: ZOL-994' + }] + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Update Spec final assets' + }, + accessory: { + type: 'button', + text: { + type: 'plain_text', + text: 'Change' + } + } + }, + { + type: 'divider' + }, + { + type: 'input', + element: { + type: 'plain_text_input', + multiline: true + }, + placeholder: { + type: 'plain_text', + text: 'Write Something', + emoji: true + }, + label: { + type: 'plain_text', + text: 'Notes', + emoji: true + }, + hint: { + type: 'plain_text', + text: 'Please take the time to compose something short', + emoji: true + }, + description: { + type: 'plain_text', + text: 'Describe your update', + emoji: true + } + } +]); +stories.add('Modal - Form TextArea', () => ); + +const ModalImages = () => UiKitModal([ + { + type: 'image', + title: { + type: 'plain_text', + text: 'Example Image', + emoji: true + }, + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png', + alt_text: 'Example Image' + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'How could be the life in Mars?' + } + }, + { + type: 'context', + elements: [ + { + type: 'image', + imageUrl: 'https://raw.githubusercontent.com/RocketChat/Rocket.Chat.Artwork/master/Logos/icon-circle-256.png' + }, + { + type: 'mrkdwn', + text: 'November 25, 2019' + } + ] + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Next stop, Mars!*\nMussum Ipsum, cacilds vidis litro abertis. Admodum accumsan disputationi eu sit. Vide electram sadipscing et per. Diuretics paradis num copo é motivis de denguis. Mais vale um bebadis conhecidiss, que um alcoolatra anonimis. Aenean aliquam molestie leo, vitae iaculis nisl.' + } + } +]); +stories.add('Modal - Images', () => ); + +const ModalActions = () => UiKitModal([{ + type: 'input', + element: { + type: 'plain_text_input' + }, + label: { + type: 'plain_text', + text: 'Title', + emoji: true + } +}, +{ + type: 'section', + text: { + type: 'mrkdwn', + text: 'Details' + } +}, +{ + type: 'section', + accessory: { + type: 'static_select', + options: [ + { + value: 1, + text: { + type: 'plain_text', + text: 'TypeL Task' + } + }, { + value: 2, + text: { + type: 'plain_text', + text: 'second button' + } + }] + } +}, +{ + type: 'section', + accessory: { + type: 'static_select', + options: [ + { + value: 1, + text: { + type: 'plain_text', + text: 'Project: Space (winter)' + } + }, { + value: 2, + text: { + type: 'plain_text', + text: 'second button' + } + }] + } +}, +{ + type: 'section', + accessory: { + type: 'static_select', + options: [ + { + value: 1, + text: { + type: 'plain_text', + text: 'Priority (optional)' + } + }, { + value: 2, + text: { + type: 'plain_text', + text: 'second button' + } + }] + } +}, +{ + type: 'section', + accessory: { + type: 'static_select', + options: [ + { + value: 1, + text: { + type: 'plain_text', + text: 'Assinee (optional)' + } + }, { + value: 2, + text: { + type: 'plain_text', + text: 'second button' + } + }] + } +}, +{ + type: 'input', + element: { + type: 'plain_text_input', + multiline: true + }, + placeholder: { + type: 'plain_text', + text: 'Write Something', + emoji: true + }, + label: { + type: 'plain_text', + text: 'Description', + emoji: true + } +}]); +stories.add('Modal - Actions', () => ); + +const ModalContextsDividers = () => UiKitModal([ + { + type: 'context', + elements: [{ + type: 'mrkdwn', + text: 'Due today' + }] + }, + { + type: 'divider' + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Finish interface componests (3 hours)' + }, + accessory: { + blockId: 'overflow-1', + type: 'overflow', + options: [ { - type: 'section', text: { - type: 'mrkdwn', - text: 'Details' - } - }, - { - type: 'section', - accessory: { - type: 'static_select', - options: [ - { - value: 1, - text: { - type: 'plain_text', - text: 'TypeL Task' - } - }, { - value: 2, - text: { - type: 'plain_text', - text: 'second button' - } - }] - } - }, - { - type: 'section', - accessory: { - type: 'static_select', - options: [ - { - value: 1, - text: { - type: 'plain_text', - text: 'Project: Space (winter)' - } - }, { - value: 2, - text: { - type: 'plain_text', - text: 'second button' - } - }] - } - }, - { - type: 'section', - accessory: { - type: 'static_select', - options: [ - { - value: 1, - text: { - type: 'plain_text', - text: 'Priority (optional)' - } - }, { - value: 2, - text: { - type: 'plain_text', - text: 'second button' - } - }] - } - }, - { - type: 'section', - accessory: { - type: 'static_select', - options: [ - { - value: 1, - text: { - type: 'plain_text', - text: 'Assinee (optional)' - } - }, { - value: 2, - text: { - type: 'plain_text', - text: 'second button' - } - }] - } - }, - { - type: 'input', - element: { - type: 'plain_text_input', - multiline: true + type: 'plain_text', + text: 'Details', + emoji: true }, + value: 'value-0' + }, + { + text: { + type: 'plain_text', + text: 'Remove', + emoji: true + }, + value: 'value-1' + } + ] + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'English Class (1 hour)' + }, + accessory: { + blockId: 'overflow-2', + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: 'Details', + emoji: true + }, + value: 'value-0' + }, + { + text: { + type: 'plain_text', + text: 'Remove', + emoji: true + }, + value: 'value-1' + } + ] + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: 'Send an email to John (15min)' + }, + accessory: { + blockId: 'overflow-3', + type: 'overflow', + options: [ + { + text: { + type: 'plain_text', + text: 'Details', + emoji: true + }, + value: 'value-0' + }, + { + text: { + type: 'plain_text', + text: 'Remove', + emoji: true + }, + value: 'value-1' + } + ] + } + } +]); +stories.add('Modal - Contexts and Dividers', () => ); + +const ModalInputWithError = () => ( + + + +); +stories.add('Modal - Input with error', () => ); + +const ModalMultilneWithError = () => ( + + + +); +stories.add('Modal - Multilne with error', () => ); + +const ModalDatePickerWithError = () => ( + + - { - UiKitModal([ - { - type: 'context', - elements: [{ - type: 'mrkdwn', - text: 'Due today' - }] - }, - { - type: 'divider' - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'Finish interface componests (3 hours)' - }, - accessory: { - blockId: 'overflow-1', - type: 'overflow', - options: [ - { - text: { - type: 'plain_text', - text: 'Details', - emoji: true - }, - value: 'value-0' - }, - { - text: { - type: 'plain_text', - text: 'Remove', - emoji: true - }, - value: 'value-1' - } - ] - } - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'English Class (1 hour)' - }, - accessory: { - blockId: 'overflow-2', - type: 'overflow', - options: [ - { - text: { - type: 'plain_text', - text: 'Details', - emoji: true - }, - value: 'value-0' - }, - { - text: { - type: 'plain_text', - text: 'Remove', - emoji: true - }, - value: 'value-1' - } - ] - } - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'Send an email to John (15min)' - }, - accessory: { - blockId: 'overflow-3', - type: 'overflow', - options: [ - { - text: { - type: 'plain_text', - text: 'Details', - emoji: true - }, - value: 'value-0' - }, - { - text: { - type: 'plain_text', - text: 'Remove', - emoji: true - }, - value: 'value-1' - } - ] - } - } - ]) - } - - - - - - - - - - - - - - - - - + }, + label: { + type: 'plain_text', + text: 'Label', + emoji: true + } + }]} + /> + ); +stories.add('Modal - DatePicker with error', () => ); diff --git a/storybook/stories/index.js b/storybook/stories/index.js index cd84085c1..20bfc4f25 100644 --- a/storybook/stories/index.js +++ b/storybook/stories/index.js @@ -1,37 +1,22 @@ /* eslint-disable import/no-extraneous-dependencies, import/no-unresolved, import/extensions */ -import React from 'react'; -import { Provider } from 'react-redux'; import { createStore, combineReducers } from 'redux'; -import { storiesOf } from '@storybook/react-native'; -import RoomItem from './RoomItem'; +import './RoomItem'; import './List'; import './ServerItem'; -import Message from './Message'; -import UiKitMessage from './UiKitMessage'; -import UiKitModal from './UiKitModal'; -import Markdown from './Markdown'; +import './Message'; +import './UiKitMessage'; +import './UiKitModal'; +import './Markdown'; import './HeaderButtons'; import './UnreadBadge'; import '../../app/views/ThreadMessagesView/Item.stories.js'; +import './Avatar'; import '../../app/containers/BackgroundContainer/index.stories.js'; import '../../app/containers/RoomHeader/RoomHeader.stories.js'; -import Avatar from './Avatar'; -// import RoomViewHeader from './RoomViewHeader'; - -import MessageContext from '../../app/containers/message/Context'; -import { themes } from '../../app/constants/colors'; - -// MessageProvider -const baseUrl = 'https://open.rocket.chat'; -const user = { - id: '', - username: 'diego.mello', - token: '' -}; // Change here to see themed storybook -const theme = 'light'; +export const theme = 'light'; const reducers = combineReducers({ settings: () => ({}), @@ -52,47 +37,4 @@ const reducers = combineReducers({ meteor: () => ({ connected: true }), activeUsers: () => ({ abc: { status: 'online', statusText: 'dog' } }) }); -const store = createStore(reducers); - -const messageDecorator = story => ( - {}, - onLongPress: () => {}, - reactionInit: () => {}, - onErrorPress: () => {}, - replyBroadcast: () => {}, - onReactionPress: () => {}, - onDiscussionPress: () => {}, - onReactionLongPress: () => {}, - threadBadgeColor: themes.light.tunreadColor - }} - > - {story()} - -); - -storiesOf('RoomItem', module) - .addDecorator(story => {story()}) - .add('list roomitem', () => ); -storiesOf('Message', module) - .addDecorator(story => {story()}) - .addDecorator(messageDecorator) - .add('list message', () => ); - -storiesOf('UiKitMessage', module) - .addDecorator(messageDecorator) - .add('list uikitmessage', () => ); -storiesOf('UiKitModal', module) - .addDecorator(messageDecorator) - .add('list UiKitModal', () => ); -storiesOf('Markdown', module) - .add('list Markdown', () => ); -storiesOf('Avatar', module) - .add('list Avatar', () => ); - -// FIXME: I couldn't make these pass on jest :( -// storiesOf('RoomViewHeader', module) -// .add('list', () => ); +export const store = createStore(reducers); diff --git a/yarn.lock b/yarn.lock index 2938649e3..0fc1c6c53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4610,12 +4610,12 @@ bunyan-debug-stream@^1.1.0: exception-formatter "^1.0.4" bunyan@^1.8.12: - version "1.8.12" - resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" - integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= + version "1.8.15" + resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" + integrity sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig== optionalDependencies: dtrace-provider "~0.8" - moment "^2.10.6" + moment "^2.19.3" mv "~2" safe-json-stringify "~1" @@ -4756,6 +4756,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -5046,6 +5051,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone-deep@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" @@ -5726,6 +5740,11 @@ decamelize@^3.2.0: dependencies: xregexp "^4.2.4" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -5904,10 +5923,10 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -detox@^16.9.0: - version "16.9.2" - resolved "https://registry.yarnpkg.com/detox/-/detox-16.9.2.tgz#3b99be3df54ef0f35ffe12d3aa87b556d00a50d3" - integrity sha512-yi74zL3hHFRU131B5tgZiYh0hPWvpryntllAKEpxRGRRuz+11s2+TjpuS0M02jGOdDMFBk5BzcXFGM57FWbWNA== +detox@^18.10.0: + version "18.10.0" + resolved "https://registry.yarnpkg.com/detox/-/detox-18.10.0.tgz#8b8d6b6f2bf9775f09d92b63f98dc1b5f4c9334e" + integrity sha512-okqMongBq0hKuJN8hxVHoBjM3Ms0XbaaWq5PyZGWuog3SXTX18ux8YjSmCU2J8ESA8muXyuOpl9KGgT8bWJTHA== dependencies: bunyan "^1.8.12" bunyan-debug-stream "^1.1.0" @@ -5921,16 +5940,18 @@ detox@^16.9.0: lodash "^4.17.5" minimist "^1.2.0" proper-lockfile "^3.0.2" + resolve-from "^5.0.0" sanitize-filename "^1.6.1" - shell-utils "^1.0.9" + serialize-error "^8.0.1" + shell-quote "^1.7.2" signal-exit "^3.0.3" tail "^2.0.0" telnet-client "1.2.8" tempfile "^2.0.0" which "^1.3.1" - ws "^3.3.1" - yargs "^13.0.0" - yargs-parser "^13.0.0" + ws "^7.4.3" + yargs "^16.0.3" + yargs-unparser "^2.0.0" diff-sequences@^24.9.0: version "24.9.0" @@ -6323,6 +6344,11 @@ es6-shim@^0.35.5: resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.5.tgz#46f59dc0a84a1c5029e8ff1166ca0a902077a9ab" integrity sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg== +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -7281,12 +7307,17 @@ flat-cache@^2.0.1: write "1.0.3" flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== dependencies: is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" @@ -7543,7 +7574,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -8294,7 +8325,12 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -8465,9 +8501,9 @@ is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.4, is-callable@^1.1.5: version "1.1.5" @@ -8676,6 +8712,11 @@ is-plain-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -10290,11 +10331,16 @@ lodash@4.17.20, lodash@^4.0.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@4.x.x, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.0: +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.0: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +lodash@^4.17.5: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + log-symbols@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -11121,12 +11167,12 @@ moment@2.27.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== -moment@2.x.x, moment@^2.10.6: +moment@2.x.x: version "2.26.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.26.0.tgz#5e1f82c6bafca6e83e808b30c8705eed0dcbd39a" integrity sha512-oIixUO+OamkUkwjhAVE18rAMfRJNsNe/Stid/gwHSOfHrOtw9EhAY2AHvdKZ/k/MggcYELFCJz/Sn2pL8b8JMw== -moment@^2.24.0: +moment@^2.19.3, moment@^2.24.0: version "2.29.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== @@ -11177,11 +11223,16 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@^2.12.1, nan@^2.14.0: +nan@^2.12.1: version "2.14.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== +nan@^2.14.0: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + nanoid@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.10.tgz#69a8a52b77892de0d11cede96bc9762852145bc4" @@ -14022,6 +14073,13 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= +serialize-error@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.0.1.tgz#7a67f8ecbbf28973b5a954a2852ff9f4eef52d99" + integrity sha512-r5o60rWFS+8/b49DNAbB+GXZA0SpDpuWE758JxDKgRTga05r3U5lwyksE91dYKDhXSmnu36RALj615E6Aj5pSg== + dependencies: + type-fest "^0.20.2" + serialize-javascript@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" @@ -14139,18 +14197,11 @@ shell-quote@1.6.1: array-reduce "~0.0.0" jsonify "~0.0.0" -shell-quote@1.7.2, shell-quote@^1.6.1: +shell-quote@1.7.2, shell-quote@^1.6.1, shell-quote@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -shell-utils@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/shell-utils/-/shell-utils-1.0.10.tgz#7fe7b8084f5d6d21323d941267013bc38aed063e" - integrity sha512-p1xuqhj3jgcXiV8wGoF1eL/NOvapN9tyGDoObqKwvZTUZn7fIzK75swLTEHfGa7sObeN9vxFplHw/zgYUYRTsg== - dependencies: - lodash "4.x.x" - shelljs@^0.7.8: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" @@ -14890,9 +14941,9 @@ table@^5.2.3: string-width "^3.0.0" tail@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/tail/-/tail-2.0.3.tgz#37567adc4624a70b35f1d146c3376fa3d6ef7c04" - integrity sha512-s9NOGkLqqiDEtBttQZI7acLS8ycYK5sTlDwNjGnpXG9c8AWj0cfAtwEIzo/hVRMMiC5EYz+bXaJWC1u1u0GPpQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/tail/-/tail-2.2.1.tgz#3369a786dde3d7b1a5baa3a0accea09348bc5a83" + integrity sha512-pqtI8HB6pbltcaDxkTq12meYxMeLNtZg7+h+c2WlXofaOh4bUeLFQ3eU8S23niqb8We4/UFc+QNlky9nCRnrSQ== tapable@^1.0.0, tapable@^1.1.3: version "1.1.3" @@ -15288,6 +15339,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -16034,6 +16090,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -16091,7 +16156,7 @@ ws@^1.1.0, ws@^1.1.5: options ">=0.0.5" ultron "1.0.x" -ws@^3.3.1, ws@^3.3.3: +ws@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== @@ -16117,6 +16182,11 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== +ws@^7.4.3: + version "7.4.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" + integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + xcode@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" @@ -16224,6 +16294,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.5: + version "5.0.7" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.7.tgz#0c514aba53fc40e2db911aeb8b51566a3374efe7" + integrity sha512-oOhslryvNcA1lB9WYr+M6TMyLkLg81Dgmyb48ZDU0lvR+5bmNDTMz7iobM1QXooaLhbbrcHrlNaABhI6Vo6StQ== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -16244,7 +16319,7 @@ yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== -yargs-parser@13.1.2, yargs-parser@^13.0.0, yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -16268,6 +16343,11 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -16284,7 +16364,17 @@ yargs-unparser@1.6.0: lodash "^4.17.15" yargs "^13.3.0" -yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2, yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -16368,3 +16458,16 @@ yargs@^15.1.0, yargs@^15.3.1: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.2" + +yargs@^16.0.3: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2"