You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/conversation/Quote.md

29 KiB

With a quotation, text-only replies

Plain text

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

With emoji

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="About 🔥six🔥"
    i18n={util.i18n}
    quote={{
      text: 'How many 🔥ferrets🔥 do you have?',
      attachments: [],
      authorName: 'Mr. 🔥Fire🔥',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="About 🔥six🔥"
    i18n={util.i18n}
    quote={{
      text: 'How many 🔥ferrets🔥 do you have?',
      attachments: [],
      authorName: 'Mr. 🔥Fire🔥',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Replies to you or yourself

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
      isFromMe: true,
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
      isFromMe: true,
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

In a group conversation

<util.ConversationContext theme={util.theme} type="group">
  <Message
    direction="incoming"
    timestamp={Date.now()}
    conversationType="group"
    authorName="Mr. 🔥Fire🔥"
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    authorAvatarPath={util.gifObjectUrl}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    conversationType="group"
    authorName="Mr. 🔥Fire🔥"
    status="sending"
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    authorAvatarPath={util.gifObjectUrl}
  />
</util.ConversationContext>

A lot of text in quotation

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

A lot of text in quotation, with icon

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

A lot of text in quotation, with image

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Woo, otters!"
    i18n={util.i18n}
    quote={{
      text:
        'I have lots of things to say. First, I enjoy otters. Second best are cats. ' +
        'After that, probably dogs. And then, you know, reptiles of all types. ' +
        'Then birds. They are dinosaurs, after all. Then cephalapods, because they are ' +
        'really smart.',
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Image with caption

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Totally, it's a pretty unintuitive concept."
    i18n={util.i18n}
    quote={{
      text: 'I am pretty confused about Pi.',
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Totally, it's a pretty unintuitive concept."
    i18n={util.i18n}
    quote={{
      text: 'I am pretty confused about Pi.',
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Image

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Yeah, pi. Tough to wrap your head around."
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Yeah, pi. Tough to wrap your head around."
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Image with no thumbnail

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Yeah, pi. Tough to wrap your head around."
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Yeah, pi. Tough to wrap your head around."
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'image/gif',
          fileName: 'pi.gif',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Video with caption

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Sweet the way the video sneaks up on you!"
    i18n={util.i18n}
    quote={{
      text: 'Check out this video I found!',
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Sweet the way the video sneaks up on you!"
    i18n={util.i18n}
    quote={{
      text: 'Check out this video I found!',
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Video

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Awesome!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Awesome!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
            objectUrl: util.gifObjectUrl,
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Video with no thumbnail

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Awesome!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Awesome!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'video/mp4',
          fileName: 'freezing_bubble.mp4',
          thumbnail: {
            contentType: 'image/gif',
          },
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Audio with caption

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="I really like it!"
    i18n={util.i18n}
    quote={{
      text: 'Check out this beautiful song!',
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="I really like it!"
    i18n={util.i18n}
    quote={{
      text: 'Check out this beautiful song!',
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Audio

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="I really like it!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="I really like it!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Voice message

const outgoing = new Whisper.Message({
  type: 'outgoing',
  body: 'I really like it!',
  sent_at: Date.now() - 18000000,
  quote: {
    author: '+12025550011',
    id: Date.now() - 1000,
    attachments: [
      {
        contentType: 'audio/mp3',
        fileName: 'agnus_dei.mp4',
      },
    ],
  },
});
const incoming = new Whisper.Message(
  Object.assign({}, outgoing.attributes, {
    source: '+12025550011',
    type: 'incoming',
    quote: Object.assign({}, outgoing.attributes.quote, {
      author: '+12025550005',
    }),
  })
);
const View = Whisper.MessageView;
<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Thanks for letting me know!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
          // Note: generated from 'flags' attribute, proposed afternoon of
          //   4/6 in Quoted Replies group
          isVoiceMessage: true,
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Thanks for letting me know!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'audio/mp3',
          fileName: 'agnus_dei.mp4',
          isVoiceMessage: true,
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>;

Other file type with caption

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="I can't read latin."
    i18n={util.i18n}
    quote={{
      text: 'This is my manifesto. Tell me what you think!',
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="I can't read latin."
    i18n={util.i18n}
    quote={{
      text: 'This is my manifesto. Tell me what you think!',
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Other file type

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    text="Sorry, I can't read latin!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    color="green"
    text="Sorry, I can't read latin!"
    i18n={util.i18n}
    quote={{
      attachments: [
        {
          contentType: 'text/plain',
          fileName: 'lorum_ipsum.txt',
        },
      ],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

With a quotation, including attachment

Quote, image attachment, and caption

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      url: util.gifObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      url: util.gifObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    text="About six"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Quote, image attachment

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      url: util.gifObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      url: util.gifObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Quote, portrait image attachment

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      url: util.portraitYellowObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      url: util.portraitYellowObjectUrl,
      fileName: 'pi.gif',
      contentType: 'image/gif',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Quote, video attachment

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      url: util.mp4ObjectUrl,
      fileName: 'freezing_bubble.mp4',
      contentType: 'video/mp4',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      url: util.mp4ObjectUrl,
      fileName: 'freezing_bubble.mp4',
      contentType: 'video/mp4',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Quote, audio attachment

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      data: util.mp3ObjectUrl,
      fileName: 'agnus_dei.mp3',
      contentType: 'audio/mp3',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      data: util.mp3ObjectUrl,
      fileName: 'agnus_dei.mp3',
      contentType: 'audio/mp3',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

Quote, file attachment

<util.ConversationContext theme={util.theme}>
  <Message
    direction="incoming"
    timestamp={Date.now()}
    color="green"
    attachment={{
      data: util.txtObjectUrl,
      fileName: 'lorum_ipsum.txt',
      contentType: 'text/plain',
      fileSize: '3.05 KB',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
  <Message
    direction="outgoing"
    timestamp={Date.now()}
    status="sending"
    attachment={{
      data: util.txtObjectUrl,
      fileName: 'lorum_ipsum.txt',
      contentType: 'text/plain',
      fileSize: '3.05 KB',
    }}
    onClickQuote={() => console.log('onClickQuote')}
    color="green"
    i18n={util.i18n}
    quote={{
      text: 'How many ferrets do you have?',
      attachments: [],
      authorPhoneNumber: '(202) 555-0011',
    }}
    onClickQuote={() => console.log('onClickQuote')}
  />
</util.ConversationContext>

In bottom bar

Plain text

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      i18n={window.i18n}
    />
  </div>
</div>

With an icon

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      i18n={window.i18n}
      attachments={[
        {
          contentType: 'image/jpeg',
          fileName: 'llama.jpg',
        },
      ]}
    />
  </div>
</div>

With an image

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      i18n={window.i18n}
      attachments={[
        {
          contentType: 'image/gif',
          fileName: 'llama.gif',
          thumbnail: {
            objectUrl: util.gifObjectUrl,
          },
        },
      ]}
    />
  </div>
</div>

With a close button

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      onClose={() => console.log('Close was clicked!')}
      i18n={window.i18n}
    />
  </div>
</div>

With a close button and icon

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      onClose={() => console.log('Close was clicked!')}
      i18n={window.i18n}
      attachments={[
        {
          contentType: 'image/jpeg',
          fileName: 'llama.jpg',
        },
      ]}
    />
  </div>
</div>

With a close button and image

<div className={util.theme}>
  <div className="bottom-bar">
    <Quote
      text="How many ferrets do you have?"
      authorColor="blue"
      authorTitle={util.ourNumber}
      authorProfileName="Mr. Blue"
      id={Date.now() - 1000}
      onClose={() => console.log('Close was clicked!')}
      i18n={window.i18n}
      attachments={[
        {
          contentType: 'image/gif',
          fileName: 'llama.gif',
          thumbnail: {
            objectUrl: util.gifObjectUrl,
          },
        },
      ]}
    />
  </div>
</div>