@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.
- package/lib/commonjs/components/Icon/index.js +12 -0
- package/lib/commonjs/components/Icon/index.js.map +1 -1
- package/lib/commonjs/components/VideoThumbnail/index.js +115 -0
- package/lib/commonjs/components/VideoThumbnail/index.js.map +1 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/theme/DarkUIKitTheme.js +2 -1
- package/lib/commonjs/theme/DarkUIKitTheme.js.map +1 -1
- package/lib/commonjs/theme/LightUIKitTheme.js +2 -1
- package/lib/commonjs/theme/LightUIKitTheme.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/ui/BottomSheet/index.js +1 -0
- package/lib/commonjs/ui/BottomSheet/index.js.map +1 -1
- package/lib/commonjs/ui/Dialog/DialogSheet.js +4 -3
- package/lib/commonjs/ui/Dialog/DialogSheet.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.image.js +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.image.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.js +6 -9
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.video.js +10 -72
- package/lib/commonjs/ui/GroupChannelMessage/Message.file.video.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/MessageContainer.js +7 -5
- package/lib/commonjs/ui/GroupChannelMessage/MessageContainer.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/MessageOpenGraph.js +2 -2
- package/lib/commonjs/ui/GroupChannelMessage/MessageOpenGraph.js.map +1 -1
- package/lib/commonjs/ui/GroupChannelMessage/index.js.map +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.image.js +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.image.js.map +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.js +2 -8
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.js.map +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.video.js +11 -78
- package/lib/commonjs/ui/OpenChannelMessage/Message.file.video.js.map +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.user.og.js +1 -1
- package/lib/commonjs/ui/OpenChannelMessage/Message.user.og.js.map +1 -1
- package/lib/module/components/Icon/index.js +12 -0
- package/lib/module/components/Icon/index.js.map +1 -1
- package/lib/module/components/VideoThumbnail/index.js +105 -0
- package/lib/module/components/VideoThumbnail/index.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/theme/DarkUIKitTheme.js +2 -1
- package/lib/module/theme/DarkUIKitTheme.js.map +1 -1
- package/lib/module/theme/LightUIKitTheme.js +2 -1
- package/lib/module/theme/LightUIKitTheme.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/ui/BottomSheet/index.js +1 -0
- package/lib/module/ui/BottomSheet/index.js.map +1 -1
- package/lib/module/ui/Dialog/DialogSheet.js +4 -3
- package/lib/module/ui/Dialog/DialogSheet.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/Message.file.image.js +2 -2
- package/lib/module/ui/GroupChannelMessage/Message.file.image.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/Message.file.js +7 -10
- package/lib/module/ui/GroupChannelMessage/Message.file.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/Message.file.video.js +11 -71
- package/lib/module/ui/GroupChannelMessage/Message.file.video.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/MessageContainer.js +7 -5
- package/lib/module/ui/GroupChannelMessage/MessageContainer.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/MessageOpenGraph.js +2 -2
- package/lib/module/ui/GroupChannelMessage/MessageOpenGraph.js.map +1 -1
- package/lib/module/ui/GroupChannelMessage/index.js.map +1 -1
- package/lib/module/ui/OpenChannelMessage/Message.file.image.js +2 -2
- package/lib/module/ui/OpenChannelMessage/Message.file.image.js.map +1 -1
- package/lib/module/ui/OpenChannelMessage/Message.file.js +2 -8
- package/lib/module/ui/OpenChannelMessage/Message.file.js.map +1 -1
- package/lib/module/ui/OpenChannelMessage/Message.file.video.js +12 -77
- package/lib/module/ui/OpenChannelMessage/Message.file.video.js.map +1 -1
- package/lib/module/ui/OpenChannelMessage/Message.user.og.js +1 -1
- package/lib/module/ui/OpenChannelMessage/Message.user.og.js.map +1 -1
- package/lib/typescript/src/components/Icon/index.d.ts +5 -0
- package/lib/typescript/src/components/VideoThumbnail/index.d.ts +13 -0
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/types.d.ts +1 -1
- package/lib/typescript/src/ui/BottomSheet/index.d.ts +1 -0
- package/lib/typescript/src/ui/Dialog/DialogSheet.d.ts +2 -1
- package/lib/typescript/src/ui/GroupChannelMessage/MessageContainer.d.ts +2 -2
- package/lib/typescript/src/ui/GroupChannelMessage/MessageOpenGraph.d.ts +1 -1
- package/lib/typescript/src/ui/GroupChannelMessage/index.d.ts +8 -0
- package/package.json +3 -3
- package/src/components/Icon/index.tsx +11 -7
- package/src/components/VideoThumbnail/index.tsx +107 -0
- package/src/index.ts +1 -0
- package/src/theme/DarkUIKitTheme.ts +1 -0
- package/src/theme/LightUIKitTheme.ts +1 -0
- package/src/types.ts +1 -1
- package/src/ui/BottomSheet/index.tsx +2 -0
- package/src/ui/Dialog/DialogSheet.tsx +6 -3
- package/src/ui/GroupChannelMessage/Message.file.image.tsx +2 -2
- package/src/ui/GroupChannelMessage/Message.file.tsx +4 -6
- package/src/ui/GroupChannelMessage/Message.file.video.tsx +12 -60
- package/src/ui/GroupChannelMessage/MessageContainer.tsx +18 -13
- package/src/ui/GroupChannelMessage/MessageOpenGraph.tsx +3 -3
- package/src/ui/GroupChannelMessage/index.ts +1 -0
- package/src/ui/OpenChannelMessage/Message.file.image.tsx +2 -2
- package/src/ui/OpenChannelMessage/Message.file.tsx +1 -3
- package/src/ui/OpenChannelMessage/Message.file.video.tsx +12 -55
- 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;
|
|
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 {
|
|
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 =
|
|
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","
|
|
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
|
-
|
|
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","
|
|
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
|
|
2
|
-
import {
|
|
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 =
|
|
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(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
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","
|
|
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),
|
|
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 {
|
|
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';
|
|
@@ -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:
|
|
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.
|
|
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.
|
|
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": "
|
|
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) & {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
+
});
|