@amityco/react-native-social-uikit 4.1.0 → 4.1.1-21d3e899.0

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 (167) hide show
  1. package/lib/commonjs/core/assets/icons/xml.js +43 -1
  2. package/lib/commonjs/core/assets/icons/xml.js.map +1 -1
  3. package/lib/commonjs/social/components/LoadingImage/index.js +4 -3
  4. package/lib/commonjs/social/components/LoadingImage/index.js.map +1 -1
  5. package/lib/commonjs/social/components/LoadingImage/styles.js +4 -0
  6. package/lib/commonjs/social/components/LoadingImage/styles.js.map +1 -1
  7. package/lib/commonjs/social/components/LoadingVideo/index.js +12 -6
  8. package/lib/commonjs/social/components/LoadingVideo/index.js.map +1 -1
  9. package/lib/commonjs/social/components/LoadingVideo/styles.js +4 -0
  10. package/lib/commonjs/social/components/LoadingVideo/styles.js.map +1 -1
  11. package/lib/commonjs/social/components/MediaSelector/MediaSelector.js +164 -0
  12. package/lib/commonjs/social/components/MediaSelector/MediaSelector.js.map +1 -0
  13. package/lib/commonjs/social/components/MediaSelector/index.js +13 -0
  14. package/lib/commonjs/social/components/MediaSelector/index.js.map +1 -0
  15. package/lib/commonjs/social/components/MediaSelector/styles.js +130 -0
  16. package/lib/commonjs/social/components/MediaSelector/styles.js.map +1 -0
  17. package/lib/commonjs/social/components/MediaViewer/MediaViewer.js +134 -0
  18. package/lib/commonjs/social/components/MediaViewer/MediaViewer.js.map +1 -0
  19. package/lib/commonjs/social/components/MediaViewer/index.js +13 -0
  20. package/lib/commonjs/social/components/MediaViewer/index.js.map +1 -0
  21. package/lib/commonjs/social/components/MediaViewer/styles.js +60 -0
  22. package/lib/commonjs/social/components/MediaViewer/styles.js.map +1 -0
  23. package/lib/commonjs/social/components/PostContent/index.js +75 -120
  24. package/lib/commonjs/social/components/PostContent/index.js.map +1 -1
  25. package/lib/commonjs/social/components/SelectedMediaComponent/SelectedMediaComponent.js +147 -0
  26. package/lib/commonjs/social/components/SelectedMediaComponent/SelectedMediaComponent.js.map +1 -0
  27. package/lib/commonjs/social/components/SelectedMediaComponent/index.js +13 -0
  28. package/lib/commonjs/social/components/SelectedMediaComponent/index.js.map +1 -0
  29. package/lib/commonjs/social/components/SelectedMediaComponent/styles.js +43 -0
  30. package/lib/commonjs/social/components/SelectedMediaComponent/styles.js.map +1 -0
  31. package/lib/commonjs/social/constants/index.js +11 -0
  32. package/lib/commonjs/social/constants/index.js.map +1 -0
  33. package/lib/commonjs/social/elements/PostMediaElement/PostMediaElement.js +244 -0
  34. package/lib/commonjs/social/elements/PostMediaElement/PostMediaElement.js.map +1 -0
  35. package/lib/commonjs/social/elements/PostMediaElement/index.js +13 -0
  36. package/lib/commonjs/social/elements/PostMediaElement/index.js.map +1 -0
  37. package/lib/commonjs/social/elements/PostMediaElement/styles.js +117 -0
  38. package/lib/commonjs/social/elements/PostMediaElement/styles.js.map +1 -0
  39. package/lib/commonjs/social/features/post/Composer/PostComposer.js +57 -91
  40. package/lib/commonjs/social/features/post/Composer/PostComposer.js.map +1 -1
  41. package/lib/commonjs/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.js +17 -7
  42. package/lib/commonjs/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.js.map +1 -1
  43. package/lib/commonjs/social/features/post/components/MediaAttachment/MediaAttachment.js +17 -7
  44. package/lib/commonjs/social/features/post/components/MediaAttachment/MediaAttachment.js.map +1 -1
  45. package/lib/commonjs/social/utils/getFrameRatio.js +52 -0
  46. package/lib/commonjs/social/utils/getFrameRatio.js.map +1 -0
  47. package/lib/commonjs/social/utils/getIndicatorConfig.js +59 -0
  48. package/lib/commonjs/social/utils/getIndicatorConfig.js.map +1 -0
  49. package/lib/module/core/assets/icons/xml.js +38 -0
  50. package/lib/module/core/assets/icons/xml.js.map +1 -1
  51. package/lib/module/social/components/LoadingImage/index.js +4 -3
  52. package/lib/module/social/components/LoadingImage/index.js.map +1 -1
  53. package/lib/module/social/components/LoadingImage/styles.js +4 -0
  54. package/lib/module/social/components/LoadingImage/styles.js.map +1 -1
  55. package/lib/module/social/components/LoadingVideo/index.js +13 -7
  56. package/lib/module/social/components/LoadingVideo/index.js.map +1 -1
  57. package/lib/module/social/components/LoadingVideo/styles.js +4 -0
  58. package/lib/module/social/components/LoadingVideo/styles.js.map +1 -1
  59. package/lib/module/social/components/MediaSelector/MediaSelector.js +158 -0
  60. package/lib/module/social/components/MediaSelector/MediaSelector.js.map +1 -0
  61. package/lib/module/social/components/MediaSelector/index.js +2 -0
  62. package/lib/module/social/components/MediaSelector/index.js.map +1 -0
  63. package/lib/module/social/components/MediaSelector/styles.js +123 -0
  64. package/lib/module/social/components/MediaSelector/styles.js.map +1 -0
  65. package/lib/module/social/components/MediaViewer/MediaViewer.js +127 -0
  66. package/lib/module/social/components/MediaViewer/MediaViewer.js.map +1 -0
  67. package/lib/module/social/components/MediaViewer/index.js +2 -0
  68. package/lib/module/social/components/MediaViewer/index.js.map +1 -0
  69. package/lib/module/social/components/MediaViewer/styles.js +53 -0
  70. package/lib/module/social/components/MediaViewer/styles.js.map +1 -0
  71. package/lib/module/social/components/PostContent/index.js +77 -122
  72. package/lib/module/social/components/PostContent/index.js.map +1 -1
  73. package/lib/module/social/components/SelectedMediaComponent/SelectedMediaComponent.js +141 -0
  74. package/lib/module/social/components/SelectedMediaComponent/SelectedMediaComponent.js.map +1 -0
  75. package/lib/module/social/components/SelectedMediaComponent/index.js +2 -0
  76. package/lib/module/social/components/SelectedMediaComponent/index.js.map +1 -0
  77. package/lib/module/social/components/SelectedMediaComponent/styles.js +36 -0
  78. package/lib/module/social/components/SelectedMediaComponent/styles.js.map +1 -0
  79. package/lib/module/social/constants/index.js +5 -0
  80. package/lib/module/social/constants/index.js.map +1 -0
  81. package/lib/module/social/elements/PostMediaElement/PostMediaElement.js +237 -0
  82. package/lib/module/social/elements/PostMediaElement/PostMediaElement.js.map +1 -0
  83. package/lib/module/social/elements/PostMediaElement/index.js +2 -0
  84. package/lib/module/social/elements/PostMediaElement/index.js.map +1 -0
  85. package/lib/module/social/elements/PostMediaElement/styles.js +110 -0
  86. package/lib/module/social/elements/PostMediaElement/styles.js.map +1 -0
  87. package/lib/module/social/features/post/Composer/PostComposer.js +59 -93
  88. package/lib/module/social/features/post/Composer/PostComposer.js.map +1 -1
  89. package/lib/module/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.js +17 -7
  90. package/lib/module/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.js.map +1 -1
  91. package/lib/module/social/features/post/components/MediaAttachment/MediaAttachment.js +17 -7
  92. package/lib/module/social/features/post/components/MediaAttachment/MediaAttachment.js.map +1 -1
  93. package/lib/module/social/utils/getFrameRatio.js +44 -0
  94. package/lib/module/social/utils/getFrameRatio.js.map +1 -0
  95. package/lib/module/social/utils/getIndicatorConfig.js +53 -0
  96. package/lib/module/social/utils/getIndicatorConfig.js.map +1 -0
  97. package/lib/typescript/core/assets/icons/xml.d.ts +5 -0
  98. package/lib/typescript/core/assets/icons/xml.d.ts.map +1 -1
  99. package/lib/typescript/social/components/LoadingImage/index.d.ts +2 -1
  100. package/lib/typescript/social/components/LoadingImage/index.d.ts.map +1 -1
  101. package/lib/typescript/social/components/LoadingImage/styles.d.ts +4 -0
  102. package/lib/typescript/social/components/LoadingImage/styles.d.ts.map +1 -1
  103. package/lib/typescript/social/components/LoadingVideo/index.d.ts +2 -1
  104. package/lib/typescript/social/components/LoadingVideo/index.d.ts.map +1 -1
  105. package/lib/typescript/social/components/LoadingVideo/styles.d.ts +4 -0
  106. package/lib/typescript/social/components/LoadingVideo/styles.d.ts.map +1 -1
  107. package/lib/typescript/social/components/MediaSelector/MediaSelector.d.ts +14 -0
  108. package/lib/typescript/social/components/MediaSelector/MediaSelector.d.ts.map +1 -0
  109. package/lib/typescript/social/components/MediaSelector/index.d.ts +2 -0
  110. package/lib/typescript/social/components/MediaSelector/index.d.ts.map +1 -0
  111. package/lib/typescript/social/components/MediaSelector/styles.d.ts +116 -0
  112. package/lib/typescript/social/components/MediaSelector/styles.d.ts.map +1 -0
  113. package/lib/typescript/social/components/MediaViewer/MediaViewer.d.ts +17 -0
  114. package/lib/typescript/social/components/MediaViewer/MediaViewer.d.ts.map +1 -0
  115. package/lib/typescript/social/components/MediaViewer/index.d.ts +3 -0
  116. package/lib/typescript/social/components/MediaViewer/index.d.ts.map +1 -0
  117. package/lib/typescript/social/components/MediaViewer/styles.d.ts +48 -0
  118. package/lib/typescript/social/components/MediaViewer/styles.d.ts.map +1 -0
  119. package/lib/typescript/social/components/PostContent/index.d.ts.map +1 -1
  120. package/lib/typescript/social/components/SelectedMediaComponent/SelectedMediaComponent.d.ts +12 -0
  121. package/lib/typescript/social/components/SelectedMediaComponent/SelectedMediaComponent.d.ts.map +1 -0
  122. package/lib/typescript/social/components/SelectedMediaComponent/index.d.ts +3 -0
  123. package/lib/typescript/social/components/SelectedMediaComponent/index.d.ts.map +1 -0
  124. package/lib/typescript/social/components/SelectedMediaComponent/styles.d.ts +25 -0
  125. package/lib/typescript/social/components/SelectedMediaComponent/styles.d.ts.map +1 -0
  126. package/lib/typescript/social/constants/index.d.ts +4 -0
  127. package/lib/typescript/social/constants/index.d.ts.map +1 -0
  128. package/lib/typescript/social/elements/PostMediaElement/PostMediaElement.d.ts +15 -0
  129. package/lib/typescript/social/elements/PostMediaElement/PostMediaElement.d.ts.map +1 -0
  130. package/lib/typescript/social/elements/PostMediaElement/index.d.ts +3 -0
  131. package/lib/typescript/social/elements/PostMediaElement/index.d.ts.map +1 -0
  132. package/lib/typescript/social/elements/PostMediaElement/styles.d.ts +88 -0
  133. package/lib/typescript/social/elements/PostMediaElement/styles.d.ts.map +1 -0
  134. package/lib/typescript/social/features/post/Composer/PostComposer.d.ts.map +1 -1
  135. package/lib/typescript/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.d.ts +3 -0
  136. package/lib/typescript/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.d.ts.map +1 -1
  137. package/lib/typescript/social/features/post/components/MediaAttachment/MediaAttachment.d.ts +3 -0
  138. package/lib/typescript/social/features/post/components/MediaAttachment/MediaAttachment.d.ts.map +1 -1
  139. package/lib/typescript/social/utils/getFrameRatio.d.ts +21 -0
  140. package/lib/typescript/social/utils/getFrameRatio.d.ts.map +1 -0
  141. package/lib/typescript/social/utils/getIndicatorConfig.d.ts +11 -0
  142. package/lib/typescript/social/utils/getIndicatorConfig.d.ts.map +1 -0
  143. package/package.json +5 -3
  144. package/src/core/assets/icons/xml.ts +46 -0
  145. package/src/social/components/LoadingImage/index.tsx +12 -2
  146. package/src/social/components/LoadingImage/styles.ts +4 -0
  147. package/src/social/components/LoadingVideo/index.tsx +28 -4
  148. package/src/social/components/LoadingVideo/styles.ts +4 -0
  149. package/src/social/components/MediaSelector/MediaSelector.tsx +231 -0
  150. package/src/social/components/MediaSelector/index.tsx +1 -0
  151. package/src/social/components/MediaSelector/styles.ts +124 -0
  152. package/src/social/components/MediaViewer/MediaViewer.tsx +168 -0
  153. package/src/social/components/MediaViewer/index.tsx +2 -0
  154. package/src/social/components/MediaViewer/styles.ts +53 -0
  155. package/src/social/components/PostContent/index.tsx +86 -159
  156. package/src/social/components/SelectedMediaComponent/SelectedMediaComponent.tsx +202 -0
  157. package/src/social/components/SelectedMediaComponent/index.ts +2 -0
  158. package/src/social/components/SelectedMediaComponent/styles.ts +38 -0
  159. package/src/social/constants/index.ts +4 -0
  160. package/src/social/elements/PostMediaElement/PostMediaElement.tsx +318 -0
  161. package/src/social/elements/PostMediaElement/index.tsx +5 -0
  162. package/src/social/elements/PostMediaElement/styles.ts +99 -0
  163. package/src/social/features/post/Composer/PostComposer.tsx +70 -96
  164. package/src/social/features/post/components/DetailedMediaAttachment/DetailedMediaAttachment.tsx +10 -3
  165. package/src/social/features/post/components/MediaAttachment/MediaAttachment.tsx +14 -3
  166. package/src/social/utils/getFrameRatio.ts +42 -0
  167. package/src/social/utils/getIndicatorConfig.ts +62 -0
@@ -0,0 +1,237 @@
1
+ import { useMemo, useRef, useState } from 'react';
2
+ import { Image, Pressable, ScrollView, useWindowDimensions, View } from 'react-native';
3
+ import { SvgXml } from 'react-native-svg';
4
+ import { Typography } from '../../../core/components/Typography/Typography';
5
+ import useAuth from '../../../core/hooks/useAuth';
6
+ import { videoControlIcon, brokenImageIcon } from '../../../core/assets/icons/xml';
7
+ import { getFrameRatio, getVideoDisplayDims, FRAME_RATIO_VALUE, DEFAULT_FRAME_RATIO } from '../../utils/getFrameRatio';
8
+ import { getIndicatorConfig } from '../../utils/getIndicatorConfig';
9
+ import { useStyles } from './styles';
10
+ function isMediaPost(post) {
11
+ return post.dataType === 'image' || post.dataType === 'video';
12
+ }
13
+ function getAttachmentRatio(post) {
14
+ if (!post) return DEFAULT_FRAME_RATIO;
15
+ if (post.dataType === 'image') {
16
+ const image = post.getImageInfo();
17
+ return getFrameRatio(image === null || image === void 0 ? void 0 : image.getWidth(), image === null || image === void 0 ? void 0 : image.getHeight());
18
+ }
19
+ const video = post.getVideoInfo();
20
+ const {
21
+ width,
22
+ height
23
+ } = getVideoDisplayDims({
24
+ width: video === null || video === void 0 ? void 0 : video.getWidth(),
25
+ height: video === null || video === void 0 ? void 0 : video.getHeight(),
26
+ rotation: video === null || video === void 0 ? void 0 : video.getRotation()
27
+ });
28
+ return getFrameRatio(width, height);
29
+ }
30
+ export function PostMediaElement({
31
+ posts,
32
+ onImageClick,
33
+ onVideoClick,
34
+ controlsRef,
35
+ loading = false
36
+ }) {
37
+ const styles = useStyles();
38
+ const {
39
+ width: screenWidth
40
+ } = useWindowDimensions();
41
+ const [current, setCurrent] = useState(0);
42
+ const [trackWidth, setTrackWidth] = useState(0);
43
+ const scrollRef = useRef(null);
44
+ const mediaPosts = useMemo(() => (posts ?? []).filter(isMediaPost), [posts]);
45
+ const ratio = useMemo(() => getAttachmentRatio(mediaPosts[0]), [mediaPosts]);
46
+ if (mediaPosts.length === 0) {
47
+ if (!loading) return null;
48
+ // Loading placeholder: a full-bleed frame in the base-shade4 colour, so the
49
+ // media area doesn't flash blank before the child posts resolve.
50
+ return /*#__PURE__*/React.createElement(View, {
51
+ style: styles.postMedia
52
+ }, /*#__PURE__*/React.createElement(View, {
53
+ style: styles.postMedia__track
54
+ }, /*#__PURE__*/React.createElement(View, {
55
+ style: [styles.postMedia__frame, {
56
+ aspectRatio: FRAME_RATIO_VALUE[DEFAULT_FRAME_RATIO]
57
+ }]
58
+ })));
59
+ }
60
+ const total = mediaPosts.length;
61
+ const isCarousel = total > 1;
62
+ const aspectRatio = FRAME_RATIO_VALUE[ratio];
63
+ // The carousel is full-bleed (screen width); use that immediately so the
64
+ // ScrollView renders without waiting for onLayout — otherwise there is an
65
+ // empty block between the placeholder and the first frame.
66
+ const slideWidth = trackWidth || screenWidth;
67
+ const handleFrameClick = index => {
68
+ const post = mediaPosts[index];
69
+ if (post.dataType === 'image') onImageClick(index);else onVideoClick(index);
70
+ };
71
+ const onLayout = event => {
72
+ const width = event.nativeEvent.layout.width;
73
+ if (width && width !== trackWidth) setTrackWidth(width);
74
+ };
75
+ const onMomentumScrollEnd = event => {
76
+ if (!slideWidth) return;
77
+ const nextIndex = Math.round(event.nativeEvent.contentOffset.x / slideWidth);
78
+ if (nextIndex !== current) setCurrent(nextIndex);
79
+ };
80
+ if (controlsRef) {
81
+ controlsRef.current = {
82
+ slideTo: index => {
83
+ var _scrollRef$current;
84
+ (_scrollRef$current = scrollRef.current) === null || _scrollRef$current === void 0 || _scrollRef$current.scrollTo({
85
+ x: index * slideWidth,
86
+ animated: false
87
+ });
88
+ setCurrent(index);
89
+ }
90
+ };
91
+ }
92
+ if (!isCarousel) {
93
+ return /*#__PURE__*/React.createElement(View, {
94
+ style: styles.postMedia
95
+ }, /*#__PURE__*/React.createElement(View, {
96
+ style: styles.postMedia__track,
97
+ onLayout: onLayout
98
+ }, /*#__PURE__*/React.createElement(MediaFrame, {
99
+ post: mediaPosts[0],
100
+ aspectRatio: aspectRatio,
101
+ onPress: () => handleFrameClick(0)
102
+ })));
103
+ }
104
+ return /*#__PURE__*/React.createElement(View, {
105
+ style: styles.postMedia
106
+ }, /*#__PURE__*/React.createElement(View, {
107
+ style: styles.postMedia__track,
108
+ onLayout: onLayout
109
+ }, /*#__PURE__*/React.createElement(ScrollView, {
110
+ ref: scrollRef,
111
+ horizontal: true,
112
+ pagingEnabled: true,
113
+ showsHorizontalScrollIndicator: false,
114
+ onMomentumScrollEnd: onMomentumScrollEnd,
115
+ scrollEventThrottle: 16,
116
+ decelerationRate: "fast"
117
+ }, mediaPosts.map((post, index) => /*#__PURE__*/React.createElement(View, {
118
+ key: post.postId,
119
+ style: [styles.postMedia__slide, {
120
+ width: slideWidth
121
+ }]
122
+ }, /*#__PURE__*/React.createElement(MediaFrame, {
123
+ post: post,
124
+ aspectRatio: aspectRatio,
125
+ onPress: () => handleFrameClick(index)
126
+ })))), /*#__PURE__*/React.createElement(PositionCounter, {
127
+ current: current,
128
+ total: total
129
+ })), /*#__PURE__*/React.createElement(PaginationIndicator, {
130
+ current: current,
131
+ total: total
132
+ }));
133
+ }
134
+ function PaginationIndicator({
135
+ current,
136
+ total
137
+ }) {
138
+ const styles = useStyles();
139
+ const {
140
+ dots
141
+ } = getIndicatorConfig(current, total);
142
+ return /*#__PURE__*/React.createElement(View, {
143
+ style: styles.postMedia__indicator
144
+ }, dots.map(dot => /*#__PURE__*/React.createElement(View, {
145
+ key: dot.key,
146
+ style: styles.postMedia__dotSlot
147
+ }, /*#__PURE__*/React.createElement(View, {
148
+ style: [styles.postMedia__dot, dot.state === 'active' ? styles.postMedia__dotActive : dot.state === 'edge' ? styles.postMedia__dotEdge : styles.postMedia__dotInactive]
149
+ }))));
150
+ }
151
+ function PositionCounter({
152
+ current,
153
+ total
154
+ }) {
155
+ const styles = useStyles();
156
+ return /*#__PURE__*/React.createElement(View, {
157
+ style: styles.postMedia__counter
158
+ }, /*#__PURE__*/React.createElement(Typography.Body, {
159
+ style: styles.postMedia__counterLabel
160
+ }, current + 1, "/", total));
161
+ }
162
+ function MediaFrame({
163
+ post,
164
+ aspectRatio,
165
+ onPress
166
+ }) {
167
+ const styles = useStyles();
168
+ return /*#__PURE__*/React.createElement(Pressable, {
169
+ onPress: onPress,
170
+ style: [styles.postMedia__frame, {
171
+ aspectRatio
172
+ }]
173
+ }, post.dataType === 'image' ? /*#__PURE__*/React.createElement(ImageMedia, {
174
+ post: post
175
+ }) : /*#__PURE__*/React.createElement(VideoMedia, {
176
+ post: post
177
+ }));
178
+ }
179
+ function ImageMedia({
180
+ post
181
+ }) {
182
+ var _post$getImageInfo;
183
+ const styles = useStyles();
184
+ const {
185
+ apiRegion
186
+ } = useAuth();
187
+ const [isBroken, setIsBroken] = useState(false);
188
+ const fileId = (_post$getImageInfo = post.getImageInfo()) === null || _post$getImageInfo === void 0 ? void 0 : _post$getImageInfo.fileId;
189
+ const url = fileId ? `https://api.${apiRegion}.amity.co/api/v3/files/${fileId}/download?size=large` : undefined;
190
+ if (!url || isBroken) return /*#__PURE__*/React.createElement(BrokenFrame, null);
191
+ return /*#__PURE__*/React.createElement(Image, {
192
+ style: styles.postMedia__media,
193
+ source: {
194
+ uri: url
195
+ },
196
+ resizeMode: "cover",
197
+ onError: () => setIsBroken(true)
198
+ });
199
+ }
200
+ function VideoMedia({
201
+ post
202
+ }) {
203
+ const styles = useStyles();
204
+ const {
205
+ apiRegion
206
+ } = useAuth();
207
+ const [isBroken, setIsBroken] = useState(false);
208
+ const data = post.data;
209
+ const thumbnailFileId = data === null || data === void 0 ? void 0 : data.thumbnailFileId;
210
+ const url = thumbnailFileId ? `https://api.${apiRegion}.amity.co/api/v3/files/${thumbnailFileId}/download?size=large` : undefined;
211
+ if (!url || isBroken) return /*#__PURE__*/React.createElement(BrokenFrame, null);
212
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Image, {
213
+ style: styles.postMedia__media,
214
+ source: {
215
+ uri: url
216
+ },
217
+ resizeMode: "cover",
218
+ onError: () => setIsBroken(true)
219
+ }), /*#__PURE__*/React.createElement(View, {
220
+ style: styles.postMedia__playButton
221
+ }, /*#__PURE__*/React.createElement(SvgXml, {
222
+ xml: videoControlIcon,
223
+ width: "40",
224
+ height: "40"
225
+ })));
226
+ }
227
+ function BrokenFrame() {
228
+ const styles = useStyles();
229
+ return /*#__PURE__*/React.createElement(View, {
230
+ style: styles.postMedia__broken
231
+ }, /*#__PURE__*/React.createElement(SvgXml, {
232
+ xml: brokenImageIcon(),
233
+ width: 32,
234
+ height: 32
235
+ }));
236
+ }
237
+ //# sourceMappingURL=PostMediaElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useRef","useState","Image","Pressable","ScrollView","useWindowDimensions","View","SvgXml","Typography","useAuth","videoControlIcon","brokenImageIcon","getFrameRatio","getVideoDisplayDims","FRAME_RATIO_VALUE","DEFAULT_FRAME_RATIO","getIndicatorConfig","useStyles","isMediaPost","post","dataType","getAttachmentRatio","image","getImageInfo","getWidth","getHeight","video","getVideoInfo","width","height","rotation","getRotation","PostMediaElement","posts","onImageClick","onVideoClick","controlsRef","loading","styles","screenWidth","current","setCurrent","trackWidth","setTrackWidth","scrollRef","mediaPosts","filter","ratio","length","React","createElement","style","postMedia","postMedia__track","postMedia__frame","aspectRatio","total","isCarousel","slideWidth","handleFrameClick","index","onLayout","event","nativeEvent","layout","onMomentumScrollEnd","nextIndex","Math","round","contentOffset","x","slideTo","_scrollRef$current","scrollTo","animated","MediaFrame","onPress","ref","horizontal","pagingEnabled","showsHorizontalScrollIndicator","scrollEventThrottle","decelerationRate","map","key","postId","postMedia__slide","PositionCounter","PaginationIndicator","dots","postMedia__indicator","dot","postMedia__dotSlot","postMedia__dot","state","postMedia__dotActive","postMedia__dotEdge","postMedia__dotInactive","postMedia__counter","Body","postMedia__counterLabel","ImageMedia","VideoMedia","_post$getImageInfo","apiRegion","isBroken","setIsBroken","fileId","url","undefined","BrokenFrame","postMedia__media","source","uri","resizeMode","onError","data","thumbnailFileId","Fragment","postMedia__playButton","xml","postMedia__broken"],"sourceRoot":"../../../../../src","sources":["social/elements/PostMediaElement/PostMediaElement.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export { PostMediaElement } from './PostMediaElement';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PostMediaElement"],"sourceRoot":"../../../../../src","sources":["social/elements/PostMediaElement/index.tsx"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,oBAAoB","ignoreList":[]}
@@ -0,0 +1,110 @@
1
+ import { StyleSheet } from 'react-native';
2
+ import { useTheme } from 'react-native-paper';
3
+ // Values map 1:1 from web PR #1830 PostMediaElement.module.css (1rem = 16dp).
4
+ // Colors resolve through theme tokens (web CSS variables), never hardcoded.
5
+ export const useStyles = () => {
6
+ const theme = useTheme();
7
+ const styles = StyleSheet.create({
8
+ postMedia: {
9
+ // Full-bleed: cancel the post card's 16px horizontal padding so the media
10
+ // spans the full card width (web PR #1830/#1834: width calc(100% + 2rem),
11
+ // margin-left/right -1rem).
12
+ marginHorizontal: -16,
13
+ paddingVertical: 8 // web: padding 0.5rem 0
14
+ },
15
+ postMedia__track: {
16
+ position: 'relative',
17
+ width: '100%'
18
+ },
19
+ postMedia__slide: {
20
+ // width is set dynamically to the measured track width so paging aligns
21
+ },
22
+ postMedia__frame: {
23
+ width: '100%',
24
+ overflow: 'hidden',
25
+ // web: no border-radius; background var(--asc-color-base-shade4)
26
+ backgroundColor: theme.colors.baseShade4
27
+ },
28
+ postMedia__media: {
29
+ width: '100%',
30
+ height: '100%'
31
+ },
32
+ postMedia__playButton: {
33
+ position: 'absolute',
34
+ top: '50%',
35
+ left: '50%',
36
+ // web: 2.5rem (40dp), centred via translate(-50%, -50%)
37
+ width: 40,
38
+ height: 40,
39
+ transform: [{
40
+ translateX: -20
41
+ }, {
42
+ translateY: -20
43
+ }],
44
+ zIndex: 1
45
+ },
46
+ postMedia__broken: {
47
+ flex: 1,
48
+ alignItems: 'center',
49
+ justifyContent: 'center',
50
+ backgroundColor: theme.colors.baseShade4
51
+ },
52
+ postMedia__counter: {
53
+ position: 'absolute',
54
+ top: 8,
55
+ // web: 0.5rem
56
+ right: 8,
57
+ // web: 0.5rem
58
+ alignItems: 'center',
59
+ justifyContent: 'center',
60
+ paddingVertical: 6,
61
+ // web: 0.375rem
62
+ paddingHorizontal: 12,
63
+ // web: 0.75rem
64
+ borderRadius: 999,
65
+ // web: --asc-border-radius-full
66
+ backgroundColor: 'rgba(0,0,0,0.5)' // web: --asc-color-transparent-black (#00000080)
67
+ },
68
+ postMedia__counterLabel: {
69
+ color: '#FFFFFF' // web: var(--asc-color-white)
70
+ },
71
+ postMedia__indicator: {
72
+ flexDirection: 'row',
73
+ alignItems: 'center',
74
+ justifyContent: 'center',
75
+ gap: 4,
76
+ // web: gap 0.25rem
77
+ height: 6,
78
+ // web: height 0.375rem
79
+ marginTop: 12 // web: parent .postMedia column gap 0.75rem
80
+ },
81
+ postMedia__dotSlot: {
82
+ alignItems: 'center',
83
+ justifyContent: 'center',
84
+ width: 6,
85
+ // web: 0.375rem
86
+ height: 6 // web: 0.375rem
87
+ },
88
+ postMedia__dot: {
89
+ borderRadius: 999,
90
+ // web: border-radius 50%
91
+ backgroundColor: theme.colors.baseShade4 // inactive/edge: base-shade4
92
+ },
93
+ postMedia__dotActive: {
94
+ width: 6,
95
+ height: 6,
96
+ backgroundColor: theme.colors.base // web: var(--asc-color-base-default)
97
+ },
98
+ postMedia__dotInactive: {
99
+ width: 6,
100
+ height: 6
101
+ },
102
+ postMedia__dotEdge: {
103
+ width: 3,
104
+ // web: 0.1875rem
105
+ height: 3
106
+ }
107
+ });
108
+ return styles;
109
+ };
110
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","useTheme","useStyles","theme","styles","create","postMedia","marginHorizontal","paddingVertical","postMedia__track","position","width","postMedia__slide","postMedia__frame","overflow","backgroundColor","colors","baseShade4","postMedia__media","height","postMedia__playButton","top","left","transform","translateX","translateY","zIndex","postMedia__broken","flex","alignItems","justifyContent","postMedia__counter","right","paddingHorizontal","borderRadius","postMedia__counterLabel","color","postMedia__indicator","flexDirection","gap","marginTop","postMedia__dotSlot","postMedia__dot","postMedia__dotActive","base","postMedia__dotInactive","postMedia__dotEdge"],"sourceRoot":"../../../../../src","sources":["social/elements/PostMediaElement/styles.ts"],"mappings":"AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SAASC,QAAQ,QAAQ,oBAAoB;AAG7C;AACA;AACA,OAAO,MAAMC,SAAS,GAAGA,CAAA,KAAM;EAC7B,MAAMC,KAAK,GAAGF,QAAQ,CAAa,CAAC;EAEpC,MAAMG,MAAM,GAAGJ,UAAU,CAACK,MAAM,CAAC;IAC/BC,SAAS,EAAE;MACT;MACA;MACA;MACAC,gBAAgB,EAAE,CAAC,EAAE;MACrBC,eAAe,EAAE,CAAC,CAAE;IACtB,CAAC;IACDC,gBAAgB,EAAE;MAChBC,QAAQ,EAAE,UAAU;MACpBC,KAAK,EAAE;IACT,CAAC;IACDC,gBAAgB,EAAE;MAChB;IAAA,CACD;IACDC,gBAAgB,EAAE;MAChBF,KAAK,EAAE,MAAM;MACbG,QAAQ,EAAE,QAAQ;MAClB;MACAC,eAAe,EAAEZ,KAAK,CAACa,MAAM,CAACC;IAChC,CAAC;IACDC,gBAAgB,EAAE;MAChBP,KAAK,EAAE,MAAM;MACbQ,MAAM,EAAE;IACV,CAAC;IACDC,qBAAqB,EAAE;MACrBV,QAAQ,EAAE,UAAU;MACpBW,GAAG,EAAE,KAAK;MACVC,IAAI,EAAE,KAAK;MACX;MACAX,KAAK,EAAE,EAAE;MACTQ,MAAM,EAAE,EAAE;MACVI,SAAS,EAAE,CAAC;QAAEC,UAAU,EAAE,CAAC;MAAG,CAAC,EAAE;QAAEC,UAAU,EAAE,CAAC;MAAG,CAAC,CAAC;MACrDC,MAAM,EAAE;IACV,CAAC;IACDC,iBAAiB,EAAE;MACjBC,IAAI,EAAE,CAAC;MACPC,UAAU,EAAE,QAAQ;MACpBC,cAAc,EAAE,QAAQ;MACxBf,eAAe,EAAEZ,KAAK,CAACa,MAAM,CAACC;IAChC,CAAC;IACDc,kBAAkB,EAAE;MAClBrB,QAAQ,EAAE,UAAU;MACpBW,GAAG,EAAE,CAAC;MAAE;MACRW,KAAK,EAAE,CAAC;MAAE;MACVH,UAAU,EAAE,QAAQ;MACpBC,cAAc,EAAE,QAAQ;MACxBtB,eAAe,EAAE,CAAC;MAAE;MACpByB,iBAAiB,EAAE,EAAE;MAAE;MACvBC,YAAY,EAAE,GAAG;MAAE;MACnBnB,eAAe,EAAE,iBAAiB,CAAE;IACtC,CAAC;IACDoB,uBAAuB,EAAE;MACvBC,KAAK,EAAE,SAAS,CAAE;IACpB,CAAC;IACDC,oBAAoB,EAAE;MACpBC,aAAa,EAAE,KAAK;MACpBT,UAAU,EAAE,QAAQ;MACpBC,cAAc,EAAE,QAAQ;MACxBS,GAAG,EAAE,CAAC;MAAE;MACRpB,MAAM,EAAE,CAAC;MAAE;MACXqB,SAAS,EAAE,EAAE,CAAE;IACjB,CAAC;IACDC,kBAAkB,EAAE;MAClBZ,UAAU,EAAE,QAAQ;MACpBC,cAAc,EAAE,QAAQ;MACxBnB,KAAK,EAAE,CAAC;MAAE;MACVQ,MAAM,EAAE,CAAC,CAAE;IACb,CAAC;IACDuB,cAAc,EAAE;MACdR,YAAY,EAAE,GAAG;MAAE;MACnBnB,eAAe,EAAEZ,KAAK,CAACa,MAAM,CAACC,UAAU,CAAE;IAC5C,CAAC;IACD0B,oBAAoB,EAAE;MACpBhC,KAAK,EAAE,CAAC;MACRQ,MAAM,EAAE,CAAC;MACTJ,eAAe,EAAEZ,KAAK,CAACa,MAAM,CAAC4B,IAAI,CAAE;IACtC,CAAC;IACDC,sBAAsB,EAAE;MACtBlC,KAAK,EAAE,CAAC;MACRQ,MAAM,EAAE;IACV,CAAC;IACD2B,kBAAkB,EAAE;MAClBnC,KAAK,EAAE,CAAC;MAAE;MACVQ,MAAM,EAAE;IACV;EACF,CAAC,CAAC;EAEF,OAAOf,MAAM;AACf,CAAC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { Alert, FlatList, Keyboard, KeyboardAvoidingView, Platform, ScrollView, Text, TouchableOpacity, View, StatusBar, Linking } from 'react-native';
1
+ import { Alert, Keyboard, KeyboardAvoidingView, Platform, ScrollView, Text, TouchableOpacity, View, StatusBar, Linking } from 'react-native';
2
2
  import { memo, useCallback, useEffect, useState } from 'react';
3
3
  import { ComponentID, ElementID, ImageSizeState, PageID, mediaAttachment } from '../../../enums';
4
4
  import { useAmityPage, useRequestPermission, useUser, isModerator } from '../../../hooks';
@@ -15,9 +15,9 @@ import TextKeyElement from '../../../elements/TextKeyElement/TextKeyElement';
15
15
  import AmityMediaAttachmentComponent from '../components/MediaAttachment';
16
16
  import AmityDetailedMediaAttachmentComponent from '../components/DetailedMediaAttachment';
17
17
  import { useKeyboardStatus } from '../../../hooks';
18
- import { launchImageLibrary, launchCamera } from 'react-native-image-picker';
19
- import LoadingImage from '../../../components/LoadingImage';
20
- import LoadingVideo from '../../../components/LoadingVideo';
18
+ import { launchCamera } from 'react-native-image-picker';
19
+ import { SelectedMediaComponent } from '../../../components/SelectedMediaComponent';
20
+ import { MediaSelector } from '../../../components/MediaSelector';
21
21
  import { CommunityRepository, PostRepository, UserRepository } from '@amityco/ts-sdk-react-native';
22
22
  import { useFile } from '../../../hooks';
23
23
  import useMention from '../../../hooks/useMention';
@@ -85,6 +85,7 @@ const AmityPostComposerPage = ({
85
85
  const [isSwipeup, setIsSwipeup] = useState(true);
86
86
  const [deletedPostIds, setDeletedPostIds] = useState([]);
87
87
  const [isUploading, setIsUploading] = useState(false);
88
+ const [mediaSelectorType, setMediaSelectorType] = useState(null);
88
89
  const [hasChangedAttachment, setHasChangedAttachment] = useState(false);
89
90
  const [imageErrors, setImageErrors] = useState(new Set());
90
91
  const [videoErrors, setVideoErrors] = useState(new Set());
@@ -427,45 +428,30 @@ const AmityPostComposerPage = ({
427
428
  }]);
428
429
  }, [displayImages.length, displayVideos.length, pickCamera]);
429
430
  const onPressImage = useCallback(async () => {
430
- if (displayImages.length === 10) return Alert.alert('Maximum upload limit reached', "You've reached the upload limit of 10 images. Any additional images will not be saved.");
431
- const result = await launchImageLibrary({
432
- mediaType: 'photo',
433
- quality: 1,
434
- selectionLimit: 10 - displayImages.length
435
- });
436
- if (!result.didCancel && result.assets && result.assets.length > 0) {
437
- const imageUriArr = result.assets.map(item => item.uri);
438
- const mediaOj = processMedia(imageUriArr);
439
- setDisplayImages(prev => {
440
- const updatedArray = [...prev, ...mediaOj];
441
- if (updatedArray.length > 10) {
442
- Alert.alert('Maximum number of images exceeded', 'Maximum number of images that can be uploaded is 10. The rest images will be discarded');
443
- return updatedArray.slice(0, 10);
444
- }
445
- return updatedArray;
446
- });
447
- }
448
- }, [displayImages.length, processMedia]);
431
+ if (displayImages.length >= 10) return Alert.alert('Maximum upload limit reached', "You've reached the upload limit of 10 images. Any additional images will not be saved.");
432
+ setMediaSelectorType('photo');
433
+ }, [displayImages.length]);
449
434
  const onPressVideo = useCallback(async () => {
450
- if (displayVideos.length === 10) return Alert.alert('Maximum upload limit reached', "You've reached the upload limit of 10 videos. Any additional videos will not be saved.");
451
- const result = await launchImageLibrary({
452
- mediaType: 'video',
453
- quality: 1,
454
- selectionLimit: 10 - displayVideos.length
435
+ if (displayVideos.length >= 10) return Alert.alert('Maximum upload limit reached', "You've reached the upload limit of 10 videos. Any additional videos will not be saved.");
436
+ setMediaSelectorType('video');
437
+ }, [displayVideos.length]);
438
+
439
+ // Receives new URIs from the custom media selector. Silently drops duplicates
440
+ // (already-selected files) and caps the total at 10, per PDT-4314.
441
+ const handleSelectedMedia = useCallback(uris => {
442
+ const type = mediaSelectorType;
443
+ setMediaSelectorType(null);
444
+ if (!type || uris.length === 0) return;
445
+ const mediaOj = processMedia(uris);
446
+ if (!mediaOj) return;
447
+ const setter = type === 'photo' ? setDisplayImages : setDisplayVideos;
448
+ setter(prev => {
449
+ const existingUrls = new Set(prev.map(m => m.url));
450
+ const additions = mediaOj.filter(m => !existingUrls.has(m.url));
451
+ const updated = [...prev, ...additions];
452
+ return updated.length > 10 ? updated.slice(0, 10) : updated;
455
453
  });
456
- if (!result.didCancel && result.assets && result.assets.length > 0) {
457
- const videoUriArr = result.assets.map(item => item.uri);
458
- const mediaOj = processMedia(videoUriArr);
459
- setDisplayVideos(prev => {
460
- const updatedArray = [...prev, ...mediaOj];
461
- if (updatedArray.length > 10) {
462
- Alert.alert('Maximum number of videos exceeded', 'Maximum number of videos that can be uploaded is 10. The rest videos will be discarded');
463
- return updatedArray.slice(0, 10);
464
- }
465
- return updatedArray;
466
- });
467
- }
468
- }, [displayVideos.length, processMedia]);
454
+ }, [mediaSelectorType, processMedia]);
469
455
  const handleImageUploadError = useCallback((hasError, source) => {
470
456
  setImageErrors(prev => {
471
457
  const newSet = new Set(prev);
@@ -543,6 +529,10 @@ const AmityPostComposerPage = ({
543
529
  return newData;
544
530
  });
545
531
  }, []);
532
+
533
+ // PDT-4310 / PDT-4312: at the 10-attachment cap the camera + gallery icons
534
+ // are disabled until the user removes a frame.
535
+ const isMediaCapReached = displayImages.length >= 10 || displayVideos.length >= 10;
546
536
  const renderDetailedAttachment = useCallback(() => {
547
537
  if (isEditMode) return null;
548
538
  if (shouldShowDetailAttachment) {
@@ -551,7 +541,8 @@ const AmityPostComposerPage = ({
551
541
  onPressImage: onPressImage,
552
542
  onPressVideo: onPressVideo,
553
543
  chosenMediaType: chosenMediaType,
554
- onHeightChange: setAttachmentBarHeight
544
+ onHeightChange: setAttachmentBarHeight,
545
+ disabled: isMediaCapReached
555
546
  });
556
547
  }
557
548
  return /*#__PURE__*/React.createElement(AmityMediaAttachmentComponent, {
@@ -559,9 +550,10 @@ const AmityPostComposerPage = ({
559
550
  onPressImage: onPressImage,
560
551
  onPressVideo: onPressVideo,
561
552
  chosenMediaType: chosenMediaType,
562
- onHeightChange: setAttachmentBarHeight
553
+ onHeightChange: setAttachmentBarHeight,
554
+ disabled: isMediaCapReached
563
555
  });
564
- }, [chosenMediaType, isEditMode, onPressCamera, onPressImage, onPressVideo, shouldShowDetailAttachment]);
556
+ }, [chosenMediaType, isEditMode, isMediaCapReached, onPressCamera, onPressImage, onPressVideo, shouldShowDetailAttachment]);
565
557
  if (isExcluded) return null;
566
558
  return /*#__PURE__*/React.createElement(SafeAreaView, {
567
559
  testID: accessibilityId,
@@ -601,55 +593,22 @@ const AmityPostComposerPage = ({
601
593
  style: styles.input
602
594
  }), /*#__PURE__*/React.createElement(View, {
603
595
  style: styles.imageContainer
604
- }, displayImages.length > 0 && /*#__PURE__*/React.createElement(FlatList, {
605
- nestedScrollEnabled: true,
606
- scrollEnabled: false,
607
- data: displayImages,
608
- renderItem: ({
609
- item,
610
- index
611
- }) => {
612
- if (!item) return null;
613
- return /*#__PURE__*/React.createElement(LoadingImage, {
614
- source: item.url,
615
- onClose: handleOnCloseImage,
616
- index: index //TODO: Fix this without index
617
- ,
618
- onLoadFinish: handleOnFinishImage,
619
- onUploadError: handleImageUploadError,
620
- isUploaded: item.isUploaded,
621
- fileId: item.fileId,
622
- fileCount: displayImages.length,
623
- isEditMode: isEditMode,
624
- postId: item.postId,
625
- setIsUploading: setIsUploading
626
- });
627
- },
628
- numColumns: 3
629
- }), displayVideos.length > 0 && /*#__PURE__*/React.createElement(FlatList, {
630
- data: displayVideos,
631
- renderItem: ({
632
- item,
633
- index
634
- }) => {
635
- if (!item) return null;
636
- return /*#__PURE__*/React.createElement(LoadingVideo, {
637
- source: item.url,
638
- onClose: handleOnCloseVideo,
639
- index: index //TODO: Fix this without index
640
- ,
641
- onLoadFinish: handleOnFinishVideo,
642
- onUploadError: handleVideoUploadError,
643
- isUploaded: item.isUploaded,
644
- fileId: item.fileId,
645
- thumbNail: item.thumbNail,
646
- fileCount: displayVideos.length,
647
- isEditMode: isEditMode,
648
- postId: item.postId,
649
- setIsUploading: setIsUploading
650
- });
651
- },
652
- numColumns: 3
596
+ }, displayImages.length > 0 && /*#__PURE__*/React.createElement(SelectedMediaComponent, {
597
+ mediaType: "image",
598
+ media: displayImages,
599
+ onClose: handleOnCloseImage,
600
+ onLoadFinish: handleOnFinishImage,
601
+ onUploadError: handleImageUploadError,
602
+ isEditMode: isEditMode,
603
+ setIsUploading: setIsUploading
604
+ }), displayVideos.length > 0 && /*#__PURE__*/React.createElement(SelectedMediaComponent, {
605
+ mediaType: "video",
606
+ media: displayVideos,
607
+ onClose: handleOnCloseVideo,
608
+ onLoadFinish: handleOnFinishVideo,
609
+ onUploadError: handleVideoUploadError,
610
+ isEditMode: isEditMode,
611
+ setIsUploading: setIsUploading
653
612
  }))), renderSuggestions({
654
613
  type: 'post'
655
614
  }), /*#__PURE__*/React.createElement(View, {
@@ -666,6 +625,13 @@ const AmityPostComposerPage = ({
666
625
  }
667
626
  }, renderDetailedAttachment())), /*#__PURE__*/React.createElement(StatusBar, {
668
627
  backgroundColor: themeStyles.colors.background
628
+ }), /*#__PURE__*/React.createElement(MediaSelector, {
629
+ visible: mediaSelectorType !== null,
630
+ mediaType: mediaSelectorType ?? 'photo',
631
+ existing: (mediaSelectorType === 'video' ? displayVideos : displayImages).map(m => m.url),
632
+ remaining: 10 - (mediaSelectorType === 'video' ? displayVideos.length : displayImages.length),
633
+ onClose: () => setMediaSelectorType(null),
634
+ onConfirm: handleSelectedMedia
669
635
  }));
670
636
  };
671
637
  export default /*#__PURE__*/memo(AmityPostComposerPage);