From 2da0ae6820c0e78aab83d978cc708ae18e78ddf4 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Mon, 3 May 2021 13:30:21 -0300 Subject: [PATCH] Merge 4.16.2 into master (#3094) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [IMPROVEMENT] Customize Sign in with Apple button (#2420) * [Snyk] Security upgrade lodash from 4.17.19 to 4.17.20 (#2416) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-LODASH-590103 Co-authored-by: Diego Mello * [NEW] Add to F-Droid (#2171) * create play and foss build * update package.json to generate each build * check1 * requested changes * initial commit * Update config.yml * minor changes * remove bugsnag from foss build * remove bugsnag tasks from foss job * fix stuck screen * fixes * update * fix lint * finalise :rocket: * requested changes * share app for fdroid * update * use negation for builds * requested change * update share app * fix issues due to latest sync * add extra line * fix lint * update * update * fix bugsnag issue * Update config.yml * Fix store url * Foss release instead of debug * Add hold for foss * Fix build * requested changes * update name and icons * update * fix * Revert "Bump version to 4.11.0 (#2392)" This reverts commit ea287980d96b181b90b8db35dfa77f600d12d517. * finalise Co-authored-by: Djorkaeff Alexandre Co-authored-by: Diego Mello * [FIX] Commit pods after #2171 (#2424) * [IMPROVEMENT] Add subscription and room events on the same batch queue (#2423) * [IMPROVEMENT] Add subscription and room events on the same batch queue * Send both params * Unused var * [IMPROVEMENT] Show "Chats in Progress" group (#2425) * [NEW] Logout from other logged in locations (#2386) * Logout from other logged in locations * Add UI feedback for the request result * Refactor request to use the proper REST API * Change backgroundColor * I18n Co-authored-by: Diego Mello * [FIX] App can't reopening a room in some cases (#2429) * [FIX] Logout from custom oauth (#2377) * New field in table of users Signed-off-by: Ezequiel De Oliveira * Saving when the user logged in with email and password Signed-off-by: Ezequiel De Oliveira * Saving login method info Signed-off-by: Ezequiel De Oliveira * Ask for the user to clear cookies Signed-off-by: Ezequiel De Oliveira * Fix lint Signed-off-by: Ezequiel De Oliveira * Removing loginMethod from redux and add I18n Signed-off-by: Ezequiel De Oliveira * Using async/await instead of then/catch Signed-off-by: Ezequiel De Oliveira * Fix lint Signed-off-by: Ezequiel De Oliveira * Pods * Added dismissText on showConfirmationAlert * Fix iOS * Rename function * I18n tweaks Co-authored-by: Diego Mello * [FIX] Wrong date and time shown in file section (#2409) * Adding missing prop to item object Signed-off-by: Ezequiel De Oliveira * Resolving the missing date in the files section in a more elegant way Signed-off-by: Ezequiel De Oliveira * Using ts attribute always inside of an item object Signed-off-by: Ezequiel De Oliveira Co-authored-by: Diego Mello * [FIX] Verify useRealName setting on files screen (#2427) Signed-off-by: Ezequiel De Oliveira Co-authored-by: Diego Mello * [FIX] Apply theme on Directory description (#2428) Signed-off-by: Ezequiel De Oliveira Co-authored-by: Diego Mello * [FIX] Wrong merge resolution after #2171 (#2431) * [FIX] Upload to internal looking for the wrong path after #2171 (#2432) * [FIX] Detox tests (#2433) * Spotlight issues * Fix room tests * Fix roomactions tests * [FIX] Crashlytics reportError not working after #2171 (#2436) * [FIX] Logout from custom oauth when using password (#2435) * [FIX] Logout from custom oauth when using password * Remove an useless const Co-authored-by: Diego Mello * [IMPROVEMENT] Move toggle and inquiry to Enterprise Edition license (#2426) * [IMPROVEMENT] Move toggle and inquiry to Enterprise * Move inquiry stream to ee * Emit inquiry subscribe * imports to ee last * Add readme to ee Co-authored-by: Djorkaeff Alexandre * [CHORE] App Group path as a iOS constant (#2439) * [FIX] Chrome debugging * Remove rn-fetch-blob * [CHORE] Use Rocket.Chat JS SDK's official repo (#2440) Co-authored-by: Diego Mello * [IMPROVEMENT] Disable HTTP for production on Android (#2357) * Only enable HTTP and user CAs on debug builds and * Allow User CAs in prod * Add config on debug * Add lint Co-authored-by: Diego Mello * [NEW] E2E Encryption (#2394) * Add E2EKey to Subscription Model * Install react-native-simple-crypto * Install bytebuffer * Add translations * CreateChannel Encrypted toggle * Request E2E_Enabled setting * Add some E2E API methods * POC E2E Encryption * Garbage remove * Remove keys cleaner * Android cast JWK -> PKCS1 * Initialize E2E when Login Success * Add some translations * Add e2e property to Message model * Send Encrypted messages * (iOS) PKCS1 -> JWK & e2e.setUserPublicAndPrivateKeys * (Android) PKCS1 -> JWK & e2e.setUserPublicAndPrivateKeys * Create an encrypted channel * Fix app crashing on RoomsList * Create room key * Set Room E2E Key (Android) * Edit room encrypted * Show encrypted icon on messages * logEvents * Decrypt pending subscriptions & messages * Handle user cancel e2e password entry * E2ESavePasswordView * Update Snapshot * Add encrypted props to message on Send * Thread messages encryption * E2E -> Encryption * Share Extension: Share encrypted text * (POC) Search messages on Encrypted room * Provide room key to new users * Request roomKey on stream-notify-room-users * Add e2eKeyId to Room Model * (WIP) E2E Encryption Screens * Remove encryption subscription file * Move E2E_Enable to Server Model * Encryption List Banner * Move Encryption init to Sagas * Show banner only when enabled * Use RocketChat/react-native-simple-crypto * Search on WM only when is an Encrypted channel * (WIP) Encryption Banner * Encryption banner * Patch -> Fork * Improve send encrypted message * Update simple-crypto * Not decrypt already decrypted messages * Add comments * Change eslint disable to inline * Improve code * Remove comment * Some fixes * (WIP) Encryption Screens * Improve sub find * Resend an encrypted message * Fix comment * Code improvements * Hide e2e buttons on features if it is not enabled * InApp notifications of a encrypted room * Encryption stop logic * Edit encrypted message * DB batch on decryptPending * Encryption ready client * Comments * Handle getRoomInstance errors * Multiple messages decrypt * Remove unnecessary try/catch * Fix decrypt all messages history * Just add a questionmark * Fix some subscriptions missing decrypt * Disable request key logic * Fix unicode emojis * Fix e2ekey request * roomId -> subscription * Decrypt subscription after merge * E2ERoom -> EncryptionRoom * Fix infinite loading * Handle import key errors * Handle request key errors * Move e2eRequestRoomKey to Rocket.Chat * WIP handshake when key should be requested * Add search messages explanation * Remove some TODO and update comments * Improvements * Dont show message hash to user * Handle key request & prevent multiple calls * Request E2EKey on decryptSubscription that doesn't exists on database yet * Insert decrypted subscription * Fix crash after login * Decrypt sub when receive the key * Decrypt pending messages of a room * Encrypted as a switch * Buffer to Base64 URI Safe * Add a relevant comment * Prevent import key without a privateKey * Prevent create a new instance when client is not ready * Update simple-crypto & remove replace trick * More comments * Remove useless comment * Remove useless try/catch * I18n all E2E screens * E2ESavePassword -> E2ESaveYourPassword * Prevent multiple views on message when is not encrypted * Fix encryption toggle not working sometimes * follow some suggestions * dont rotate icons * remove unnecessary condition * remove unreachable event * create channel comment * disable no-bitwise rule for entire file * loadKeys -> persistKeys * getMasterKey -> generateMasterKey * explicit difference between E2EKey & e2eKeyId * roomId -> rid * group columns * Remove server selector * missing log events * remove comment * use stored public key * update simple-crypto & remove base64-js patch * add some logs * remove unreachable condition * log errors * handle errors on provide key directly on subscription * Downgrade RocketChat/react-native-simple-crypto * improve get room instance * migration of older apps * check encrypted status before send a message * wait client ready * use our own base64-js * add more jest tests * explain return * remove unncessary stop * thrown error to caller * remove superfluous checks * use Encryption property * change ready state logic * ready -> establishing * encryption.room -> encryptionRoom * EncryptionRoom -> Room * add documentation * wait establishing before provide a room key * remove superfluous condition * improve error handling logic * fallback e2ekey set * remove no longer necessary check * remove e.g. * improve getRoomInstance * import from index * use batch * fix a comment * decrypt tmsg * dont show hash when message is encrypted * Fix detox * Apply suggestions from code review Co-authored-by: Diego Mello * [CHORE] Update run-ios and run-android scripts (#2450) * [IMPROVEMENT] Show errors on server enter (#2449) * Catching errors * [IMPROVEMENT] Show errors on server enter * "Not rc server" instead of "invalid or insecure url" msg * [NEW] Show server history (#2421) * Add dropdown Signed-off-by: Ezequiel De Oliveira * Adding new table to serverSchema Signed-off-by: Ezequiel De Oliveira * Saving if not exists Signed-off-by: Ezequiel De Oliveira * list of visited servers finished Signed-off-by: Ezequiel De Oliveira * Fix lint Signed-off-by: Ezequiel De Oliveira * Rename ServerLinks to ServersHistory * Refactor * Save username * Sort servers desc * ServerInput * Item * Refactor * Layout tweaks * Layout * query by text * Small refactor * Redirecting to login * Save username for oauth * Fix keyboard persist * Add tests * Unnecessary yield * Stop rendering FlatList logic when there's no servers on history * Dismiss keyboard and autocomplete when tapped outside server TextInput Co-authored-by: Diego Mello * [NEW] Toggle analytics events (#2422) * Create flow to toggle analytics events on memory * Persist toggle analytics events * Update crash report to contemplate analytics events * Minor tweaks Co-authored-by: Diego Mello * [FIX] Local database searches using non-latin characters (#2462) * [FIX] Local database searches using non-latin characters * Add tests * [FIX] Read receipt crashing in some cases (#2464) * [IMPROVEMENT] Add "Allow_Save_Media_to_Gallery" setting (#2459) * [IMPROVEMENT] Add "Allow_Save_Media_to_Gallery" setting * Default true for old servers * [FIX] Jitsi breaking changes (#2468) * [FIX] Jitsi breaking changes * Update yarn cache * Update WatermelonDB to 0.19.0 (#2469) * [FIX] Jitsi breaking changes * Update yarn cache * Update watermelon to 0.19 * [FIX] SanitizeLikeString util crashes for empty strings (#2471) * [i18n] Add Traditional Chinese (zh_TW) (#2465) * I18n: Add Traditional Chinese language file(zh_TW) * Minor fixes * I18n: Add missing translation and fix some weird words * fix escape char * Fix minor issues Co-authored-by: Diego Mello * [I18n] Improve Simplified Chinese (zh_CN) (#2466) * I18n: Improve Simplified Chinese(zh_CN) language file * I18n: Add missing translation Co-authored-by: Diego Mello * [CHORE] Simplify i18n files (#2472) * [FIX] Remove assets from share extension on iOS (#2473) * [CHORE] Change database location to Experimental Apps (#2483) * change database location of experimental apps * fix migration from older versions * [FIX] WatermelonDB caching Date as String (#2484) Co-authored-by: Diego Mello * [NEW] E2E Encryption push (Android) (#2481) * poc push encryption android * eof * format code * react-native-simple-crypto update * prevent find sub twice * remove storage and use ejson storage * invalidate yarn cache * Bump crypto and fix db path * Fix google-services path Co-authored-by: Diego Mello * [FIX] Language set by web client (#2488) Co-authored-by: Diego Mello * [i18n] Improve Chinese translation (zh-TW, zh-CN) (#2486) Co-authored-by: Diego Mello * [i18n] Add missing italian strings (#2487) fix some existing ones too * [NEW] E2E Encryption push (iOS) (#2463) * link pods to notification service * push encryption poc * decrypt room key poc * read user key from mmkv and cast into a pkcs * push decrypt poc (iOS) * expose needed watermelon methods * watermelon -> database * indent & simple-crypto update * string extensions * storage * toBase64 -> toData * remove a forced unwrap * remove unused import * database driver * improvement * folder structure & watermelon bridge * more improvement stuff * watermelon -> database * reuse database instance * improvement * database fix: bypass watermelon cache * some code improvements * encryption instances * start api stuff * network layer * improve notification service * improve folder structure * watermelon patch * retry fetch logic * rocketchat class * fix try to decrypt without a roomKey * fallback to original content that is translated * some fixes to rocketchat logic * merge develop * remove unnecessary extension * [CHORE] Improve reply notification code (iOS) * undo sign changes * remove mocked value * import direct from library * send message request * reply notification with encrypted message working properly * revert apple sign * fix api onerror * trick to display sender name on group notifications * revert data.host change * fix some multithread issues * use sendername sent by server * small improvement * Bump crypto lib * Update ios/NotificationService/NotificationService.swift * add experimental string * remove trailing slash * remove trailing slash on reply * fix decrypt messages Co-authored-by: Diego Mello * [REGRESSION] HTTP Basic Auth (#2490) * [FIX] Logout when install fresh Official and Experimental iOS app (#2493) * [FIX] Show images in iOS 14 (#2494) * [DOCS] Add Reactotron (#2498) * Update about the inspection tool for our app. Information about the Reactotron tool was missing in the contribution file. * Update CONTRIBUTING.md Co-authored-by: Diego Mello * [REGRESSION] SSL Pinning stopped working after #2449 (#2510) * [CHORE] Reset yarn cache (#2512) * [FIX] Fastlane iOS (#2513) * [IMPROVEMENT] Add F-Droid modules as AdditionalModules (#2530) * [IMPROVEMENT] Add F-Droid modules as AdditionalModules * Fix missing import * [CHORE] Use App Store Connect API Key (#2549) * [CHORE] Use App Store Connect API Key * Update bundle * rollback keychain * Remove keychain * Keychain is actually needed * Update gitignore * [FIX] Failing iOS build on fork PR (#2558) * Fix fastlane build for a fork PR * Change the iOS fastlane command to build_fork * [FIX] Avatar cache invalidation (#2311) * [WIP] Avatar cache invalidation * [WIP] Avatar container * [IMPROVEMENT] Avatar container * [CHORE] Improve code * Allow static image on Avatar * Fix avatar changing while change username (#1583) Co-authored-by: Prateek93a * Add default props to properly update on Sidebar and ProfileView * Fix subscribing on the wrong moment * Storyshots update * RoomItem using Avatar Component * use iife to unsubscribe from user * Use component on avatar container * RoomItem as a React.Component * Move servers models to servers folder * Avatar -> AvatarContainer * Users indexed fields * Initialize author and check if u is present * Not was found -> User not found (turn comments more relevant) * RoomItemInner -> Wrapper * Revert Avatar Touchable logic * Revert responsability of LeftButton on Tablet Mode * Prevent setState on constructor * Run avatarURL only when its not static * Add streams RC Version * Move entire add user logic to result.success * Reorder init on RoomItem * onPress as a class function * Fix roomItem using same username * Add avatar Stories * Fix pick an image from gallery on ProfileView * get avatar etag on select users of create discussion * invalidate ci cache * Fix migration * Fix sidebar avatar not updating Co-authored-by: Prateek93a Co-authored-by: Diego Mello * [NEW] Channel avatars (#2504) * [WIP] Avatar cache invalidation * [WIP] Avatar container * [IMPROVEMENT] Avatar container * [CHORE] Improve code * Allow static image on Avatar * Fix avatar changing while change username (#1583) Co-authored-by: Prateek93a * Add default props to properly update on Sidebar and ProfileView * Fix subscribing on the wrong moment * Storyshots update * RoomItem using Avatar Component * use iife to unsubscribe from user * Use component on avatar container * RoomItem as a React.Component * Move servers models to servers folder * Avatar -> AvatarContainer * Users indexed fields * Initialize author and check if u is present * Not was found -> User not found (turn comments more relevant) * RoomItemInner -> Wrapper * Revert Avatar Touchable logic * Revert responsability of LeftButton on Tablet Mode * Prevent setState on constructor * Run avatarURL only when its not static * Add streams RC Version * Move entire add user logic to result.success * Reorder init on RoomItem * onPress as a class function * Fix roomItem using same username * Add avatar Stories * Fix pick an image from gallery on ProfileView * Format Avatar URL to use RoomId. Co-authored-by: Ezequiel De Oliveira * edit room avatar * invalidate cache of room images * reinit avatar if something change * read avatar cache on search * room avatar changed system message * add avatar by rid test * update snapshot * etag cache on select channel * reset room avatar * increase caching to have a better image quality * fix lgtm warn * invalidate ci cache * get avatar etag on select users of create discussion * invalidate ci cache * Fix migration * Fix sidebar avatar not updating * Remove outdated comment * Tests Co-authored-by: Prateek93a Co-authored-by: Diego Mello Co-authored-by: Ezequiel De Oliveira * [IMPROVEMENT] List Component (#2506) * List.Item * section * Start removing theme as prop * Remove StatusBar theme prop * SafeAreaView theme prop * Minor fixes * List.Container * Add translateTitle and translateSubtitle props * Storybook * Show action indicator * Header * Info * Theme stories * FlatList * DisplayName * Fix settings * FlatList tweaks * ThemeView * Screen Lock Config * DefaultBrowserView * PickerView and User Prefs * Notification Prefs * StatusView * Auto Translate * InviteUsersEdit * Visitor * Minor fixes * Remove Separator * Remove iteminfo * Font scale * Legal * Jitsi and e2e * Block * search, star, etc * auto translate and notifications * RoomInfo * Refactor RoomActions * lint * Remove DisclosureIndicator * padding horizontal 12 * Detox * Tests * Address review comments * Fix vertical scroll Co-authored-by: Djorkaeff Alexandre * [FIX] App always sends auth for Avatar requests (#2517) * [FIX] Sending auth for Avatar requests when not necessary * fix storybook * Fix ShareListView not updating avatars Co-authored-by: Diego Mello * [FIX] iOS uploads always cropping as squares (#2516) Co-authored-by: Diego Mello * [IMPROVEMENT] Mentions layout without background (#2559) * [IMPROVEMENT] Mentions layout without background * Fix RoomItem * Fix tests * [IMPROVEMENT] Support badge number on header buttons (#2566) * Beginning header buttons refactor * Add HeaderButtons * item with title * Refactor * Remove lib * Refactor * Update snapshot * Refactor * Update tests * Lint * [NEW] Threads (#2567) * [IMPROVEMENT] Mentions layout without background * Fix RoomItem * Fix tests * Smaller messagebox * Messagebox colors tweak * Beginning header buttons refactor * Add HeaderButtons * item with title * Refactor * Remove lib * Refactor * Update snapshot * Send to channel on messagebox * Add tshow * Add showMessageInMainThread to login.user reducer * Filter threads on main channel based on user setting * Send tshow * Add tunread * Move unread colors logic away from UnreadBadge component so it can be used on other components * Export UnreadBadge on index * Add empty test * Refactor * Update tests * Lint * Thread unread user and group on RoomItem * Thread badge working * Started ThreadMessagesView.Item * Fix separator * Reactivity working * Lint * custom emojis aren't necessary * Basic filter layout * Filtering layout * Refactor * apply filter * DropdownItemHeader * default all * few fixes * No data found * Fixes list performance issues * Use locale on date formats * Fixed minor styles * Thread badge * Refactor getBadgeColor * Fix send to channel background color * starting search threads * Fix lint and tests * Bump to 4.12.0 just for testing :) * Search input layout * query * starting threads header * fix unnecessary tlm on tmid messages * Fix thread header * lint * Fix thread header on ShareView * Add e2e tests * Fix subscriptions sort * Update stories and minor fixes * Fix button sizes on Messagebox * Remove comment * Unnecessary conditional * Add showMessageInMainThread to user collection * Fix thread header * Fix thread messages not working on tablet * Reset Messagebox.tshow after sending a message * Allow to send to channel when replying to a thread from main channel * Unnecessary theme prop * Address comments * Remove re-render * Fix scroll indicator bug * Fix style * Minor i18n fix * Fix dropdown height * I18n ptbr * I18n * [IMPROVEMENT] Android push notification as a heads-up notification (#2507) Co-authored-by: Diego Mello * [IMPROVEMENT] Add `Change Encryption Password` and `Reset E2E Key` (#2542) * init * Basic tests passing * Add SecurityPrivacyView * List.Item * section * Start removing theme as prop * Remove StatusBar theme prop * SafeAreaView theme prop * Minor fixes * List.Container * Add translateTitle and translateSubtitle props * Storybook * Show action indicator * Header * Info * Theme stories * FlatList * DisplayName * Fix settings * FlatList tweaks * ThemeView * Screen Lock Config * DefaultBrowserView * PickerView and User Prefs * Notification Prefs * StatusView * Auto Translate * InviteUsersEdit * Visitor * Minor fixes * Remove Separator * Remove iteminfo * Font scale * Legal * Jitsi and e2e * Block * search, star, etc * auto translate and notifications * RoomInfo * Refactor RoomActions * lint * Remove DisclosureIndicator * padding horizontal 12 * Detox * Tests * SecurityPrivacy * E2E encryption sec view * stash * Reset own key * Reset key * Change password * Hide content * Small refactor * Fix tests * Tests passing * Change test order * add pt-br * Address review comments * tests * Missing i18n ptbr Co-authored-by: Djorkaeff Alexandre * [IMPROVEMENT] Branding update (#2580) * iOS native icons * Android native icons * Foss native icons * Experimental icon iOS * Experimental * Notification icon * Splash screen * Splash screen iOS * Blue notification text * Fix iOS Launch Screen Icon * Experimental and foss Co-authored-by: Diego Mello * [CHORE] Update Xcode to 12.1.0 (#2592) * [CHORE] Update Xcode to 12.1.0 * Remove alpha from Xcode App Store Icon * [IMPROVEMENT] Auto search when text changes in directory textfield (#2547) Co-authored-by: Djorkaeff Alexandre Co-authored-by: Diego Mello * [FIX] Rooms header overlapping right icons (#2503) takes into account long names on small screen which led to overlapping title and right buttons on the header bar * [IMPROVEMENT] Jitsi lean (#2534) * 2.10.2 * update jitsi sdk * use our own react-native-jitsi-meet * use own android jitsi sdk * remove jsc reference * use self-builded ios sdk * update react-native-jitsi-meet Co-authored-by: Diego Mello * [i18n] German word fix (#2598) Report in German means "The Report" not "to report". Therefor "Melden" ist better suited here. Co-authored-by: Diego Mello * [i18n] Improve Chinese translation (#2570) * [FIX] App crashing when notification is received/replied (Android) (#2602) Co-authored-by: Diego Mello * [FIX] Update react native CLI to support white labeling with XCode 12 (#2560) Co-authored-by: Diego Mello * [i18n] Add missing German strings (#2571) * adding missing German strings * resolving conflict Co-authored-by: Diego Mello * [REGRESSION] Avatars doesn't show up on older servers (< 3.6.0) (#2603) * [REGRESSION] Avatars doesn't show up on older servers (< 3.6.0) * fix: snapshots tests failing Co-authored-by: Diego Mello * [FIX] Missing locales in moment helper (#2562) * [i18n] Add missing Russian strings (#2555) * Added waiting for network string translate * [i18n] Add missing russian strings * Some E2E strings * [i18n] Add missing russian strings * Some grammatical changes and translate optimizations * Add english strings * Final translate Co-authored-by: Карлан Антон Андреевич Co-authored-by: Diego Mello * [FIX] 'Send to channel' when replying as a quote (#2606) Co-authored-by: Diego Mello * [FIX] Android notification on Dark Theme using Official main color (#2604) Co-authored-by: Diego Mello * [FIX] Storybook not able to import Avatar (#2607) * [FIX] Storybook not able to import Avatar * Fix lint * Mock Date.now * Fix RU translation * isLegacy -> serverVersion * Remove change avatar from room info edit for servers below 3.6 * Mock for storyshots only * lint Co-authored-by: Diego Mello * [BUG] App isn't showing message for PDF/file uploads (#2584) * Fixed the issue #2531 In app/containers/message/Reply.js added a View Contaier around the Attachment Touchable and Added a Markdown attribute with msg set to description of attachment to display the message if any. * Added the condition to check if File Description Exists Added an if statement to check if file description exists and if yes then add a markdown with value msg equal to the description. Also tested using 'yarn test -u' to add/update the tests. * Made the requested Changes Removed the condition to check for attachment description. Added the `markdown` inside the touchable and wrapped `attachmentContainer` and the `markdown` inside a `<>` component * Added file not showing message issue code in this branch * Fixed the mistake in return * fix * Add tests Co-authored-by: Diego Mello * [FIX] Header title positioning not changing according to the number of icons (#2608) * [DOCS] Update Android Supported versions (#2611) * [i18n] Improve Russian translation (#2609) Co-authored-by: Diego Mello * [FIX] User notification preferences throwing an error when select default Email option (#2615) Co-authored-by: Diego Mello * [FIX] MomentJS crashing on Spanish language (#2616) Co-authored-by: Diego Mello * [FIX] AllowBackup manifest attribute causing unexpected behaviour on login (#2617) * [FIX] Search messages crashing when show a thread message (#2618) Co-authored-by: Diego Mello * [FIX] F-Droid build for store (#2557) * [FIX] F-Droid build for store * Trying to make Override custom push notifications on play build only * Use play sourceSets * Change version code * Fix react-native-config-reader * [FIX] F-Droid build for store * Trying to make Override custom push notifications on play build only * Use play sourceSets * Change version code * Fix react-native-config-reader * Remove react-native-device-info Google dependencies / Use LIBRE_BUILD of react-native-jitsi-meet * Invalidate CI Cache * Set specific jitsi-meet-sdk * Specify 2.10.0-libre * jitsi-meet using an url based on play build * update react-native-jitsi-meet * react-native-device-info foss * undo some unnecessary changes * Fix notifications Co-authored-by: Djorkaeff Alexandre * Merge beta into master (#2621) * Sync develop on master (#275) * Create LICENSE * Sync master (#721) * Merge 1.13.0 into Master (#936) * fix last messages (#239) * fix last messages * Room actions (#231) * Layout * Empty starred list * Favorite room * Pinned messages * fix last messages * fix date on pinned messages * fix package * [NEW] OAuth (#241) * Layout * tmp * test iscordova * Webview redirecting * Open and Close login actions * Login services saved on redux * OAuth Github * Server regex fix * OAuth modal style * - Twitter login - Remove services from redux - Open login saga fix * - Facebook login - Fixed user agent - Reactions fix - Message url unique key fix * Google login * Email keyboard removed from messagebox * - Login buttons refactored - RoomList header * Layout improvements * Meteor login redirect_uri changed * fix * Random credentialToken state * [NEW] Room actions: Mentioned messages and Room Members (#242) * Mentioned messages * Starred and pinned actions debounce * Room members * Open room on member touch * [WIP] Improves (#245) * hotfix for ios * hotfix for ios * Update config.yml * Workaround for RN 0.54 on iOS (#246) * Update iOS to RN 0.54 (#248) * Update iOS to RN 0.54 * [WIP] Audio message functionality (#247) * [NEW] Add module react-native-audio * [WIP] Audio message basic UI * [NEW] Record audio message * Use cordova repository to get certificates * Icon 1024 * [NEW] Room actions: block user, snippet messages, room files and leave room (#250) * - Block user - Load room members async - fixed reactive change of room's read only flag * Snippet messages * - Room files - Dismiss Video component on back button press - Improvements on Image component * Improvement on Video component * Leave room * Missing message types * lint * Reactotron working (#249) * [NEW] Room info and Room info edit (#254) * - Block user - Load room members async - fixed reactive change of room's read only flag * Snippet messages * - Room files - Dismiss Video component on back button press - Improvements on Image component * Improvement on Video component * Leave room * Missing message types * lint * - Room info (read only) - Missing message types * Room info scroll * - Tap on room header opens room info - Layout tweaks * - Room info edit - iOS Toast fixed * - Style not implemented actions as disabled * Edit room permission * - Save all room settings in a single call - Implemented roomType and readOnly * - Allow reacting when room is read only * Message type added: room_changed_privacy * Erase room * Created TextInput and SwitchContainer components for reuse and readability * - hasPermission method * - Archive/Unarchive room - Set Join Code * Twitter keyboard type on iOS * Archived room * reactWhenReadOnly permission on message * Active users refactored * User roles * - Subscribe to roles (in order to get role description info: e.g. 'core-team' to 'Rocket.Chat Team') - Save roles to realm (for offline access) - Save roles to redux (and get data from realm on app init) * Lint * code style * password show/hide feature * fix show/hide password * password show/hide * Crashlytics (#258) * Fabric iOS * Fabric configured on iOS and Android * login tracked * more logs * fix reaction * CI fix * Bug fixes (#261) * Layout fixes * RoomsListView's SafeAreaView * Unhandled promise rejection fix * Prevent navigation from opening scenes twice * Create channel fixes * Create LICENSE * Beta (#265) * Fabric iOS * Fabric configured on iOS and Android * - react-native-fabric configured - login tracked * README updated * Run scripts from README updated * README scripts * get rooms and messages by rest * user status * more improves * more improves * send pong on timeout * fix some methods * more tests * rest messages * Room actions (#266) * Toggle notifications * Search messages * Invite users * Mute/Unmute users in room * rocket.cat messages * Room topic layout fixed * Starred messages loading onEndReached * Room actions onEndReached * Unnecessary login request * Login loading * Login services fixed * User presence layout * ïmproves on room actions view * Removed unnecessary data from SelectedUsersView * load few messages on open room, search message improve * fix loading messages forever * Removed state from search * Custom message time format * secureTextEntry layout * Reduce android app size * Roles subscription fix * Public routes navigation * fix reconnect * - New login/register, login, register * proguard * Login flux * App init/restore * Android layout fixes * Multiple meteor connection requests fixed * Nested attachments * Nested attachments * fix check status * New login layout (#269) * Public routes navigation * New login/register, login, register * Multiple meteor connection requests fixed * Nested attachments * Button component * TextInput android layout fixed * Register fixed * Thinner close modal button * Requests /me after login only one time * Static images moved * fix reconnect * fix ddp * fix custom emoji * New message layout (#273) * Grouping messages * Message layout * Users typing animation * Image attachment layout * Fabric and image fix (#284) * Fixed images not showing * Keyboard libs updated * Fabric fix and location removed (#286) * Proguard disabled * message with list + links fixed (#288) * Better image cache component (#292) * react-native-img-cache removed * Improve list render * Support inside markdown * Deep linking (#291) * deep linking * Basic deep link working * Deep link routing * Multiple servers working * Send user to the room * Avatar initials and room type icon (#298) * Deep linking fix and more (#294) * Fix - Any https link was deep linking to RocketChat * Keyboard dismiss after add new server * Room info bug fix * Opacity animation * Navigation when adding server fixed * Throttle for unnecessary render on receiving several messages * Search inputs without autocorrect and autocapitalize * Search messages fixed * Messagebox unnecessary render and spotlight fixed * react-native-keyboard-input updated * Lint * Tests updated * Update all dependencies (#299) * Update react-navigation to the latest version 🚀 (#293) * fix(package): update react-navigation to version 2.0.0 * Code updated to support breaking changes of react-navigation * Detox tests E2E (#283) * RoomsListView re-render (#304) @RocketChat/ReactNative - [x] Removed unnecessary re-renders on RoomsListView * [NEW] Broadcast channels (#301) * Broadcast channels * e2e tests * New markdown (#306) Our current markdown is causing a lot of issues on Android devices, since it wraps everything inside a Text component. On Android, Text doesn't support View as a child. This PR adds react-native-markdown-renderer, that uses View as wrapper and may be better. * Fixed audio recording issues (#310) * Fix for "java.lang.IllegalArgumentException: unexpected url" (#313) @RocketChat/ReactNative User was able to add an invalid instance of Rocket.Chat by pressing submit button instead of "Connect" button. * I18n (#312) * Unread and date separator layout improved (#319) @RocketChat/ReactNative - [x] Unread and date separator layout - [x] "Start of conversation"/"Loading messages" label ![screen shot 2018-05-30 at 18 10 43](https://user-images.githubusercontent.com/804994/40747867-0424964a-6435-11e8-9293-31cc43c110ab.png) ![screen shot 2018-05-30 at 18 09 05](https://user-images.githubusercontent.com/804994/40747868-04484784-6435-11e8-8c31-92e0776276f0.png) * [FIX] iOS Universal links (#318) * [NEW] Drawer (#322) * [FIX] invalid user muted value * Ddp fixes (#324) * [NEW] User Profile (#323) * Drawer layout * Drawer changes * Profile * Profile avatar * Set language * Tests * Custom fields * Readme updated * fix invalid user muted value * Fix for "Cannot add a child that doesn't have a YogaNode to a parent without a measure function! (Trying to add a 'RCTVirtualText' to a 'RCTView')" * Settings/Permissions improvements (#325) * Changed the way we read RocketChat settings since setting.type won't be returned from server anymore * Permissions * Unnecessary action sheet render * Update gradle and targetSdkVersion (#328) * Changed the way we read RocketChat settings since setting.type won't be returned from server anymore * Permissions * Unnecessary action sheet render * Update gradle * Switched testServer to use blob * RoomsListHeader search fixed * Runs loadMessagesForRoom only if room has at least 20 rows * - Logout if user's token expired - Removed update avatar logic - Profile dialog border on android * - Animations disabled - CircleCI set * Tests updated * "eventType argument is required" fix * Switch push notification lib (#346) @RocketChat/ReactNative Closes #342 * Allow x-instance-id and X-Instance-ID header (#354) @RocketChat/ReactNative Closes #137 Some server configurations may send x-instance-id header with different case. * Image upload improvements (#368) @RocketChat/ReactNative - [x] Crop image - [x] Type image description (like web) - [x] Show upload progress - [x] "Try again" in case of error - [x] Cancel upload while in progress - [x] [Android] Zoom on photos ![image](https://user-images.githubusercontent.com/804994/42526934-a12da304-844d-11e8-8668-f3d69369726a.png) ![image](https://user-images.githubusercontent.com/804994/42527829-297945fe-8450-11e8-9f0e-9e668dd33043.png) * [NEW] Room Loading(#372) @RocketChat/ReactNative * [FIX] Empty room name for livechat (#375) @RocketChat/ReactNative Closes #320 Closes #209 * [NEW] Reply preview (#374) * Updated to React Native 0.56 * Reply Preview * [FIX] Close websocket (#379) * Fixed a bug when closing websocket * removeListener fixed * [I18N] Russian translation (#381) [I18N] Russian translation file * [NEW] Icon (#383) @RocketChat/ReactNative ![image](https://user-images.githubusercontent.com/804994/43228416-d8af49d6-9037-11e8-8830-a1803932c7fd.png) * [FIX] Android 8 notifications (#382) @RocketChat/ReactNative Closes #380 * Added CocoaPods to manage react-native-image-crop-picker (#373) @RocketChat/ReactNative react-native-image-crop-picker raised an error when uploading to TestFlight. The lib highly recommends CocoaPods for production builds. * Added single-server to readme (#390) @RocketChat/ReactNative Closes #386 Closes #295 * Improve RoomsList render time (#384) @RocketChat/ReactNative - [x] Added FlatList.getItemLayout() to improve list render time - [x] Some texts were breaking lines at sidebar - [x] Removed onPress from links at RoomsListView - [x] Added eslint rule to prevent unused styles - [x] Fixed auto focus bug at CreateChannel and NewServer - [x] Fix change server bug - [x] Fixed a bug when resuming in ListServer - [x] I18n fixed - [x] Fixed a bug on actionsheet ref not being created - [x] Reply wasn't showing on Android - [x] Use Notification.Builder.setColor/getColor only after Android SDK 23 - [x] Listen to app state only when inside app - [x] Switched register push token position in order to improve login performance - [x] When deep link changes server, it doesn't refresh rooms list - [x] Added SafeAreaView in all views to improve iPhone X experience - [x] Subpath regex #388 * [NEW] Empty room background (#412) @RocketChat/ReactNative Closes #398 ![aug-09-2018 11-35-32](https://user-images.githubusercontent.com/804994/43906080-cbfadf92-9bc8-11e8-9ac9-44f43d3af023.gif) ![aug-09-2018 11-35-16](https://user-images.githubusercontent.com/804994/43906082-cc19411c-9bc8-11e8-9892-c65c86951a91.gif) ![image](https://user-images.githubusercontent.com/804994/43911366-ad830cd0-9bd5-11e8-8913-6a7e87a2206c.png) * Add roadmap (#406) @RocketChat/ReactNative Closes #45 * [NEW] Onboarding (#407) @RocketChat/ReactNative Closes #392 ![aug-07-2018 17-03-50](https://user-images.githubusercontent.com/804994/43799447-f62074dc-9a63-11e8-8aac-bf2c4c5a8a2b.gif) ![aug-07-2018 17-03-35](https://user-images.githubusercontent.com/804994/43799446-f5f84a70-9a63-11e8-8947-265113ae9bf4.gif) ![aug-07-2018 17-03-13](https://user-images.githubusercontent.com/804994/43799445-f5d70ee6-9a63-11e8-94a9-f49c7d69fbba.gif) * [NEW] Updated Logo on Splash screen (#409) @RocketChat/ReactNative Closes #399 ![aug-07-2018 17-39-44](https://user-images.githubusercontent.com/804994/43801415-739a0cca-9a69-11e8-8bec-d65f751e6a28.gif) ![aug-07-2018 17-31-12](https://user-images.githubusercontent.com/804994/43801416-73d19bd6-9a69-11e8-90ac-bbc7ddeed938.gif) * [FIX] Only single attachment rendered (#417) * [NEW] Rooms list layout (#413) * RoomsListView layout * Rooms list layout * Sort component * Header icons * Default header colors * Add server dropdown * Close sort dropdown if server dropdown will open * UserItem * Room type icon * Search working * Tests updated * Android layout * Using realm queries instead of array iterates * Animation duration * Fixed render bug * [NEW] Create channel layout (#420) * RoomsListView layout * Rooms list layout * Sort component * Header icons * Default header colors * Add server dropdown * Close sort dropdown if server dropdown will open * UserItem * Room type icon * Search working * Tests updated * Android layout * Using realm queries instead of array iterates * Animation duration * Fixed render bug * - NewMessageView - backButtonTitle always empty - SearchBox created * New create channel layout * Search refactored * loginSuccess dismiss modal * Tests working * [FIX] Open unsupported videos on browser (#422) * 1.1 * Sort/group rooms local only (#425) * Update android api from ci * Sort local only * [FIX] Missing current server (#427) * server.current removed * Increased area of touch on header * Hide search when sort dropdown is tapped * default server icon url * 1.1.1 * [NEW] Experimental Icon (#430) * [NEW] Message layout (#426) * message container/component * Separator component * Reply * Url * tests updated * Minor changes * Audio component * Broadcast button * Minor touches * Reply preview * Edited * Minor bug fixes * - Update roadmap - Bump version to 1.2 * Onboarding styles fix * [FIX] Drawer navigation won't refresh chats (#432) * Avoid errors on Audio/Image/Video (#443) * Bump version to 1.2.1 (#444) * Stop supporting Android 4.4 and lower (#447) * Several fixes for 1.2.1 (#448) * Fix user.roles * Better onLongPress handle on messages * Indicator position * Fix role undefined in system messages * Add baseUrl in case of file attachments * Join room fixed * RoomView params * Broadcast fixes * Add server layout changes * Use native images * Subscribe to not joined channels * Fix alerts without i18n * Tests updated * Bump version to 1.2.2 (#449) * [NEW] Use community JSC for Android (#450) * [NEW] Use community JSC for Android * Quick fix on unread chats * [NEW] Show app version (#454) * [NEW] Portuguese translation (#452) * [NEW] Portuguese translation * Remove servers from sidebar * Update dependencies (#431) * Update dependencies * Lint and test * Added react-native fork * rn 57 * Lint and tests updated * Update xcode on circleci * Use legacy build system * Update tests * Use inline requires (#459) * Update dependencies * Lint and test * Added react-native fork * rn 57 * Lint and tests updated * Update xcode on circleci * Use legacy build system * Update tests * Inline requires * Fix eslint and remove temp gradle * Unnecessary renders * Update isNotch and Readme * Tests updated * Bump version to 1.3.0 (#461) * Better touch handling on rooms list (#462) * Use react-native-gesture-handler at RoomItem * Fixed info message author * Edit message render improvement * Fix ws to http replace * Bump version to 1.3.1 (#463) * Composer layout tweaked (#464) * Composer layout tweaked * Fix localization error * Bump version to 1.3.2 * [FIX] Handle deleted messages (#466) * [FIX] Handle deleted messages * Fix rest error * Fix some connection issues * [FIX] Search rooms (#468) * Bump version to 1.3.3 (#469) * Connecting to DDP badge (#471) * Display custom fields on user info (#476) * Render custom fields on user info * renderCustomFields fix * Display custom fields in user info * Fix lint error * [FIX] DDP badge wasn't hiding on fast connections (#477) * Use Rocket.Chat JS SDK (#481) * JS SDK * API working * Multiple servers * Bump version to 1.4.0 (#482) * [FIX] 2FA and LDAP (#488) * [FIX] Unread rooms group order (#487) * Use grouping setting on temp messages (#486) * [FIX] Delete room error (#485) * Rename to Rocket.Chat Experimental (#483) * Update dependencies (#484) * Bump version to 1.4.0 (#482) * test * one more test * Fix build * Regression: Wait for unmount to delete database after logout (#489) * Bump version to 1.4.1 (#490) * Regression: Crash on Android search (#492) * Bump version to 1.4.2 (#493) * Update Rocket.Chat.js.SDK (#494) * Bump version to v1.4.3 (#495) * [FIX] OAuth (#496) * Smaller header icons inside the room (#499) * [FIX] Logout (#497) * [FIX] Logout * Removed realm instances on rooms list * Bump version to 1.4.4 (#498) * Update navigation library (#501) * v2 * Working on Android 0.57.3 * Drawer working * Removing v1 navigator * - Splash screen - Icons changed * Deeplink * Remove EventEmitter from CreateChannelView * Android search * Android notifications * OAuth * Fix search props * Lint and tests fixed * Fix android build * Improvements on iPhone X* usage * Fix detox * Fix android build * Room.f added to RoomView.shouldComponentUpdate * Animations on RoomsListView and RoomView * Fix topbar buttons on Android * Bump version to 1.5.0 (#503) * Check $FABRIC_KEY availability in CircleCI (#506) * Check $FABRIC_KEY in CircleCI * Remove config scripts * Check $FABRIC_KEY availability in CircleCI for iOS (#507) * [I18n] Add Simplified Chinese(zh-CN) locale (#505) * [FIX] iOS pop gesture not working properly (#509) * Check if lastMessage has an attachment and show "User sent an attachment" at RoomsList (#510) * [FIX] Messages not being loaded properly (#513) * Fetch avatar initials from server (#512) * Fix iOS pop gesture and open sidemenu gesture (#511) * Bump version to 1.5.1 (#516) * [NEW] Room header layout (#521) * Clear iOS notification on resume/open (#520) * [FIX] Flashing avatars on Android after #512 (#519) * [FIX] App connects to previous server instead of the recent added (#518) * [FIX] Room view header crashes when destructuring reducer (#523) * [FIX] Dismiss keyboard on room close (#530) * [FIX] Composer composer's send icon slowness (#528) * [WIP] New Authentication layout (#536) New Authentication layout * Regression: Resend messages with error (#532) * DDP Connection badge animation changed (#533) * [FIX] Upload buttons on Android (#541) * Bump version to 1.6.0 (#543) * I18n: Add missing translation of simplified Chinese (#539) * Update dependencies (#544) * AndroidManifest changes * Regression: Deep linking stopped working after react-native-navigation update (#549) * [FIX] Android stuck on splash screen after hardware back button is pressed (#550) * [FIX] Android stuck on splash screen after hardware button is pressed * Fix empty user at asyncstorage * Remove unused subscribe * [FIX] x-instance-id header prop is case insensitive (#551) * Bump version to 1.6.1 (#553) * [FIX] x-instance-id header prop is case insensitive * Use Rest API calls (#558) * Chats: Don't show group header if none of the filters is selected (#560) * [CHORE] Update Xcode image version on CircleCI (#561) * Bump version to 1.7.0 (#562) * [FIX] Load messages on notification tap (#564) * Use Rest API pt 2 (#568) * Room files * Pinned messages * Starred messages * Mentioned messages * Search messages * Bug fixes * Profile * Livechat * Block/unblock user * Erase room * Archive room * Remove unused method * Bug fix * [CHORE] Add hold step on CircleCI before TestFlight (#572) * [FIX] GET /info to check if it's a valid server instead of x-instance-id (#573) * Bump version to 1.7.1 (#574) * Unnecessary re-renders removed (#570) * shouldComponentUpdate * Rooms list shouldcomponentupdate * RoomView shouldComponentUpdate * Messagebox and Message shouldComponentUpdate * EmojiPicker shouldComponentUpdate * RoomActions shouldComponentUpdate * Room info shouldComponentUpdate * Update RNN * Use only one Flatlist if none group filter is selected * Update fix * shouldComponentUpdate * Bug fixes * ListView changes * Bug fix * render list bug fix * Changes on public channels * - RoomView saga leak removed - Join room e2e tests added * Rest versions * Method call versions * Min RocketChat version alert * Update dependencies (#587) * [FIX] Better message actions (#567) * [FIX] Back button press on message actions (#592) * Bump version to 1.8.0 (#595) * [FIX] LDAP login (#596) * Create class to manage navigation (#594) * Add Navigation class * Place Drawer.js logic inside of Navigation * Load less views at startup * [FIX] v1.8.0 (#599) * Downgrade react-native-fast-image * Update iOS permission usage descriptions * [FIX] Delete upload item * Update JS SDK version (#602) * Add Icons class (#611) Creates Icons class to manage when to load icons from native side or react-native-vector-icons. It also fixes `react-native run-android` #517 * Updating room indicator (#609) Shows "Updating..." when requesting rooms from Rest API. * [FIX] Load avatar on servers that prevent unauthenticated avatar access (#604) App would show an empty space on servers that require authentication on avatar access * [FIX] 2FA login in a server with LDAP enabled (#612) * [FIX] Start loop searching for rooms updates only when connection goes down and SDK has userId (#613) * Allow to create empty channel (#615) * [FIX] Reply title should break text (#616) * Bump version to 1.9.0 (#617) * [FIX] SDK issues (#621) * Remove listeners from room * Properly close connections on change server * Minor layout change on connecting badge * [CHORE] Add TestFlight invite and update Readme (#623) * [FIX] npm -> yarn dependencies migration (#622) * I18n: Add French (#629) * [FIX] Remove rooms listener (#630) * [CHORE] Update issue template (#638) * I18n: Add German (#641) * Bump version to 1.10.0 (#644) * [FIX] Prevent mass is typing dispatchs (#651) * [FIX] Handle database errors properly (#650) * [FIX] Change actions labels (#654) * [FIX] Room members filter (#655) * [FIX] uploadProgress is not a function (#656) * [FIX] Slow messagebox (#658) * Remove drawer (#653) * Remove drawer (layout needs to be changed in future releases, though) * Don't navigate outside on logout if there's other logged server * Update react-native-navigation * Message button (#660) * Remove touchable opacity when scrolling messages * Tap on disable messages closes keyboard * Unify vibration * Vibrate only on Android * [FIX] Fetch rooms date (#662) * [FIX] Select emoji error (#666) * Update Realm to 2.24 (#667) * Update React Native to 0.58.6 (#668) * [FIX] Fix some language issues in German language (#664) * New icons (#643) * New Icons * Remove unused assets * Change send icon * Layout tweaks * Refactor Status * Styles changed * User layout fix * Separator layout changes * Sidebar status layout fix * Fix Message.onLongPress issue * Fix code markdown Closes https://github.com/RocketChat/Rocket.Chat.ReactNative/issues/625 * Status lint * Fix tests * Navigation debounce * RoomActions icons * Space between components * Group text * Update tests * [CHORE] Remove .debug suffix on Android (#681) * [FIX] Fix null native Messagebox component object (#680) * Fix null native Messagebox component object * [iOS] Fix header alignment * Remove unused files * Switch to react-navigation (#687) * Update readme (#714) * Bump to 1.10.1 (#731) * [FIX] Deep linking between multiple logged servers (#730) * Fix handle invisible status (#692) * I18n: Add Portuguese (Portugal) (#722) * [FIX] Show ActivityIndicator in RoomMembersView (#686) * Bump version to 1.11.0 (#761) * Migrate from GCM to FCM (#760) * [NEW] Scrollable room name feature (#756) * [NEW] Scroll down floating button (#735) * [CHORE] Added Storybook documentation (#757) * Use FlatList in RoomView (#762) * [FIX] iOS requiring location permission (#768) * Room item layout (#771) * [NEW] Draft message per room (#772) * [FIX] Add Realm.safeAddListener (#785) * [CHORE] Remove tvOS target (#779) * [NEW] Discussions (#696) * Bump version to 1.12.0 (#804) * [NEW] Threads (#798) * RoomsListView improvements (#819) * [FIX] Giphy not showing (#810) * [FIX] Apply emojify on empty texts (#824) * Lock drawer when stack is not on root screen (#825) * Room item layout (#835) * [FIX] Threads (#838) Closes #826 Closes #827 Closes #828 Closes #829 Closes #830 Closes #831 Closes #832 Closes #833 * [FIX] Smaller thread title (#846) * [FIX] Smaller thread title * Remove markdown notation from thread title * On message press debounce * Align vertical thread title * [Regression] Search stopped working on Android after LastMessage refactor (#851) * Load legal pages from web (#849) * Update fetch permissions api (#850) * Update custom emojis endpoint (#852) * Update emoji endpoint * Use React.memo on Markdown * Support RC versions lower than 0.75.0 * Realm migration * Fetch roles from rest api (#853) * Fetch roles from rest api * Fix RoomInfoView role get * Remove roles from redux * Bump version to 1.13 (#857) * Active users improvements (#855) * Remove connection badge (#862) * Connecting indicator on RoomsListView header * Connecting indicator on RoomView header * Remove ConnectionBadge * Show updating on RoomView load messages * Update dependencies (#863) * Minor updates * Update jsc-android * Update react-native-modal * Minor updates * Update react-native-fast-image * Minor dev updates * Few major updates * Update react-native-keyboard-aware-scroll-view * Update pods * Update android-support * Update tests * Remove duplicated getRoleDescription function (#866) * [FIX] Load local URL image (#871) * [FIX] Toggle/follow thread icon (#867) * Tweaks on sequential threads messages layout (#858) * Tweaks on sequential threads messages * Update tests * Fix quote * Prevent from deleting thread start message when positioned inside the thread * Remove thread listener from RightButtons * Fix error on thread start parse * Stop parsing threads on render * Check replied thread only if necessary * Fix messages don't displaying * Fix threads e2e * RoomsListView.updateState slice * Stop fetching hidden messages on threads * Set initialNumToRender to 5 * [FIX] Check if room is mounted before setting state (#864) * Tweaks on sequential threads messages * Update tests * Fix quote * Prevent from deleting thread start message when positioned inside the thread * Remove thread listener from RightButtons * Fix error on thread start parse * Stop parsing threads on render * Check replied thread only if necessary * Fix messages don't displaying * Fix threads e2e * RoomsListView.updateState slice * Stop fetching hidden messages on threads * Check if RoomView is mounted before rendering * Refactor navigation events on RoomsListView * Fix lint * Fix listener * [FIX] Typing not getting cleared after popping a room (#873) * [CHORE] Remove e2e tests from CI (#875) * [FIX] Remove listeners on RoomView header unmount (#874) * [RELEASE] Merge beta into master (#1055) * Bump version to 1.16.0 (#1014) * [IMPROVEMENT] Share credentials with Rocket.Chat.iOS (#982) * :sparkles: Create user table * :sparkles: Introduce user table * :fire: Remove unused table * :heavy_plus_sign: Add userdefaults to storage data * :green_heart: Fix android build * :sparkles: Get credentials from iOS native client * :fire: Remove unused code * :rewind: Revert sign xcode * :bug: Fix first login-logout * :art: Use constants to UserDefaults Keys * :bug: Fix clear server-user-info on logout * :bug: Fix filter null value * :ambulance: Remove user object in logout * :sparkles: Fix get servers from native-client * :ambulance: Fix error on change server * [FIX] Don't run UserDefaults credentials on Android (#1015) * :bug: Fix native credentials (android) * Fix migration loop * [IMPROVEMENT] Hide frequently used emoji tab when empty (#792) * [IMPROVEMENT] Bigger emoji in emoji only messages (#793) * issue #725: bigger emoji in emoji only message * issue-725/add storybook for Message/Emoji * issue-725: update storybook/Message jest snapshot * comment storybook import * allow spaces and line breaks in emoji only message * merge develop * revert unnecessary spacing * [FIX] Empty message if contains only a link (#787) * Fix empty message if contains only a link * :bug: Fix empty space * [IMPROVEMENT] Refactor empty space regex on quote (#1017) * :art: Improve regex to empty space on quote * :art: Improve on regex to empty space on quote * [NEW] Custom fields on signup (#1013) * added custom feilds on registration * added flag as leftIcon and removed lable * added try and catch * typo * [CHORE] Renew provisioning profiles (#1020) * [NEW] Auto-translate (#1012) * Update realm * View original and translate working * Read AutoTranslate_Enabled setting * RocketChat.canAutoTranslate() * AutoTranslateView * Save language * Auto-translate switch * Translate message * [IMPROVEMENT] Use haptics rather than vibration (#1016) * Install expo-haptics * Use expo-haptics rather than RN's Vibration module * [IMPROVEMENT] Use Rest API for file upload (#1005) * removed rn-fetch-blob and use native XMLHttpRequest instead * removed unnessary changes * fix android bug * fix android bug * added tmid support * fix bug * fixed isssue with cacel model * fix problems with audio * done requested changes * fix bug with android * [CHORE] [CI] [TESTS] update detox to make ci pass (#1026) * feat: update detox to 12.11.3 to make CI pass * ci: comment all jobs but leave e2e-test job * commit to rerun IC e2e-test job * ci: uncomment all CI jobs * [NEW] Room swipe actions: mark as read/unread, hide, fav (#976) * added unread and fav feature * changed the layout * fix jest * done requested changes * added requested changes * [FIX] Android build (#1027) * [FIX] Android build * CircleCI error * [FIX] iOS share credentials build (#1028) * [FIX] iOS share credentials build * Use `hasMigration` as a string * [CI] Restore cache on CI (#1029) * feat: add fastlane save\restore cache config; comment not needed jobs; * install fastlane using 'bundle install' * install fastlane using 'sudo bundle install' * uncomment ios build commands * run set up google services in ios folder * add working_directory: ios to ios-build steps * remove 'cd ios' from Fastlane build step * add save\restore cache for npm modules * group save_cache steps * cache fastlane in ios-testflight job * uncomment previously commented jobs\steps * fix: add missing colon * use key for caching: node-modules-{{ checksum ".circleci/config.yml" }}-{{ checksum "yarn.lock" }} * add names for save\restore steps * ci: add `default` step with `working_directory: ~/repo` to ios-build job * return back caching npm: `node-v1-{{ checksum "package.json" }}-{{ arch }}` * fix: add missing curly braces * save\restore cache in e2e-test job; remove {{arch}} from cache names * add names to restore_cache steps in android-build job * add names to save_cache steps in android-build job * add names to all save\restore steps; change checksum package.json to yarn.lock * change `npm` to `NPM` in steps naming * remove {{ checksum circle ci }} from android-build job and fix naming of steps * [FIX] Rooms swipes (#1034) * Regression: on press style feedback * Action button styles * Fix animations * Styles changed * Update subscription without having to wait for socket * Calculate width on RoomsListView instead * [FIX] Decrease bigger emoji size to 30 (#1031) * [FIX] Append server URL on avatar if necessary (#1038) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * Bump version to 1.16.1 (#1045) * [FIX] Set UserDefaults AppGroup on notification tap (#1047) * [FIX] Auto-translate messages as they arrive * Fix favorite button * [RELEASE] Merge beta into master (#1082) * Bump version to 1.16.0 (#1014) * [IMPROVEMENT] Share credentials with Rocket.Chat.iOS (#982) * :sparkles: Create user table * :sparkles: Introduce user table * :fire: Remove unused table * :heavy_plus_sign: Add userdefaults to storage data * :green_heart: Fix android build * :sparkles: Get credentials from iOS native client * :fire: Remove unused code * :rewind: Revert sign xcode * :bug: Fix first login-logout * :art: Use constants to UserDefaults Keys * :bug: Fix clear server-user-info on logout * :bug: Fix filter null value * :ambulance: Remove user object in logout * :sparkles: Fix get servers from native-client * :ambulance: Fix error on change server * [FIX] Don't run UserDefaults credentials on Android (#1015) * :bug: Fix native credentials (android) * Fix migration loop * [IMPROVEMENT] Hide frequently used emoji tab when empty (#792) * [IMPROVEMENT] Bigger emoji in emoji only messages (#793) * issue #725: bigger emoji in emoji only message * issue-725/add storybook for Message/Emoji * issue-725: update storybook/Message jest snapshot * comment storybook import * allow spaces and line breaks in emoji only message * merge develop * revert unnecessary spacing * [FIX] Empty message if contains only a link (#787) * Fix empty message if contains only a link * :bug: Fix empty space * [IMPROVEMENT] Refactor empty space regex on quote (#1017) * :art: Improve regex to empty space on quote * :art: Improve on regex to empty space on quote * [NEW] Custom fields on signup (#1013) * added custom feilds on registration * added flag as leftIcon and removed lable * added try and catch * typo * [CHORE] Renew provisioning profiles (#1020) * [NEW] Auto-translate (#1012) * Update realm * View original and translate working * Read AutoTranslate_Enabled setting * RocketChat.canAutoTranslate() * AutoTranslateView * Save language * Auto-translate switch * Translate message * [IMPROVEMENT] Use haptics rather than vibration (#1016) * Install expo-haptics * Use expo-haptics rather than RN's Vibration module * [IMPROVEMENT] Use Rest API for file upload (#1005) * removed rn-fetch-blob and use native XMLHttpRequest instead * removed unnessary changes * fix android bug * fix android bug * added tmid support * fix bug * fixed isssue with cacel model * fix problems with audio * done requested changes * fix bug with android * [CHORE] [CI] [TESTS] update detox to make ci pass (#1026) * feat: update detox to 12.11.3 to make CI pass * ci: comment all jobs but leave e2e-test job * commit to rerun IC e2e-test job * ci: uncomment all CI jobs * [NEW] Room swipe actions: mark as read/unread, hide, fav (#976) * added unread and fav feature * changed the layout * fix jest * done requested changes * added requested changes * [FIX] Android build (#1027) * [FIX] Android build * CircleCI error * [FIX] iOS share credentials build (#1028) * [FIX] iOS share credentials build * Use `hasMigration` as a string * [CI] Restore cache on CI (#1029) * feat: add fastlane save\restore cache config; comment not needed jobs; * install fastlane using 'bundle install' * install fastlane using 'sudo bundle install' * uncomment ios build commands * run set up google services in ios folder * add working_directory: ios to ios-build steps * remove 'cd ios' from Fastlane build step * add save\restore cache for npm modules * group save_cache steps * cache fastlane in ios-testflight job * uncomment previously commented jobs\steps * fix: add missing colon * use key for caching: node-modules-{{ checksum ".circleci/config.yml" }}-{{ checksum "yarn.lock" }} * add names for save\restore steps * ci: add `default` step with `working_directory: ~/repo` to ios-build job * return back caching npm: `node-v1-{{ checksum "package.json" }}-{{ arch }}` * fix: add missing curly braces * save\restore cache in e2e-test job; remove {{arch}} from cache names * add names to restore_cache steps in android-build job * add names to save_cache steps in android-build job * add names to all save\restore steps; change checksum package.json to yarn.lock * change `npm` to `NPM` in steps naming * remove {{ checksum circle ci }} from android-build job and fix naming of steps * [FIX] Rooms swipes (#1034) * Regression: on press style feedback * Action button styles * Fix animations * Styles changed * Update subscription without having to wait for socket * Calculate width on RoomsListView instead * [FIX] Decrease bigger emoji size to 30 (#1031) * [FIX] Append server URL on avatar if necessary (#1038) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * Bump version to 1.16.1 (#1045) * [FIX] Set UserDefaults AppGroup on notification tap (#1047) * [FIX] Auto-translate messages as they arrive * Fix favorite button * [FIX] Swipe animations (#1044) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * Fix favorite button * [FIX] Auto-translate messages as they arrive (#1049) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * [FIX] Auto-translate messages as they arrive * [i18n] Add missing de translations (#1040) * [CHORE] Switch to react-native-localize (#1043) * Bump version to 1.17.0 (#1057) * Load views as needed (#1056) * [IMPROVEMENT] Change "resend" icon position (#1048) * [NEW] Video support (#801) * [NEW] File upload (#882) * [NEW] Share extension (#942) * [FIX] Share extension CI build (#1060) * Change bundleID * Provisioning * get provisioning profile * [IMPROVEMENT] Reusable toast (#1065) * [FIX] Moment locales (#1066) * [FIX] Share Extension issues (#1064) * [FIX] Empty white list enables all media types upload (#1077) * Merge branch 'master' into develop (#1079) * [FIX] Empty white list enables all media types upload (#1080) * Create utils to media (canUpload) * Fix variable name * [CHORE] Update README (#1081) * [RELEASE] Merge beta into master (#1088) * Bump version to 1.16.0 (#1014) * [IMPROVEMENT] Share credentials with Rocket.Chat.iOS (#982) * :sparkles: Create user table * :sparkles: Introduce user table * :fire: Remove unused table * :heavy_plus_sign: Add userdefaults to storage data * :green_heart: Fix android build * :sparkles: Get credentials from iOS native client * :fire: Remove unused code * :rewind: Revert sign xcode * :bug: Fix first login-logout * :art: Use constants to UserDefaults Keys * :bug: Fix clear server-user-info on logout * :bug: Fix filter null value * :ambulance: Remove user object in logout * :sparkles: Fix get servers from native-client * :ambulance: Fix error on change server * [FIX] Don't run UserDefaults credentials on Android (#1015) * :bug: Fix native credentials (android) * Fix migration loop * [IMPROVEMENT] Hide frequently used emoji tab when empty (#792) * [IMPROVEMENT] Bigger emoji in emoji only messages (#793) * issue #725: bigger emoji in emoji only message * issue-725/add storybook for Message/Emoji * issue-725: update storybook/Message jest snapshot * comment storybook import * allow spaces and line breaks in emoji only message * merge develop * revert unnecessary spacing * [FIX] Empty message if contains only a link (#787) * Fix empty message if contains only a link * :bug: Fix empty space * [IMPROVEMENT] Refactor empty space regex on quote (#1017) * :art: Improve regex to empty space on quote * :art: Improve on regex to empty space on quote * [NEW] Custom fields on signup (#1013) * added custom feilds on registration * added flag as leftIcon and removed lable * added try and catch * typo * [CHORE] Renew provisioning profiles (#1020) * [NEW] Auto-translate (#1012) * Update realm * View original and translate working * Read AutoTranslate_Enabled setting * RocketChat.canAutoTranslate() * AutoTranslateView * Save language * Auto-translate switch * Translate message * [IMPROVEMENT] Use haptics rather than vibration (#1016) * Install expo-haptics * Use expo-haptics rather than RN's Vibration module * [IMPROVEMENT] Use Rest API for file upload (#1005) * removed rn-fetch-blob and use native XMLHttpRequest instead * removed unnessary changes * fix android bug * fix android bug * added tmid support * fix bug * fixed isssue with cacel model * fix problems with audio * done requested changes * fix bug with android * [CHORE] [CI] [TESTS] update detox to make ci pass (#1026) * feat: update detox to 12.11.3 to make CI pass * ci: comment all jobs but leave e2e-test job * commit to rerun IC e2e-test job * ci: uncomment all CI jobs * [NEW] Room swipe actions: mark as read/unread, hide, fav (#976) * added unread and fav feature * changed the layout * fix jest * done requested changes * added requested changes * [FIX] Android build (#1027) * [FIX] Android build * CircleCI error * [FIX] iOS share credentials build (#1028) * [FIX] iOS share credentials build * Use `hasMigration` as a string * [CI] Restore cache on CI (#1029) * feat: add fastlane save\restore cache config; comment not needed jobs; * install fastlane using 'bundle install' * install fastlane using 'sudo bundle install' * uncomment ios build commands * run set up google services in ios folder * add working_directory: ios to ios-build steps * remove 'cd ios' from Fastlane build step * add save\restore cache for npm modules * group save_cache steps * cache fastlane in ios-testflight job * uncomment previously commented jobs\steps * fix: add missing colon * use key for caching: node-modules-{{ checksum ".circleci/config.yml" }}-{{ checksum "yarn.lock" }} * add names for save\restore steps * ci: add `default` step with `working_directory: ~/repo` to ios-build job * return back caching npm: `node-v1-{{ checksum "package.json" }}-{{ arch }}` * fix: add missing curly braces * save\restore cache in e2e-test job; remove {{arch}} from cache names * add names to restore_cache steps in android-build job * add names to save_cache steps in android-build job * add names to all save\restore steps; change checksum package.json to yarn.lock * change `npm` to `NPM` in steps naming * remove {{ checksum circle ci }} from android-build job and fix naming of steps * [FIX] Rooms swipes (#1034) * Regression: on press style feedback * Action button styles * Fix animations * Styles changed * Update subscription without having to wait for socket * Calculate width on RoomsListView instead * [FIX] Decrease bigger emoji size to 30 (#1031) * [FIX] Append server URL on avatar if necessary (#1038) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * Bump version to 1.16.1 (#1045) * [FIX] Set UserDefaults AppGroup on notification tap (#1047) * [FIX] Auto-translate messages as they arrive * Fix favorite button * [FIX] Swipe animations (#1044) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * Fix favorite button * [FIX] Auto-translate messages as they arrive (#1049) * Comment removeClippedSubviews * Comment width animation * Remove redux from RoomItem * Fix wrong re-render comparison * Remove listener * Raise minDeltaX * memo actions * Spring with native driver * Refactor functions * Fix props issues * Remove RoomItem.height * Long swipe * Refactor animations * this.rowTranslation -> this.transX * Moved state to this * [FIX] Auto-translate messages as they arrive * [i18n] Add missing de translations (#1040) * [CHORE] Switch to react-native-localize (#1043) * Bump version to 1.17.0 (#1057) * Load views as needed (#1056) * [IMPROVEMENT] Change "resend" icon position (#1048) * [NEW] Video support (#801) * [NEW] File upload (#882) * [NEW] Share extension (#942) * [FIX] Share extension CI build (#1060) * Change bundleID * Provisioning * get provisioning profile * [IMPROVEMENT] Reusable toast (#1065) * [FIX] Moment locales (#1066) * [FIX] Share Extension issues (#1064) * [FIX] Empty white list enables all media types upload (#1077) * Merge branch 'master' into develop (#1079) * [FIX] Empty white list enables all media types upload (#1080) * Create utils to media (canUpload) * Fix variable name * [CHORE] Update README (#1081) * [FIX] Media share type (#1086) * [RELEASE] Merge beta into master (#1142) * [RELEASE] Merge beta into master (#1174) * [RELEASE] Merge beta into master (#1282) * Merge beta into master (#1461) * Merge beta into master (#1637) * Merge beta into master (#1759) * Merge beta into master (#1897) * [FIX] Close SortDropdown on sort select (#1230) * [FIX] Cancel upload and check failed upload (#1232) * [FIX] Slash commands not cleaning is typing and not using state (#1233) * [FIX] Dispatch roomsRequest on app foreground event even if not connected (#1234) * [CHORE] Update react-native-jitsi-meet (#1235) * [FIX] Regex on run slash command (#1223) * Update React Native to 0.61.1 (#1236) * Update React Native to 0.61.1 * Update patch to SSL Pinning * Revert storybook * [CHORE] Update react-native-safe-area-view (#1219) * [FIX] Try/catch JSON.parse XHR response (#1238) * [FIX] Change messagebox icon immediate on change text (#1241) * [FIX] Update last open on message stream received (#1240) * [FIX] Remove animation from RoomsListView.willFocus (#1239) * [FIX] Delete message on thread (#1214) * [REGRESSION] Markdown text (#1242) * [FIX] Jest (#1243) * [FIX] Avatar shown when useRealName is activated (#1162) * Fix avatar when use real name * Wrong indentation * [DOCS] Add SECURITY.md (#1244) * [CHORE] Update react-native-reanimated to 1.3.0 (#1246) * [FIX] Run credentials migration only once (#1245) * [CHORE] Update react-native-jitsi-meet to 2.0.1 (#1249) * [FIX] Messagebox onChangeText issues (#1252) * Stop ongoing debounces on messagebox unmount * Immediately change send icon, but keep debouncing others * Make CustomEmoji stateless function * Fix mentions keyExtractor * [FIX] Room subscription issues (#1255) * [FIX] Reaction press (#1258) * [FIX] Channel avatars not showing after application unloads (#1264) * Revert react-native-safe-area-view (#1265) * [FIX] Remove console on production mode (#1268) * [FIX] Messages preview issues (#1257) * [FIX] Select user from native credentials (#1266) * [FIX] Some issues on preview message (#1271) * [FIX] Audio player track and thumb not rendering on Android (#1273) * [FIX] Record audio message throws exception when FileSystem.getInfoAsync is called (#1272) * [FIX] China shouldn't use CallKit (#1274) * [FIX] Watermelon batches (#1277) * Bump version to 1.20.1 (#1285) * [CHORE] Remove memoize-one (#1284) * [FIX] End Jitsi call on unmount (#1291) * [FIX] Allow self-signed certificates (#1310) * [FIX] Set User-Agent (#1318) * Set User-Agent Fetch & Websocket & XHR * Set User-Agent * Custom User Agent on fetch/websocket * Fix names * Use DeviceInfo * fix server with subpath (#1322) * [FIX] Server with https:\\ instead of https:// (#1320) * [FIX] Server dropdown not closing after changing stack (#1299) * [FIX] Invalid server version (#1319) * [IMPROVEMENT] Respect "Hide counter" preference (#1306) * [FIX] Pass isFocused as a function to Messagebox (#1309) * [CHORE] Remove icons folder (#1290) * [CHORE] Refactor RoomItem touchable (#1331) * [FIX] Unnecessary rerender on RoomItem when status is undefined (#1336) * [UPDATE DEPS] react-navigation and react-navigation-stack (#1337) * [FIX] Avatars not loading on share extension when Accounts_AvatarBlockUnauthenticatedAccess is enabled (#1339) * Bump version to 1.20.2 (#1340) * [FIX] Remove some unnecessary re-renders on Messagebox (#1341) * [REGRESSION] Use LayoutAnimation instead of Transition API (#1338) * [FIX] Remove setState from notifications view causing watermelon object to be updated outside an action (#1342) * [IMPROVEMENT] Save last message as message when subscription is updated (#1344) * [UPDATE DEPS] Update RN to 0.61.3 (#1345) * [DOCS] Update Readme (#1346) * [CHORE] Remove react-native-scrollable-tab-view fork (#1352) * [FIX] URL preview (#1360) * [REGRESSION] Decrease list view memory size (#1361) * [FIX] Paste (#1350) * [CHORE] Update gems (#1365) * Bump version to 1.20.3 (#1366) * [FIX] Use Ruby 2.4 on TestFlight upload (#1368) * [FIX] Parse Urls (#1371) * [FIX] Parse image URL only if it's not empty (#1372) * [FIX] Load messages issues (#1373) * Bump version to 1.21.0 (#1376) * [FIX] Crowd login (#1381) * [FIX] Clicking user avatar in thread previews crashes app (#1363) * [IMPROVEMENT] Error messages on connect (#1379) * [FIX] ProfileView input navigation error when custom fields aren't set (#1383) * [FIX] Batch server deletion on logout (#1382) * Bump app to 1.22.0 (#1387) * [FIX] Server Version (#1392) * Update patch and minor deps (#1386) * [FIX] Crash when open thread (#1395) * Bump version to 1.23.0 (#1394) * [I18N] Update ru.js (#1384) * [FIX] CAS building wrong URL (#1362) * [FIX] Delete messages (#1399) * [FIX] In-app notification showing wrong content on channels (#1400) * Bump version to 1.24.0 (#1404) * [FIX] Prevent server with whitespace (#1402) * [IMPROVEMENT] Keyboard and content type on login (#1403) * [FIX] Messages stop loading (#1410) * [NEW] Tablet support (#1300) * [IMPROVEMENT] Authentication via deep linking (#1418) * [IMPROVEMENT] Markdown performance when identifying emoji only content (#1422) * [FIX] BackHandler remove random failing on development (#1423) * Bump version to 1.25.0 (#1424) * [CHORE] Update CI Xcode Image (#1430) * [FIX] Rooms grouping not working properly (#1435) * [FIX] Take a video (#1437) * [NEW] Themes (#1298) * [FIX] Share extension doesn't reconnect to previous selected server on Android (#1429) * [FIX] Init local settings on notification tap (#1438) * Bump version to 1.26.0 (#1450) * [FIX] Emoji parser not working on Hermes (#1445) * [NEW] Enable Hermes (#1446) * [FIX] Automatic theme repeating (#1457) * [CHORE] Sync Experimental and Official app versions (#1458) * [DOCS] Update readme (#1459) * [FIX] Messages being sent but showing as temp status (#1469) * [FIX] Missing messages after reconnect (#1470) * [FIX] Few fixes on themes (#1477) * [I18N] Missing German translations (#1465) * Missing German translation * adding a missing space behind colon * added a missing space after colon * and another attempt to finally fix this – got confused by all the branches * some smaller fixes for the translation * better wording * fixed another typo * [FIX] Crash while displaying the attached image with http on file name (#1401) * [IMPROVEMENT] Tap app and server version to copy to clipboard (#1425) * [NEW] Reply notification (#1448) * [FIX] Incorrect background color login on iPad (#1480) * [FIX] Prevent multiple tap on send (Share Extension) (#1481) * [NEW] Image Viewer (#1479) * [DOCS] Update Readme (#1485) * [FIX] Jitsi with Hermes Enabled (#1523) * [FIX] Draft messages not working with themed Messagebox (#1525) * [FIX] Go to direct message from members list (#1519) * [FIX] Make SAML wait for idp token instead of creating it on client (#1527) * [FIX] Server Test Push Notification (#1508) Co-authored-by: Diego Mello * [CHORE] Update to new server response (#1509) * [FIX] Insert messages with blank users (#1529) * Bump version to 4.2.1 (#1530) * [FIX] Error when normalizing empty messages (#1532) * [REGRESSION] CAS (#1570) * Bump version to 4.2.2 (#1571) * [FIX] Add username block condition to prevent error (#1585) * Bump version to 4.2.3 * Bump version to 4.2.4 * Bump version to 4.3.0 (#1630) * [FIX] Channels doesn't load (#1586) * [FIX] Channels doesn't load * [FIX] Update roomsUpdatedAt when subscriptions.length is 0 * [FIX] Remove unnecessary changes * [FIX] Improve the code Co-authored-by: Diego Mello * [FIX] Make SAML to work on Rocket.Chat < 2.3.0 (#1629) * [NEW] Invite links (#1534) * [FIX] Set the http-agent to the form that Rocket.Chat requires for logging (#1482) Co-authored-by: Diego Mello * [FIX] "Following thread" and "Unfollowed Thread" is hardcoded and not translated (#1625) * [FIX] Disable reset button if form didn't changed (#1569) Co-authored-by: Diego Mello * [FIX] Header title of RoomInfoView (#1553) * [I18N] Gallery Permissions DE (#1542) * [FIX] Not allow to send messages to archived room (#1623) * [FIX] Profile fields automatically reset (#1502) * [FIX] Show attachment on ThreadMessagesView (#1493) * [NEW] Wordpress auth (#1633) * [CHORE] Add Start Packager script (#1639) * [CHORE] Update RN to 0.61.5 (#1638) * [CHORE] Update RN to 0.61.5 * [CHORE] Update react-native patch Co-authored-by: Djorkaeff Alexandre * Bump version to 4.3.1 (#1641) * [FIX] Change force logout rule (#1640) * Bump version to 4.4.0 (#1643) * [IMPROVEMENT] Use MessagingStyle on Android Notification (#1575) * [NEW] Request review (#1627) * [NEW] Pull to refresh RoomView (#1657) * [FIX] Unsubscribe from room (#1655) * [FIX] Server with subdirs (#1646) * [NEW] Clear cache (#1660) * [IMPROVEMENT] Memoize and batch subscriptions updates (#1642) * [FIX] Disallow empty sharing (#1664) * [REGRESSION] Use HTTPS links for sharing and markets protocol for review (#1663) * [FIX] In some cases, share extension doesn't load images (#1649) * [i18n] DE translations for new invite function and some minor fixes (#1631) * [FIX] Remove duplicate jetify step (#1628) minor: also remove 'cd' calls Co-authored-by: Diego Mello * [REGRESSION] Read messages (#1666) * [i18n] German translations missing (#1670) * [FIX] Notifications crash on older Android Versions (#1672) * [i18n] Added Dutch translation (#1676) * [NEW] Omnichannel Beta (#1674) * [NEW] Confirm logout/clear cache (#1688) * [I18N] Add es-ES language (#1495) * [NEW] UiKit Beta (#1497) * [IMPROVEMENT] Use reselect (#1696) * [FIX] Notification in Android API level less than 24 (#1692) * [IMPROVEMENT] Send tmid on slash commands and media (#1698) * [FIX] Unhandled action on UIKit (#1703) * [NEW] Pull to refresh RoomsList (#1701) * [IMPROVEMENT] Reset app when language is changed (#1702) * [FIX] Small fixes on UIKit (#1709) * [FIX] Spotlight (#1719) * [CHORE] Update react-native-image-crop-picker (#1712) * [FIX] Messages Overlapping (Android) and MessageBox Scroll (iOS) (#1720) * [REGRESSION] Remove @ and # from mention (#1721) * [NEW] Direct message from user info (#1516) * [FIX] Delete slash commands (#1723) * [IMPROVEMENT] Hold URL to copy (#1684) * [FIX] Different sourcemaps generation for Hermes (#1724) * [FIX] Different sourcemaps generation for Hermes * Upload sourcemaps after build * [REVERT] Show emoji keyboard on Android (#1738) * [FIX] Stop logging react-native-image-crop-picker (#1745) * [FIX] Prevent toast ref error (#1744) * [FIX] Prevent reaction map error (#1743) * [FIX] Add missing calls to user info (#1741) * [FIX] Catch room unsubscribe error (#1739) * [i18n] Missing German keys (#1735) * [FIX] Missing i18n on MessagesView title (#1733) * [FIX] UIKit Modal: Weird behavior on Android Tablet (#1742) * [i18n] Missing key on German (#1747) Co-authored-by: Diego Mello * [i18n] Add Italian (#1736) … * [FIX] Notification stream throwing an error when there isn't a message on payload (#2637) * [FIX] Threads not being updated and other related issues (#2636) * Fix parent title on thread header breaking lines * Fix https://github.com/RocketChat/Rocket.Chat.ReactNative/issues/2519 * Fix thread badge not being updated * [FIX] Minor room header issues (#2630) * Add hitSlop to RoomView header * Use 1 icon padding for threads header Co-authored-by: Djorkaeff Alexandre * [FIX] Whitelabel unable to find package name (#2626) * Fixes #2625 * Fixes #2614 * Apply resValue on defaultConfig and undo unnecessary changes Co-authored-by: Diego Mello * [i18n] Add missing German strings (#2619) Co-authored-by: Diego Mello * [FIX] Model columns misplaced (#2640) * [FIX] Connect a null server (#2639) Co-authored-by: Diego Mello * [FIX] Jitsi users unable to unmute (#2623) * [FIX] Jitsi users being muted always * fix: bundle is invalid * Update jitsi meet sdk with ui improvements * Update JitsiMeetSDK ios * Centralize toolbox android * Fix images on Jitsi Co-authored-by: Diego Mello * Bump version to 4.12.1 (#2641) * [FIX] Share extension and save image not working on Android 10 (#2651) * Bump version to 4.13.0 (#2657) * [FIX] Update Loading logo (#2658) * [NEW] Support client certificates for SSL (two-way authentication) (Android) (#2624) * wip: Android SSL Pinning * Use own SSLPinningModule * wip: Use Rocket.Chat own react-native * wip: Fresco Images using custom OkHttpClient * wip: react-native-webview onReceivedClientCertRequest * feat: Save Images of a SSL Pinning protected server * chore: SSLPinning package as a interface to iOS & Android implementations * chore: update glide * feat: load images under a client ssl certificate protected server * chore: remove patch * feat: Audio & Video under a SSL Client protected server * fix: Unpin certificate when change server * feat: Fast Image as a patch * chore: update fast-image * Fix merge Co-authored-by: Diego Mello * [NEW] Channel actions (#2644) * room roles * handle owner * endpoints * Leader and Moderator * Remove user from room * stash ignore * Add subscription.ignored column * ignore user * Fix icons * I18n * Minor i18n fixes * Direct Message and open action sheet after a normal tap * Fix icon * stash isIgnored * isManualUnignored message * Fix update * Ignored * Mute, moderator, leader, owner, remove from room * ignore * Tests * pt-BR * Update pods * Apply requested changes * Add RC version on requests * [NEW] Support RTL (#2656) * wip: RTL (iOS) * wip: RTL (Android) * wip: reload bundle when change between RTL languages * fix: Stack Animation on Android * fix: update snapshot * fix: Swipe Room Actions in RTL mode * fix: snapshots * Move isRTL to i18n * Fix styling * Update tests * Update pods Co-authored-by: Diego Mello * [FIX] Initial users' status is not fetched (#2664) * [FIX] Messages overlapping and emoji keyboard not opening (#2670) * Replace keyboard libs for react-native-ui-lib * Apply Jitsi branch * Require keyboard on bundle * Update ui-lib * chore: update deps Co-authored-by: Djorkaeff Alexandre * [CHORE] Force normalized params for 2FA (#2683) Co-authored-by: Diego Mello * [FIX] Thread message flickering while thread parent isn't found (#2676) Co-authored-by: Diego Mello * [FIX] Light theme not working on Android with Dark Theme set (#2675) Co-authored-by: Diego Mello * [FIX] App not prompting join code for password protected channels (#2514) * Adding joinCode parameter Co-authored-by: Vitor Leal Co-authored-by: Fernando Aguilar * Insert join code input Signed-off-by: Vitor.Leal * Add joinCode field on db Signed-off-by: Vitor.Leal * Add label i18 pt-br and en-us Signed-off-by: Vitor.Leal * Add insert join code text Signed-off-by: Vitor.Leal * Fix atribute name Signed-off-by: Vitor.Leal * Add join text Signed-off-by: Vitor.Leal Co-authored-by: Daniel Maike Co-authored-by: Fernando Aguilar * Fix attributes joinCode, joinCodeRequired and pass attribute param in navigation Signed-off-by: Daniel Maike Co-authored-by: Vitor Leal * Fixing attribute joinCodeRequired pass to goRoom Signed-off-by: Daniel Maike * Changed textinput style Signed-off-by: Daniel Maike Co-authored-by: Vitor Leal * Delete not necessary attribute Signed-off-by: Daniel Maike * Fixing input style Co-authored-by: Vitor Leal * Undo unncessary changes * use a join code modal * tests: e2e tests to join protected channel * fix: undo unnecessary change * tests: cancel join code * Remove some tests * Minor fixes Co-authored-by: Vitor Leal Co-authored-by: Fernando Aguilar Co-authored-by: Djorkaeff Alexandre Co-authored-by: youssef-md Co-authored-by: Diego Mello * [I18n] Add Arabic (#2537) * Arabic language setup * Added arabic translation * Arabic translation Proofreading Co-authored-by: Diego Mello * [I18N] Add missing zh_TW and zh_CN strings (#2680) * feat(i18n): add some missing strings and improve some translation * fix: add missing server version Co-authored-by: Diego Mello * [IMPROVEMENT] Add username on status messages (#2553) * 1689 - missing user name for status messages * 1689 - missing user name for status messages. Fixed broken e2e test "should pin message". * Minor tweak * Remove center style * Small refactor on User * Remove toLowerCase * Update tests Co-authored-by: Diego Mello * [FIX] Filenames are incorrect in non-latin alphabets on upload (#2671) * fix: filename on react-native-image-crop-picker * fix: use rn-fetch-blob to upload files * fix: FileUpload as a service * fix: cancel upload on iOS * fix: file upload from share extension Co-authored-by: Diego Mello * [IMPROVEMENT] Ease white labelling for Android (#2685) * improve white labelling for Android * Move application ID to gradle properties * Fix CI * Point foss sufix to main app * Use npx on android-whitelabel script Co-authored-by: Diego Mello * [FIX] Chats order (#2688) * Persist highest value on subscription.roomUpdatedAt * Update tests Co-authored-by: Djorkaeff Alexandre * [REGRESSION] Re-enable Jitsi Chat (#2687) * Fix main jitsi * Fix iOS * Clear build.gradle cache * Don't restore gradle * cache is back * Use master * Point to react-native-jitsi-meet#master * [CHORE] Build official apps on CI (#2701) * Duplicated target and changed Bridging Header * Display name * Unnecessary dumb swift file removed * Buildable name * Reorder Info.plist * Rename Official target's bundle id * Ignore .mobileprovision * Fix provisioning of official app * Starting signing * stash fastfile * starting official ci iOS * Uncomment Fastfile keychain * Fix CI config * allowProvisioningUpdates * Changing AppIcon and Splash Screen * Remove unnecessary folder inside of Images.xcassets * Reorder notificationservice and shareextension plists * Fix signing * Manual signing style for official * Split official signing * Update project provisioning * Use ENV as profile * Output match * Keys * TestFlight refactor * Setting up android * android-official-play-build job * Start removing unnecessary fastlane tasks on Android * Trying to refactor Android jobs * android-env * Remove foss build for now * Fork * Fix if conditions * Fix push * ios-build command * Rename Android builds * Upload dSYMs * Refactoring workflow * Reorder upload-to-testflight * upload-to-google-play-beta command * Fix ci * Fix android fork build * Fix keystore * Fix options on fastlane android * Fix keystore * Check isOfficial on iOS * Check isOfficial on db * Remove unused imports * Database names on Android * Tag fix * Minor fixes * Set IS_OFFICIAL on CI * Fix detox * follow review suggestions Co-authored-by: Djorkaeff Alexandre * [i18n] Update fr (#2697) Co-authored-by: Diego Mello * [i18n] Update fr (#2705) Typo Co-authored-by: Diego Mello * [FIX] Empty space on Messagebox (#2704) Co-authored-by: Diego Mello * [FIX] Yarn android scripts (#2716) * [CHORE] Rename Experimental iOS lane (#2717) * Move build_fork to the end * Rename release to build_experimental * [IMPROVEMENT] Use class variable instead of state for List's animated (#2718) * [FIX] Bottom sheet being hidden sometimes (#2722) * [IMPROVEMENT] Match background and text mention colors (#2723) * [FIX] App freezing if Markdown preview contains sequential empty spaces (#2726) * Remove sequential empty spaces from Markdown preview * Use Markdown preview on RepliedThread * [FIX] Official app without sharedUserId (#2734) * [CHORE] Update React Native to 0.63.4 (#2737) * Bump version to 4.13.1 (#2739) * [REGRESSION] Multiple uploads not working on iOS (#2738) * Update React Native to 0.63.4 * Fix multiple uploads not working on iOS * [FIX] Unable to save attachment on iOS (#2743) * Fix rn-fetch-blob's document dir without forward slash * Update camera roll * [FIX] Generate Jitsi access token when making a call (#2694) fixes: #2693 # Please enter the commit message for your changes. Lines starting Co-authored-by: Diego Mello * [FIX] Jitsi notification delay (#2668) Co-authored-by: Diego Mello * [FIX] Channels list not following the same sorting logic from web client (#2763) * [FIX] Pods lost on Official target (#2764) * [FIX] RoomItem using deprecated animated event signature (#2771) * [FIX] Server autocomplete text breaking line (#2774) * [FIX] ServerDropdown flashing bigger server icon (#2775) * [FIX] ServerDropdown flashing bigger server icon * Remove unused logo and update image path where needed * Minor tweak Co-authored-by: Diego Mello * [FIX] Rooms list not being updated on some cases (#2765) * Request subscriptions on RoomsListView.constructor * Removes opened rooms from last message persisting * Change server reducer * Prevent undefined ids causing query error * [FIX] Share Extension hitting memory limit on iOS (#2788) * [FIX] Disallow swipe to dismiss on share extension * Limit query to 20 and clean up props * Remove rn-extension-share branch pointer * Test new branch * Remove branch * [IMPROVEMENT] Threads layout tweaks (#2686) * improvement: Thread Details * fix: re-render Thread Messages Item * fix: update snapshots * improve: thread details component * fix: cast replies length * improvement: format date of threads * improvement: thread details styles * fix: wrap text * tests: update snapshot * improvement: use same date format for all dates * Icon size 24 * Remove date * Remove prop drill * Badge position * Badge container tweak * Fix inline style * Move ThreadDetails to containers * Update stories * Fix lint * Remove wrong prop Co-authored-by: Diego Mello * [CHORE] Remove some migrations (#2792) * Remove force rooms refresh * Remove MMKV migration * Bump version to 4.14.0 (#2797) * [FIX] Messagebox tracking lost on pop gesture navigation (#2799) * Use setTimeout instead of InteractionManager * Update tracking lib * [FIX] Back button closing activity when on root stack screen (#2804) * Make hardware back button to behave as home button on root screens * Remove unnecessary code * Remove handleBackPress from OnboardingView * Fix lint * [i18n] Add missing German strings (#2715) Co-authored-by: Diego Mello * [NEW] Encrypted Discussions (#2813) * I18n key fix * Add encrypted switch * Remove unused i18n keys * Add enabled to encryption reducer * Show encrypted option on CreateDiscussionView only when e2e encryption is properly set * Add localSearch and use it on search * Use encrypted from parent channel * Fix method calls as rest api with 2fa enabled * Fix logout after reset keys * Use encryption reducer instead of lib directly to check render * Check for room type logic to display encryption option on create discussion * Check toggle-room-e2e-encryption permission on RoomActionsView * Check for encryption status instead of setting on server * Fix * Disable switch instead of hide it * Fix spotlight for DMs * Fix server test * [FIX] Messagebox missing style for text color (#2786) * Changing auxilaryTintColor * Changed Placeholder color to BodyText color * added color prop * eslint changes * used array for styles Co-authored-by: Diego Mello * [I18N] Update arabic (#2696) * Update ar.js * Update ar.js Co-authored-by: Diego Mello * [FIX] Workspace input without i18n (#2689) * [FIX] Translation of strings in Login page * Strings are added for translation. fixes: #2620 * Add pt-BR Co-authored-by: Diego Mello * [FIX] Spotlight returning duplicated entries (#2805) * Update rocketchat.js * Updated search function * Minor improvements * Remove atIndex * Add remove logic to remove duplicate data from response Co-authored-by: Diego Mello * [CHORE] Refactor ServerItem (#2778) * Updated ServerDropdown and ServerItem * Added ServerItem stories * Update ServerDropdown.js * Updated ServerItem stories * Updated ServerItem stories and ServerItem component * Updated SelectServerView, ServerItem and ServerItem stories * Updated ServerItem stories * Updated ServerItem stories * Update tests Co-authored-by: Diego Mello * [DOCS] Updated Quick Start docs link in e2e/readme (#2802) Co-authored-by: Diego Mello * [I18N] Add Turkish (#2793) * Turkish language support added * Update tr.js Co-authored-by: Diego Mello * [FIX] Lint on #2793 (#2818) * [I18N] Add missing german strings (#2689) (#2820) * [I18N] Add missing italian strings (#2817) * [FIX] Server version becoming null on server change (#2821) * [FIX] Wrong styling on E2E encryption banner (#2767) * [FIX] Wrong styling on E2E encryption banner * [FIX] Wrong styling on E2E encryption banner * [FIX] Wrong styling on E2E encryption banner * [FIX] Wrong styling on E2E encryption banner (#2767) * Updated SortDropdown, ListHeader, ListItem and added stories for List.Item * Updated SortDropdown * Removed unused component * Updated List.Item and stories * Reverted unnecessary changes and updated ListItem stories * Fix minor indentation * Stop breaking Touch's default underlay color * Fix indentation * Remove falsy comparison from render * Fix left icon * Use List.Item on OmnichannelStatus * Add missing separator * Lint * Fix sort dropdown * Remove unnecessary styles * Fix detox Co-authored-by: Diego Mello * [FIX] App Store using Experimental's app id (#2826) * [FIX] Wrong username on push notifications (#2825) * [FIX] Share extension memory issues on iOS (#2845) * Remove unnecessary class prop * Stop rendering servers when there's only one * Map and alloc only necessary columns from query * Fetch servers count instead of all servers records * Fetch only needed servers * Separators * Remove renderContent * Minor fix * Refactor query * Smaller avatars in memory * Fix getItemLayout * Add topic * Load less pods * tests * Import only used functions from lodash * Fix pods * Import only used functions from semver * Fix media sharing * Update pods * Disables preview and thumb on iOS * Update expo-video-thumbnail * Unnecessary change * [FIX] Logout from other locations not prompting confirmation option (#2854) * Fixed logout toast bug for the iOS * Removing callToAction and replacing with confirmationText Co-authored-by: Diego Mello * Bump version to 4.14.1 (#2859) * [IMPROVEMENT] Check for focused rooms on in-app notifications (#2857) * Update InAppNotification and room reducer * Update InAppNotification This reverts commit 60330a1e04cfe8d2e5aa311f367083d831682c49. * Stop subscribing to threads * Remove ref * Fix prop-types Co-authored-by: Diego Mello * [FIX] Real name being ignored in SearchMessagesView (#2838) Co-authored-by: Gerzon Z Co-authored-by: Diego Mello * [CHORE] Remove unnecessary share reducer calls (#2861) * Remove unnecesary share reducer calls * Update Avatar Co-authored-by: Diego Mello * [FIX] Breadcrumbs exceeding characters limit (#2862) * [FIX] breadcrumbs exceeding * fix.breadcrumbs-exceeding-change-events Co-authored-by: Diego Mello * [FIX] App compressing videos on iOS (#2915) * Update index.js * Update index.js * [FIX] Real name setting ignored on reply preview (#2908) Co-authored-by: Diego Mello * [FIX] Reply component sending unused prop to Description (#2900) Co-authored-by: Diego Mello * [CHORE] BackdropOpacity based on themes (#2863) * Added backdropOpacity based on theme * Updated ActionSheet, ReactionsModal, ReactionPicker and Sidebar * Updated MultiSelect Co-authored-by: Diego Mello * [FIX] Webview not falling back to default auth challenge when no cert is provided (#2918) * [FIX] Android - fallback to default auth challenge handling when no cert is provided * If a certificate auth challenge is requested on Android the webview will hang if no certificate is loaded. To prevent this, fallback to default Android behavior and cancel the challenge with request.cancel() * No client certificate case defaults to super implementation * Update react-native-webview * Downgrade to previous dependency version Co-authored-by: Diego Mello Co-authored-by: Gerzon Z Co-authored-by: Jan Garaj * [FIX] Support Jitsi_URL_Room_Hash (#2905) * [FIX] Temp attachment files not being flushed after saved to gallery (#2871) * Update AttachmentView.js * Update AttachmentView.js * Update AttachmentView.js * Update AttachmentView.js Co-authored-by: Diego Mello * [CHORE] Update iOS profiles for Experimental app (#2933) * [IMPROVE] Deleted thread reply redirects to thread (#2840) Co-authored-by: Diego Mello * [FIX] Thread showing typing indicator from main room (#2869) * [FIX] Remove typing indicator from thread's header * remove unnecessary props and change usersTyping condition Co-authored-by: Diego Mello * [FIX] DM rooms show typing status from last group room (#2878) * [FIX] DM rooms show typing status from last group room * Undo changes * Check if current typing is from focused room before dispatching to redux Co-authored-by: Diego Mello * [FIX] Can't copy or edit media's description (#2885) * [FIX] Image descriptions issues * shorten the condition string * fix selectedMessage state Co-authored-by: Diego Mello * [FIX] RightButtonsContainer re-render check not returning default value (#2899) Co-authored-by: Diego Mello * [CHORE] Remove InteractionManager blocks (#2906) * [FIX] Remove InteractionManager blocks * Minor fix Co-authored-by: Diego Mello * [FIX] App not sending second argument for EventEmitter.removeListener on some places (#2909) Co-authored-by: Diego Mello * [FIX] Temp message ignoring real name (#2919) Co-authored-by: Diego Mello * [FIX] System message of e2e encryption is missing (#2888) * [FIX] System message of e2e encryption missing * add new encryption string * add to stories * Add pt-BR * Move stories Co-authored-by: Diego Mello * [CHORE] Add permissions to Redux (#2914) * [FIX] Add permissions to Redux store * add only permissions being used in the app * add clear permissions reducer * call RocketChat.hasPermission from reducer * add server version comparison on getPermissions * refactor hasPermission function * refactor hasPermission function * remove uncomment code * use Q.experimentalSortBy() * add coerce function * Change Rocketchat.hasPermission * Apply on isReadOnly * Apply to RoomInfoEditView * Apply to RoomInfoView and RoomInfoEditView * canAutoTranslate * Unnecessary clear permissions * Revert getUpdatedSince * Naming fix Co-authored-by: Diego Mello * [CHORE] Add hold step for ios and android build experimental (#2943) * [CHORE] Add hold step for ios-build-experimental and android-build-experimental * Android hold step * add ios hold step Co-authored-by: Diego Mello * [IMPROVEMENT] Remove lodash.isEqual (#2893) * Added dequal and react-fast-compare as substitutes to lodash.isEqual * Update ReplyPreview.js * Remove react-fast-compare * Removed deep-equal and upgrade babel-eslint dev dependency * Fix avatar * Fix Messagebox * Fix CreateDiscussionView * ModalBlockView * NewMessageView * ProfileView * RoomInfoEditView * ServerDropdown * Return local search as object instead of observable * SelectedUsersView Co-authored-by: Diego Mello * [I18N] Add missing Russian strings (#2946) * [i18n] Add missing Russian strings * Couple fixes * Fix Direct_message Translate Direct_message as already has been translated Co-authored-by: Diego Mello * [CHORE] Use shortcut syntax for get collections (#2932) Co-authored-by: Diego Mello * [FIX] Use List.Separator in all places (#2931) * [FIX] Use List.Separator in all places * add List.Separator * change List.Separator Co-authored-by: Diego Mello * [FIX] Limit new message list query size to 50 (#2947) * Limit query to 50 * Remove observable * [FIX] Support chats order for older versions of the server (#2934) * Update mergeSubscriptionsRooms.js * Update mergeSubscriptionsRooms.js * Update mergeSubscriptionsRooms.js * Minor refactor Co-authored-by: Diego Mello * [FIX] Reactions modal's backdrop color too light (#2949) Co-authored-by: Diego Mello * Bump version to 4.15.0 (#2950) * [FIX] Share extension not working correctly on Official app (#2963) * [FIX] Cannot read property 'some' of undefined on hasPermission (#2966) Co-authored-by: Diego Mello * [FIX] Deep linking and other connectivity issues (#2894) * Navigate from push notification only if necessary * Use JS SDK branch * Stop reconnecting if it's already connected * Fix RoomsListView forever loading after tapping push notification of another server * Execute fewer operations on app/index * Remove roomsRequest call from onForeground * Apply check and reopen * Stop opening in-app notification when the app is on backgorund * Connecting tweaks * Fix deep linking not working if the app is on background * Force reset yarn cache * Upgrade JS SDK * Remove listener on unmount * Fix resume on Android after back button is pressed * Fix local authentication resume * Fix back button android * Change JS SDK branch * [FIX] Messagebox's placeholder color is too bright (#2968) * [IMPROVEMENT] Message attachment colors (#2860) * Added convertStrToHex function and updated Reply component * Removed convertStrtToHex function and added attachmentBackground * Added color2k, removed transparent view and applied transparentize to backgroundColor * Added stories * Update Reply stories * Update Reply stories * Fix lint * Update Reply stories * Fix props * Move tests to Message stories Co-authored-by: Diego Mello * [FIX] App forgetting workspace when server is not finished added (#2798) * [FIX] App forgetting workspace * Added e2e tests * Update login.js * Update logout.js * Reverted changes on login and share, updated init * Update 08-persistantworkspace.spec.js * Revert unnecessary changes * Revert line change * Update share.js * Tweak tests * Use wm shorthand * Remove irrelevant calls to RocketChat.TOKEN_KEY Co-authored-by: Diego Mello * [TESTS] Add E2E tests to draft message (#2960) * [E2E TEST] Draft message * Fix tests Co-authored-by: Diego Mello * [TESTS] Add E2E tests to group DM (#2961) Co-authored-by: Diego Mello * [TESTS] Add E2E tests to directory (#2964) * [E2E TEST] Directory * Fix tests Co-authored-by: Diego Mello * [CHORE] Simplify server version comparison (#2922) * Simplify server version where needed * Added lte and gte functions and updated imports * Updated functions names * Update util functions * Update util function and added methods * Remove lt and coerce from getPermissions and mergeSubscriptionsRooms * Fix comparison * Update getPermissions.js * Remove unused import * Fix lint * Fix lint Co-authored-by: Diego Mello * [TESTS] Add E2E tests to discussions (#2970) * [E2E TEST] Discussions * fix error Cannot find UI elemen * Fix tests Co-authored-by: Diego Mello * [FIX] Attachment not rendering markdown (#2924) * [FIX] Render markdown in Fields content * Added stories Co-authored-by: Diego Mello * [TESTS] Add e2e tests for mark message as unread (#2953) * [E2E TEST] Add e2e tests for mark message as unread * fixed test for draft message * change test name * move test to other file * Remove unnecessary tests * Rename file * Update jest tests Co-authored-by: Diego Mello * [TESTS] Add E2E tests to delete server (#2954) * [E2E TEST] Delete server * fixed test for delete server * fix tests * minor changes * Rename file Co-authored-by: Diego Mello * [CHORE] Refactor RoomActionsView permissions (#2872) Co-authored-by: Diego Mello * [CHORE] Add status and teams icons (#2989) Co-authored-by: Gerzon Z * [FIX] SSO not working with 2FA (TOTP) (#2978) * Update AuthenticationWebView.js * Updated loginTOTP * Added validation * Update rocketchat.js * Update rocketchat.js * Update rocketchat.js * Update rocketchat.js * Fix resolve * Remove incognito * Fix totp being requested on webview Co-authored-by: Diego Mello * [IMPROVEMENT] User status icons (#2991) * Add status and teams * Update icons, icon size and getUsersPresence * Minor changes * Refactor RoomTypeIcon * Minor tweaks * Update unit tests * Minor fixes * Fix styles * Small refactor * Update jest Co-authored-by: Diego Mello * [REGRESSION] Auth via deep linking not working (#3015) * Update rocketchat and add e2e test for deep linking * Update rocketchat and add e2e test for deep linking * Update deeplinking e2e * fix deep linking auth * Test deep linking auth * Fix deeplink to rid and add tests * Small refactor * Add non existing server test Co-authored-by: Diego Mello * [FIX] Create discussion request being sent with null value on encryption param (#3033) * [CHORE] Use JSON files for i18n (#3011) * [IMPROVEMENT] Load only i18n files needed (#3014) * Use json * Load only i18n files needed * [REGRESSION] Clear local server cache not loading rooms (#3007) * Fix clear cache * Write e2e tests * Fix lint * Fix isRTL * [FIX] Custom OAuth and iframe login attempts being called multiple times (#3020) * [FIX] App crashing when attachment color is an invalid HEX (#3021) * [IMPROVEMENT] Add "Message" option to Room Info (#3029) * [CHORE] Go to room from hashtag * Layout tweaks Co-authored-by: Diego Mello * [FIX] Can't change status (#3018) Co-authored-by: Diego Mello * [FIX] Search input not using the whole header space (#3012) * [FIX] Search input not using the whole space * Fix on getHeaderTitlePosition Co-authored-by: Diego Mello * [FIX] E2EE password hiding automatically (#2972) * [FIX] E2EE password hiding automatically * add e2e test * fixed hiding banner * move e2e tests to 01-e2eencryption * remove console.log * Fix tests Co-authored-by: Diego Mello * [TESTS] Move threads tests to its own file (#2965) * [E2E TEST] Move threads test to another file * changed descirbe title * Rearrange files Co-authored-by: Diego Mello * [FIX] Regex typo on markdown (#2928) * [FIX] Fix Regex Typo * Add story for testing Co-authored-by: Diego Mello * [FIX] Make attachment validation compatible with web client (#2927) * [FIX] Make attachment validation compatible with web client * Added stories Co-authored-by: Diego Mello * [FIX] Non-reply attachments displaying time (#2902) * Remove time if no message_link * Fix message stories for replies * Final stories fix Co-authored-by: Diego Mello * [FIX] i18n not being applied on login/register labels (#2930) * Use I18n translate in login text input label * Add to register and add missing strings Co-authored-by: Diego Mello * Revert "[FIX] Make attachment validation compatible with web client (#2927)" (#3036) This reverts commit d6200745c028dd47b4ce0f11eb396c8f2a4cf807. * Bump version to 4.16.0 (#3037) * [NEW] Basic support to Teams (#3016) * Database migration * RoomItem icon * Team icons * Teams group * Small tweak on RoomTypeIcon * RoomView Header * Add team's channels to RoomView header * Starting TeamChannelsView * Icon size * o data found * Update TeamChannelsView, add teams subscriptions and send params to TeamChannelsView * Use teams.ListRooms endpoint, render rooms list, remove unused functions * Show team main on TeamChannelsView * Disable swipe * Pagination working * Fix blinking no data found * Search working * Refactor to use BackgroundContainer while loading * Go to room * Cleanup * Go to actions * Events * Lint * Add debounce to go room * Fix for tablet * i18n * Small fix * Minor refactor * Use local data when it exists * Show last message * Force teams migration * Add stories to BackgroundContainer * Remove unused component * Move RoomViewHeader into containers folder * Refactoring * Testing RoomHeader * i18n * Fix server endpoint version * Fix events Co-authored-by: Gerzon Z * [CHORE] Refactor mention tracking logic (#2997) * [Improvement] Improve mentions This PR focuses on improving command, emoji, channel and user mentions. * [Tests] Added e2e tests for mention improvement * [Improvement] Modify slash command mention logic. Added slash command with argument preview Slash command should show only if the message bigins with / * Return data on search for empty text * Minor fixes * Update e2e tests * Minor fix * [FIX] allow command mentioning in between text Co-authored-by: Diego Mello * [FIX] Status text not being updated on sidebar (#3041) * Update StatusView.js * Minor tweak * Minor tweaks Co-authored-by: Diego Mello * [FIX] Unable to search non-latin alphabet names on members list (#3039) * Add search by name in members list * Update RoomMembersView search Co-authored-by: Diego Mello * Search stops working after some time (#3044) * Bump version to 4.17.0 (#3058) * [CHORE] Add job to upload Experimental to Google Play production (#3050) * [REGRESSION] SAML stopped working after #2978 (#3060) * [REGRESSION] Room actions not loading on tablet (#3061) * Bump version to 4.16.1 (#3063) * [REGRESSION] Fallback language stopped working (#3072) * [CHORE] Update Detox to 18.10.0 (#3052) * Updated detox and 5 tests * Update e2e cases for Detox v18, update setUserStatus and added SET_STATUS_FAIL * Downgrade mocha * Exclude arm64 from building and update tests cases * Update more tests cases, add registeringUser4 * Update more test files and add room-actions-scrollview testID * Update package.json * Remove unused username from test file and update 08-roominfo test file * Fixing * Mark as unread * Fixing flaky tests * Minor fixes Co-authored-by: Diego Mello * [FIX] Message author touchable taking whole space available (#3048) Co-authored-by: Gerzon Z * [CHORE] Improve stories (#3028) * [CHORE] Improve stories * Refactor Avatar and UIKitModal * fixed undefined 'name' * Remove commented stories * Remove Markdown from stories/index, update Markdown test file and remove markdown stories from Message stories * Remove StoriesSeparator * Refactor Markdown * Remove commented lines of code * Small refactor * Re-add stories Co-authored-by: Gerzon Z Co-authored-by: Gerzon Z Co-authored-by: Diego Mello * Bump version to 4.17.0 (#3083) * [REGRESSION] Fallback not working when device's language is available (#3091) * Always add 'en' i18n * Add tests * Bump version to 4.16.2 (#3092) Co-authored-by: Snyk bot Co-authored-by: Govind Dixit Co-authored-by: Djorkaeff Alexandre Co-authored-by: Youssef Muhamad Co-authored-by: Ezequiel de Oliveira Co-authored-by: Graham Smith Co-authored-by: David-Tsui Co-authored-by: Vincenzo Esposito Co-authored-by: Rishabh Gupta <38923768+imrishabh18@users.noreply.github.com> Co-authored-by: Prateek93a Co-authored-by: Hendy Irawan Co-authored-by: Alexandru Naiman Co-authored-by: Dani Co-authored-by: Luis Co-authored-by: phriedrich Co-authored-by: zaphod534 <32894570+zaphod534@users.noreply.github.com> Co-authored-by: ankar84 Co-authored-by: Карлан Антон Андреевич Co-authored-by: Saket Mahajan Co-authored-by: Guilherme Gazzo Co-authored-by: Prateek Jain <44807945+Prateek93a@users.noreply.github.com> Co-authored-by: Lucas Siqueira Co-authored-by: Calebe Rios Co-authored-by: Pitstopper <18574776+Pitstopper@users.noreply.github.com> Co-authored-by: Guilherme Siqueira Co-authored-by: devyaniChoubey <52153085+devyaniChoubey@users.noreply.github.com> Co-authored-by: Bernard Seow Co-authored-by: Hiroki Ishiura Co-authored-by: Exordian Co-authored-by: Daanchaam Co-authored-by: Iván Álvarez Co-authored-by: Sarthak Pranesh <41206172+sarthakpranesh@users.noreply.github.com> Co-authored-by: Michele Pellegrini Co-authored-by: Tanmoy Bhowmik Co-authored-by: Hibikine Kage <14365761+hibikine@users.noreply.github.com> Co-authored-by: Neil Agarwal Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Zhaubassarova Aruzhan <49000079+azhaubassar@users.noreply.github.com> Co-authored-by: Aroo Co-authored-by: Sarthak Pranesh Co-authored-by: Siddharth Padhi Co-authored-by: Bruno Dantas Co-authored-by: devyaniChoubey Co-authored-by: Dan Caseley Co-authored-by: Heng Sok Co-authored-by: Rohit Verma <44283521+refactor-droidyy@users.noreply.github.com> Co-authored-by: Gabriel Henriques Co-authored-by: Júlia Grala <30629556+juliagrala@users.noreply.github.com> Co-authored-by: nixxou <45721836+nixxou@users.noreply.github.com> Co-authored-by: Marco Jakobs Co-authored-by: Daniel Maike Co-authored-by: Vitor Leal Co-authored-by: Fernando Aguilar Co-authored-by: Abdullah Alhamoud <10301923+abalhamoud@users.noreply.github.com> Co-authored-by: Dave Koo Co-authored-by: Fazil Boudjelal Co-authored-by: Lucas Dousse Co-authored-by: Sumukha Hegde Co-authored-by: Gerzon Z Co-authored-by: Gerzon Z Co-authored-by: yash-rajpal <58601732+yash-rajpal@users.noreply.github.com> Co-authored-by: Hakan YILMAZ Co-authored-by: Arkadyuti Bandyopadhyay Co-authored-by: Anant Bhasin <38764067+aKn1ghtOut@users.noreply.github.com> Co-authored-by: Gung Wah <41157464+kresnaputra@users.noreply.github.com> Co-authored-by: Billy Newman Co-authored-by: Jan Garaj Co-authored-by: sadegh --- .eslintrc.js | 1 + .../__snapshots__/Storyshots.test.js.snap | 68831 +++++++--------- android/app/build.gradle | 2 +- app/containers/MessageBox/index.js | 4 +- app/containers/message/User.js | 3 +- app/i18n/index.js | 1 + app/i18n/locales/nl.json | 1 - app/utils/log/events.js | 1 + app/views/RoomActionsView/index.js | 2 +- app/views/StatusView.js | 5 +- e2e/data.js | 11 +- e2e/helpers/app.js | 23 +- e2e/helpers/data_setup.js | 9 +- e2e/tests/assorted/01-e2eencryption.spec.js | 9 +- e2e/tests/assorted/02-broadcast.spec.js | 2 +- e2e/tests/assorted/03-profile.spec.js | 13 +- e2e/tests/assorted/04-setting.spec.js | 19 - e2e/tests/assorted/05-joinpublicroom.spec.js | 6 +- e2e/tests/assorted/06-status.spec.js | 4 +- e2e/tests/assorted/07-changeserver.spec.js | 5 +- .../assorted/08-joinprotectedroom.spec.js | 7 +- e2e/tests/assorted/10-deleteserver.spec.js | 5 +- e2e/tests/assorted/11-deeplinking.spec.js | 32 +- e2e/tests/assorted/12-i18n.spec.js | 114 + e2e/tests/onboarding/01-onboarding.spec.js | 6 +- .../onboarding/03-forgotpassword.spec.js | 1 + .../onboarding/07-server-history.spec.js | 2 +- e2e/tests/room/01-createroom.spec.js | 15 +- e2e/tests/room/02-room.spec.js | 25 +- e2e/tests/room/03-roomactions.spec.js | 24 +- e2e/tests/room/05-threads.spec.js | 34 +- e2e/tests/room/07-markasunread.spec.js | 19 +- e2e/tests/room/08-roominfo.spec.js | 28 +- ios/RocketChatRN.xcodeproj/project.pbxproj | 8 +- ios/RocketChatRN/Info.plist | 2 +- ios/ShareRocketChatRN/Info.plist | 2 +- package.json | 12 +- storybook/stories/Avatar.js | 274 +- storybook/stories/Markdown.js | 452 +- storybook/stories/Message.js | 1638 +- storybook/stories/RoomItem.js | 197 +- storybook/stories/StoriesSeparator.js | 36 - storybook/stories/UiKitMessage.js | 843 +- storybook/stories/UiKitModal.js | 1083 +- storybook/stories/index.js | 74 +- yarn.lock | 179 +- 46 files changed, 34092 insertions(+), 39972 deletions(-) create mode 100644 e2e/tests/assorted/12-i18n.spec.js delete mode 100644 storybook/stories/StoriesSeparator.js 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..52cde22be 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`] = ` @@ -10450,16 +10205,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 +13922,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 +14415,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -14976,27 +14516,19 @@ exports[`Storyshots Message list message 1`] = ` - - Grouped messages - + + +`; + +exports[`Storyshots Message Block Quote 1`] = ` + + @@ -15135,8 +14668,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -15183,1422 +14716,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 +14940,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 +17737,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 +22688,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -17649,7 +22875,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17671,7 +22897,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -17729,7 +22955,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17751,7 +22977,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -17831,7 +23057,7 @@ exports[`Storyshots Message list message 1`] = ` onStartShouldSetResponder={[Function]} style={ Object { - "backgroundColor": "#ffffff", + "backgroundColor": "#f1f2f4", "borderRadius": 2, "marginBottom": 8, "marginRight": 8, @@ -17853,7 +23079,7 @@ exports[`Storyshots Message list message 1`] = ` "minWidth": 46.3, }, Object { - "borderColor": "#e1e5e8", + "borderColor": "#1d74f5", }, ] } @@ -18328,6 +23554,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18344,8 +23571,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -18635,6 +23862,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18651,8 +23879,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -18920,6 +24148,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -18936,8 +24165,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -19267,6 +24496,7 @@ exports[`Storyshots Message list message 1`] = ` "alignItems": "center", "flex": 1, "flexDirection": "row", + "justifyContent": "space-between", } } > @@ -19283,8 +24513,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -19654,76 +24884,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 +25521,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -20108,7 +25545,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > - diego.mello + Diego Mello - - - - - - Testing block quote - - - - - Testing block quote + Message @@ -20264,27 +25622,19 @@ exports[`Storyshots Message list message 1`] = ` - - Lists - + + +`; + +exports[`Storyshots Message Grouped messages 1`] = ` + + @@ -20423,8 +25774,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 +27330,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -21139,27 +27562,6 @@ exports[`Storyshots Message list message 1`] = ` - - Numerated lists in separated messages - @@ -21298,8 +27701,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -21585,287 +27988,19 @@ exports[`Storyshots Message list message 1`] = ` - - Static avatar - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Message - - - - - - - - - - Full name - + + +`; + +exports[`Storyshots Message Mentions 1`] = ` + + @@ -22004,268 +28140,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 +28557,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -22986,27 +28863,19 @@ exports[`Storyshots Message list message 1`] = ` - - Emojis - + + +`; + +exports[`Storyshots Message Message with read receipt 1`] = ` + + @@ -23145,8 +29015,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -23212,1512 +29082,7 @@ exports[`Storyshots Message list message 1`] = ` } > - 👊🤙👏 - - - - - - - - - - Single Emoji - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - 👏 - - - - - - - - - - Custom Emojis - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - - - - - - - - - - - - - - - - Single Custom Emojis - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - - - - Normal Emoji + Custom Emojis - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - 🤙 - - - - - - - - - - - - - Four emoji - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - 🤙 - - - - - - 🤙🤙 + I'm fine! @@ -24814,5802 +29116,6 @@ exports[`Storyshots Message list message 1`] = ` - - Time format - - - - - - - - - - - - - - - - - diego.mello - - - - 10 November 2017 - - - - - - Testing - - - - - - - - - - Reactions - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Reactions - - - - - - - - 😂 - - - 3 - - - - - - - - - - 13 - - - - - - - 🤔 - - - 1 - - - - - - -  - - - - - - - - - - - Multiple reactions - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Multiple Reactions - - - - - - - - - - - 1 - - - - - - - - - - 1 - - - - - - - - - - 1 - - - - - - - ❤️ - - - 1 - - - - - - - 🐶 - - - 1 - - - - - - - 😀 - - - 1 - - - - - - - 😬 - - - 1 - - - - - - - 😁 - - - 1 - - - - - - -  - - - - - - - - - - - Intercalated users - - - - - - - - - - - - - - - - - rocket.cat - - - - 10:00 AM - - - - - - Fourth message - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Third message - - - - - - - - - - - - - - - - - - - - - - - - rocket.cat - - - - 10:00 AM - - - - - - Second message - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - First message - - - - - - - - - - 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 - - - - - - - - - - - - - This is a description - - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - - - - This is a description - - - - - - - - - - - - - - With video - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - -  - - - - - This is a description - - - - - - - - - - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - -  - - - - - - - - - With audio - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - - - - - 00:00 - - - - - This is a description - - - - - - - - - - - First message + I'm fine! @@ -30712,615 +29218,6 @@ exports[`Storyshots Message list message 1`] = ` - - - - - - - - - - - - - 00:00 - - - - - This is a description - - - - - - - - - - - - - - - - - - - - 00:00 - - - - - - - - - - - - - - - - - - - - 00:00 - - - - - - - - - With file - @@ -31459,8 +29357,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -31506,109 +29404,9 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - - - - - File.pdf - - - - - + - This is a description - - - - - + > + I'm fine! + + + + +  + @@ -31723,109 +29528,9 @@ exports[`Storyshots Message list message 1`] = ` ] } > - - - - - - File.pdf - - - - - + - This is a description - - - - - + > + I'm fine! + + + + +  + - - Message with reply - + + +`; + +exports[`Storyshots Message Message with reply 1`] = ` + + @@ -32051,8 +29756,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -32210,25 +29915,6 @@ exports[`Storyshots Message list message 1`] = ` > I'm a very long long title and I'll break - - 10:00 AM - @@ -32420,8 +30107,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -32579,25 +30266,6 @@ exports[`Storyshots Message list message 1`] = ` > rocket.cat - - 10:00 AM - - - Message with read receipt - + + +`; + +exports[`Storyshots Message Message with thread 1`] = ` + + @@ -32845,755 +30506,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, - "flexDirection": "row", - "opacity": 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 - - - - - - - - - - - - - - - - - - - - -  - - - Markdown: link block code - - - -  - - - - - - - - - - - - - - - I'm fine! - - - - - - - - - Sequential thread messages following thread button - + + +`; + +exports[`Storyshots Message Reactions 1`] = ` + + @@ -35763,8 +32430,1707 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + Reactions + + + + + + + + 😂 + + + 1 + + + + + + + + + + 99 + + + + + + + 🤔 + + + 999 + + + + + + + 🤔 + + + 9999 + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + Multiple Reactions + + + + + + + + + + + 1 + + + + + + + + + + 1 + + + + + + + + + + 1 + + + + + + + ❤️ + + + 1 + + + + + + + 🐶 + + + 1 + + + + + + + 😀 + + + 1 + + + + + + + 😬 + + + 1 + + + + + + + 😁 + + + 1 + + + + + + +  + + + + + + + + + + + +`; + +exports[`Storyshots Message Sequential thread messages following thread button 1`] = ` + + + + + + + + + + + + + + + + - - Sequential thread messages following thread reply - + + +`; + +exports[`Storyshots Message Sequential thread messages following thread reply 1`] = ` + + - - Discussion - + + +`; + +exports[`Storyshots Message Static avatar 1`] = ` + + @@ -37371,8 +35722,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -37418,134 +35769,221 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - Started a discussion: - - - This is a discussion - - - - -  - - - No messages yet - - + + + Message + + + + + + + + + + +`; + +exports[`Storyshots Message System messages 1`] = ` + + + + + + + + + + + + + + + + + diego.mello + + + - + > + Message removed + + @@ -37601,12 +36041,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, }, ] } @@ -37634,9 +36074,9 @@ exports[`Storyshots Message list message 1`] = ` "overflow": "hidden", }, Object { - "borderRadius": 4, - "height": 36, - "width": 36, + "borderRadius": 2, + "height": 20, + "width": 20, }, ] } @@ -37647,7 +36087,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/diego.mello?format=png&size=20", } } style={ @@ -37676,64 +36116,38 @@ exports[`Storyshots Message list message 1`] = ` ] } > - - - - diego.mello - - + + diego.mello + + + - 10:00 AM + has joined the channel + + + + + + + + + + + + + + + + + + + + diego.mello + + + + Message pinned + + + + + + + + + + + + + + + + + + + + + + diego.mello + + + + has left the channel + + + + + + + + + + + + + + + + + + + - Started a discussion: + User rocket.cat removed by diego.mello + + + + + + + + + + + + + + + + + - This is a discussion + User rocket.cat added by diego.mello - - - -  - - - 1 message - - - - November 10, 2017 - - + + + + + + + + + + + + + + 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`] = ` + + @@ -38027,8 +38477,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -38074,143 +38524,59 @@ exports[`Storyshots Message list message 1`] = ` 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 + + Temp message + @@ -38218,6 +38584,19 @@ exports[`Storyshots Message list message 1`] = ` + + +`; + +exports[`Storyshots Message Time format 1`] = ` + + @@ -38356,8 +38736,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -38400,146 +38780,56 @@ exports[`Storyshots Message list message 1`] = ` ] } > - 10:00 AM + 10 November 2017 - - Started a discussion: - - - This is a discussion - - - - -  - - - +999 messages - - + - November 10, 2017 + + Testing + @@ -38547,27 +38837,19 @@ exports[`Storyshots Message list message 1`] = ` - - URL - + + +`; + +exports[`Storyshots Message Two short custom fields with markdown 1`] = ` + + @@ -38706,8 +38989,836 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, + "opacity": 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`] = ` + + + + + + + + + + + + + + + + @@ -39078,8 +40190,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -39416,27 +40528,19 @@ exports[`Storyshots Message list message 1`] = ` - - Custom fields - + + +`; + +exports[`Storyshots Message With alias 1`] = ` + + @@ -39575,8 +40680,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -39599,7 +40704,26 @@ exports[`Storyshots Message list message 1`] = ` ] } > - diego.mello + Diego Mello + + @ + diego.mello + - - - - - 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 - @@ -40360,8 +40939,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -40384,7 +40963,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. + - - - - - 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 - + + +`; + +exports[`Storyshots Message With audio 1`] = ` + + @@ -41233,8 +41211,1110 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", + "flexDirection": "row", + "flexShrink": 1, + "opacity": 1, + } + } + > + + diego.mello + + + + 10:00 AM + + + + + + + + + + 00:00 + + + + + This is a description + + + + + + + + + + + + + + + + + + + First message + + + + + + + + + + + + + + + + + + + + + 00:00 + + + + + This is a description + + + + + + + + + + + + + + + + + + + + 00:00 + + + + + + + + + + + + + + + + + + + + 00:00 + + + + + + + + + +`; + +exports[`Storyshots Message With file 1`] = ` + + + + + + + + + + + + + + + + - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - + File.pdf + + - - - + + - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - + } + /> - - + + + + + + + + + + - - - - - Field 1 - - - - Value 1 - - - - - - Field 2 - - - - Value 2 - - - - - - + "marginLeft": 46, + }, + false, + ] + } + > + - + + File.pdf + + + + + + + This is a description + + + + + + + + + + + + +`; + +exports[`Storyshots Message With image 1`] = ` + + + + + + + + + + + + + + + + + + diego.mello + + + + 10:00 AM + + + + + + - - Invalid color - + style={ + Object { + "bottom": 0, + "left": 0, + "position": "absolute", + "right": 0, + "top": 0, + } + } + /> + + + This is a description + + @@ -41968,27 +43076,6 @@ exports[`Storyshots Message list message 1`] = ` - - Broadcast - @@ -42127,8 +43215,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -42174,28 +43262,86 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - + + } + > + + + + + + + - Broadcasted message - - - - - - -  - - - Reply + Array [ + Object {}, + Object { + "alignItems": "flex-start", + "flexDirection": "row", + "flexWrap": "wrap", + "justifyContent": "flex-start", + "marginBottom": 0, + "marginTop": 0, + }, + ], + ] + } + > + This is a description + + + + @@ -42311,27 +43428,19 @@ exports[`Storyshots Message list message 1`] = ` - - Archived - + + +`; + +exports[`Storyshots Message With video 1`] = ` + + @@ -42470,8 +43580,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Object { "alignItems": "center", - "flex": 1, "flexDirection": "row", + "flexShrink": 1, "opacity": 1, } } @@ -42517,190 +43627,7 @@ exports[`Storyshots Message list message 1`] = ` 10:00 AM - - - - This message is inside an archived room - - - - - - - - - - Error - - - - - - - - - - - - - + - - diego.mello - - - - 10:00 AM - - -  +  - - - This message has error + This is a description + + + - - + } + > + + + + + + + + + + + diego.mello + + - diego.mello + 10:00 AM - - 10:00 AM - + @@ -42992,8 +43972,8 @@ exports[`Storyshots Message list message 1`] = ` style={ Array [ Object { - "color": "#f5455c", - "fontSize": 18, + "color": "#ffffff", + "fontSize": 54, }, undefined, Object { @@ -43005,322 +43985,7 @@ exports[`Storyshots Message list message 1`] = ` ] } > -  - - - - - - - This message has error too - - - - - - - - - Temp - - - - - - - - - - - - - - - - - diego.mello - - - - 10:00 AM - - - - - - Temp message - +  @@ -43328,27 +43993,19 @@ exports[`Storyshots Message list message 1`] = ` - - Editing - + + +`; + +exports[`Storyshots Message Without header 1`] = ` + + - - - - - - - - - - - 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 - - - - - - - - - - - - - - - This room's encryption has been disabled by diego.mello - - - - - - - - - - - - - - - - - - - - This room's encryption has been enabled by diego.mello - - - - - - - - Ignored - - - - - - - - - - - - - - - - Message ignored. Tap to display it. - - - - - - - - - Custom style - - - - - - - - - - - - - - - - - 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 - - + +`; + +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`] = ` + + `; +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 + + + + + + + + + + + +  + + + 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 + + + + + + + + +`; + +exports[`Storyshots Room Item User status 1`] = ` + + + + + + + +  + + + 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 + + + + + + + + +`; + +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 ServerItem content 1`] = ` Array [ `; -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..3f5a48c12 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(); } @@ -101,8 +101,7 @@ class StatusView extends React.Component { navigation.goBack(); } - setCustomStatus = async() => { - const { statusText } = this.state; + setCustomStatus = async(statusText) => { const { user, setUser } = this.props; this.setState({ loading: true }); diff --git a/e2e/data.js b/e2e/data.js index 77f9f82c0..79e7842e8 100644 --- a/e2e/data.js +++ b/e2e/data.js @@ -1,9 +1,9 @@ const random = require('./helpers/random'); const value = random(20); const data = { - server: 'http://localhost:3000', - adminUser: 'admin', - adminPassword: 'password', + server: 'https://mobile.rocket.chat', + adminUser: 'e2e_admin', + adminPassword: 'p7mFh4yLwCRXSnMvG', alternateServer: 'https://stable.rocket.chat', users: { regular: { @@ -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 07bb1935c..13f5b8cac 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -1450,6 +1450,7 @@ DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -1569,6 +1570,7 @@ DEVELOPMENT_TEAM = S6UPZG7ZR3; ENABLE_BITCODE = NO; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"${PODS_ROOT}/Crashlytics/iOS\"", @@ -1687,11 +1689,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; @@ -1728,7 +1731,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)"; @@ -1756,6 +1759,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..855b1df73 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", @@ -194,8 +194,7 @@ "build": "xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build", "type": "ios.simulator", "device": { - "type": "iPhone 11 Pro", - "os": "13.7" + "type": "iPhone 11 Pro" } }, "ios.sim.release": { @@ -203,8 +202,7 @@ "build": "xcodebuild -workspace ios/RocketChatRN.xcworkspace -scheme RocketChatRN -configuration Release -sdk iphonesimulator -derivedDataPath ios/build", "type": "ios.simulator", "device": { - "type": "iPhone 11 Pro", - "os": "13.7" + "type": "iPhone 11 Pro" }, "artifacts": { "plugins": { 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"