chat.stories.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { v4 as uuid } from 'uuid'
  2. import { ContextRoot } from '../js/shared/context/root-context'
  3. import ChatPane from '../js/features/chat/components/chat-pane'
  4. import { stubMathJax } from '../../test/frontend/features/chat/components/stubs'
  5. import { setupContext } from './fixtures/context'
  6. import useFetchMock from './hooks/use-fetch-mock'
  7. const ONE_MINUTE = 60 * 1000
  8. const user = {
  9. id: 'fake_user',
  10. first_name: 'mortimer',
  11. email: 'fake@example.com',
  12. }
  13. const user2 = {
  14. id: 'another_fake_user',
  15. first_name: 'leopold',
  16. email: 'another_fake@example.com',
  17. }
  18. function generateMessages(count) {
  19. const messages = []
  20. let timestamp = new Date().getTime() // newest message goes first
  21. for (let i = 0; i <= count; i++) {
  22. const author = Math.random() > 0.5 ? user : user2
  23. // modify the timestamp so the previous message has 70% chances to be within 5 minutes from
  24. // the current one, for grouping purposes
  25. timestamp -= (4.3 + Math.random()) * ONE_MINUTE
  26. messages.push({
  27. id: uuid(),
  28. content: `message #${i}`,
  29. user: author,
  30. timestamp,
  31. })
  32. }
  33. return messages
  34. }
  35. stubMathJax()
  36. setupContext()
  37. export const Conversation = args => {
  38. useFetchMock(fetchMock => {
  39. fetchMock.get(/messages/, generateMessages(35)).post(/messages/, {})
  40. })
  41. return <ChatPane {...args} />
  42. }
  43. export const NoMessages = args => {
  44. useFetchMock(fetchMock => {
  45. fetchMock.get(/messages/, [])
  46. })
  47. return <ChatPane {...args} />
  48. }
  49. export const Loading = args => {
  50. useFetchMock(fetchMock => {
  51. fetchMock.get(/messages/, generateMessages(6), {
  52. delay: 1000 * 10,
  53. })
  54. })
  55. return <ChatPane {...args} />
  56. }
  57. export default {
  58. title: 'Chat',
  59. component: ChatPane,
  60. argTypes: {
  61. resetUnreadMessages: { action: 'resetUnreadMessages' },
  62. },
  63. args: {
  64. resetUnreadMessages: () => {},
  65. },
  66. decorators: [
  67. Story => (
  68. <>
  69. <style>{'html, body, .chat { height: 100%; width: 100%; }'}</style>
  70. <ContextRoot ide={window._ide} settings={{}}>
  71. <Story />
  72. </ContextRoot>
  73. </>
  74. ),
  75. ],
  76. }