/* eslint-disable import/no-extraneous-dependencies */ import React from 'react'; 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 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'; const _theme = 'light'; const styles = StyleSheet.create({ }); const user = { id: 'y8bd77ptZswPj3EW8', username: 'diego.mello', token: '79q6lH40W4ZRGLOshDiDiVlQaCc4f_lU9HNdHLAzuHz' }; const author = { _id: 'userid', username: 'diego.mello' }; const baseUrl = 'https://open.rocket.chat'; const date = new Date(2017, 10, 10, 10); const longText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; const getCustomEmoji = (content) => { const customEmoji = { marioparty: { name: content, extension: 'gif' }, react_rocket: { name: content, extension: 'png' }, nyan_rocket: { name: content, extension: 'png' } }[content]; return customEmoji; }; export const MessageDecorator = story => ( <MessageContext.Provider value={{ user, baseUrl, onPress: () => {}, onLongPress: () => {}, reactionInit: () => {}, onErrorPress: () => {}, replyBroadcast: () => {}, onReactionPress: () => {}, onDiscussionPress: () => {}, onReactionLongPress: () => {}, threadBadgeColor: themes.light.tunreadColor }} > {story()} </MessageContext.Provider> ); export const Message = props => ( <MessageComponent baseUrl={baseUrl} user={user} author={author} ts={date} timeFormat='LT' isHeader getCustomEmoji={getCustomEmoji} theme={_theme} {...props} /> ); export const StoryProvider = story => <Provider store={store}>{story()}</Provider>; const MessageScrollView = story => <ScrollView style={{ backgroundColor: themes[_theme].backgroundColor }}>{story()}</ScrollView>; const stories = storiesOf('Message', module) .addDecorator(StoryProvider) .addDecorator(MessageScrollView) .addDecorator(MessageDecorator); stories.add('Basic', () => ( <> <Message msg='Message' /> <Message msg={longText} /> </> )); stories.add('Grouped messages', () => ( <> <Message msg='...' /> <Message msg='Different user' author={{ ...author, username: longText }} /> <Message msg='This is the third message' isHeader={false} /> <Message msg='This is the second message' isHeader={false} /> <Message msg='This is the first message' /> </> )); stories.add('Without header', () => ( <Message msg='Message' isHeader={false} /> )); stories.add('With alias', () => ( <> <Message msg='Message' alias='Diego Mello' /> <Message msg='Message' author={{ ...author, username: longText }} alias='Diego Mello' /> </> )); stories.add('Edited', () => ( <Message msg='Message' edited /> )); stories.add('Encrypted', () => ( <> <Message msg='Message' type='e2e' /> <Message msg='Message Encrypted without Header' isHeader={false} type='e2e' /> <Message msg='Message Encrypted with Reactions' reactions={[{ emoji: ':joy:', usernames: [user.username] }, { emoji: ':marioparty:', usernames: [user.username] }, { emoji: ':thinking:', usernames: [user.username] }]} onReactionPress={() => {}} type='e2e' /> <Message msg='Thread reply encrypted' tmid='1' tmsg='Thread with emoji :) :joy:' isThreadReply type='e2e' /> <Message msg='Temp message encrypted' status={messagesStatus.TEMP} isTemp type='e2e' /> <Message msg='Message Edited encrypted' edited type='e2e' /> <Message hasError msg='This message has error and is encrypted' status={messagesStatus.ERROR} onErrorPress={() => alert('Error pressed')} type='e2e' /> <Message msg='Read Receipt encrypted with Header' isReadReceiptEnabled read type='e2e' /> <Message msg='Read Receipt encrypted without Header' isReadReceiptEnabled read isHeader={false} type='e2e' /> </> )); stories.add('Block Quote', () => ( <> <Message msg='> Testing block quote' /> <Message msg={'> Testing block quote\nTesting block quote'} /> </> )); stories.add('Lists', () => ( <> <Message msg={'* Dogs\n * cats\n - cats'} /> <Message msg={'1. Dogs \n 2. Cats'} /> <Message msg='1. Dogs' /> <Message msg='2. Cats' isHeader={false} /> </> )); stories.add('Static avatar', () => ( <Message msg='Message' avatar='https://pbs.twimg.com/profile_images/1016397063649660929/14EIApTi_400x400.jpg' /> )); stories.add('Full name', () => ( <Message msg='Message' author={{ ...author, username: 'diego.mello', name: 'Diego Mello' }} useRealName /> )); stories.add('Mentions', () => ( <> <Message msg='@rocket.cat @diego.mello @all @here #general' mentions={[{ username: 'rocket.cat' }, { username: 'diego.mello' }, { username: 'all' }, { username: 'here' }]} channels={[{ name: 'general' }]} /> <Message msg='@rocket.cat Lorem ipsum dolor @diego.mello sit amet, @all consectetur adipiscing @here elit, sed do eiusmod tempor #general incididunt ut labore et dolore magna aliqua.' mentions={[{ username: 'rocket.cat' }, { username: 'diego.mello' }, { username: 'all' }, { username: 'here' }]} channels={[{ name: 'general' }]} /> </> )); stories.add('Emojis', () => ( <> <Message msg='👊🤙👏' /> <Message msg='👏' /> <Message msg=':react_rocket: :nyan_rocket: :marioparty:' /> <Message msg=':react_rocket:' /> <Message msg='🤙:react_rocket:' /> <Message msg='🤙:react_rocket:🤙🤙' /> </> )); stories.add('Time format', () => ( <Message msg='Testing' timeFormat='DD MMMM YYYY' /> )); stories.add('Reactions', () => ( <> <Message msg='Reactions' reactions={[{ emoji: ':joy:', usernames: [user.username] }, { emoji: ':marioparty:', usernames: new Array(99) }, { emoji: ':thinking:', usernames: new Array(999) }, { emoji: ':thinking:', usernames: new Array(9999) }]} onReactionPress={() => {}} /> <Message msg='Multiple Reactions' reactions={[{ emoji: ':marioparty:', usernames: [user.username] }, { emoji: ':react_rocket:', usernames: [user.username] }, { emoji: ':nyan_rocket:', usernames: [user.username] }, { emoji: ':heart:', usernames: [user.username] }, { emoji: ':dog:', usernames: [user.username] }, { emoji: ':grinning:', usernames: [user.username] }, { emoji: ':grimacing:', usernames: [user.username] }, { emoji: ':grin:', usernames: [user.username] }]} onReactionPress={() => {}} /> </> )); stories.add('Date and Unread separators', () => ( <> <Message msg='Fourth message' author={{ ...author, username: 'rocket.cat' }} /> <MessageSeparator ts={date} unread theme={_theme} /> <Message msg='Third message' /> <MessageSeparator unread theme={_theme} /> <Message msg='Second message' author={{ ...author, username: 'rocket.cat' }} isHeader={false} /> <Message msg='Second message' author={{ ...author, username: 'rocket.cat' }} /> <MessageSeparator ts={date} theme={_theme} /> <Message msg='First message' /> </> )); stories.add('With image', () => ( <> <Message attachments={[{ title: 'This is a title', description: 'This is a description', image_url: '/dummypath' }]} /> <Message attachments={[{ title: 'This is a title', description: 'This is a description :nyan_rocket:', image_url: '/dummypath' }]} /> </> )); stories.add('With video', () => ( <> <Message attachments={[{ title: 'This is a title', description: 'This is a description :nyan_rocket:', video_url: '/dummypath' }]} /> <Message attachments={[{ title: 'This is a title', video_url: '/dummypath' }]} /> </> )); stories.add('With audio', () => ( <> <Message attachments={[{ title: 'This is a title', description: 'This is a description :nyan_rocket:', audio_url: '/dummypath' }]} /> <Message msg='First message' isHeader={false} /> <Message attachments={[{ title: 'This is a title', description: 'This is a description', audio_url: '/dummypath' }]} isHeader={false} /> <Message attachments={[{ title: 'This is a title', audio_url: '/dummypath' }]} isHeader={false} /> <Message attachments={[{ title: 'This is a title', audio_url: '/dummypath' }]} isHeader={false} /> </> )); stories.add('With file', () => ( <> <Message attachments={[{ text: 'File.pdf', description: 'This is a description :nyan_rocket:' }]} /> <Message attachments={[{ text: 'File.pdf', description: 'This is a description :nyan_rocket:' }]} isHeader={false} /> </> )); stories.add('Message with reply', () => ( <> <Message msg="I'm fine!" attachments={[{ author_name: 'I\'m a very long long title and I\'ll break', ts: date, timeFormat: 'LT', text: 'How are you?' }]} /> <Message msg="I'm fine!" attachments={[{ author_name: 'rocket.cat', ts: date, timeFormat: 'LT', text: 'How are you? :nyan_rocket:' }]} /> </> )); stories.add('Message with read receipt', () => ( <> <Message msg="I'm fine!" isReadReceiptEnabled unread /> <Message msg="I'm fine!" isReadReceiptEnabled unread isHeader={false} /> <Message msg="I'm fine!" isReadReceiptEnabled read /> <Message msg="I'm fine!" isReadReceiptEnabled read isHeader={false} /> </> )); stories.add('Message with thread', () => ( <> <Message msg='How are you?' tcount={1} tlm={date} /> <Message msg="I'm fine!" tmid='1' tmsg='How are you?' isThreadReply /> <Message msg="I'm fine!" tmid='1' tmsg='Thread with emoji :) :joy:' isThreadReply /> <Message msg="I'm fine!" tmid='1' tmsg={longText} isThreadReply /> <Message msg={longText} tmid='1' tmsg='How are you?' isThreadReply /> <Message msg={longText} tmid='1' tmsg={longText} isThreadReply /> <Message tmid='1' tmsg='Thread with attachment' attachments={[{ title: 'This is a title', description: 'This is a description :nyan_rocket:', audio_url: '/file-upload/c4wcNhrbXJLBvAJtN/1535569819516.aac' }]} isThreadReply /> </> )); stories.add('Sequential thread messages following thread button', () => ( <> <Message msg='How are you?' tcount={1} tlm={date} /> <Message msg="I'm fine!" tmid='1' isThreadSequential /> <Message msg={longText} tmid='1' isThreadSequential /> <Message attachments={[{ title: 'This is a title', description: 'This is a description', audio_url: '/file-upload/c4wcNhrbXJLBvAJtN/1535569819516.aac' }]} tmid='1' isThreadSequential /> </> )); stories.add('Sequential thread messages following thread reply', () => ( <> <Message msg="I'm fine!" tmid='1' tmsg='How are you?' isThreadReply /> <Message msg='Cool!' tmid='1' isThreadSequential /> <Message msg={longText} tmid='1' isThreadSequential /> <Message attachments={[{ title: 'This is a title', description: 'This is a description', audio_url: '/file-upload/c4wcNhrbXJLBvAJtN/1535569819516.aac' }]} tmid='1' isThreadSequential /> </> )); stories.add('Discussion', () => ( <> <Message type='discussion-created' drid='aisduhasidhs' dcount={null} dlm={null} msg='This is a discussion' /> <Message type='discussion-created' drid='aisduhasidhs' dcount={1} dlm={date} msg='This is a discussion' /> <Message type='discussion-created' drid='aisduhasidhs' dcount={10} dlm={date} msg={longText} /> <Message type='discussion-created' drid='aisduhasidhs' dcount={1000} dlm={date} msg='This is a discussion' /> </> )); stories.add('URL', () => ( <> <Message urls={[{ url: 'https://rocket.chat', image: 'https://rocket.chat/images/blog/post.jpg', title: 'Rocket.Chat - Free, Open Source, Enterprise Team Chat', description: 'Rocket.Chat is the leading open source team chat software solution. Free, unlimited and completely customizable with on-premises and SaaS cloud hosting.' }, { url: 'https://google.com', title: 'Google', description: 'Search the world\'s information, including webpages, images, videos and more. Google has many special features to help you find exactly what you\'re looking for.' }]} /> <Message urls={[{ url: 'https://google.com', title: 'Google', description: 'Search the world\'s information, including webpages, images, videos and more. Google has many special features to help you find exactly what you\'re looking for.' }]} msg='Message :nyan_rocket:' /> <Message urls={[{ url: 'https://google.com', title: 'Google', description: 'Search the world\'s information, including webpages, images, videos and more. Google has many special features to help you find exactly what you\'re looking for.' }]} isHeader={false} /> </> )); stories.add('Custom fields', () => ( <> <Message msg='Message' attachments={[{ author_name: 'rocket.cat', ts: date, timeFormat: 'LT', text: 'Custom fields', fields: [{ title: 'Field 1', value: 'Value 1' }, { title: 'Field 2', value: 'Value 2' }, { title: 'Field 3', value: 'Value 3' }, { title: 'Field 4', value: 'Value 4' }, { title: 'Field 5', value: 'Value 5' }] }]} /> </> )); stories.add('Two short custom fields with markdown', () => ( <Message msg='Message' attachments={[{ author_name: 'rocket.cat', ts: date, timeFormat: 'LT', text: 'Custom fields', fields: [{ title: 'Field 1', value: 'Value 1', short: true }, { title: 'Field 2', value: '[Value 2](https://google.com/)', short: true }] }, { author_name: 'rocket.cat', ts: date, timeFormat: 'LT', text: 'Custom fields 2', fields: [{ title: 'Field 1', value: 'Value 1', short: true }, { title: 'Field 2', value: '**Value 2**', short: true }] }]} /> )); stories.add('Colored attachments', () => ( <Message attachments={[{ color: 'red', fields: [{ title: 'Field 1', value: 'Value 1', short: true }, { title: 'Field 2', value: 'Value 2', short: true }] }, { color: 'green', fields: [{ title: 'Field 1', value: 'Value 1', short: true }, { title: 'Field 2', value: 'Value 2', short: true }] }, { color: 'blue', fields: [{ title: 'Field 1', value: 'Value 1', short: true }, { title: 'Field 2', value: 'Value 2', short: true }] }]} /> )); stories.add('Broadcast', () => ( <Message msg='Broadcasted message' broadcast replyBroadcast={() => alert('broadcast!')} /> )); stories.add('Archived', () => ( <Message msg='This message is inside an archived room' archived /> )); stories.add('Error', () => ( <> <Message hasError msg='This message has error' status={messagesStatus.ERROR} onErrorPress={() => alert('Error pressed')} /> <Message hasError msg='This message has error too' status={messagesStatus.ERROR} onErrorPress={() => alert('Error pressed')} isHeader={false} /> </> )); stories.add('Temp', () => ( <Message msg='Temp message' status={messagesStatus.TEMP} isTemp /> )); stories.add('Editing', () => ( <Message msg='Message being edited' editing /> )); stories.add('System messages', () => ( <> <Message type='rm' isInfo /> <Message type='uj' isInfo /> <Message msg='New name' type='message_pinned' isInfo attachments={[{ author_name: 'rocket.cat', ts: date, timeFormat: 'LT', text: 'First message' }]} /> <Message type='ul' isInfo /> <Message msg='rocket.cat' type='ru' isInfo /> <Message msg='rocket.cat' type='au' isInfo /> <Message msg='rocket.cat' type='user-muted' isInfo /> <Message msg='rocket.cat' type='user-unmuted' isInfo /> <Message msg='rocket.cat' role='admin' type='subscription-role-added' isInfo /> <Message msg='rocket.cat' role='admin' type='subscription-role-removed' isInfo /> <Message msg='New name' type='r' isInfo /> <Message msg='new description' type='room_changed_description' isInfo /> <Message msg='new announcement' type='room_changed_announcement' isInfo /> <Message msg='new topic' type='room_changed_topic' isInfo /> <Message msg='public' type='room_changed_privacy' isInfo /> <Message type='room_e2e_disabled' isInfo /> <Message type='room_e2e_enabled' isInfo /> </> )); stories.add('Ignored', () => ( <Message isIgnored /> )); stories.add('Custom style', () => ( <Message msg='Message' style={[styles.normalize, { backgroundColor: '#ddd' }]} /> ));