@amityco/react-native-social-uikit 4.0.0-RC9 → 4.0.0-b295c41.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.
- package/lib/commonjs/v4/PublicApi/Pages/AmityPostComposerPage/AmityPostComposerPage.js +1 -1
- package/lib/commonjs/v4/component/PreviewLink/LinkPreview.js +3 -3
- package/lib/commonjs/v4/component/PreviewLink/LinkPreview.js.map +1 -1
- package/lib/commonjs/v4/component/PreviewLink/utils.js +9 -73
- package/lib/commonjs/v4/component/PreviewLink/utils.js.map +1 -1
- package/lib/module/v4/PublicApi/Pages/AmityPostComposerPage/AmityPostComposerPage.js +1 -1
- package/lib/module/v4/component/PreviewLink/LinkPreview.js +3 -3
- package/lib/module/v4/component/PreviewLink/LinkPreview.js.map +1 -1
- package/lib/module/v4/component/PreviewLink/utils.js +9 -73
- package/lib/module/v4/component/PreviewLink/utils.js.map +1 -1
- package/lib/typescript/src/v4/component/PreviewLink/utils.d.ts +6 -1
- package/lib/typescript/src/v4/component/PreviewLink/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/v4/PublicApi/Pages/AmityPostComposerPage/AmityPostComposerPage.tsx +1 -1
- package/src/v4/component/PreviewLink/LinkPreview.tsx +3 -3
- package/src/v4/component/PreviewLink/utils.ts +9 -108
|
@@ -247,7 +247,7 @@ const AmityPostComposerPage = ({
|
|
|
247
247
|
}, [navigation, AmityPostComposerPageBehavior]);
|
|
248
248
|
const onClose = (0, _react.useCallback)(() => {
|
|
249
249
|
_reactNative.Alert.alert('Discard this post', 'The post will be permanently deleted. It cannot be undone', [{
|
|
250
|
-
text: '
|
|
250
|
+
text: 'Keep Editing',
|
|
251
251
|
style: 'cancel'
|
|
252
252
|
}, {
|
|
253
253
|
text: 'Discard',
|
|
@@ -21,7 +21,7 @@ const LinkPreview = exports.LinkPreview = /*#__PURE__*/React.memo(({
|
|
|
21
21
|
let isCancelled = false;
|
|
22
22
|
const fetchData = async () => {
|
|
23
23
|
setData(undefined);
|
|
24
|
-
const newData = await (0, _utils.getPreviewData)(text
|
|
24
|
+
const newData = await (0, _utils.getPreviewData)(text);
|
|
25
25
|
if (!isCancelled) {
|
|
26
26
|
setData(newData);
|
|
27
27
|
}
|
|
@@ -33,8 +33,8 @@ const LinkPreview = exports.LinkPreview = /*#__PURE__*/React.memo(({
|
|
|
33
33
|
}, [text]);
|
|
34
34
|
const handlePress = () => (data === null || data === void 0 ? void 0 : data.link) && _reactNative.Linking.openURL(data.link);
|
|
35
35
|
const renderImageNode = React.useCallback(image => {
|
|
36
|
-
const imageUrl = image
|
|
37
|
-
uri: image
|
|
36
|
+
const imageUrl = image ? {
|
|
37
|
+
uri: image
|
|
38
38
|
} : require('../../assets/images/previewLinkDefaultBackground.png');
|
|
39
39
|
return /*#__PURE__*/React.createElement(_reactNative.Image, {
|
|
40
40
|
accessibilityRole: "image",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_styles","_utils","_RenderTextWithMention","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LinkPreview","exports","memo","text","mentionPositionArr","data","setData","useState","styles","useStyles","useEffect","isCancelled","fetchData","undefined","newData","getPreviewData","handlePress","link","Linking","openURL","renderImageNode","useCallback","image","imageUrl","
|
|
1
|
+
{"version":3,"names":["React","_interopRequireWildcard","require","_reactNative","_styles","_utils","_RenderTextWithMention","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LinkPreview","exports","memo","text","mentionPositionArr","data","setData","useState","styles","useStyles","useEffect","isCancelled","fetchData","undefined","newData","getPreviewData","handlePress","link","Linking","openURL","renderImageNode","useCallback","image","imageUrl","uri","createElement","Image","accessibilityRole","resizeMode","source","style","renderTitleNode","title","Text","numberOfLines","renderShortUrl","url","matches","match","shortUrl","View","textPost","TouchableOpacity","onPress","metadataContainer","metadataTextContainer"],"sourceRoot":"../../../../../src","sources":["v4/component/PreviewLink/LinkPreview.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.oneOf = exports.getPreviewDataImage = exports.getPreviewData = exports.getImageSize = exports.getHtmlEntitiesDecodedText = exports.getContent = exports.getActualImageUrl = exports.REGEX_TITLE = exports.REGEX_META = exports.REGEX_LINK = exports.REGEX_IMAGE_TAG = exports.REGEX_IMAGE_CONTENT_TYPE = exports.REGEX_EMAIL = void 0;
|
|
7
7
|
var _htmlEntities = require("html-entities");
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _tsSdkReactNative = require("@amityco/ts-sdk-react-native");
|
|
9
10
|
const getActualImageUrl = (baseUrl, imageUrl) => {
|
|
10
11
|
let actualImageUrl = imageUrl === null || imageUrl === void 0 ? void 0 : imageUrl.trim();
|
|
11
12
|
if (!actualImageUrl || actualImageUrl.startsWith('data')) return null;
|
|
@@ -53,7 +54,7 @@ const getImageSize = url => {
|
|
|
53
54
|
// Functions below use functions from the same file and mocks are not working
|
|
54
55
|
/* istanbul ignore next */
|
|
55
56
|
exports.getImageSize = getImageSize;
|
|
56
|
-
const getPreviewData = async
|
|
57
|
+
const getPreviewData = async text => {
|
|
57
58
|
const previewData = {
|
|
58
59
|
description: undefined,
|
|
59
60
|
image: undefined,
|
|
@@ -70,78 +71,13 @@ const getPreviewData = async (text, requestTimeout = 5000) => {
|
|
|
70
71
|
if (!url.toLowerCase().startsWith('http')) {
|
|
71
72
|
url = 'https://' + url;
|
|
72
73
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
81
|
-
abortControllerTimeout = setTimeout(() => {
|
|
82
|
-
abortController.abort();
|
|
83
|
-
}, requestTimeout);
|
|
84
|
-
const response = await request;
|
|
85
|
-
clearTimeout(abortControllerTimeout);
|
|
86
|
-
previewData.link = url;
|
|
87
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
88
|
-
if (REGEX_IMAGE_CONTENT_TYPE.test(contentType)) {
|
|
89
|
-
const image = await getPreviewDataImage(url);
|
|
90
|
-
previewData.image = image;
|
|
91
|
-
return previewData;
|
|
92
|
-
}
|
|
93
|
-
const html = await response.text();
|
|
94
|
-
|
|
95
|
-
// Some pages return undefined
|
|
96
|
-
if (!html) return previewData;
|
|
97
|
-
const head = html.substring(0, html.indexOf('<body'));
|
|
98
|
-
|
|
99
|
-
// Get page title
|
|
100
|
-
const title = REGEX_TITLE.exec(head);
|
|
101
|
-
previewData.title = getHtmlEntitiesDecodedText(title === null || title === void 0 ? void 0 : title[1]);
|
|
102
|
-
let matches;
|
|
103
|
-
const meta = [];
|
|
104
|
-
while ((matches = REGEX_META.exec(head)) !== null) {
|
|
105
|
-
// @ts-ignore
|
|
106
|
-
meta.push([...matches]);
|
|
107
|
-
}
|
|
108
|
-
const metaPreviewData = meta.reduce((acc, curr) => {
|
|
109
|
-
// Verify that we have property/name and content
|
|
110
|
-
// Note that if a page will specify property, name and content in the same meta, regex will fail
|
|
111
|
-
if (!curr[2] || !curr[3]) return acc;
|
|
112
|
-
|
|
113
|
-
// Only take the first occurrence
|
|
114
|
-
// For description take the meta description tag into consideration
|
|
115
|
-
const description = !acc.description && (getContent(curr[2], curr[3], 'og:description') || getContent(curr[2], curr[3], 'description'));
|
|
116
|
-
const ogImage = !acc.imageUrl && getContent(curr[2], curr[3], 'og:image');
|
|
117
|
-
const ogTitle = !acc.title && getContent(curr[2], curr[3], 'og:title');
|
|
118
|
-
return {
|
|
119
|
-
description: description ? getHtmlEntitiesDecodedText(description) : acc.description,
|
|
120
|
-
imageUrl: ogImage ? getActualImageUrl(url, ogImage) : acc.imageUrl,
|
|
121
|
-
title: ogTitle ? getHtmlEntitiesDecodedText(ogTitle) : acc.title
|
|
122
|
-
};
|
|
123
|
-
}, {
|
|
124
|
-
title: previewData.title
|
|
125
|
-
});
|
|
126
|
-
previewData.description = metaPreviewData.description;
|
|
127
|
-
previewData.image = await getPreviewDataImage(metaPreviewData.imageUrl);
|
|
128
|
-
previewData.title = metaPreviewData.title;
|
|
129
|
-
if (!previewData.image) {
|
|
130
|
-
let imageMatches;
|
|
131
|
-
const tags = [];
|
|
132
|
-
while ((imageMatches = REGEX_IMAGE_TAG.exec(html)) !== null) {
|
|
133
|
-
// @ts-ignore
|
|
134
|
-
tags.push([...imageMatches]);
|
|
135
|
-
}
|
|
136
|
-
let images = [];
|
|
137
|
-
for (const tag of tags.filter(t => !t[1].startsWith('data')).slice(0, 5)) {
|
|
138
|
-
const image = await getPreviewDataImage(getActualImageUrl(url, tag[1]));
|
|
139
|
-
if (!image) continue;
|
|
140
|
-
images = [...images, image];
|
|
141
|
-
}
|
|
142
|
-
previewData.image = images.sort((a, b) => b.height * b.width - a.height * a.width)[0];
|
|
143
|
-
}
|
|
144
|
-
return previewData;
|
|
74
|
+
const request = await _tsSdkReactNative.Client.fetchLinkPreview(url);
|
|
75
|
+
return {
|
|
76
|
+
description: request.description || undefined,
|
|
77
|
+
image: request.image || undefined,
|
|
78
|
+
link: url,
|
|
79
|
+
title: request.title || undefined
|
|
80
|
+
};
|
|
145
81
|
} catch {
|
|
146
82
|
return previewData;
|
|
147
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_htmlEntities","require","_reactNative","getActualImageUrl","baseUrl","imageUrl","actualImageUrl","trim","startsWith","endsWith","slice","exports","getHtmlEntitiesDecodedText","text","actualText","decode","getContent","left","right","type","_contents$type","contents","getImageSize","url","Promise","resolve","reject","Image","getSize","width","height","error","getPreviewData","
|
|
1
|
+
{"version":3,"names":["_htmlEntities","require","_reactNative","_tsSdkReactNative","getActualImageUrl","baseUrl","imageUrl","actualImageUrl","trim","startsWith","endsWith","slice","exports","getHtmlEntitiesDecodedText","text","actualText","decode","getContent","left","right","type","_contents$type","contents","getImageSize","url","Promise","resolve","reject","Image","getSize","width","height","error","getPreviewData","previewData","description","undefined","image","link","title","_textWithoutEmails$ma","textWithoutEmails","replace","REGEX_EMAIL","match","REGEX_LINK","toLowerCase","request","Client","fetchLinkPreview","getPreviewDataImage","aspectRatio","oneOf","truthy","falsy","args","REGEX_IMAGE_CONTENT_TYPE","REGEX_IMAGE_TAG","REGEX_META","REGEX_TITLE"],"sourceRoot":"../../../../../src","sources":["v4/component/PreviewLink/utils.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -241,7 +241,7 @@ const AmityPostComposerPage = ({
|
|
|
241
241
|
}, [navigation, AmityPostComposerPageBehavior]);
|
|
242
242
|
const onClose = useCallback(() => {
|
|
243
243
|
Alert.alert('Discard this post', 'The post will be permanently deleted. It cannot be undone', [{
|
|
244
|
-
text: '
|
|
244
|
+
text: 'Keep Editing',
|
|
245
245
|
style: 'cancel'
|
|
246
246
|
}, {
|
|
247
247
|
text: 'Discard',
|
|
@@ -13,7 +13,7 @@ export const LinkPreview = /*#__PURE__*/React.memo(({
|
|
|
13
13
|
let isCancelled = false;
|
|
14
14
|
const fetchData = async () => {
|
|
15
15
|
setData(undefined);
|
|
16
|
-
const newData = await getPreviewData(text
|
|
16
|
+
const newData = await getPreviewData(text);
|
|
17
17
|
if (!isCancelled) {
|
|
18
18
|
setData(newData);
|
|
19
19
|
}
|
|
@@ -25,8 +25,8 @@ export const LinkPreview = /*#__PURE__*/React.memo(({
|
|
|
25
25
|
}, [text]);
|
|
26
26
|
const handlePress = () => (data === null || data === void 0 ? void 0 : data.link) && Linking.openURL(data.link);
|
|
27
27
|
const renderImageNode = React.useCallback(image => {
|
|
28
|
-
const imageUrl = image
|
|
29
|
-
uri: image
|
|
28
|
+
const imageUrl = image ? {
|
|
29
|
+
uri: image
|
|
30
30
|
} : require('../../assets/images/previewLinkDefaultBackground.png');
|
|
31
31
|
return /*#__PURE__*/React.createElement(Image, {
|
|
32
32
|
accessibilityRole: "image",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Image","Linking","Text","TouchableOpacity","View","useStyles","getPreviewData","RenderTextWithMention","LinkPreview","memo","text","mentionPositionArr","data","setData","useState","styles","useEffect","isCancelled","fetchData","undefined","newData","handlePress","link","openURL","renderImageNode","useCallback","image","imageUrl","
|
|
1
|
+
{"version":3,"names":["React","Image","Linking","Text","TouchableOpacity","View","useStyles","getPreviewData","RenderTextWithMention","LinkPreview","memo","text","mentionPositionArr","data","setData","useState","styles","useEffect","isCancelled","fetchData","undefined","newData","handlePress","link","openURL","renderImageNode","useCallback","image","imageUrl","uri","require","createElement","accessibilityRole","resizeMode","source","style","renderTitleNode","title","numberOfLines","renderShortUrl","url","matches","match","shortUrl","textPost","onPress","metadataContainer","metadataTextContainer"],"sourceRoot":"../../../../../src","sources":["v4/component/PreviewLink/LinkPreview.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { decode } from 'html-entities';
|
|
2
2
|
import { Image } from 'react-native';
|
|
3
|
+
import { Client } from '@amityco/ts-sdk-react-native';
|
|
3
4
|
export const getActualImageUrl = (baseUrl, imageUrl) => {
|
|
4
5
|
let actualImageUrl = imageUrl === null || imageUrl === void 0 ? void 0 : imageUrl.trim();
|
|
5
6
|
if (!actualImageUrl || actualImageUrl.startsWith('data')) return null;
|
|
@@ -43,7 +44,7 @@ export const getImageSize = url => {
|
|
|
43
44
|
|
|
44
45
|
// Functions below use functions from the same file and mocks are not working
|
|
45
46
|
/* istanbul ignore next */
|
|
46
|
-
export const getPreviewData = async
|
|
47
|
+
export const getPreviewData = async text => {
|
|
47
48
|
const previewData = {
|
|
48
49
|
description: undefined,
|
|
49
50
|
image: undefined,
|
|
@@ -60,78 +61,13 @@ export const getPreviewData = async (text, requestTimeout = 5000) => {
|
|
|
60
61
|
if (!url.toLowerCase().startsWith('http')) {
|
|
61
62
|
url = 'https://' + url;
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
});
|
|
71
|
-
abortControllerTimeout = setTimeout(() => {
|
|
72
|
-
abortController.abort();
|
|
73
|
-
}, requestTimeout);
|
|
74
|
-
const response = await request;
|
|
75
|
-
clearTimeout(abortControllerTimeout);
|
|
76
|
-
previewData.link = url;
|
|
77
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
78
|
-
if (REGEX_IMAGE_CONTENT_TYPE.test(contentType)) {
|
|
79
|
-
const image = await getPreviewDataImage(url);
|
|
80
|
-
previewData.image = image;
|
|
81
|
-
return previewData;
|
|
82
|
-
}
|
|
83
|
-
const html = await response.text();
|
|
84
|
-
|
|
85
|
-
// Some pages return undefined
|
|
86
|
-
if (!html) return previewData;
|
|
87
|
-
const head = html.substring(0, html.indexOf('<body'));
|
|
88
|
-
|
|
89
|
-
// Get page title
|
|
90
|
-
const title = REGEX_TITLE.exec(head);
|
|
91
|
-
previewData.title = getHtmlEntitiesDecodedText(title === null || title === void 0 ? void 0 : title[1]);
|
|
92
|
-
let matches;
|
|
93
|
-
const meta = [];
|
|
94
|
-
while ((matches = REGEX_META.exec(head)) !== null) {
|
|
95
|
-
// @ts-ignore
|
|
96
|
-
meta.push([...matches]);
|
|
97
|
-
}
|
|
98
|
-
const metaPreviewData = meta.reduce((acc, curr) => {
|
|
99
|
-
// Verify that we have property/name and content
|
|
100
|
-
// Note that if a page will specify property, name and content in the same meta, regex will fail
|
|
101
|
-
if (!curr[2] || !curr[3]) return acc;
|
|
102
|
-
|
|
103
|
-
// Only take the first occurrence
|
|
104
|
-
// For description take the meta description tag into consideration
|
|
105
|
-
const description = !acc.description && (getContent(curr[2], curr[3], 'og:description') || getContent(curr[2], curr[3], 'description'));
|
|
106
|
-
const ogImage = !acc.imageUrl && getContent(curr[2], curr[3], 'og:image');
|
|
107
|
-
const ogTitle = !acc.title && getContent(curr[2], curr[3], 'og:title');
|
|
108
|
-
return {
|
|
109
|
-
description: description ? getHtmlEntitiesDecodedText(description) : acc.description,
|
|
110
|
-
imageUrl: ogImage ? getActualImageUrl(url, ogImage) : acc.imageUrl,
|
|
111
|
-
title: ogTitle ? getHtmlEntitiesDecodedText(ogTitle) : acc.title
|
|
112
|
-
};
|
|
113
|
-
}, {
|
|
114
|
-
title: previewData.title
|
|
115
|
-
});
|
|
116
|
-
previewData.description = metaPreviewData.description;
|
|
117
|
-
previewData.image = await getPreviewDataImage(metaPreviewData.imageUrl);
|
|
118
|
-
previewData.title = metaPreviewData.title;
|
|
119
|
-
if (!previewData.image) {
|
|
120
|
-
let imageMatches;
|
|
121
|
-
const tags = [];
|
|
122
|
-
while ((imageMatches = REGEX_IMAGE_TAG.exec(html)) !== null) {
|
|
123
|
-
// @ts-ignore
|
|
124
|
-
tags.push([...imageMatches]);
|
|
125
|
-
}
|
|
126
|
-
let images = [];
|
|
127
|
-
for (const tag of tags.filter(t => !t[1].startsWith('data')).slice(0, 5)) {
|
|
128
|
-
const image = await getPreviewDataImage(getActualImageUrl(url, tag[1]));
|
|
129
|
-
if (!image) continue;
|
|
130
|
-
images = [...images, image];
|
|
131
|
-
}
|
|
132
|
-
previewData.image = images.sort((a, b) => b.height * b.width - a.height * a.width)[0];
|
|
133
|
-
}
|
|
134
|
-
return previewData;
|
|
64
|
+
const request = await Client.fetchLinkPreview(url);
|
|
65
|
+
return {
|
|
66
|
+
description: request.description || undefined,
|
|
67
|
+
image: request.image || undefined,
|
|
68
|
+
link: url,
|
|
69
|
+
title: request.title || undefined
|
|
70
|
+
};
|
|
135
71
|
} catch {
|
|
136
72
|
return previewData;
|
|
137
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decode","Image","getActualImageUrl","baseUrl","imageUrl","actualImageUrl","trim","startsWith","endsWith","slice","getHtmlEntitiesDecodedText","text","actualText","getContent","left","right","type","_contents$type","contents","getImageSize","url","Promise","resolve","reject","getSize","width","height","error","getPreviewData","
|
|
1
|
+
{"version":3,"names":["decode","Image","Client","getActualImageUrl","baseUrl","imageUrl","actualImageUrl","trim","startsWith","endsWith","slice","getHtmlEntitiesDecodedText","text","actualText","getContent","left","right","type","_contents$type","contents","getImageSize","url","Promise","resolve","reject","getSize","width","height","error","getPreviewData","previewData","description","undefined","image","link","title","_textWithoutEmails$ma","textWithoutEmails","replace","REGEX_EMAIL","match","REGEX_LINK","toLowerCase","request","fetchLinkPreview","getPreviewDataImage","aspectRatio","oneOf","truthy","falsy","args","REGEX_IMAGE_CONTENT_TYPE","REGEX_IMAGE_TAG","REGEX_META","REGEX_TITLE"],"sourceRoot":"../../../../../src","sources":["v4/component/PreviewLink/utils.ts"],"mappings":"AAAA,SAASA,MAAM,QAAQ,eAAe;AACtC,SAASC,KAAK,QAAQ,cAAc;AAGpC,SAASC,MAAM,QAAQ,8BAA8B;AAErD,OAAO,MAAMC,iBAAiB,GAAGA,CAACC,OAAe,EAAEC,QAAiB,KAAK;EACvE,IAAIC,cAAc,GAAGD,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEE,IAAI,CAAC,CAAC;EACrC,IAAI,CAACD,cAAc,IAAIA,cAAc,CAACE,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI;EAErE,IAAIF,cAAc,CAACE,UAAU,CAAC,IAAI,CAAC,EACjCF,cAAc,GAAG,SAASA,cAAc,EAAE;EAE5C,IAAI,CAACA,cAAc,CAACE,UAAU,CAAC,MAAM,CAAC,EAAE;IACtC,IAAIJ,OAAO,CAACK,QAAQ,CAAC,GAAG,CAAC,IAAIH,cAAc,CAACE,UAAU,CAAC,GAAG,CAAC,EAAE;MAC3DF,cAAc,GAAG,GAAGF,OAAO,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGJ,cAAc,EAAE;IAC7D,CAAC,MAAM,IAAI,CAACF,OAAO,CAACK,QAAQ,CAAC,GAAG,CAAC,IAAI,CAACH,cAAc,CAACE,UAAU,CAAC,GAAG,CAAC,EAAE;MACpEF,cAAc,GAAG,GAAGF,OAAO,IAAIE,cAAc,EAAE;IACjD,CAAC,MAAM;MACLA,cAAc,GAAG,GAAGF,OAAO,GAAGE,cAAc,EAAE;IAChD;EACF;EAEA,OAAOA,cAAc;AACvB,CAAC;AAED,OAAO,MAAMK,0BAA0B,GAAIC,IAAa,IAAK;EAC3D,MAAMC,UAAU,GAAGD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEL,IAAI,CAAC,CAAC;EAC/B,IAAI,CAACM,UAAU,EAAE,OAAO,IAAI;EAE5B,OAAOb,MAAM,CAACa,UAAU,CAAC;AAC3B,CAAC;AAED,OAAO,MAAMC,UAAU,GAAGA,CAACC,IAAY,EAAEC,KAAa,EAAEC,IAAY,KAAK;EAAA,IAAAC,cAAA;EACvE,MAAMC,QAAQ,GAAG;IACf,CAACJ,IAAI,CAACR,IAAI,CAAC,CAAC,GAAGS,KAAK;IACpB,CAACA,KAAK,CAACT,IAAI,CAAC,CAAC,GAAGQ;EAClB,CAAC;EAED,QAAAG,cAAA,GAAOC,QAAQ,CAACF,IAAI,CAAC,cAAAC,cAAA,uBAAdA,cAAA,CAAgBX,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,OAAO,MAAMa,YAAY,GAAIC,GAAW,IAAK;EAC3C,OAAO,IAAIC,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;IAC5CvB,KAAK,CAACwB,OAAO,CACXJ,GAAG,EACH,CAACK,KAAK,EAAEC,MAAM,KAAK;MACjBJ,OAAO,CAAC;QAAEI,MAAM;QAAED;MAAM,CAAC,CAAC;IAC5B,CAAC;IACD;IACCE,KAAK,IAAKJ,MAAM,CAACI,KAAK,CACzB,CAAC;EACH,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA,OAAO,MAAMC,cAAc,GAAG,MAAOjB,IAAY,IAAK;EACpD,MAAMkB,WAAwB,GAAG;IAC/BC,WAAW,EAAEC,SAAS;IACtBC,KAAK,EAAED,SAAS;IAChBE,IAAI,EAAEF,SAAS;IACfG,KAAK,EAAEH;EACT,CAAC;EAED,IAAI;IAAA,IAAAI,qBAAA;IACF,MAAMC,iBAAiB,GAAGzB,IAAI,CAAC0B,OAAO,CAACC,WAAW,EAAE,EAAE,CAAC,CAAChC,IAAI,CAAC,CAAC;IAE9D,IAAI,CAAC8B,iBAAiB,EAAE,OAAOP,WAAW;IAE1C,MAAMI,IAAI,IAAAE,qBAAA,GAAGC,iBAAiB,CAACG,KAAK,CAACC,UAAU,CAAC,cAAAL,qBAAA,uBAAnCA,qBAAA,CAAsC,CAAC,CAAC;IAErD,IAAI,CAACF,IAAI,EAAE,OAAOJ,WAAW;IAE7B,IAAIT,GAAG,GAAGa,IAAI;IAEd,IAAI,CAACb,GAAG,CAACqB,WAAW,CAAC,CAAC,CAAClC,UAAU,CAAC,MAAM,CAAC,EAAE;MACzCa,GAAG,GAAG,UAAU,GAAGA,GAAG;IACxB;IAEA,MAAMsB,OAAO,GAAG,MAAMzC,MAAM,CAAC0C,gBAAgB,CAACvB,GAAG,CAAC;IAElD,OAAO;MACLU,WAAW,EAAEY,OAAO,CAACZ,WAAW,IAAIC,SAAS;MAC7CC,KAAK,EAAEU,OAAO,CAACV,KAAK,IAAID,SAAS;MACjCE,IAAI,EAAEb,GAAG;MACTc,KAAK,EAAEQ,OAAO,CAACR,KAAK,IAAIH;IAC1B,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAOF,WAAW;EACpB;AACF,CAAC;;AAED;AACA,OAAO,MAAMe,mBAAmB,GAAG,MAAOxB,GAAY,IAAK;EACzD,IAAI,CAACA,GAAG,EAAE,OAAO,IAAI;EAErB,IAAI;IACF,MAAM;MAAEM,MAAM;MAAED;IAAM,CAAC,GAAG,MAAMN,YAAY,CAACC,GAAG,CAAC;IACjD,MAAMyB,WAAW,GAAGpB,KAAK,IAAIC,MAAM,IAAI,CAAC,CAAC;IAEzC,IAAIA,MAAM,GAAG,GAAG,IAAID,KAAK,GAAG,GAAG,IAAIoB,WAAW,GAAG,GAAG,IAAIA,WAAW,GAAG,EAAE,EAAE;MACxE,MAAMb,KAAuB,GAAG;QAAEN,MAAM;QAAEN,GAAG;QAAEK;MAAM,CAAC;MACtD,OAAOO,KAAK;IACd,CAAC,MAAM;MACL,OAAO,IAAI;IACb;EACF,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMc,KAAK,GAChBA,CACEC,MAAqB,EACrBC,KAAQ,KAEV,CAAC,GAAGC,IAAmB,KAAwB;EAC7C,OAAOF,MAAM,GAAGA,MAAM,CAAC,GAAGE,IAAI,CAAC,GAAGD,KAAK;AACzC,CAAC;AAEH,OAAO,MAAMV,WAAW,GACtB,qDAAqD;AACvD,OAAO,MAAMY,wBAAwB,GAAG,WAAW;AACnD;AACA,OAAO,MAAMC,eAAe,GAAG,mCAAmC;AAClE,OAAO,MAAMX,UAAU,GACrB,2FAA2F;AAC7F;AACA,OAAO,MAAMY,UAAU,GACrB,oEAAoE;AACtE,OAAO,MAAMC,WAAW,GAAG,2BAA2B","ignoreList":[]}
|
|
@@ -3,7 +3,12 @@ export declare const getActualImageUrl: (baseUrl: string, imageUrl?: string) =>
|
|
|
3
3
|
export declare const getHtmlEntitiesDecodedText: (text?: string) => string;
|
|
4
4
|
export declare const getContent: (left: string, right: string, type: string) => string;
|
|
5
5
|
export declare const getImageSize: (url: string) => Promise<Size>;
|
|
6
|
-
export declare const getPreviewData: (text: string
|
|
6
|
+
export declare const getPreviewData: (text: string) => Promise<PreviewData | {
|
|
7
|
+
description: any;
|
|
8
|
+
image: any;
|
|
9
|
+
link: string;
|
|
10
|
+
title: any;
|
|
11
|
+
}>;
|
|
7
12
|
export declare const getPreviewDataImage: (url?: string) => Promise<PreviewDataImage>;
|
|
8
13
|
export declare const oneOf: <T extends (...args: A) => any, U, A extends any[]>(truthy: T | undefined, falsy: U) => (...args: Parameters<T>) => ReturnType<T> | U;
|
|
9
14
|
export declare const REGEX_EMAIL: RegExp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/v4/component/PreviewLink/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../../src/v4/component/PreviewLink/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG9D,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,WAAW,MAAM,WAkBnE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,OAAO,MAAM,WAKvD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,MAAM,WAOnE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,kBAWvC,CAAC;AAIF,eAAO,MAAM,cAAc,GAAU,MAAM,MAAM;;;;;EAkChD,CAAC;AAGF,eAAO,MAAM,mBAAmB,GAAU,MAAM,MAAM,8BAgBrD,CAAC;AAEF,eAAO,MAAM,KAAK,GACf,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,EAChD,QAAQ,CAAC,GAAG,SAAS,EACrB,OAAO,CAAC,MAET,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAEzC,CAAC;AAEJ,eAAO,MAAM,WAAW,QAC+B,CAAC;AACxD,eAAO,MAAM,wBAAwB,QAAc,CAAC;AAEpD,eAAO,MAAM,eAAe,QAAsC,CAAC;AACnE,eAAO,MAAM,UAAU,QACsE,CAAC;AAE9F,eAAO,MAAM,UAAU,QAC+C,CAAC;AACvE,eAAO,MAAM,WAAW,QAA8B,CAAC"}
|
package/package.json
CHANGED
|
@@ -301,7 +301,7 @@ const AmityPostComposerPage: FC<AmityPostComposerPageType> = ({
|
|
|
301
301
|
'Discard this post',
|
|
302
302
|
'The post will be permanently deleted. It cannot be undone',
|
|
303
303
|
[
|
|
304
|
-
{ text: '
|
|
304
|
+
{ text: 'Keep Editing', style: 'cancel' },
|
|
305
305
|
{
|
|
306
306
|
text: 'Discard',
|
|
307
307
|
style: 'destructive',
|
|
@@ -21,7 +21,7 @@ export const LinkPreview = React.memo(
|
|
|
21
21
|
|
|
22
22
|
const fetchData = async () => {
|
|
23
23
|
setData(undefined);
|
|
24
|
-
const newData = await getPreviewData(text
|
|
24
|
+
const newData = await getPreviewData(text);
|
|
25
25
|
if (!isCancelled) {
|
|
26
26
|
setData(newData);
|
|
27
27
|
}
|
|
@@ -37,8 +37,8 @@ export const LinkPreview = React.memo(
|
|
|
37
37
|
|
|
38
38
|
const renderImageNode = React.useCallback(
|
|
39
39
|
(image: PreviewDataImage) => {
|
|
40
|
-
const imageUrl = image
|
|
41
|
-
? { uri: image
|
|
40
|
+
const imageUrl = image
|
|
41
|
+
? { uri: image }
|
|
42
42
|
: require('../../assets/images/previewLinkDefaultBackground.png');
|
|
43
43
|
|
|
44
44
|
return (
|
|
@@ -2,6 +2,7 @@ import { decode } from 'html-entities';
|
|
|
2
2
|
import { Image } from 'react-native';
|
|
3
3
|
|
|
4
4
|
import { PreviewData, PreviewDataImage, Size } from './types';
|
|
5
|
+
import { Client } from '@amityco/ts-sdk-react-native';
|
|
5
6
|
|
|
6
7
|
export const getActualImageUrl = (baseUrl: string, imageUrl?: string) => {
|
|
7
8
|
let actualImageUrl = imageUrl?.trim();
|
|
@@ -54,7 +55,7 @@ export const getImageSize = (url: string) => {
|
|
|
54
55
|
|
|
55
56
|
// Functions below use functions from the same file and mocks are not working
|
|
56
57
|
/* istanbul ignore next */
|
|
57
|
-
export const getPreviewData = async (text: string
|
|
58
|
+
export const getPreviewData = async (text: string) => {
|
|
58
59
|
const previewData: PreviewData = {
|
|
59
60
|
description: undefined,
|
|
60
61
|
image: undefined,
|
|
@@ -77,114 +78,14 @@ export const getPreviewData = async (text: string, requestTimeout = 5000) => {
|
|
|
77
78
|
url = 'https://' + url;
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
const abortController = new AbortController();
|
|
81
|
+
const request = await Client.fetchLinkPreview(url);
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
abortControllerTimeout = setTimeout(() => {
|
|
92
|
-
abortController.abort();
|
|
93
|
-
}, requestTimeout);
|
|
94
|
-
|
|
95
|
-
const response = await request;
|
|
96
|
-
|
|
97
|
-
clearTimeout(abortControllerTimeout);
|
|
98
|
-
|
|
99
|
-
previewData.link = url;
|
|
100
|
-
|
|
101
|
-
const contentType = response.headers.get('content-type') ?? '';
|
|
102
|
-
|
|
103
|
-
if (REGEX_IMAGE_CONTENT_TYPE.test(contentType)) {
|
|
104
|
-
const image = await getPreviewDataImage(url);
|
|
105
|
-
previewData.image = image;
|
|
106
|
-
return previewData;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const html = await response.text();
|
|
110
|
-
|
|
111
|
-
// Some pages return undefined
|
|
112
|
-
if (!html) return previewData;
|
|
113
|
-
|
|
114
|
-
const head = html.substring(0, html.indexOf('<body'));
|
|
115
|
-
|
|
116
|
-
// Get page title
|
|
117
|
-
const title = REGEX_TITLE.exec(head);
|
|
118
|
-
previewData.title = getHtmlEntitiesDecodedText(title?.[1]);
|
|
119
|
-
|
|
120
|
-
let matches: RegExpMatchArray | null;
|
|
121
|
-
const meta: RegExpMatchArray[] = [];
|
|
122
|
-
while ((matches = REGEX_META.exec(head)) !== null) {
|
|
123
|
-
// @ts-ignore
|
|
124
|
-
meta.push([...matches]);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const metaPreviewData = meta.reduce<{
|
|
128
|
-
description?: string;
|
|
129
|
-
imageUrl?: string;
|
|
130
|
-
title?: string;
|
|
131
|
-
}>(
|
|
132
|
-
(acc, curr) => {
|
|
133
|
-
// Verify that we have property/name and content
|
|
134
|
-
// Note that if a page will specify property, name and content in the same meta, regex will fail
|
|
135
|
-
if (!curr[2] || !curr[3]) return acc;
|
|
136
|
-
|
|
137
|
-
// Only take the first occurrence
|
|
138
|
-
// For description take the meta description tag into consideration
|
|
139
|
-
const description =
|
|
140
|
-
!acc.description &&
|
|
141
|
-
(getContent(curr[2], curr[3], 'og:description') ||
|
|
142
|
-
getContent(curr[2], curr[3], 'description'));
|
|
143
|
-
const ogImage =
|
|
144
|
-
!acc.imageUrl && getContent(curr[2], curr[3], 'og:image');
|
|
145
|
-
const ogTitle = !acc.title && getContent(curr[2], curr[3], 'og:title');
|
|
146
|
-
|
|
147
|
-
return {
|
|
148
|
-
description: description
|
|
149
|
-
? getHtmlEntitiesDecodedText(description)
|
|
150
|
-
: acc.description,
|
|
151
|
-
imageUrl: ogImage ? getActualImageUrl(url, ogImage) : acc.imageUrl,
|
|
152
|
-
title: ogTitle ? getHtmlEntitiesDecodedText(ogTitle) : acc.title,
|
|
153
|
-
};
|
|
154
|
-
},
|
|
155
|
-
{ title: previewData.title }
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
previewData.description = metaPreviewData.description;
|
|
159
|
-
previewData.image = await getPreviewDataImage(metaPreviewData.imageUrl);
|
|
160
|
-
previewData.title = metaPreviewData.title;
|
|
161
|
-
|
|
162
|
-
if (!previewData.image) {
|
|
163
|
-
let imageMatches: RegExpMatchArray | null;
|
|
164
|
-
const tags: RegExpMatchArray[] = [];
|
|
165
|
-
while ((imageMatches = REGEX_IMAGE_TAG.exec(html)) !== null) {
|
|
166
|
-
// @ts-ignore
|
|
167
|
-
tags.push([...imageMatches]);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
let images: PreviewDataImage[] = [];
|
|
171
|
-
|
|
172
|
-
for (const tag of tags
|
|
173
|
-
.filter((t) => !t[1].startsWith('data'))
|
|
174
|
-
.slice(0, 5)) {
|
|
175
|
-
const image = await getPreviewDataImage(getActualImageUrl(url, tag[1]));
|
|
176
|
-
|
|
177
|
-
if (!image) continue;
|
|
178
|
-
|
|
179
|
-
images = [...images, image];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
previewData.image = images.sort(
|
|
183
|
-
(a, b) => b.height * b.width - a.height * a.width
|
|
184
|
-
)[0];
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return previewData;
|
|
83
|
+
return {
|
|
84
|
+
description: request.description || undefined,
|
|
85
|
+
image: request.image || undefined,
|
|
86
|
+
link: url,
|
|
87
|
+
title: request.title || undefined,
|
|
88
|
+
};
|
|
188
89
|
} catch {
|
|
189
90
|
return previewData;
|
|
190
91
|
}
|