From 2f03ca52c5768cb306739f9ba1a7099b55246198 Mon Sep 17 00:00:00 2001 From: Danish Ahmed Mirza <77742477+try-catch-stack@users.noreply.github.com> Date: Fri, 30 Sep 2022 01:12:04 +0530 Subject: [PATCH] [IMPROVE] Add `All` tab in Reactions List (#4409) Co-authored-by: Diego Mello --- .storybook/index.js | 2 + .storybook/storybook.requires.js | 1 + .../ReactionsList.stories.storyshot | 5 + app/containers/ReactionsList.tsx | 145 ------------------ app/containers/ReactionsList/AllTab.tsx | 77 ++++++++++ .../ReactionsList/ReactionsList.stories.tsx | 71 +++++++++ .../ReactionsList/ReactionsList.test.tsx | 79 ++++++++++ .../ReactionsList/ReactionsTabBar.tsx | 89 +++++++++++ app/containers/ReactionsList/UsersList.tsx | 47 ++++++ app/containers/ReactionsList/index.tsx | 34 ++++ app/containers/ReactionsList/styles.ts | 88 +++++++++++ app/containers/message/Attachments.tsx | 11 +- app/definitions/IReaction.ts | 1 + app/lib/methods/helpers/normalizeMessage.ts | 3 +- app/views/RoomView/index.tsx | 13 +- e2e/tests/room/02-room.spec.ts | 19 ++- 16 files changed, 523 insertions(+), 162 deletions(-) create mode 100644 __tests__/containers/ReactionsList/__snapshots__/ReactionsList.stories.storyshot delete mode 100644 app/containers/ReactionsList.tsx create mode 100644 app/containers/ReactionsList/AllTab.tsx create mode 100644 app/containers/ReactionsList/ReactionsList.stories.tsx create mode 100644 app/containers/ReactionsList/ReactionsList.test.tsx create mode 100644 app/containers/ReactionsList/ReactionsTabBar.tsx create mode 100644 app/containers/ReactionsList/UsersList.tsx create mode 100644 app/containers/ReactionsList/index.tsx create mode 100644 app/containers/ReactionsList/styles.ts diff --git a/.storybook/index.js b/.storybook/index.js index 69fb86031..8b41d94e9 100644 --- a/.storybook/index.js +++ b/.storybook/index.js @@ -6,11 +6,13 @@ import RNBootSplash from 'react-native-bootsplash'; import { selectServerRequest } from '../app/actions/server'; import { mockedStore as store } from '../app/reducers/mockedStore'; import database from '../app/lib/database'; +import { setUser } from '../app/actions/login'; RNBootSplash.hide(); const baseUrl = 'https://open.rocket.chat'; store.dispatch(selectServerRequest(baseUrl)); +store.dispatch(setUser({ id: 'abc', username: 'rocket.cat', name: 'Rocket Cat' })); database.setActiveDB(baseUrl); const StorybookUIRoot = getStorybookUI({}); diff --git a/.storybook/storybook.requires.js b/.storybook/storybook.requires.js index 1baa14ff4..975d6d3f9 100644 --- a/.storybook/storybook.requires.js +++ b/.storybook/storybook.requires.js @@ -30,6 +30,7 @@ const getStories = () => { require("../app/containers/markdown/new/NewMarkdown.stories.tsx"), require("../app/containers/message/Components/CollapsibleQuote/CollapsibleQuote.stories.tsx"), require("../app/containers/message/Message.stories.tsx"), + require("../app/containers/ReactionsList/ReactionsList.stories.tsx"), require("../app/containers/RoomHeader/RoomHeader.stories.tsx"), require("../app/containers/RoomItem/RoomItem.stories.tsx"), require("../app/containers/SearchBox/SearchBox.stories.tsx"), diff --git a/__tests__/containers/ReactionsList/__snapshots__/ReactionsList.stories.storyshot b/__tests__/containers/ReactionsList/__snapshots__/ReactionsList.stories.storyshot new file mode 100644 index 000000000..a09e68fb8 --- /dev/null +++ b/__tests__/containers/ReactionsList/__snapshots__/ReactionsList.stories.storyshot @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Storyshots ReactionsList Reactions List Full Name 1`] = `"{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingVertical\\":10,\\"flex\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1},\\"testID\\":\\"reactionsList\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"reactionsTabBar\\"},\\"children\\":[{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"horizontal\\":true,\\"showsHorizontalScrollIndicator\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":2,\\"borderColor\\":\\"#549df9\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-All\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"All\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:marioparty:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"2\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:react_rocket:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/react_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"2\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:nyan_rocket:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/nyan_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:grinning:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":20,\\"width\\":24,\\"height\\":24,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"😀\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:tada:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":20,\\"width\\":24,\\"height\\":24,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"🎉\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]}]}]}]},{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"scrollEventThrottle\\":16,\\"horizontal\\":true,\\"pagingEnabled\\":true,\\"automaticallyAdjustContentInsets\\":false,\\"contentOffset\\":{\\"x\\":0},\\"scrollsToTop\\":false,\\"showsHorizontalScrollIndicator\\":false,\\"scrollEnabled\\":true,\\"directionalLockEnabled\\":true,\\"alwaysBounceVertical\\":false,\\"keyboardDismissMode\\":\\"on-drag\\",\\"collapsable\\":false,\\"style\\":{}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1},\\"testID\\":\\"reactionsListAllTab\\"},\\"children\\":[{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"data\\":[{\\"emoji\\":\\":marioparty:\\",\\"_id\\":\\"marioparty\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]},{\\"emoji\\":\\":react_rocket:\\",\\"_id\\":\\"react_rocket\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]},{\\"emoji\\":\\":nyan_rocket:\\",\\"_id\\":\\"nyan_rocket\\",\\"usernames\\":[\\"rocket.cat\\"],\\"names\\":[\\"Rocket Cat\\"]},{\\"emoji\\":\\":grinning:\\",\\"_id\\":\\"grinning\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]},{\\"emoji\\":\\":tada:\\",\\"_id\\":\\"tada\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}],\\"contentContainerStyle\\":{\\"marginHorizontal\\":12,\\"marginVertical\\":8,\\"paddingBottom\\":30},\\"viewabilityConfigCallbackPairs\\":[],\\"removeClippedSubviews\\":false,\\"scrollEventThrottle\\":50,\\"stickyHeaderIndices\\":[]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"2 people reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"Rocket Cat and Diego Mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/react_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"2 people reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"Rocket Cat and Diego Mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/nyan_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"Rocket Cat\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":30,\\"width\\":36,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"😀\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"Diego Mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":30,\\"width\\":36,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"🎉\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"Diego Mello\\"]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":marioparty:\\",\\"_id\\":\\"marioparty\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":react_rocket:\\",\\"_id\\":\\"react_rocket\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":nyan_rocket:\\",\\"_id\\":\\"nyan_rocket\\",\\"usernames\\":[\\"rocket.cat\\"],\\"names\\":[\\"Rocket Cat\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":grinning:\\",\\"_id\\":\\"grinning\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":tada:\\",\\"_id\\":\\"tada\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}},\\"children\\":null}]}]}]}]}]}]}"`; + +exports[`Storyshots ReactionsList Reactions List Story 1`] = `"{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingVertical\\":10,\\"flex\\":1}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1},\\"testID\\":\\"reactionsList\\"},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"flex\\":1},null]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"reactionsTabBar\\"},\\"children\\":[{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"horizontal\\":true,\\"showsHorizontalScrollIndicator\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":2,\\"borderColor\\":\\"#549df9\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-All\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":16,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"All\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:marioparty:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"2\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:react_rocket:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/react_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"2\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:nyan_rocket:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":24,\\"height\\":24}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/nyan_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:grinning:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":20,\\"width\\":24,\\"height\\":24,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"😀\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":125,\\"borderBottomWidth\\":1,\\"borderColor\\":\\"#cbcbcc\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"testID\\":\\"tabBarItem-:tada:\\",\\"accessible\\":true,\\"focusable\\":true,\\"style\\":{\\"opacity\\":1},\\"collapsable\\":false},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"paddingBottom\\":4,\\"height\\":44,\\"justifyContent\\":\\"center\\",\\"alignItems\\":\\"center\\",\\"flexDirection\\":\\"row\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":20,\\"width\\":24,\\"height\\":24,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"🎉\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"marginLeft\\":4,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"600\\"},{\\"color\\":\\"#6C727A\\"}]},\\"children\\":[\\"1\\"]}]}]}]}]}]}]},{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"scrollEventThrottle\\":16,\\"horizontal\\":true,\\"pagingEnabled\\":true,\\"automaticallyAdjustContentInsets\\":false,\\"contentOffset\\":{\\"x\\":0},\\"scrollsToTop\\":false,\\"showsHorizontalScrollIndicator\\":false,\\"scrollEnabled\\":true,\\"directionalLockEnabled\\":true,\\"alwaysBounceVertical\\":false,\\"keyboardDismissMode\\":\\"on-drag\\",\\"collapsable\\":false,\\"style\\":{}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1},\\"testID\\":\\"reactionsListAllTab\\"},\\"children\\":[{\\"type\\":\\"RCTScrollView\\",\\"props\\":{\\"data\\":[{\\"emoji\\":\\":marioparty:\\",\\"_id\\":\\"marioparty\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]},{\\"emoji\\":\\":react_rocket:\\",\\"_id\\":\\"react_rocket\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]},{\\"emoji\\":\\":nyan_rocket:\\",\\"_id\\":\\"nyan_rocket\\",\\"usernames\\":[\\"rocket.cat\\"],\\"names\\":[\\"Rocket Cat\\"]},{\\"emoji\\":\\":grinning:\\",\\"_id\\":\\"grinning\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]},{\\"emoji\\":\\":tada:\\",\\"_id\\":\\"tada\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}],\\"contentContainerStyle\\":{\\"marginHorizontal\\":12,\\"marginVertical\\":8,\\"paddingBottom\\":30},\\"viewabilityConfigCallbackPairs\\":[],\\"removeClippedSubviews\\":false,\\"scrollEventThrottle\\":50,\\"stickyHeaderIndices\\":[]},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/marioparty.gif\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"2 people reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"rocket.cat and diego.mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/react_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"2 people reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"rocket.cat and diego.mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":[{\\"overflow\\":\\"hidden\\"},{\\"width\\":36,\\"height\\":36}]},\\"children\\":[{\\"type\\":\\"FastImageView\\",\\"props\\":{\\"style\\":{\\"position\\":\\"absolute\\",\\"left\\":0,\\"right\\":0,\\"top\\":0,\\"bottom\\":0},\\"source\\":{\\"uri\\":\\"/emoji-custom/nyan_rocket.png\\",\\"priority\\":\\"high\\"},\\"resizeMode\\":\\"contain\\"},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"rocket.cat\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":30,\\"width\\":36,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"😀\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"diego.mello\\"]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":null},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"marginVertical\\":6,\\"flexDirection\\":\\"row\\",\\"alignItems\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":{\\"fontSize\\":30,\\"width\\":36,\\"textAlign\\":\\"center\\",\\"color\\":\\"#fff\\"}},\\"children\\":[\\"🎉\\"]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"flex\\":1,\\"marginLeft\\":8,\\"justifyContent\\":\\"center\\"}},\\"children\\":[{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"500\\"},{\\"color\\":\\"#2f343d\\"}]},\\"children\\":[\\"1 person reacted\\"]},{\\"type\\":\\"Text\\",\\"props\\":{\\"style\\":[{\\"fontSize\\":14,\\"textAlign\\":\\"left\\",\\"backgroundColor\\":\\"transparent\\",\\"fontFamily\\":\\"Inter\\",\\"fontWeight\\":\\"400\\"},{\\"color\\":\\"#9ca2a8\\"}]},\\"children\\":[\\"diego.mello\\"]}]}]}]}]}]}]}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":marioparty:\\",\\"_id\\":\\"marioparty\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":react_rocket:\\",\\"_id\\":\\"react_rocket\\",\\"usernames\\":[\\"rocket.cat\\",\\"diego.mello\\"],\\"names\\":[\\"Rocket Cat\\",\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":nyan_rocket:\\",\\"_id\\":\\"nyan_rocket\\",\\"usernames\\":[\\"rocket.cat\\"],\\"names\\":[\\"Rocket Cat\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":grinning:\\",\\"_id\\":\\"grinning\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}},\\"children\\":null}]},{\\"type\\":\\"View\\",\\"props\\":{\\"style\\":{\\"width\\":750}},\\"children\\":[{\\"type\\":\\"View\\",\\"props\\":{\\"tabLabel\\":{\\"emoji\\":\\":tada:\\",\\"_id\\":\\"tada\\",\\"usernames\\":[\\"diego.mello\\"],\\"names\\":[\\"Diego Mello\\"]}},\\"children\\":null}]}]}]}]}]}]}"`; diff --git a/app/containers/ReactionsList.tsx b/app/containers/ReactionsList.tsx deleted file mode 100644 index b7908c240..000000000 --- a/app/containers/ReactionsList.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import React from 'react'; -import { StyleSheet, Text, Pressable, View, ScrollView } from 'react-native'; -import ScrollableTabView from 'react-native-scrollable-tab-view'; -import { FlatList } from 'react-native-gesture-handler'; - -import Emoji from './message/Emoji'; -import { useTheme } from '../theme'; -import { TGetCustomEmoji } from '../definitions/IEmoji'; -import { IReaction } from '../definitions'; -import Avatar from './Avatar'; -import sharedStyles from '../views/Styles'; - -const MIN_TAB_WIDTH = 70; - -const styles = StyleSheet.create({ - reactionsListContainer: { height: '100%', width: '100%' }, - tabBarItem: { - paddingHorizontal: 10, - paddingBottom: 10, - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'row' - }, - reactionCount: { marginLeft: 5 }, - emojiName: { margin: 10 }, - userItemContainer: { marginHorizontal: 10, marginVertical: 5, flexDirection: 'row' }, - usernameContainer: { marginHorizontal: 10, justifyContent: 'center' }, - usernameText: { fontSize: 17, ...sharedStyles.textMedium }, - standardEmojiStyle: { fontSize: 20, color: '#fff' }, - customEmojiStyle: { width: 25, height: 25 } -}); - -interface IReactionsListBase { - baseUrl: string; - getCustomEmoji: TGetCustomEmoji; -} - -interface IReactionsListProps extends IReactionsListBase { - reactions?: IReaction[]; - width: number; -} - -interface ITabBarItem extends IReactionsListBase { - tab: IReaction; - index: number; - goToPage?: (index: number) => void; -} -interface IReactionsTabBar extends IReactionsListBase { - activeTab?: number; - tabs?: IReaction[]; - goToPage?: (index: number) => void; - width: number; -} - -const TabBarItem = ({ tab, index, goToPage, baseUrl, getCustomEmoji }: ITabBarItem) => { - const { colors } = useTheme(); - return ( - { - goToPage?.(index); - }} - style={({ pressed }: { pressed: boolean }) => ({ - opacity: pressed ? 0.7 : 1 - })} - > - - - {tab.usernames.length} - - - ); -}; - -const ReactionsTabBar = ({ tabs, activeTab, goToPage, baseUrl, getCustomEmoji, width }: IReactionsTabBar) => { - const tabWidth = tabs && Math.max(width / tabs.length, MIN_TAB_WIDTH); - const { colors } = useTheme(); - return ( - - - {tabs?.map((tab, index) => { - const isActiveTab = activeTab === index; - return ( - - - - ); - })} - - - ); -}; - -const UsersList = ({ tabLabel }: { tabLabel: IReaction }) => { - const { colors } = useTheme(); - const { emoji, usernames } = tabLabel; - return ( - ( - - {emoji} - - )} - renderItem={({ item }) => ( - - - - {item} - - - )} - keyExtractor={item => item} - /> - ); -}; - -const ReactionsList = ({ reactions, baseUrl, getCustomEmoji, width }: IReactionsListProps): React.ReactElement => { - // sorting reactions in descending order on the basic of number of users reacted - const sortedReactions = reactions?.sort((reaction1, reaction2) => reaction2.usernames.length - reaction1.usernames.length); - - return ( - - }> - {sortedReactions?.map(reaction => ( - - ))} - - - ); -}; - -export default ReactionsList; diff --git a/app/containers/ReactionsList/AllTab.tsx b/app/containers/ReactionsList/AllTab.tsx new file mode 100644 index 000000000..4dfcbd2f0 --- /dev/null +++ b/app/containers/ReactionsList/AllTab.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { Text, View, FlatList } from 'react-native'; + +import Emoji from '../message/Emoji'; +import { useTheme } from '../../theme'; +import { IReaction } from '../../definitions'; +import { TGetCustomEmoji } from '../../definitions/IEmoji'; +import I18n from '../../i18n'; +import styles from './styles'; +import { useAppSelector } from '../../lib/hooks'; + +interface IAllReactionsListItemProps { + getCustomEmoji: TGetCustomEmoji; + item: IReaction; +} + +interface IAllTabProps { + getCustomEmoji: TGetCustomEmoji; + tabLabel: IReaction; + reactions?: IReaction[]; +} + +const AllReactionsListItem = ({ item, getCustomEmoji }: IAllReactionsListItemProps) => { + const { colors } = useTheme(); + const useRealName = useAppSelector(state => state.settings.UI_Use_Real_Name); + const server = useAppSelector(state => state.server.server); + const username = useAppSelector(state => state.login.user.username); + const count = item.usernames.length; + + let displayNames; + if (useRealName && item.names) { + displayNames = item.names + .slice(0, 3) + .map((name, index) => (item.usernames[index] === username ? I18n.t('you') : name)) + .join(', '); + } else { + displayNames = item.usernames + .slice(0, 3) + .map((otherUsername: string) => (username === otherUsername ? I18n.t('you') : otherUsername)) + .join(', '); + } + if (count > 3) { + displayNames = `${displayNames} ${I18n.t('and_more')} ${count - 3}`; + } else { + displayNames = displayNames.replace(/,(?=[^,]*$)/, ` ${I18n.t('and')}`); + } + return ( + + + + + {count === 1 ? I18n.t('1_person_reacted') : I18n.t('N_people_reacted', { n: count })} + + {displayNames} + + + ); +}; + +const AllTab = ({ reactions, getCustomEmoji }: IAllTabProps): React.ReactElement => ( + + } + keyExtractor={item => item.emoji} + /> + +); + +export default AllTab; diff --git a/app/containers/ReactionsList/ReactionsList.stories.tsx b/app/containers/ReactionsList/ReactionsList.stories.tsx new file mode 100644 index 000000000..50d99b8ae --- /dev/null +++ b/app/containers/ReactionsList/ReactionsList.stories.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { View } from 'react-native'; + +import { TGetCustomEmoji, IEmoji } from '../../definitions'; +import ReactionsList from '.'; +import { mockedStore as store } from '../../reducers/mockedStore'; +import { updateSettings } from '../../actions/settings'; + +const getCustomEmoji: TGetCustomEmoji = content => { + const customEmoji = { + marioparty: { name: content, extension: 'gif' }, + react_rocket: { name: content, extension: 'png' }, + nyan_rocket: { name: content, extension: 'png' } + }[content] as IEmoji; + return customEmoji; +}; + +const reactions = [ + { + emoji: ':marioparty:', + _id: 'marioparty', + usernames: ['rocket.cat', 'diego.mello'], + names: ['Rocket Cat', 'Diego Mello'] + }, + { + emoji: ':react_rocket:', + _id: 'react_rocket', + usernames: ['rocket.cat', 'diego.mello'], + names: ['Rocket Cat', 'Diego Mello'] + }, + { + emoji: ':nyan_rocket:', + _id: 'nyan_rocket', + usernames: ['rocket.cat'], + names: ['Rocket Cat'] + }, + { + emoji: ':grinning:', + _id: 'grinning', + usernames: ['diego.mello'], + names: ['Diego Mello'] + }, + { + emoji: ':tada:', + _id: 'tada', + usernames: ['diego.mello'], + names: ['Diego Mello'] + } +]; + +export const ReactionsListStory = () => { + store.dispatch(updateSettings('UI_Use_Real_Name', false)); + return ( + + + + ); +}; + +export const ReactionsListFullName = () => { + store.dispatch(updateSettings('UI_Use_Real_Name', true)); + return ( + + + + ); +}; + +export default { + title: 'ReactionsList' +}; diff --git a/app/containers/ReactionsList/ReactionsList.test.tsx b/app/containers/ReactionsList/ReactionsList.test.tsx new file mode 100644 index 000000000..004b4498f --- /dev/null +++ b/app/containers/ReactionsList/ReactionsList.test.tsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { fireEvent, render, within } from '@testing-library/react-native'; +import { Provider } from 'react-redux'; + +import ReactionsList from '.'; +import { mockedStore } from '../../reducers/mockedStore'; + +const getCustomEmoji = jest.fn(); +const reactions = [ + { + emoji: 'marioparty', + _id: 'marioparty', + usernames: ['rocket.cat', 'diego.mello'], + names: ['Rocket Cat', 'Diego Mello'] + }, + { + emoji: 'react_rocket', + _id: 'react_rocket', + usernames: ['rocket.cat', 'diego.mello'], + names: ['Rocket Cat', 'Diego Mello'] + }, + { + emoji: 'nyan_rocket', + _id: 'nyan_rocket', + usernames: ['rocket.cat'], + names: ['Rocket Cat'] + }, + { + emoji: 'grinning', + _id: 'grinning', + usernames: ['diego.mello'], + names: ['Diego Mello'] + } +]; + +const Render = () => ( + + + +); + +describe('ReactionsList', () => { + test('should render Reactions List', async () => { + const { findByTestId } = render(); + const ReactionsListView = await findByTestId('reactionsList'); + expect(ReactionsListView).toBeTruthy(); + }); + + test('should render tab bar', async () => { + const { findByTestId } = render(); + const AllTab = await findByTestId('reactionsTabBar'); + expect(AllTab).toBeTruthy(); + }); + + test('should render All tab', async () => { + const { findByTestId } = render(); + const AllTab = await findByTestId('reactionsListAllTab'); + expect(AllTab).toBeTruthy(); + }); + + test('correct tab on clicking tab item', async () => { + const { findByTestId } = render(); + const tab = await findByTestId(`tabBarItem-${reactions[0].emoji}`); + fireEvent.press(tab); + const usersList = await findByTestId(`usersList-${reactions[0].emoji}`); + expect(usersList).toBeTruthy(); + const emojiName = await within(usersList).getByTestId(`usersListEmojiName`); + expect(emojiName.props.children).toEqual(reactions[0].emoji); + }); + + test('should render correct number of reactions', async () => { + const { findByTestId } = render(); + const tab = await findByTestId(`tabBarItem-${reactions[0].emoji}`); + fireEvent.press(tab); + const usersList = await findByTestId(`usersList-${reactions[0].emoji}`); + const allReactions = await within(usersList).getAllByTestId('userItem'); + expect(allReactions).toHaveLength(reactions[0].usernames.length); + }); +}); diff --git a/app/containers/ReactionsList/ReactionsTabBar.tsx b/app/containers/ReactionsList/ReactionsTabBar.tsx new file mode 100644 index 000000000..cbb780110 --- /dev/null +++ b/app/containers/ReactionsList/ReactionsTabBar.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { Text, Pressable, View, ScrollView } from 'react-native'; + +import Emoji from '../message/Emoji'; +import { useTheme } from '../../theme'; +import { IReaction } from '../../definitions'; +import { TGetCustomEmoji } from '../../definitions/IEmoji'; +import I18n from '../../i18n'; +import styles, { MIN_TAB_WIDTH } from './styles'; +import { useDimensions, useOrientation } from '../../dimensions'; +import { useAppSelector } from '../../lib/hooks'; + +interface ITabBarItem { + getCustomEmoji: TGetCustomEmoji; + tab: IReaction; + index: number; + goToPage?: (index: number) => void; +} +interface IReactionsTabBar { + getCustomEmoji: TGetCustomEmoji; + activeTab?: number; + tabs?: IReaction[]; + goToPage?: (index: number) => void; +} + +const TabBarItem = ({ tab, index, goToPage, getCustomEmoji }: ITabBarItem) => { + const { colors } = useTheme(); + const server = useAppSelector(state => state.server.server); + return ( + { + goToPage?.(index); + }} + style={({ pressed }: { pressed: boolean }) => ({ + opacity: pressed ? 0.7 : 1 + })} + testID={`tabBarItem-${tab.emoji}`} + > + + {tab._id === 'All' ? ( + {I18n.t('All')} + ) : ( + <> + + {tab.usernames.length} + + )} + + + ); +}; + +const ReactionsTabBar = ({ tabs, activeTab, goToPage, getCustomEmoji }: IReactionsTabBar): React.ReactElement => { + const { isLandscape } = useOrientation(); + const { width } = useDimensions(); + const reactionsListWidth = isLandscape ? width / 2 : width; + const tabWidth = tabs && Math.max(reactionsListWidth / tabs.length, MIN_TAB_WIDTH); + const { colors } = useTheme(); + return ( + + + {tabs?.map((tab, index) => { + const isActiveTab = activeTab === index; + return ( + + + + ); + })} + + + ); +}; + +export default ReactionsTabBar; diff --git a/app/containers/ReactionsList/UsersList.tsx b/app/containers/ReactionsList/UsersList.tsx new file mode 100644 index 000000000..9723b051f --- /dev/null +++ b/app/containers/ReactionsList/UsersList.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { Text, View, FlatList } from 'react-native'; +import { useSelector } from 'react-redux'; + +import { useTheme } from '../../theme'; +import { IReaction, IApplicationState } from '../../definitions'; +import Avatar from '../Avatar'; +import styles from './styles'; + +const UsersList = ({ tabLabel }: { tabLabel: IReaction }): React.ReactElement => { + const { colors } = useTheme(); + const useRealName = useSelector((state: IApplicationState) => state.settings.UI_Use_Real_Name); + + const { emoji, usernames, names } = tabLabel; + const users = + names?.length > 0 + ? usernames.map((username, index) => ({ username, name: names[index] })) + : usernames.map(username => ({ username, name: '' })); + + return ( + + + {emoji} + + + } + renderItem={({ item }) => ( + + + + + {useRealName && item.name ? item.name : item.username} + + + + )} + keyExtractor={item => item.username} + testID={`usersList-${emoji}`} + /> + ); +}; + +export default UsersList; diff --git a/app/containers/ReactionsList/index.tsx b/app/containers/ReactionsList/index.tsx new file mode 100644 index 000000000..ec55057ab --- /dev/null +++ b/app/containers/ReactionsList/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { View } from 'react-native'; +import ScrollableTabView from 'react-native-scrollable-tab-view'; + +import { TGetCustomEmoji } from '../../definitions/IEmoji'; +import { IReaction } from '../../definitions'; +import I18n from '../../i18n'; +import styles from './styles'; +import AllTab from './AllTab'; +import UsersList from './UsersList'; +import ReactionsTabBar from './ReactionsTabBar'; + +interface IReactionsListProps { + getCustomEmoji: TGetCustomEmoji; + reactions?: IReaction[]; +} + +const ReactionsList = ({ reactions, getCustomEmoji }: IReactionsListProps): React.ReactElement => { + // sorting reactions in descending order on the basic of number of users reacted + const sortedReactions = reactions?.sort((reaction1, reaction2) => reaction2.usernames.length - reaction1.usernames.length); + const allTabLabel = { emoji: I18n.t('All'), usernames: [], names: [], _id: 'All' }; + return ( + + }> + + {sortedReactions?.map(reaction => ( + + ))} + + + ); +}; + +export default ReactionsList; diff --git a/app/containers/ReactionsList/styles.ts b/app/containers/ReactionsList/styles.ts new file mode 100644 index 000000000..34885f216 --- /dev/null +++ b/app/containers/ReactionsList/styles.ts @@ -0,0 +1,88 @@ +import { StyleSheet } from 'react-native'; + +import sharedStyles from '../../views/Styles'; + +export const MIN_TAB_WIDTH = 70; + +export default StyleSheet.create({ + container: { + flex: 1 + }, + allTabContainer: { + flex: 1 + }, + tabBarItem: { + paddingBottom: 4, + height: 44, + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'row' + }, + listContainer: { + marginHorizontal: 12, + marginVertical: 8, + paddingBottom: 30 + }, + reactionCount: { + marginLeft: 4, + ...sharedStyles.textSemibold + }, + emojiNameContainer: { + marginVertical: 8 + }, + emojiName: { + fontSize: 14, + ...sharedStyles.textMedium + }, + listItemContainer: { + marginVertical: 6, + flexDirection: 'row', + alignItems: 'center' + }, + textContainer: { + flex: 1, + marginLeft: 8, + justifyContent: 'center' + }, + usernameText: { + fontSize: 16, + ...sharedStyles.textSemibold + }, + standardEmojiStyle: { + fontSize: 20, + width: 24, + height: 24, + textAlign: 'center', + color: '#fff' + }, + customEmojiStyle: { + width: 24, + height: 24 + }, + allTabItem: { + fontSize: 16, + ...sharedStyles.textSemibold + }, + allTabStandardEmojiStyle: { + fontSize: 30, + width: 36, + textAlign: 'center', + color: '#fff' + }, + allTabCustomEmojiStyle: { + width: 36, + height: 36 + }, + allListItemContainer: { + flexDirection: 'row', + alignItems: 'center' + }, + allListNPeopleReacted: { + fontSize: 14, + ...sharedStyles.textMedium + }, + allListWhoReacted: { + fontSize: 14, + ...sharedStyles.textRegular + } +}); diff --git a/app/containers/message/Attachments.tsx b/app/containers/message/Attachments.tsx index a581f194e..8731d1505 100644 --- a/app/containers/message/Attachments.tsx +++ b/app/containers/message/Attachments.tsx @@ -114,7 +114,16 @@ const Attachments: React.FC = React.memo( ); } - return ; + return ( + + ); }); return <>{attachmentsElements}; }, diff --git a/app/definitions/IReaction.ts b/app/definitions/IReaction.ts index a28f5d06e..113b3a0af 100644 --- a/app/definitions/IReaction.ts +++ b/app/definitions/IReaction.ts @@ -2,4 +2,5 @@ export interface IReaction { _id: string; emoji: string; usernames: string[]; + names: string[]; } diff --git a/app/lib/methods/helpers/normalizeMessage.ts b/app/lib/methods/helpers/normalizeMessage.ts index a0e7d6409..bb31d5858 100644 --- a/app/lib/methods/helpers/normalizeMessage.ts +++ b/app/lib/methods/helpers/normalizeMessage.ts @@ -38,7 +38,8 @@ export default (msg: any): IMessage | IThreadResult | null => { msg.reactions = Object.keys(msg.reactions).map(key => ({ _id: `${msg._id}${key}`, emoji: key, - usernames: msg.reactions ? msg.reactions[key].usernames : [] + usernames: msg.reactions ? msg.reactions[key].usernames : [], + names: msg.reactions ? msg.reactions[key].names : [] })); } if (msg.translations && Object.keys(msg.translations).length) { diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 1b6d4081e..4b76660a2 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -862,18 +862,11 @@ class RoomView extends React.Component { onReactionLongPress = (message: TAnyMessageModel) => { this.setState({ selectedMessage: message }); - const { showActionSheet, baseUrl, width } = this.props; + const { showActionSheet } = this.props; const { selectedMessage } = this.state; this.messagebox?.current?.closeEmojiAndAction(showActionSheet, { - children: ( - - ), - snaps: ['50%'], + children: , + snaps: ['50%', '80%'], enableContentPanningGesture: false }); }; diff --git a/e2e/tests/room/02-room.spec.ts b/e2e/tests/room/02-room.spec.ts index 266da5e27..7e449fe64 100644 --- a/e2e/tests/room/02-room.spec.ts +++ b/e2e/tests/room/02-room.spec.ts @@ -306,7 +306,7 @@ describe('Room screen', () => { .withTimeout(60000); }); - it('should show reaction picker on add reaction button pressed and have frequently used emoji, and dismiss review nag', async () => { + it('should show reaction picker on add reaction button pressed and have frequently used emoji', async () => { await element(by.id('message-add-reaction')).tap(); await waitFor(element(by.id('reaction-picker'))) .toExist() @@ -324,6 +324,19 @@ describe('Room screen', () => { .withTimeout(60000); }); + it('should ask for review', async () => { + await dismissReviewNag(); // TODO: Create a proper test for this elsewhere. + }); + + it('should open/close reactions list', async () => { + await element(by.id('message-reaction-:grinning:')).longPress(); + await waitFor(element(by.id('reactionsList'))) + .toExist() + .withTimeout(4000); + await expect(element(by.id('action-sheet-handle'))).toBeVisible(); + await element(by.id('action-sheet-handle')).swipe('down', 'fast', 0.5); + }); + it('should remove reaction', async () => { await element(by.id('message-reaction-:grinning:')).tap(); await waitFor(element(by.id('message-reaction-:grinning:'))) @@ -331,10 +344,6 @@ describe('Room screen', () => { .withTimeout(60000); }); - it('should ask for review', async () => { - await dismissReviewNag(); // TODO: Create a proper test for this elsewhere. - }); - it('should edit message', async () => { await mockMessage('edit'); await element(by[textMatcher](`${data.random}edit`))