@sendbird/uikit-react-native-foundation 3.0.4 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/lib/commonjs/components/Icon/index.js +12 -0
  2. package/lib/commonjs/components/Icon/index.js.map +1 -1
  3. package/lib/commonjs/components/VideoThumbnail/index.js +115 -0
  4. package/lib/commonjs/components/VideoThumbnail/index.js.map +1 -0
  5. package/lib/commonjs/index.js +7 -0
  6. package/lib/commonjs/index.js.map +1 -1
  7. package/lib/commonjs/theme/DarkUIKitTheme.js +2 -1
  8. package/lib/commonjs/theme/DarkUIKitTheme.js.map +1 -1
  9. package/lib/commonjs/theme/LightUIKitTheme.js +2 -1
  10. package/lib/commonjs/theme/LightUIKitTheme.js.map +1 -1
  11. package/lib/commonjs/types.js.map +1 -1
  12. package/lib/commonjs/ui/BottomSheet/index.js +1 -0
  13. package/lib/commonjs/ui/BottomSheet/index.js.map +1 -1
  14. package/lib/commonjs/ui/Dialog/DialogSheet.js +4 -3
  15. package/lib/commonjs/ui/Dialog/DialogSheet.js.map +1 -1
  16. package/lib/commonjs/ui/GroupChannelMessage/Message.file.image.js +1 -1
  17. package/lib/commonjs/ui/GroupChannelMessage/Message.file.image.js.map +1 -1
  18. package/lib/commonjs/ui/GroupChannelMessage/Message.file.js +6 -9
  19. package/lib/commonjs/ui/GroupChannelMessage/Message.file.js.map +1 -1
  20. package/lib/commonjs/ui/GroupChannelMessage/Message.file.video.js +10 -72
  21. package/lib/commonjs/ui/GroupChannelMessage/Message.file.video.js.map +1 -1
  22. package/lib/commonjs/ui/GroupChannelMessage/MessageContainer.js +7 -5
  23. package/lib/commonjs/ui/GroupChannelMessage/MessageContainer.js.map +1 -1
  24. package/lib/commonjs/ui/GroupChannelMessage/MessageOpenGraph.js +2 -2
  25. package/lib/commonjs/ui/GroupChannelMessage/MessageOpenGraph.js.map +1 -1
  26. package/lib/commonjs/ui/GroupChannelMessage/index.js.map +1 -1
  27. package/lib/commonjs/ui/OpenChannelMessage/Message.file.image.js +1 -1
  28. package/lib/commonjs/ui/OpenChannelMessage/Message.file.image.js.map +1 -1
  29. package/lib/commonjs/ui/OpenChannelMessage/Message.file.js +2 -8
  30. package/lib/commonjs/ui/OpenChannelMessage/Message.file.js.map +1 -1
  31. package/lib/commonjs/ui/OpenChannelMessage/Message.file.video.js +11 -78
  32. package/lib/commonjs/ui/OpenChannelMessage/Message.file.video.js.map +1 -1
  33. package/lib/commonjs/ui/OpenChannelMessage/Message.user.og.js +1 -1
  34. package/lib/commonjs/ui/OpenChannelMessage/Message.user.og.js.map +1 -1
  35. package/lib/module/components/Icon/index.js +12 -0
  36. package/lib/module/components/Icon/index.js.map +1 -1
  37. package/lib/module/components/VideoThumbnail/index.js +105 -0
  38. package/lib/module/components/VideoThumbnail/index.js.map +1 -0
  39. package/lib/module/index.js +1 -0
  40. package/lib/module/index.js.map +1 -1
  41. package/lib/module/theme/DarkUIKitTheme.js +2 -1
  42. package/lib/module/theme/DarkUIKitTheme.js.map +1 -1
  43. package/lib/module/theme/LightUIKitTheme.js +2 -1
  44. package/lib/module/theme/LightUIKitTheme.js.map +1 -1
  45. package/lib/module/types.js.map +1 -1
  46. package/lib/module/ui/BottomSheet/index.js +1 -0
  47. package/lib/module/ui/BottomSheet/index.js.map +1 -1
  48. package/lib/module/ui/Dialog/DialogSheet.js +4 -3
  49. package/lib/module/ui/Dialog/DialogSheet.js.map +1 -1
  50. package/lib/module/ui/GroupChannelMessage/Message.file.image.js +2 -2
  51. package/lib/module/ui/GroupChannelMessage/Message.file.image.js.map +1 -1
  52. package/lib/module/ui/GroupChannelMessage/Message.file.js +7 -10
  53. package/lib/module/ui/GroupChannelMessage/Message.file.js.map +1 -1
  54. package/lib/module/ui/GroupChannelMessage/Message.file.video.js +11 -71
  55. package/lib/module/ui/GroupChannelMessage/Message.file.video.js.map +1 -1
  56. package/lib/module/ui/GroupChannelMessage/MessageContainer.js +7 -5
  57. package/lib/module/ui/GroupChannelMessage/MessageContainer.js.map +1 -1
  58. package/lib/module/ui/GroupChannelMessage/MessageOpenGraph.js +2 -2
  59. package/lib/module/ui/GroupChannelMessage/MessageOpenGraph.js.map +1 -1
  60. package/lib/module/ui/GroupChannelMessage/index.js.map +1 -1
  61. package/lib/module/ui/OpenChannelMessage/Message.file.image.js +2 -2
  62. package/lib/module/ui/OpenChannelMessage/Message.file.image.js.map +1 -1
  63. package/lib/module/ui/OpenChannelMessage/Message.file.js +2 -8
  64. package/lib/module/ui/OpenChannelMessage/Message.file.js.map +1 -1
  65. package/lib/module/ui/OpenChannelMessage/Message.file.video.js +12 -77
  66. package/lib/module/ui/OpenChannelMessage/Message.file.video.js.map +1 -1
  67. package/lib/module/ui/OpenChannelMessage/Message.user.og.js +1 -1
  68. package/lib/module/ui/OpenChannelMessage/Message.user.og.js.map +1 -1
  69. package/lib/typescript/src/components/Icon/index.d.ts +5 -0
  70. package/lib/typescript/src/components/VideoThumbnail/index.d.ts +13 -0
  71. package/lib/typescript/src/index.d.ts +1 -0
  72. package/lib/typescript/src/types.d.ts +1 -1
  73. package/lib/typescript/src/ui/BottomSheet/index.d.ts +1 -0
  74. package/lib/typescript/src/ui/Dialog/DialogSheet.d.ts +2 -1
  75. package/lib/typescript/src/ui/GroupChannelMessage/MessageContainer.d.ts +2 -2
  76. package/lib/typescript/src/ui/GroupChannelMessage/MessageOpenGraph.d.ts +1 -1
  77. package/lib/typescript/src/ui/GroupChannelMessage/index.d.ts +8 -0
  78. package/package.json +3 -3
  79. package/src/components/Icon/index.tsx +11 -7
  80. package/src/components/VideoThumbnail/index.tsx +107 -0
  81. package/src/index.ts +1 -0
  82. package/src/theme/DarkUIKitTheme.ts +1 -0
  83. package/src/theme/LightUIKitTheme.ts +1 -0
  84. package/src/types.ts +1 -1
  85. package/src/ui/BottomSheet/index.tsx +2 -0
  86. package/src/ui/Dialog/DialogSheet.tsx +6 -3
  87. package/src/ui/GroupChannelMessage/Message.file.image.tsx +2 -2
  88. package/src/ui/GroupChannelMessage/Message.file.tsx +4 -6
  89. package/src/ui/GroupChannelMessage/Message.file.video.tsx +12 -60
  90. package/src/ui/GroupChannelMessage/MessageContainer.tsx +18 -13
  91. package/src/ui/GroupChannelMessage/MessageOpenGraph.tsx +3 -3
  92. package/src/ui/GroupChannelMessage/index.ts +1 -0
  93. package/src/ui/OpenChannelMessage/Message.file.image.tsx +2 -2
  94. package/src/ui/OpenChannelMessage/Message.file.tsx +1 -3
  95. package/src/ui/OpenChannelMessage/Message.file.video.tsx +12 -55
  96. package/src/ui/OpenChannelMessage/Message.user.og.tsx +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["AdminMessage","FileMessage","ImageFileMessage","VideoFileMessage","UnknownMessage","UserMessage","OpenGraphUser","GroupChannelMessage","User","File","ImageFile","VideoFile","Admin","Unknown"],"sources":["index.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { SendbirdGroupChannel, SendbirdMessage, SendbirdUser } from '@sendbird/uikit-utils';\n\nimport AdminMessage from './Message.admin';\nimport FileMessage from './Message.file';\nimport ImageFileMessage from './Message.file.image';\nimport VideoFileMessage from './Message.file.video';\nimport UnknownMessage from './Message.unknown';\nimport UserMessage from './Message.user';\nimport OpenGraphUser from './Message.user.og';\n\nexport type GroupChannelMessageProps<T extends SendbirdMessage, AdditionalProps = unknown> = {\n channel: SendbirdGroupChannel;\n message: T;\n variant?: 'outgoing' | 'incoming';\n strings?: {\n senderName?: string;\n sentDate?: string;\n edited?: string;\n fileName?: string;\n unknownTitle?: string;\n unknownDescription?: string;\n };\n\n children?: React.ReactNode;\n sendingStatus?: React.ReactNode;\n\n groupedWithPrev: boolean;\n groupedWithNext: boolean;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressAvatar?: () => void;\n onPressURL?: (url: string) => void;\n onPressMentionedUser?: (mentionedUser?: SendbirdUser) => void;\n} & AdditionalProps;\n\nconst GroupChannelMessage = {\n User: UserMessage,\n OpenGraphUser: OpenGraphUser,\n File: FileMessage,\n ImageFile: ImageFileMessage,\n VideoFile: VideoFileMessage,\n Admin: AdminMessage,\n Unknown: UnknownMessage,\n};\n\nexport default GroupChannelMessage;\n"],"mappings":"AAIA,OAAOA,YAAY,MAAM,iBAAiB;AAC1C,OAAOC,WAAW,MAAM,gBAAgB;AACxC,OAAOC,gBAAgB,MAAM,sBAAsB;AACnD,OAAOC,gBAAgB,MAAM,sBAAsB;AACnD,OAAOC,cAAc,MAAM,mBAAmB;AAC9C,OAAOC,WAAW,MAAM,gBAAgB;AACxC,OAAOC,aAAa,MAAM,mBAAmB;AA2B7C,MAAMC,mBAAmB,GAAG;EAC1BC,IAAI,EAAEH,WAAW;EACjBC,aAAa,EAAEA,aAAa;EAC5BG,IAAI,EAAER,WAAW;EACjBS,SAAS,EAAER,gBAAgB;EAC3BS,SAAS,EAAER,gBAAgB;EAC3BS,KAAK,EAAEZ,YAAY;EACnBa,OAAO,EAAET;AACX,CAAC;AAED,eAAeG,mBAAmB"}
1
+ {"version":3,"names":["AdminMessage","FileMessage","ImageFileMessage","VideoFileMessage","UnknownMessage","UserMessage","OpenGraphUser","GroupChannelMessage","User","File","ImageFile","VideoFile","Admin","Unknown"],"sources":["index.ts"],"sourcesContent":["import type React from 'react';\n\nimport type { SendbirdGroupChannel, SendbirdMessage, SendbirdUser } from '@sendbird/uikit-utils';\n\nimport AdminMessage from './Message.admin';\nimport FileMessage from './Message.file';\nimport ImageFileMessage from './Message.file.image';\nimport VideoFileMessage from './Message.file.video';\nimport UnknownMessage from './Message.unknown';\nimport UserMessage from './Message.user';\nimport OpenGraphUser from './Message.user.og';\n\nexport type GroupChannelMessageProps<T extends SendbirdMessage, AdditionalProps = unknown> = {\n channel: SendbirdGroupChannel;\n message: T;\n variant?: 'outgoing' | 'incoming';\n strings?: {\n senderName?: string;\n sentDate?: string;\n edited?: string;\n fileName?: string;\n unknownTitle?: string;\n unknownDescription?: string;\n };\n\n children?: React.ReactNode;\n sendingStatus?: React.ReactNode;\n parentMessage?: React.ReactNode;\n\n groupedWithPrev: boolean;\n groupedWithNext: boolean;\n onPress?: () => void;\n onLongPress?: () => void;\n onPressAvatar?: () => void;\n onPressURL?: (url: string) => void;\n onPressMentionedUser?: (mentionedUser?: SendbirdUser) => void;\n} & AdditionalProps;\n\nconst GroupChannelMessage = {\n User: UserMessage,\n OpenGraphUser: OpenGraphUser,\n File: FileMessage,\n ImageFile: ImageFileMessage,\n VideoFile: VideoFileMessage,\n Admin: AdminMessage,\n Unknown: UnknownMessage,\n};\n\nexport default GroupChannelMessage;\n"],"mappings":"AAIA,OAAOA,YAAY,MAAM,iBAAiB;AAC1C,OAAOC,WAAW,MAAM,gBAAgB;AACxC,OAAOC,gBAAgB,MAAM,sBAAsB;AACnD,OAAOC,gBAAgB,MAAM,sBAAsB;AACnD,OAAOC,cAAc,MAAM,mBAAmB;AAC9C,OAAOC,WAAW,MAAM,gBAAgB;AACxC,OAAOC,aAAa,MAAM,mBAAmB;AA4B7C,MAAMC,mBAAmB,GAAG;EAC1BC,IAAI,EAAEH,WAAW;EACjBC,aAAa,EAAEA,aAAa;EAC5BG,IAAI,EAAER,WAAW;EACjBS,SAAS,EAAER,gBAAgB;EAC3BS,SAAS,EAAER,gBAAgB;EAC3BS,KAAK,EAAEZ,YAAY;EACnBa,OAAO,EAAET;AACX,CAAC;AAED,eAAeG,mBAAmB"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { getAvailableUriFromFileMessage } from '@sendbird/uikit-utils';
2
+ import { getThumbnailUriFromFileMessage } from '@sendbird/uikit-utils';
3
3
  import Box from '../../components/Box';
4
4
  import ImageWithPlaceholder from '../../components/ImageWithPlaceholder';
5
5
  import PressBox from '../../components/PressBox';
@@ -11,7 +11,7 @@ const ImageFileMessage = props => {
11
11
  onLongPress,
12
12
  ...rest
13
13
  } = props;
14
- const uri = getAvailableUriFromFileMessage(props.message);
14
+ const uri = getThumbnailUriFromFileMessage(props.message);
15
15
  return /*#__PURE__*/React.createElement(MessageContainer, rest, /*#__PURE__*/React.createElement(Box, {
16
16
  borderRadius: 8,
17
17
  overflow: 'hidden',
@@ -1 +1 @@
1
- {"version":3,"names":["React","getAvailableUriFromFileMessage","Box","ImageWithPlaceholder","PressBox","createStyleSheet","MessageContainer","ImageFileMessage","props","onPress","onLongPress","rest","uri","message","createElement","borderRadius","overflow","style","styles","container","activeOpacity","source","width","height","maxWidth"],"sources":["Message.file.image.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SendbirdFileMessage } from '@sendbird/uikit-utils';\nimport { getAvailableUriFromFileMessage } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport ImageWithPlaceholder from '../../components/ImageWithPlaceholder';\nimport PressBox from '../../components/PressBox';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\nconst ImageFileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage>) => {\n const { onPress, onLongPress, ...rest } = props;\n const uri = getAvailableUriFromFileMessage(props.message);\n return (\n <MessageContainer {...rest}>\n <Box borderRadius={8} overflow={'hidden'} style={styles.container}>\n <PressBox style={styles.container} activeOpacity={0.8} onPress={onPress} onLongPress={onLongPress}>\n <ImageWithPlaceholder source={{ uri }} width={'100%'} height={'100%'} />\n </PressBox>\n </Box>\n </MessageContainer>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n maxWidth: 296,\n height: 196,\n },\n});\n\nexport default ImageFileMessage;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,SAASC,8BAA8B,QAAQ,uBAAuB;AAEtE,OAAOC,GAAG,MAAM,sBAAsB;AACtC,OAAOC,oBAAoB,MAAM,uCAAuC;AACxE,OAAOC,QAAQ,MAAM,2BAA2B;AAChD,OAAOC,gBAAgB,MAAM,+BAA+B;AAC5D,OAAOC,gBAAgB,MAAM,oBAAoB;AAGjD,MAAMC,gBAAgB,GAAIC,KAAmD,IAAK;EAChF,MAAM;IAAEC,OAAO;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGH,KAAK;EAC/C,MAAMI,GAAG,GAAGX,8BAA8B,CAACO,KAAK,CAACK,OAAO,CAAC;EACzD,oBACEb,KAAA,CAAAc,aAAA,CAACR,gBAAgB,EAAKK,IAAI,eACxBX,KAAA,CAAAc,aAAA,CAACZ,GAAG;IAACa,YAAY,EAAE,CAAE;IAACC,QAAQ,EAAE,QAAS;IAACC,KAAK,EAAEC,MAAM,CAACC;EAAU,gBAChEnB,KAAA,CAAAc,aAAA,CAACV,QAAQ;IAACa,KAAK,EAAEC,MAAM,CAACC,SAAU;IAACC,aAAa,EAAE,GAAI;IAACX,OAAO,EAAEA,OAAQ;IAACC,WAAW,EAAEA;EAAY,gBAChGV,KAAA,CAAAc,aAAA,CAACX,oBAAoB;IAACkB,MAAM,EAAE;MAAET;IAAI,CAAE;IAACU,KAAK,EAAE,MAAO;IAACC,MAAM,EAAE;EAAO,EAAG,CAC/D,CACP,CACW;AAEvB,CAAC;AAED,MAAML,MAAM,GAAGb,gBAAgB,CAAC;EAC9Bc,SAAS,EAAE;IACTK,QAAQ,EAAE,GAAG;IACbD,MAAM,EAAE;EACV;AACF,CAAC,CAAC;AAEF,eAAehB,gBAAgB"}
1
+ {"version":3,"names":["React","getThumbnailUriFromFileMessage","Box","ImageWithPlaceholder","PressBox","createStyleSheet","MessageContainer","ImageFileMessage","props","onPress","onLongPress","rest","uri","message","createElement","borderRadius","overflow","style","styles","container","activeOpacity","source","width","height","maxWidth"],"sources":["Message.file.image.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SendbirdFileMessage } from '@sendbird/uikit-utils';\nimport { getThumbnailUriFromFileMessage } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport ImageWithPlaceholder from '../../components/ImageWithPlaceholder';\nimport PressBox from '../../components/PressBox';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\nconst ImageFileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage>) => {\n const { onPress, onLongPress, ...rest } = props;\n const uri = getThumbnailUriFromFileMessage(props.message);\n return (\n <MessageContainer {...rest}>\n <Box borderRadius={8} overflow={'hidden'} style={styles.container}>\n <PressBox style={styles.container} activeOpacity={0.8} onPress={onPress} onLongPress={onLongPress}>\n <ImageWithPlaceholder source={{ uri }} width={'100%'} height={'100%'} />\n </PressBox>\n </Box>\n </MessageContainer>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n maxWidth: 296,\n height: 196,\n },\n});\n\nexport default ImageFileMessage;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,SAASC,8BAA8B,QAAQ,uBAAuB;AAEtE,OAAOC,GAAG,MAAM,sBAAsB;AACtC,OAAOC,oBAAoB,MAAM,uCAAuC;AACxE,OAAOC,QAAQ,MAAM,2BAA2B;AAChD,OAAOC,gBAAgB,MAAM,+BAA+B;AAC5D,OAAOC,gBAAgB,MAAM,oBAAoB;AAGjD,MAAMC,gBAAgB,GAAIC,KAAmD,IAAK;EAChF,MAAM;IAAEC,OAAO;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGH,KAAK;EAC/C,MAAMI,GAAG,GAAGX,8BAA8B,CAACO,KAAK,CAACK,OAAO,CAAC;EACzD,oBACEb,KAAA,CAAAc,aAAA,CAACR,gBAAgB,EAAKK,IAAI,eACxBX,KAAA,CAAAc,aAAA,CAACZ,GAAG;IAACa,YAAY,EAAE,CAAE;IAACC,QAAQ,EAAE,QAAS;IAACC,KAAK,EAAEC,MAAM,CAACC;EAAU,gBAChEnB,KAAA,CAAAc,aAAA,CAACV,QAAQ;IAACa,KAAK,EAAEC,MAAM,CAACC,SAAU;IAACC,aAAa,EAAE,GAAI;IAACX,OAAO,EAAEA,OAAQ;IAACC,WAAW,EAAEA;EAAY,gBAChGV,KAAA,CAAAc,aAAA,CAACX,oBAAoB;IAACkB,MAAM,EAAE;MAAET;IAAI,CAAE;IAACU,KAAK,EAAE,MAAO;IAACC,MAAM,EAAE;EAAO,EAAG,CAC/D,CACP,CACW;AAEvB,CAAC;AAED,MAAML,MAAM,GAAGb,gBAAgB,CAAC;EAC9Bc,SAAS,EAAE;IACTK,QAAQ,EAAE,GAAG;IACbD,MAAM,EAAE;EACV;AACF,CAAC,CAAC;AAEF,eAAehB,gBAAgB"}
@@ -7,12 +7,6 @@ import Text from '../../components/Text';
7
7
  import createStyleSheet from '../../styles/createStyleSheet';
8
8
  import useUIKitTheme from '../../theme/useUIKitTheme';
9
9
  import MessageContainer from './MessageContainer';
10
- const iconMapper = {
11
- audio: 'file-audio',
12
- image: 'photo',
13
- video: 'play',
14
- file: 'file-document'
15
- };
16
10
  const FileMessage = props => {
17
11
  const {
18
12
  colors
@@ -47,8 +41,8 @@ const FileMessage = props => {
47
41
  borderRadius: 8,
48
42
  alignItems: 'flex-start',
49
43
  backgroundColor: colors.background
50
- }, /*#__PURE__*/React.createElement(Icon, {
51
- icon: iconMapper[type],
44
+ }, /*#__PURE__*/React.createElement(Icon.File, {
45
+ fileType: type,
52
46
  size: 32
53
47
  })), /*#__PURE__*/React.createElement(Text, {
54
48
  body3: true,
@@ -1 +1 @@
1
- {"version":3,"names":["React","getFileTypeFromMessage","Box","Icon","PressBox","Text","createStyleSheet","useUIKitTheme","MessageContainer","iconMapper","audio","image","video","file","FileMessage","props","colors","onPress","onLongPress","rest","type","message","color","ui","openChannelMessage","default","createElement","_ref","_props$strings","pressed","padding","borderRadius","flexDirection","alignItems","justifyContent","style","backgroundColor","bubbleBackground","enabled","marginRight","background","icon","size","body3","numberOfLines","ellipsizeMode","textMsg","styles","fileName","strings","name","flexShrink"],"sources":["Message.file.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SendbirdFileMessage, getFileTypeFromMessage } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport Icon from '../../components/Icon';\nimport PressBox from '../../components/PressBox';\nimport Text from '../../components/Text';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport useUIKitTheme from '../../theme/useUIKitTheme';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\nconst iconMapper = { audio: 'file-audio', image: 'photo', video: 'play', file: 'file-document' } as const;\n\ntype Props = {};\nconst FileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage, Props>) => {\n const { colors } = useUIKitTheme();\n const { onPress, onLongPress, ...rest } = props;\n const type = getFileTypeFromMessage(props.message);\n const color = colors.ui.openChannelMessage.default;\n\n return (\n <MessageContainer {...rest}>\n <PressBox onPress={onPress} onLongPress={onLongPress}>\n {({ pressed }) => {\n return (\n <Box\n padding={8}\n borderRadius={8}\n flexDirection={'row'}\n alignItems={'center'}\n justifyContent={'flex-start'}\n style={{ backgroundColor: pressed ? color.pressed.bubbleBackground : color.enabled.bubbleBackground }}\n >\n <Box\n padding={4}\n marginRight={8}\n borderRadius={8}\n alignItems={'flex-start'}\n backgroundColor={colors.background}\n >\n <Icon icon={iconMapper[type]} size={32} />\n </Box>\n <Text\n body3\n numberOfLines={1}\n ellipsizeMode={'middle'}\n color={color.enabled.textMsg}\n style={styles.fileName}\n >\n {props.strings?.fileName || props.message.name}\n </Text>\n </Box>\n );\n }}\n </PressBox>\n </MessageContainer>\n );\n};\n\nconst styles = createStyleSheet({\n fileName: {\n flexShrink: 1,\n },\n});\nexport default FileMessage;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAA8BC,sBAAsB,QAAQ,uBAAuB;AAEnF,OAAOC,GAAG,MAAM,sBAAsB;AACtC,OAAOC,IAAI,MAAM,uBAAuB;AACxC,OAAOC,QAAQ,MAAM,2BAA2B;AAChD,OAAOC,IAAI,MAAM,uBAAuB;AACxC,OAAOC,gBAAgB,MAAM,+BAA+B;AAC5D,OAAOC,aAAa,MAAM,2BAA2B;AACrD,OAAOC,gBAAgB,MAAM,oBAAoB;AAGjD,MAAMC,UAAU,GAAG;EAAEC,KAAK,EAAE,YAAY;EAAEC,KAAK,EAAE,OAAO;EAAEC,KAAK,EAAE,MAAM;EAAEC,IAAI,EAAE;AAAgB,CAAU;AAGzG,MAAMC,WAAW,GAAIC,KAA0D,IAAK;EAClF,MAAM;IAAEC;EAAO,CAAC,GAAGT,aAAa,EAAE;EAClC,MAAM;IAAEU,OAAO;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGJ,KAAK;EAC/C,MAAMK,IAAI,GAAGnB,sBAAsB,CAACc,KAAK,CAACM,OAAO,CAAC;EAClD,MAAMC,KAAK,GAAGN,MAAM,CAACO,EAAE,CAACC,kBAAkB,CAACC,OAAO;EAElD,oBACEzB,KAAA,CAAA0B,aAAA,CAAClB,gBAAgB,EAAKW,IAAI,eACxBnB,KAAA,CAAA0B,aAAA,CAACtB,QAAQ;IAACa,OAAO,EAAEA,OAAQ;IAACC,WAAW,EAAEA;EAAY,GAClDS,IAAA,IAAiB;IAAA,IAAAC,cAAA;IAAA,IAAhB;MAAEC;IAAQ,CAAC,GAAAF,IAAA;IACX,oBACE3B,KAAA,CAAA0B,aAAA,CAACxB,GAAG;MACF4B,OAAO,EAAE,CAAE;MACXC,YAAY,EAAE,CAAE;MAChBC,aAAa,EAAE,KAAM;MACrBC,UAAU,EAAE,QAAS;MACrBC,cAAc,EAAE,YAAa;MAC7BC,KAAK,EAAE;QAAEC,eAAe,EAAEP,OAAO,GAAGP,KAAK,CAACO,OAAO,CAACQ,gBAAgB,GAAGf,KAAK,CAACgB,OAAO,CAACD;MAAiB;IAAE,gBAEtGrC,KAAA,CAAA0B,aAAA,CAACxB,GAAG;MACF4B,OAAO,EAAE,CAAE;MACXS,WAAW,EAAE,CAAE;MACfR,YAAY,EAAE,CAAE;MAChBE,UAAU,EAAE,YAAa;MACzBG,eAAe,EAAEpB,MAAM,CAACwB;IAAW,gBAEnCxC,KAAA,CAAA0B,aAAA,CAACvB,IAAI;MAACsC,IAAI,EAAEhC,UAAU,CAACW,IAAI,CAAE;MAACsB,IAAI,EAAE;IAAG,EAAG,CACtC,eACN1C,KAAA,CAAA0B,aAAA,CAACrB,IAAI;MACHsC,KAAK;MACLC,aAAa,EAAE,CAAE;MACjBC,aAAa,EAAE,QAAS;MACxBvB,KAAK,EAAEA,KAAK,CAACgB,OAAO,CAACQ,OAAQ;MAC7BX,KAAK,EAAEY,MAAM,CAACC;IAAS,GAEtB,EAAApB,cAAA,GAAAb,KAAK,CAACkC,OAAO,cAAArB,cAAA,uBAAbA,cAAA,CAAeoB,QAAQ,KAAIjC,KAAK,CAACM,OAAO,CAAC6B,IAAI,CACzC,CACH;EAEV,CAAC,CACQ,CACM;AAEvB,CAAC;AAED,MAAMH,MAAM,GAAGzC,gBAAgB,CAAC;EAC9B0C,QAAQ,EAAE;IACRG,UAAU,EAAE;EACd;AACF,CAAC,CAAC;AACF,eAAerC,WAAW"}
1
+ {"version":3,"names":["React","getFileTypeFromMessage","Box","Icon","PressBox","Text","createStyleSheet","useUIKitTheme","MessageContainer","FileMessage","props","colors","onPress","onLongPress","rest","type","message","color","ui","openChannelMessage","default","createElement","_ref","_props$strings","pressed","padding","borderRadius","flexDirection","alignItems","justifyContent","style","backgroundColor","bubbleBackground","enabled","marginRight","background","File","fileType","size","body3","numberOfLines","ellipsizeMode","textMsg","styles","fileName","strings","name","flexShrink"],"sources":["Message.file.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SendbirdFileMessage, getFileTypeFromMessage } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport Icon from '../../components/Icon';\nimport PressBox from '../../components/PressBox';\nimport Text from '../../components/Text';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport useUIKitTheme from '../../theme/useUIKitTheme';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\ntype Props = {};\nconst FileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage, Props>) => {\n const { colors } = useUIKitTheme();\n const { onPress, onLongPress, ...rest } = props;\n const type = getFileTypeFromMessage(props.message);\n const color = colors.ui.openChannelMessage.default;\n\n return (\n <MessageContainer {...rest}>\n <PressBox onPress={onPress} onLongPress={onLongPress}>\n {({ pressed }) => {\n return (\n <Box\n padding={8}\n borderRadius={8}\n flexDirection={'row'}\n alignItems={'center'}\n justifyContent={'flex-start'}\n style={{ backgroundColor: pressed ? color.pressed.bubbleBackground : color.enabled.bubbleBackground }}\n >\n <Box\n padding={4}\n marginRight={8}\n borderRadius={8}\n alignItems={'flex-start'}\n backgroundColor={colors.background}\n >\n <Icon.File fileType={type} size={32} />\n </Box>\n <Text\n body3\n numberOfLines={1}\n ellipsizeMode={'middle'}\n color={color.enabled.textMsg}\n style={styles.fileName}\n >\n {props.strings?.fileName || props.message.name}\n </Text>\n </Box>\n );\n }}\n </PressBox>\n </MessageContainer>\n );\n};\n\nconst styles = createStyleSheet({\n fileName: {\n flexShrink: 1,\n },\n});\nexport default FileMessage;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAA8BC,sBAAsB,QAAQ,uBAAuB;AAEnF,OAAOC,GAAG,MAAM,sBAAsB;AACtC,OAAOC,IAAI,MAAM,uBAAuB;AACxC,OAAOC,QAAQ,MAAM,2BAA2B;AAChD,OAAOC,IAAI,MAAM,uBAAuB;AACxC,OAAOC,gBAAgB,MAAM,+BAA+B;AAC5D,OAAOC,aAAa,MAAM,2BAA2B;AACrD,OAAOC,gBAAgB,MAAM,oBAAoB;AAIjD,MAAMC,WAAW,GAAIC,KAA0D,IAAK;EAClF,MAAM;IAAEC;EAAO,CAAC,GAAGJ,aAAa,EAAE;EAClC,MAAM;IAAEK,OAAO;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGJ,KAAK;EAC/C,MAAMK,IAAI,GAAGd,sBAAsB,CAACS,KAAK,CAACM,OAAO,CAAC;EAClD,MAAMC,KAAK,GAAGN,MAAM,CAACO,EAAE,CAACC,kBAAkB,CAACC,OAAO;EAElD,oBACEpB,KAAA,CAAAqB,aAAA,CAACb,gBAAgB,EAAKM,IAAI,eACxBd,KAAA,CAAAqB,aAAA,CAACjB,QAAQ;IAACQ,OAAO,EAAEA,OAAQ;IAACC,WAAW,EAAEA;EAAY,GAClDS,IAAA,IAAiB;IAAA,IAAAC,cAAA;IAAA,IAAhB;MAAEC;IAAQ,CAAC,GAAAF,IAAA;IACX,oBACEtB,KAAA,CAAAqB,aAAA,CAACnB,GAAG;MACFuB,OAAO,EAAE,CAAE;MACXC,YAAY,EAAE,CAAE;MAChBC,aAAa,EAAE,KAAM;MACrBC,UAAU,EAAE,QAAS;MACrBC,cAAc,EAAE,YAAa;MAC7BC,KAAK,EAAE;QAAEC,eAAe,EAAEP,OAAO,GAAGP,KAAK,CAACO,OAAO,CAACQ,gBAAgB,GAAGf,KAAK,CAACgB,OAAO,CAACD;MAAiB;IAAE,gBAEtGhC,KAAA,CAAAqB,aAAA,CAACnB,GAAG;MACFuB,OAAO,EAAE,CAAE;MACXS,WAAW,EAAE,CAAE;MACfR,YAAY,EAAE,CAAE;MAChBE,UAAU,EAAE,YAAa;MACzBG,eAAe,EAAEpB,MAAM,CAACwB;IAAW,gBAEnCnC,KAAA,CAAAqB,aAAA,CAAClB,IAAI,CAACiC,IAAI;MAACC,QAAQ,EAAEtB,IAAK;MAACuB,IAAI,EAAE;IAAG,EAAG,CACnC,eACNtC,KAAA,CAAAqB,aAAA,CAAChB,IAAI;MACHkC,KAAK;MACLC,aAAa,EAAE,CAAE;MACjBC,aAAa,EAAE,QAAS;MACxBxB,KAAK,EAAEA,KAAK,CAACgB,OAAO,CAACS,OAAQ;MAC7BZ,KAAK,EAAEa,MAAM,CAACC;IAAS,GAEtB,EAAArB,cAAA,GAAAb,KAAK,CAACmC,OAAO,cAAAtB,cAAA,uBAAbA,cAAA,CAAeqB,QAAQ,KAAIlC,KAAK,CAACM,OAAO,CAAC8B,IAAI,CACzC,CACH;EAEV,CAAC,CACQ,CACM;AAEvB,CAAC;AAED,MAAMH,MAAM,GAAGrC,gBAAgB,CAAC;EAC9BsC,QAAQ,EAAE;IACRG,UAAU,EAAE;EACd;AACF,CAAC,CAAC;AACF,eAAetC,WAAW"}
@@ -1,98 +1,33 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import { getAvailableUriFromFileMessage } from '@sendbird/uikit-utils';
3
- import Box from '../../components/Box';
4
- import Icon from '../../components/Icon';
5
- import ImageWithPlaceholder from '../../components/ImageWithPlaceholder';
1
+ import React from 'react';
2
+ import { getThumbnailUriFromFileMessage } from '@sendbird/uikit-utils';
6
3
  import PressBox from '../../components/PressBox';
4
+ import { VideoThumbnail } from '../../components/VideoThumbnail';
7
5
  import createStyleSheet from '../../styles/createStyleSheet';
8
- import useUIKitTheme from '../../theme/useUIKitTheme';
9
6
  import MessageContainer from './MessageContainer';
10
7
  const VideoFileMessage = props => {
11
- const {
12
- colors,
13
- palette
14
- } = useUIKitTheme();
15
8
  const {
16
9
  onPress,
17
10
  onLongPress,
18
11
  ...rest
19
12
  } = props;
20
- const uri = getAvailableUriFromFileMessage(props.message);
21
- const {
22
- thumbnail,
23
- loading
24
- } = useRetry(() => props.fetchThumbnailFromVideoSource(uri));
13
+ const uri = getThumbnailUriFromFileMessage(props.message);
25
14
  return /*#__PURE__*/React.createElement(MessageContainer, rest, /*#__PURE__*/React.createElement(PressBox, {
26
15
  style: styles.container,
27
16
  activeOpacity: 0.8,
28
17
  onPress: onPress,
29
18
  onLongPress: onLongPress
30
- }, /*#__PURE__*/React.createElement(Box, {
31
- borderRadius: 8,
32
- overflow: 'hidden',
33
- style: styles.container
34
- }, loading ? /*#__PURE__*/React.createElement(Box, {
35
- backgroundColor: colors.onBackground04,
36
- style: {
37
- width: '100%',
38
- height: '100%'
39
- }
40
- }) : /*#__PURE__*/React.createElement(ImageWithPlaceholder, {
41
- source: {
42
- uri: thumbnail ?? 'invalid-image'
43
- },
44
- width: '100%',
45
- height: '100%'
46
- }), (loading || thumbnail !== null) && /*#__PURE__*/React.createElement(Box, {
47
- style: styles.iconContainer,
48
- alignItems: 'center',
49
- justifyContent: 'center'
50
- }, /*#__PURE__*/React.createElement(Icon, {
51
- icon: 'play',
52
- size: 28,
53
- color: palette.onBackgroundLight02,
54
- containerStyle: [styles.playIcon, {
55
- backgroundColor: palette.onBackgroundDark01
56
- }]
57
- })))));
58
- };
59
- const useRetry = function (fetch) {
60
- let retryCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
61
- const [state, setState] = useState({
62
- thumbnail: null,
63
- loading: true
64
- });
65
- const retryCountRef = useRef(0);
66
- const retryTimeoutRef = useRef();
67
- const fetchThumbnail = useRef(fetch);
68
- fetchThumbnail.current = fetch;
69
- useEffect(() => {
70
- if (!state.thumbnail) {
71
- const reloadReservation = () => {
72
- if (retryCountRef.current < retryCount) {
73
- retryTimeoutRef.current = setTimeout(() => {
74
- retryCountRef.current++;
75
- reloadReservation();
76
- fetchThumbnail.current().then(result => {
77
- setState({
78
- loading: false,
79
- thumbnail: (result === null || result === void 0 ? void 0 : result.path) ?? null
80
- });
81
- });
82
- }, retryCountRef.current * 5000);
83
- }
84
- };
85
- return reloadReservation();
86
- } else {
87
- return clearTimeout(retryTimeoutRef.current);
88
- }
89
- }, [state.thumbnail]);
90
- return state;
19
+ }, /*#__PURE__*/React.createElement(VideoThumbnail, {
20
+ style: styles.container,
21
+ source: uri,
22
+ fetchThumbnailFromVideoSource: props.fetchThumbnailFromVideoSource
23
+ })));
91
24
  };
92
25
  const styles = createStyleSheet({
93
26
  container: {
94
27
  maxWidth: 296,
95
- height: 196
28
+ height: 196,
29
+ borderRadius: 8,
30
+ overflow: 'hidden'
96
31
  },
97
32
  iconContainer: {
98
33
  position: 'absolute',
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","useState","getAvailableUriFromFileMessage","Box","Icon","ImageWithPlaceholder","PressBox","createStyleSheet","useUIKitTheme","MessageContainer","VideoFileMessage","props","colors","palette","onPress","onLongPress","rest","uri","message","thumbnail","loading","useRetry","fetchThumbnailFromVideoSource","createElement","style","styles","container","activeOpacity","borderRadius","overflow","backgroundColor","onBackground04","width","height","source","iconContainer","alignItems","justifyContent","icon","size","color","onBackgroundLight02","containerStyle","playIcon","onBackgroundDark01","fetch","retryCount","arguments","length","undefined","state","setState","retryCountRef","retryTimeoutRef","fetchThumbnail","current","reloadReservation","setTimeout","then","result","path","clearTimeout","maxWidth","position","padding"],"sources":["Message.file.video.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport type { SendbirdFileMessage } from '@sendbird/uikit-utils';\nimport { getAvailableUriFromFileMessage } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport Icon from '../../components/Icon';\nimport ImageWithPlaceholder from '../../components/ImageWithPlaceholder';\nimport PressBox from '../../components/PressBox';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport useUIKitTheme from '../../theme/useUIKitTheme';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\ntype Props = {\n fetchThumbnailFromVideoSource: (uri: string) => Promise<{ path: string } | null>;\n};\nconst VideoFileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage, Props>) => {\n const { colors, palette } = useUIKitTheme();\n const { onPress, onLongPress, ...rest } = props;\n const uri = getAvailableUriFromFileMessage(props.message);\n const { thumbnail, loading } = useRetry(() => props.fetchThumbnailFromVideoSource(uri));\n\n return (\n <MessageContainer {...rest}>\n <PressBox style={styles.container} activeOpacity={0.8} onPress={onPress} onLongPress={onLongPress}>\n <Box borderRadius={8} overflow={'hidden'} style={styles.container}>\n {loading ? (\n <Box backgroundColor={colors.onBackground04} style={{ width: '100%', height: '100%' }} />\n ) : (\n <ImageWithPlaceholder source={{ uri: thumbnail ?? 'invalid-image' }} width={'100%'} height={'100%'} />\n )}\n\n {(loading || thumbnail !== null) && (\n <Box style={styles.iconContainer} alignItems={'center'} justifyContent={'center'}>\n <Icon\n icon={'play'}\n size={28}\n color={palette.onBackgroundLight02}\n containerStyle={[styles.playIcon, { backgroundColor: palette.onBackgroundDark01 }]}\n />\n </Box>\n )}\n </Box>\n </PressBox>\n </MessageContainer>\n );\n};\nconst useRetry = (fetch: () => Promise<{ path: string } | null>, retryCount = 5) => {\n const [state, setState] = useState({ thumbnail: null as null | string, loading: true });\n const retryCountRef = useRef(0);\n const retryTimeoutRef = useRef<NodeJS.Timeout>();\n const fetchThumbnail = useRef(fetch);\n fetchThumbnail.current = fetch;\n\n useEffect(() => {\n if (!state.thumbnail) {\n const reloadReservation = () => {\n if (retryCountRef.current < retryCount) {\n retryTimeoutRef.current = setTimeout(() => {\n retryCountRef.current++;\n reloadReservation();\n fetchThumbnail.current().then((result) => {\n setState({ loading: false, thumbnail: result?.path ?? null });\n });\n }, retryCountRef.current * 5000);\n }\n };\n\n return reloadReservation();\n } else {\n return clearTimeout(retryTimeoutRef.current);\n }\n }, [state.thumbnail]);\n\n return state;\n};\nconst styles = createStyleSheet({\n container: {\n maxWidth: 296,\n height: 196,\n },\n iconContainer: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n playIcon: {\n padding: 10,\n borderRadius: 50,\n },\n});\nexport default VideoFileMessage;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","getThumbnailUriFromFileMessage","PressBox","VideoThumbnail","createStyleSheet","MessageContainer","VideoFileMessage","props","onPress","onLongPress","rest","uri","message","createElement","style","styles","container","activeOpacity","source","fetchThumbnailFromVideoSource","maxWidth","height","borderRadius","overflow","iconContainer","position","width","playIcon","padding"],"sources":["Message.file.video.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SendbirdFileMessage } from '@sendbird/uikit-utils';\nimport { getThumbnailUriFromFileMessage } from '@sendbird/uikit-utils';\n\nimport PressBox from '../../components/PressBox';\nimport { VideoThumbnail } from '../../components/VideoThumbnail';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\ntype Props = {\n fetchThumbnailFromVideoSource: (uri: string) => Promise<{ path: string } | null>;\n};\n\nconst VideoFileMessage = (props: OpenChannelMessageProps<SendbirdFileMessage, Props>) => {\n const { onPress, onLongPress, ...rest } = props;\n const uri = getThumbnailUriFromFileMessage(props.message);\n\n return (\n <MessageContainer {...rest}>\n <PressBox style={styles.container} activeOpacity={0.8} onPress={onPress} onLongPress={onLongPress}>\n <VideoThumbnail\n style={styles.container}\n source={uri}\n fetchThumbnailFromVideoSource={props.fetchThumbnailFromVideoSource}\n />\n </PressBox>\n </MessageContainer>\n );\n};\n\nconst styles = createStyleSheet({\n container: {\n maxWidth: 296,\n height: 196,\n borderRadius: 8,\n overflow: 'hidden',\n },\n iconContainer: {\n position: 'absolute',\n width: '100%',\n height: '100%',\n },\n playIcon: {\n padding: 10,\n borderRadius: 50,\n },\n});\nexport default VideoFileMessage;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,SAASC,8BAA8B,QAAQ,uBAAuB;AAEtE,OAAOC,QAAQ,MAAM,2BAA2B;AAChD,SAASC,cAAc,QAAQ,iCAAiC;AAChE,OAAOC,gBAAgB,MAAM,+BAA+B;AAC5D,OAAOC,gBAAgB,MAAM,oBAAoB;AAOjD,MAAMC,gBAAgB,GAAIC,KAA0D,IAAK;EACvF,MAAM;IAAEC,OAAO;IAAEC,WAAW;IAAE,GAAGC;EAAK,CAAC,GAAGH,KAAK;EAC/C,MAAMI,GAAG,GAAGV,8BAA8B,CAACM,KAAK,CAACK,OAAO,CAAC;EAEzD,oBACEZ,KAAA,CAAAa,aAAA,CAACR,gBAAgB,EAAKK,IAAI,eACxBV,KAAA,CAAAa,aAAA,CAACX,QAAQ;IAACY,KAAK,EAAEC,MAAM,CAACC,SAAU;IAACC,aAAa,EAAE,GAAI;IAACT,OAAO,EAAEA,OAAQ;IAACC,WAAW,EAAEA;EAAY,gBAChGT,KAAA,CAAAa,aAAA,CAACV,cAAc;IACbW,KAAK,EAAEC,MAAM,CAACC,SAAU;IACxBE,MAAM,EAAEP,GAAI;IACZQ,6BAA6B,EAAEZ,KAAK,CAACY;EAA8B,EACnE,CACO,CACM;AAEvB,CAAC;AAED,MAAMJ,MAAM,GAAGX,gBAAgB,CAAC;EAC9BY,SAAS,EAAE;IACTI,QAAQ,EAAE,GAAG;IACbC,MAAM,EAAE,GAAG;IACXC,YAAY,EAAE,CAAC;IACfC,QAAQ,EAAE;EACZ,CAAC;EACDC,aAAa,EAAE;IACbC,QAAQ,EAAE,UAAU;IACpBC,KAAK,EAAE,MAAM;IACbL,MAAM,EAAE;EACV,CAAC;EACDM,QAAQ,EAAE;IACRC,OAAO,EAAE,EAAE;IACXN,YAAY,EAAE;EAChB;AACF,CAAC,CAAC;AACF,eAAehB,gBAAgB"}
@@ -90,7 +90,7 @@ const OpenGraphUserMessage = props => {
90
90
  numberOfLines: 2,
91
91
  caption2: true,
92
92
  color: colors.onBackground01
93
- }, props.message.ogMetaData.description), Boolean(props.message.ogMetaData.defaultImage) && /*#__PURE__*/React.createElement(ImageWithPlaceholder, {
93
+ }, props.message.ogMetaData.description), !!props.message.ogMetaData.defaultImage && /*#__PURE__*/React.createElement(ImageWithPlaceholder, {
94
94
  style: styles.ogImage,
95
95
  source: {
96
96
  uri: props.message.ogMetaData.defaultImage.url
@@ -1 +1 @@
1
- {"version":3,"names":["React","urlRegexRough","Box","ImageWithPlaceholder","PressBox","RegexText","Text","createStyleSheet","useUIKitTheme","MessageContainer","OpenGraphUserMessage","props","colors","onPress","onLongPress","onPressURL","rest","color","ui","openChannelMessage","default","createElement","_ref","_props$strings","pressed","_extends","body3","enabled","textMsg","patterns","regex","replacer","_ref2","match","parentProps","keyPrefix","index","key","primary","style","message","Boolean","updatedAt","textMsgPostfix","strings","edited","ogMetaData","grouped","styles","ogContainer","_props$message$ogMeta","url","_ref3","padding","borderRadius","backgroundColor","bubbleBackground","numberOfLines","caption2","onBackground02","ogUrl","body2","ogTitle","title","description","onBackground01","defaultImage","ogImage","source","uri","maxWidth","marginBottom","width","height","marginTop"],"sources":["Message.user.og.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { urlRegexRough } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport ImageWithPlaceholder from '../../components/ImageWithPlaceholder';\nimport PressBox from '../../components/PressBox';\nimport RegexText from '../../components/RegexText';\nimport Text from '../../components/Text';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport useUIKitTheme from '../../theme/useUIKitTheme';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\ntype Props = {};\nconst OpenGraphUserMessage = (props: OpenChannelMessageProps<SendbirdUserMessage, Props>) => {\n const { colors } = useUIKitTheme();\n const { onPress, onLongPress, onPressURL, ...rest } = props;\n const color = colors.ui.openChannelMessage.default;\n\n return (\n <Box>\n <PressBox onPress={onPress} onLongPress={onLongPress}>\n {({ pressed }) => (\n <MessageContainer pressed={pressed} {...rest}>\n <Text body3 color={color.enabled.textMsg}>\n <RegexText\n body3\n color={color.enabled.textMsg}\n patterns={[\n {\n regex: urlRegexRough,\n replacer({ match, parentProps, keyPrefix, index }) {\n return (\n <Text\n {...parentProps}\n key={`${keyPrefix}-${index}`}\n onPress={() => onPressURL?.(match)}\n onLongPress={onLongPress}\n color={colors.primary}\n style={parentProps?.style}\n >\n {match}\n </Text>\n );\n },\n },\n ]}\n >\n {props.message.message}\n </RegexText>\n {Boolean(props.message.updatedAt) && (\n <Text body3 color={color.enabled.textMsgPostfix}>\n {props.strings?.edited ?? ' (edited)'}\n </Text>\n )}\n </Text>\n </MessageContainer>\n )}\n </PressBox>\n {props.message.ogMetaData && (\n <MessageContainer {...rest} grouped>\n <PressBox\n style={styles.ogContainer}\n onPress={() => props.message.ogMetaData?.url && onPressURL?.(props.message.ogMetaData.url)}\n onLongPress={onLongPress}\n >\n {({ pressed }) =>\n props.message.ogMetaData && (\n <Box\n padding={8}\n borderRadius={8}\n style={styles.ogContainer}\n backgroundColor={pressed ? color.pressed.bubbleBackground : color.enabled.bubbleBackground}\n >\n <Text numberOfLines={1} caption2 color={colors.onBackground02} style={styles.ogUrl}>\n {props.message.ogMetaData.url}\n </Text>\n\n <Text numberOfLines={2} body2 color={colors.primary} style={styles.ogTitle}>\n {props.message.ogMetaData.title}\n </Text>\n\n {Boolean(props.message.ogMetaData.description) && (\n <Text numberOfLines={2} caption2 color={colors.onBackground01}>\n {props.message.ogMetaData.description}\n </Text>\n )}\n\n {Boolean(props.message.ogMetaData.defaultImage) && (\n <ImageWithPlaceholder\n style={styles.ogImage}\n source={{ uri: props.message.ogMetaData.defaultImage.url }}\n />\n )}\n </Box>\n )\n }\n </PressBox>\n </MessageContainer>\n )}\n </Box>\n );\n};\n\nconst styles = createStyleSheet({\n ogContainer: {\n maxWidth: 296,\n },\n ogUrl: {\n marginBottom: 4,\n },\n ogTitle: {\n marginBottom: 8,\n },\n ogImage: {\n width: '100%',\n height: 156,\n marginTop: 12,\n },\n});\n\nexport default OpenGraphUserMessage;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","urlRegexRough","Box","ImageWithPlaceholder","PressBox","RegexText","Text","createStyleSheet","useUIKitTheme","MessageContainer","OpenGraphUserMessage","props","colors","onPress","onLongPress","onPressURL","rest","color","ui","openChannelMessage","default","createElement","_ref","_props$strings","pressed","_extends","body3","enabled","textMsg","patterns","regex","replacer","_ref2","match","parentProps","keyPrefix","index","key","primary","style","message","Boolean","updatedAt","textMsgPostfix","strings","edited","ogMetaData","grouped","styles","ogContainer","_props$message$ogMeta","url","_ref3","padding","borderRadius","backgroundColor","bubbleBackground","numberOfLines","caption2","onBackground02","ogUrl","body2","ogTitle","title","description","onBackground01","defaultImage","ogImage","source","uri","maxWidth","marginBottom","width","height","marginTop"],"sources":["Message.user.og.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { SendbirdUserMessage } from '@sendbird/uikit-utils';\nimport { urlRegexRough } from '@sendbird/uikit-utils';\n\nimport Box from '../../components/Box';\nimport ImageWithPlaceholder from '../../components/ImageWithPlaceholder';\nimport PressBox from '../../components/PressBox';\nimport RegexText from '../../components/RegexText';\nimport Text from '../../components/Text';\nimport createStyleSheet from '../../styles/createStyleSheet';\nimport useUIKitTheme from '../../theme/useUIKitTheme';\nimport MessageContainer from './MessageContainer';\nimport type { OpenChannelMessageProps } from './index';\n\ntype Props = {};\nconst OpenGraphUserMessage = (props: OpenChannelMessageProps<SendbirdUserMessage, Props>) => {\n const { colors } = useUIKitTheme();\n const { onPress, onLongPress, onPressURL, ...rest } = props;\n const color = colors.ui.openChannelMessage.default;\n\n return (\n <Box>\n <PressBox onPress={onPress} onLongPress={onLongPress}>\n {({ pressed }) => (\n <MessageContainer pressed={pressed} {...rest}>\n <Text body3 color={color.enabled.textMsg}>\n <RegexText\n body3\n color={color.enabled.textMsg}\n patterns={[\n {\n regex: urlRegexRough,\n replacer({ match, parentProps, keyPrefix, index }) {\n return (\n <Text\n {...parentProps}\n key={`${keyPrefix}-${index}`}\n onPress={() => onPressURL?.(match)}\n onLongPress={onLongPress}\n color={colors.primary}\n style={parentProps?.style}\n >\n {match}\n </Text>\n );\n },\n },\n ]}\n >\n {props.message.message}\n </RegexText>\n {Boolean(props.message.updatedAt) && (\n <Text body3 color={color.enabled.textMsgPostfix}>\n {props.strings?.edited ?? ' (edited)'}\n </Text>\n )}\n </Text>\n </MessageContainer>\n )}\n </PressBox>\n {props.message.ogMetaData && (\n <MessageContainer {...rest} grouped>\n <PressBox\n style={styles.ogContainer}\n onPress={() => props.message.ogMetaData?.url && onPressURL?.(props.message.ogMetaData.url)}\n onLongPress={onLongPress}\n >\n {({ pressed }) =>\n props.message.ogMetaData && (\n <Box\n padding={8}\n borderRadius={8}\n style={styles.ogContainer}\n backgroundColor={pressed ? color.pressed.bubbleBackground : color.enabled.bubbleBackground}\n >\n <Text numberOfLines={1} caption2 color={colors.onBackground02} style={styles.ogUrl}>\n {props.message.ogMetaData.url}\n </Text>\n\n <Text numberOfLines={2} body2 color={colors.primary} style={styles.ogTitle}>\n {props.message.ogMetaData.title}\n </Text>\n\n {Boolean(props.message.ogMetaData.description) && (\n <Text numberOfLines={2} caption2 color={colors.onBackground01}>\n {props.message.ogMetaData.description}\n </Text>\n )}\n\n {!!props.message.ogMetaData.defaultImage && (\n <ImageWithPlaceholder\n style={styles.ogImage}\n source={{ uri: props.message.ogMetaData.defaultImage.url }}\n />\n )}\n </Box>\n )\n }\n </PressBox>\n </MessageContainer>\n )}\n </Box>\n );\n};\n\nconst styles = createStyleSheet({\n ogContainer: {\n maxWidth: 296,\n },\n ogUrl: {\n marginBottom: 4,\n },\n ogTitle: {\n marginBottom: 8,\n },\n ogImage: {\n width: '100%',\n height: 156,\n marginTop: 12,\n },\n});\n\nexport default OpenGraphUserMessage;\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { ImageStyle, StyleProp, ViewStyle } from 'react-native';
2
+ import { FileType } from '@sendbird/uikit-utils';
2
3
  import IconAssets from '../../assets/icon';
3
4
  type IconNames = keyof typeof IconAssets;
4
5
  type Props = {
@@ -10,5 +11,9 @@ type Props = {
10
11
  };
11
12
  declare const Icon: ((props: Props) => JSX.Element) & {
12
13
  Assets: typeof IconAssets;
14
+ File: typeof FileIcon;
13
15
  };
16
+ declare const FileIcon: ({ fileType, ...props }: Omit<Props, "icon"> & {
17
+ fileType: FileType;
18
+ }) => JSX.Element;
14
19
  export default Icon;
@@ -0,0 +1,13 @@
1
+ import { StyleProp, ViewStyle } from 'react-native';
2
+ type Props = {
3
+ source: string;
4
+ fetchThumbnailFromVideoSource: (uri: string) => Promise<{
5
+ path: string;
6
+ } | null>;
7
+ style?: StyleProp<ViewStyle>;
8
+ iconSize?: number;
9
+ /** @deprecated please use `source` prop **/
10
+ videoSource?: string;
11
+ };
12
+ export declare const VideoThumbnail: ({ fetchThumbnailFromVideoSource, style, source, videoSource, iconSize }: Props) => JSX.Element;
13
+ export {};
@@ -13,6 +13,7 @@ export type { RegexTextPattern } from './components/RegexText';
13
13
  export { default as Switch } from './components/Switch';
14
14
  export { default as Text } from './components/Text';
15
15
  export { default as TextInput } from './components/TextInput';
16
+ export { VideoThumbnail } from './components/VideoThumbnail';
16
17
  /** UI **/
17
18
  export { default as ActionMenu } from './ui/ActionMenu';
18
19
  export { default as Alert } from './ui/Alert';
@@ -72,7 +72,7 @@ export type ComponentColorTree = GetColorTree<{
72
72
  ColorPart: {
73
73
  Header: 'background' | 'borderBottom';
74
74
  Button: 'background' | 'content';
75
- Dialog: 'background' | 'text' | 'message' | 'highlight' | 'destructive';
75
+ Dialog: 'background' | 'text' | 'message' | 'highlight' | 'destructive' | 'blurred';
76
76
  Input: 'text' | 'placeholder' | 'background' | 'highlight';
77
77
  Badge: 'text' | 'background';
78
78
  Placeholder: 'content' | 'highlight';
@@ -8,6 +8,7 @@ export type BottomSheetItem = {
8
8
  iconColor?: string;
9
9
  title: string;
10
10
  titleColor?: string;
11
+ disabled?: boolean;
11
12
  onPress: () => void;
12
13
  }[];
13
14
  HeaderComponent?: (props: HeaderProps) => JSX.Element;
@@ -12,6 +12,7 @@ export type SheetItemProps = {
12
12
  iconColor?: string;
13
13
  title: string;
14
14
  titleColor?: string;
15
+ disabled?: boolean;
15
16
  };
16
- declare const SheetItem: ({ icon, title, iconColor, titleColor }: SheetItemProps) => JSX.Element;
17
+ declare const SheetItem: ({ icon, title, iconColor, titleColor, disabled }: SheetItemProps) => JSX.Element;
17
18
  export default DialogSheet;
@@ -3,7 +3,7 @@ import type { GroupChannelMessageProps } from './index';
3
3
  type Props = GroupChannelMessageProps<SendbirdMessage>;
4
4
  declare const MessageContainer: {
5
5
  (props: Props): JSX.Element;
6
- Incoming({ children, groupedWithNext, groupedWithPrev, message, onPressAvatar, strings, }: Props): JSX.Element;
7
- Outgoing({ children, message, groupedWithNext, strings, sendingStatus, }: Props): JSX.Element;
6
+ Incoming({ children, groupedWithNext, groupedWithPrev, message, onPressAvatar, strings, parentMessage, }: Props): JSX.Element;
7
+ Outgoing({ children, message, groupedWithNext, strings, sendingStatus, parentMessage, }: Props): JSX.Element;
8
8
  };
9
9
  export default MessageContainer;
@@ -1,6 +1,6 @@
1
1
  import type { SendbirdUserMessage } from '@sendbird/uikit-utils';
2
2
  declare const MessageOpenGraph: ({ onPressURL, onLongPress, ogMetaData, variant, }: {
3
- ogMetaData: Required<SendbirdUserMessage>['ogMetaData'];
3
+ ogMetaData: NonNullable<SendbirdUserMessage['ogMetaData']>;
4
4
  variant: 'outgoing' | 'incoming';
5
5
  onPressURL?: ((url: string) => void) | undefined;
6
6
  onLongPress?: (() => void) | undefined;
@@ -14,6 +14,7 @@ export type GroupChannelMessageProps<T extends SendbirdMessage, AdditionalProps
14
14
  };
15
15
  children?: React.ReactNode;
16
16
  sendingStatus?: React.ReactNode;
17
+ parentMessage?: React.ReactNode;
17
18
  groupedWithPrev: boolean;
18
19
  groupedWithNext: boolean;
19
20
  onPress?: () => void;
@@ -37,6 +38,7 @@ declare const GroupChannelMessage: {
37
38
  } | undefined;
38
39
  children?: React.ReactNode;
39
40
  sendingStatus?: React.ReactNode;
41
+ parentMessage?: React.ReactNode;
40
42
  groupedWithPrev: boolean;
41
43
  groupedWithNext: boolean;
42
44
  onPress?: (() => void) | undefined;
@@ -62,6 +64,7 @@ declare const GroupChannelMessage: {
62
64
  } | undefined;
63
65
  children?: React.ReactNode;
64
66
  sendingStatus?: React.ReactNode;
67
+ parentMessage?: React.ReactNode;
65
68
  groupedWithPrev: boolean;
66
69
  groupedWithNext: boolean;
67
70
  onPress?: (() => void) | undefined;
@@ -87,6 +90,7 @@ declare const GroupChannelMessage: {
87
90
  } | undefined;
88
91
  children?: React.ReactNode;
89
92
  sendingStatus?: React.ReactNode;
93
+ parentMessage?: React.ReactNode;
90
94
  groupedWithPrev: boolean;
91
95
  groupedWithNext: boolean;
92
96
  onPress?: (() => void) | undefined;
@@ -109,6 +113,7 @@ declare const GroupChannelMessage: {
109
113
  } | undefined;
110
114
  children?: React.ReactNode;
111
115
  sendingStatus?: React.ReactNode;
116
+ parentMessage?: React.ReactNode;
112
117
  groupedWithPrev: boolean;
113
118
  groupedWithNext: boolean;
114
119
  onPress?: (() => void) | undefined;
@@ -131,6 +136,7 @@ declare const GroupChannelMessage: {
131
136
  } | undefined;
132
137
  children?: React.ReactNode;
133
138
  sendingStatus?: React.ReactNode;
139
+ parentMessage?: React.ReactNode;
134
140
  groupedWithPrev: boolean;
135
141
  groupedWithNext: boolean;
136
142
  onPress?: (() => void) | undefined;
@@ -157,6 +163,7 @@ declare const GroupChannelMessage: {
157
163
  } | undefined;
158
164
  children?: React.ReactNode;
159
165
  sendingStatus?: React.ReactNode;
166
+ parentMessage?: React.ReactNode;
160
167
  groupedWithPrev: boolean;
161
168
  groupedWithNext: boolean;
162
169
  onPress?: (() => void) | undefined;
@@ -179,6 +186,7 @@ declare const GroupChannelMessage: {
179
186
  } | undefined;
180
187
  children?: React.ReactNode;
181
188
  sendingStatus?: React.ReactNode;
189
+ parentMessage?: React.ReactNode;
182
190
  groupedWithPrev: boolean;
183
191
  groupedWithNext: boolean;
184
192
  onPress?: (() => void) | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-react-native-foundation",
3
- "version": "3.0.4",
3
+ "version": "3.1.1",
4
4
  "description": "A foundational UI kit for building chat-enabled React Native apps.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -47,7 +47,7 @@
47
47
  "access": "public"
48
48
  },
49
49
  "dependencies": {
50
- "@sendbird/uikit-utils": "3.0.4"
50
+ "@sendbird/uikit-utils": "3.1.1"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/react": "*",
@@ -89,5 +89,5 @@
89
89
  "readmeFile": "./README.md",
90
90
  "displayName": "@sendbird/uikit-react-native-foundation"
91
91
  },
92
- "gitHead": "bf8ff3723f82f75ccf994938d6e5468e6fb669be"
92
+ "gitHead": "cc1e2d626a4a3278e80d523b4c63fd3719c82441"
93
93
  }
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { Image, ImageStyle, StyleProp, StyleSheet, View, ViewStyle } from 'react-native';
3
3
 
4
+ import { FileType, convertFileTypeToMessageType, getFileIconFromMessageType } from '@sendbird/uikit-utils';
5
+
4
6
  import IconAssets from '../../assets/icon';
5
7
  import createStyleSheet from '../../styles/createStyleSheet';
6
8
  import useUIKitTheme from '../../theme/useUIKitTheme';
@@ -15,13 +17,10 @@ type Props = {
15
17
  style?: StyleProp<ImageStyle>;
16
18
  containerStyle?: StyleProp<ViewStyle>;
17
19
  };
18
- const Icon: ((props: Props) => JSX.Element) & { Assets: typeof IconAssets } = ({
19
- icon,
20
- color,
21
- size = 24,
22
- containerStyle,
23
- style,
24
- }) => {
20
+ const Icon: ((props: Props) => JSX.Element) & {
21
+ Assets: typeof IconAssets;
22
+ File: typeof FileIcon;
23
+ } = ({ icon, color, size = 24, containerStyle, style }) => {
25
24
  const sizeStyle = sizeStyles[size as SizeFactor] ?? { width: size, height: size };
26
25
  const { colors } = useUIKitTheme();
27
26
  return (
@@ -35,6 +34,10 @@ const Icon: ((props: Props) => JSX.Element) & { Assets: typeof IconAssets } = ({
35
34
  );
36
35
  };
37
36
 
37
+ const FileIcon = ({ fileType, ...props }: Omit<Props, 'icon'> & { fileType: FileType }) => {
38
+ return <Icon icon={getFileIconFromMessageType(convertFileTypeToMessageType(fileType))} {...props} />;
39
+ };
40
+
38
41
  const containerStyles = StyleSheet.create({
39
42
  container: {
40
43
  alignItems: 'center',
@@ -66,4 +69,5 @@ const sizeStyles = createStyleSheet({
66
69
  });
67
70
 
68
71
  Icon.Assets = IconAssets;
72
+ Icon.File = FileIcon;
69
73
  export default Icon;
@@ -0,0 +1,107 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import { StyleProp, StyleSheet, ViewStyle } from 'react-native';
3
+
4
+ import { isImage } from '@sendbird/uikit-utils';
5
+
6
+ import createStyleSheet from '../../styles/createStyleSheet';
7
+ import useUIKitTheme from '../../theme/useUIKitTheme';
8
+ import Box from '../Box';
9
+ import Icon from '../Icon';
10
+ import ImageWithPlaceholder from '../ImageWithPlaceholder';
11
+
12
+ type Props = {
13
+ source: string;
14
+ fetchThumbnailFromVideoSource: (uri: string) => Promise<{ path: string } | null>;
15
+
16
+ style?: StyleProp<ViewStyle>;
17
+ iconSize?: number;
18
+ /** @deprecated please use `source` prop **/
19
+ videoSource?: string;
20
+ };
21
+
22
+ export const VideoThumbnail = ({ fetchThumbnailFromVideoSource, style, source, videoSource, iconSize = 28 }: Props) => {
23
+ const { palette, select } = useUIKitTheme();
24
+ const { thumbnail, loading } = useRetry(async () => {
25
+ if (isImage(source ?? videoSource)) return { path: source ?? videoSource };
26
+ return fetchThumbnailFromVideoSource(source ?? videoSource);
27
+ });
28
+
29
+ return (
30
+ <Box style={style}>
31
+ {loading ? (
32
+ <Box
33
+ style={StyleSheet.absoluteFill}
34
+ backgroundColor={select({ dark: palette.background400, light: palette.background100 })}
35
+ />
36
+ ) : (
37
+ <ImageWithPlaceholder source={{ uri: thumbnail ?? 'invalid-image' }} style={StyleSheet.absoluteFill} />
38
+ )}
39
+
40
+ {(loading || thumbnail !== null) && iconSize > 0 && (
41
+ <Box style={StyleSheet.absoluteFill} alignItems={'center'} justifyContent={'center'}>
42
+ <Icon
43
+ icon={'play'}
44
+ size={iconSize}
45
+ color={palette.onBackgroundLight02}
46
+ containerStyle={[styles.playIcon, { backgroundColor: palette.onBackgroundDark01 }]}
47
+ />
48
+ </Box>
49
+ )}
50
+ </Box>
51
+ );
52
+ };
53
+
54
+ const useRetry = (fetch: () => Promise<{ path: string } | null>, retryCount = 5) => {
55
+ const [state, setState] = useState({ thumbnail: null as null | string, loading: true });
56
+ const retryCountRef = useRef(0);
57
+ const fetchThumbnail = useRef(fetch);
58
+ fetchThumbnail.current = fetch;
59
+
60
+ useEffect(() => {
61
+ let _timeout: NodeJS.Timeout;
62
+ let _cancelled = false;
63
+
64
+ if (!state.thumbnail) {
65
+ const tryFetchThumbnail = (timeout: number) => {
66
+ const retry = () => {
67
+ retryCountRef.current++;
68
+ tryFetchThumbnail(timeout + 5000);
69
+ };
70
+
71
+ const finish = (path: string | null) => {
72
+ if (!_cancelled) setState({ loading: false, thumbnail: path });
73
+ };
74
+
75
+ if (retryCountRef.current < retryCount) {
76
+ _timeout = setTimeout(() => {
77
+ fetchThumbnail
78
+ .current()
79
+ .then((result) => {
80
+ if (result === null) retry();
81
+ else finish(result.path);
82
+ })
83
+ .catch(() => retry());
84
+ }, timeout);
85
+ } else {
86
+ finish(null);
87
+ }
88
+ };
89
+
90
+ tryFetchThumbnail(0);
91
+ }
92
+
93
+ return () => {
94
+ _cancelled = true;
95
+ clearTimeout(_timeout);
96
+ };
97
+ }, [state.thumbnail]);
98
+
99
+ return state;
100
+ };
101
+
102
+ const styles = createStyleSheet({
103
+ playIcon: {
104
+ padding: 10,
105
+ borderRadius: 50,
106
+ },
107
+ });