@expensify/react-native-live-markdown 0.1.152 → 0.1.153
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/web/inputElements/inlineImage.js +31 -17
- package/lib/commonjs/web/inputElements/inlineImage.js.map +1 -1
- package/lib/module/web/inputElements/inlineImage.js +31 -17
- package/lib/module/web/inputElements/inlineImage.js.map +1 -1
- package/lib/typescript/src/web/inputElements/inlineImage.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web/inputElements/inlineImage.ts +37 -19
|
@@ -6,27 +6,34 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.addInlineImagePreview = addInlineImagePreview;
|
|
7
7
|
var _styleUtils = require("../../styleUtils");
|
|
8
8
|
var _loadingIndicator = require("./loadingIndicator");
|
|
9
|
+
const INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS = 300;
|
|
9
10
|
const inlineImageDefaultStyles = {
|
|
10
11
|
position: 'absolute',
|
|
11
12
|
bottom: 0,
|
|
12
13
|
left: 0
|
|
13
14
|
};
|
|
15
|
+
let timeout = null;
|
|
14
16
|
function createImageElement(url, callback) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
if (timeout) {
|
|
18
|
+
clearTimeout(timeout);
|
|
19
|
+
}
|
|
20
|
+
timeout = setTimeout(() => {
|
|
21
|
+
const imageContainer = document.createElement('span');
|
|
22
|
+
imageContainer.contentEditable = 'false';
|
|
23
|
+
imageContainer.setAttribute('data-type', 'inline-container');
|
|
24
|
+
const img = new Image();
|
|
25
|
+
imageContainer.appendChild(img);
|
|
26
|
+
img.contentEditable = 'false';
|
|
27
|
+
img.onload = () => callback(imageContainer);
|
|
28
|
+
img.onerror = err => callback(imageContainer, err);
|
|
29
|
+
img.src = url;
|
|
30
|
+
}, INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS);
|
|
24
31
|
}
|
|
25
32
|
|
|
26
33
|
/** Adds already loaded image element from current input content to the tree node */
|
|
27
34
|
function updateImageTreeNode(targetNode, newElement, imageMarginTop = 0) {
|
|
28
35
|
const paddingBottom = `${(0, _styleUtils.parseStringWithUnitToNumber)(newElement.style.height) + imageMarginTop}px`;
|
|
29
|
-
targetNode.element.appendChild(newElement);
|
|
36
|
+
targetNode.element.appendChild(newElement.cloneNode(true));
|
|
30
37
|
let currentParent = targetNode.element;
|
|
31
38
|
while (currentParent.parentElement && !['line', 'block'].includes(currentParent.getAttribute('data-type') || '')) {
|
|
32
39
|
currentParent = currentParent.parentElement;
|
|
@@ -66,7 +73,7 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
66
73
|
marginBottom: `${imageMarginBottom}px`,
|
|
67
74
|
paddingBottom: ((_markdownStyle$loadin = markdownStyle.loadingIndicatorContainer) === null || _markdownStyle$loadin === void 0 ? void 0 : _markdownStyle$loadin.height) || ((_markdownStyle$loadin2 = markdownStyle.loadingIndicator) === null || _markdownStyle$loadin2 === void 0 ? void 0 : _markdownStyle$loadin2.height) || !!markdownStyle.loadingIndicator && '30px' || undefined
|
|
68
75
|
});
|
|
69
|
-
createImageElement(imageHref, imageContainer => {
|
|
76
|
+
createImageElement(imageHref, (imageContainer, err) => {
|
|
70
77
|
// Verify if the current spinner is for the loaded image. If not, it means that the response came after the user changed the image url
|
|
71
78
|
const currentSpinner = currentInput.querySelector('[data-type="spinner"]');
|
|
72
79
|
// Remove the spinner
|
|
@@ -74,11 +81,6 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
74
81
|
currentSpinner.remove();
|
|
75
82
|
}
|
|
76
83
|
const img = imageContainer.firstChild;
|
|
77
|
-
|
|
78
|
-
// Set the image styles
|
|
79
|
-
Object.assign(imageContainer.style, {
|
|
80
|
-
...inlineImageDefaultStyles
|
|
81
|
-
});
|
|
82
84
|
const {
|
|
83
85
|
minHeight,
|
|
84
86
|
minWidth,
|
|
@@ -86,13 +88,25 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
86
88
|
maxWidth,
|
|
87
89
|
borderRadius
|
|
88
90
|
} = markdownStyle.inlineImage || {};
|
|
89
|
-
|
|
91
|
+
const imgStyle = {
|
|
90
92
|
minHeight,
|
|
91
93
|
minWidth,
|
|
92
94
|
maxHeight,
|
|
93
95
|
maxWidth,
|
|
94
96
|
borderRadius
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Set the image styles
|
|
100
|
+
Object.assign(imageContainer.style, {
|
|
101
|
+
...inlineImageDefaultStyles,
|
|
102
|
+
...(err && {
|
|
103
|
+
...imgStyle,
|
|
104
|
+
display: 'flex',
|
|
105
|
+
alignItems: 'center',
|
|
106
|
+
justifyContent: 'center'
|
|
107
|
+
})
|
|
95
108
|
});
|
|
109
|
+
Object.assign(img.style, !err && imgStyle);
|
|
96
110
|
targetNode.element.appendChild(imageContainer);
|
|
97
111
|
Object.assign(imageContainer.style, {
|
|
98
112
|
height: `${imageContainer.clientHeight}px`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_styleUtils","require","_loadingIndicator","inlineImageDefaultStyles","position","bottom","left","createImageElement","url","callback","imageContainer","document","createElement","contentEditable","setAttribute","img","Image","appendChild","onload","onerror","src","updateImageTreeNode","targetNode","newElement","imageMarginTop","paddingBottom","parseStringWithUnitToNumber","style","height","element","currentParent","parentElement","includes","getAttribute","Object","assign","addInlineImagePreview","currentInput","text","ranges","markdownStyle","_markdownStyle$inline","_markdownStyle$inline2","_markdownStyle$loadin","_markdownStyle$loadin2","linkRange","find","r","type","imageHref","substring","start","length","inlineImage","marginTop","imageMarginBottom","marginBottom","alreadyLoadedPreview","querySelector","loadedImageContainer","spinner","createLoadingIndicator","display","loadingIndicatorContainer","loadingIndicator","undefined","currentSpinner","remove","firstChild","minHeight","minWidth","maxHeight","maxWidth","borderRadius","clientHeight"],"sourceRoot":"../../../../src","sources":["web/inputElements/inlineImage.ts"],"mappings":";;;;;;AAEA,IAAAA,WAAA,GAAAC,OAAA;AAGA,IAAAC,iBAAA,GAAAD,OAAA;AAEA,MAAME,wBAAwB,GAAG;EAC/BC,QAAQ,EAAE,UAAU;EACpBC,MAAM,EAAE,CAAC;EACTC,IAAI,EAAE;AACR,CAAC;AAED,SAASC,kBAAkBA,CAACC,GAAW,EAAEC,
|
|
1
|
+
{"version":3,"names":["_styleUtils","require","_loadingIndicator","INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS","inlineImageDefaultStyles","position","bottom","left","timeout","createImageElement","url","callback","clearTimeout","setTimeout","imageContainer","document","createElement","contentEditable","setAttribute","img","Image","appendChild","onload","onerror","err","src","updateImageTreeNode","targetNode","newElement","imageMarginTop","paddingBottom","parseStringWithUnitToNumber","style","height","element","cloneNode","currentParent","parentElement","includes","getAttribute","Object","assign","addInlineImagePreview","currentInput","text","ranges","markdownStyle","_markdownStyle$inline","_markdownStyle$inline2","_markdownStyle$loadin","_markdownStyle$loadin2","linkRange","find","r","type","imageHref","substring","start","length","inlineImage","marginTop","imageMarginBottom","marginBottom","alreadyLoadedPreview","querySelector","loadedImageContainer","spinner","createLoadingIndicator","display","loadingIndicatorContainer","loadingIndicator","undefined","currentSpinner","remove","firstChild","minHeight","minWidth","maxHeight","maxWidth","borderRadius","imgStyle","alignItems","justifyContent","clientHeight"],"sourceRoot":"../../../../src","sources":["web/inputElements/inlineImage.ts"],"mappings":"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"}
|
|
@@ -1,26 +1,33 @@
|
|
|
1
1
|
import { parseStringWithUnitToNumber } from '../../styleUtils';
|
|
2
2
|
import { createLoadingIndicator } from './loadingIndicator';
|
|
3
|
+
const INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS = 300;
|
|
3
4
|
const inlineImageDefaultStyles = {
|
|
4
5
|
position: 'absolute',
|
|
5
6
|
bottom: 0,
|
|
6
7
|
left: 0
|
|
7
8
|
};
|
|
9
|
+
let timeout = null;
|
|
8
10
|
function createImageElement(url, callback) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
if (timeout) {
|
|
12
|
+
clearTimeout(timeout);
|
|
13
|
+
}
|
|
14
|
+
timeout = setTimeout(() => {
|
|
15
|
+
const imageContainer = document.createElement('span');
|
|
16
|
+
imageContainer.contentEditable = 'false';
|
|
17
|
+
imageContainer.setAttribute('data-type', 'inline-container');
|
|
18
|
+
const img = new Image();
|
|
19
|
+
imageContainer.appendChild(img);
|
|
20
|
+
img.contentEditable = 'false';
|
|
21
|
+
img.onload = () => callback(imageContainer);
|
|
22
|
+
img.onerror = err => callback(imageContainer, err);
|
|
23
|
+
img.src = url;
|
|
24
|
+
}, INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS);
|
|
18
25
|
}
|
|
19
26
|
|
|
20
27
|
/** Adds already loaded image element from current input content to the tree node */
|
|
21
28
|
function updateImageTreeNode(targetNode, newElement, imageMarginTop = 0) {
|
|
22
29
|
const paddingBottom = `${parseStringWithUnitToNumber(newElement.style.height) + imageMarginTop}px`;
|
|
23
|
-
targetNode.element.appendChild(newElement);
|
|
30
|
+
targetNode.element.appendChild(newElement.cloneNode(true));
|
|
24
31
|
let currentParent = targetNode.element;
|
|
25
32
|
while (currentParent.parentElement && !['line', 'block'].includes(currentParent.getAttribute('data-type') || '')) {
|
|
26
33
|
currentParent = currentParent.parentElement;
|
|
@@ -60,7 +67,7 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
60
67
|
marginBottom: `${imageMarginBottom}px`,
|
|
61
68
|
paddingBottom: ((_markdownStyle$loadin = markdownStyle.loadingIndicatorContainer) === null || _markdownStyle$loadin === void 0 ? void 0 : _markdownStyle$loadin.height) || ((_markdownStyle$loadin2 = markdownStyle.loadingIndicator) === null || _markdownStyle$loadin2 === void 0 ? void 0 : _markdownStyle$loadin2.height) || !!markdownStyle.loadingIndicator && '30px' || undefined
|
|
62
69
|
});
|
|
63
|
-
createImageElement(imageHref, imageContainer => {
|
|
70
|
+
createImageElement(imageHref, (imageContainer, err) => {
|
|
64
71
|
// Verify if the current spinner is for the loaded image. If not, it means that the response came after the user changed the image url
|
|
65
72
|
const currentSpinner = currentInput.querySelector('[data-type="spinner"]');
|
|
66
73
|
// Remove the spinner
|
|
@@ -68,11 +75,6 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
68
75
|
currentSpinner.remove();
|
|
69
76
|
}
|
|
70
77
|
const img = imageContainer.firstChild;
|
|
71
|
-
|
|
72
|
-
// Set the image styles
|
|
73
|
-
Object.assign(imageContainer.style, {
|
|
74
|
-
...inlineImageDefaultStyles
|
|
75
|
-
});
|
|
76
78
|
const {
|
|
77
79
|
minHeight,
|
|
78
80
|
minWidth,
|
|
@@ -80,13 +82,25 @@ function addInlineImagePreview(currentInput, targetNode, text, ranges, markdownS
|
|
|
80
82
|
maxWidth,
|
|
81
83
|
borderRadius
|
|
82
84
|
} = markdownStyle.inlineImage || {};
|
|
83
|
-
|
|
85
|
+
const imgStyle = {
|
|
84
86
|
minHeight,
|
|
85
87
|
minWidth,
|
|
86
88
|
maxHeight,
|
|
87
89
|
maxWidth,
|
|
88
90
|
borderRadius
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Set the image styles
|
|
94
|
+
Object.assign(imageContainer.style, {
|
|
95
|
+
...inlineImageDefaultStyles,
|
|
96
|
+
...(err && {
|
|
97
|
+
...imgStyle,
|
|
98
|
+
display: 'flex',
|
|
99
|
+
alignItems: 'center',
|
|
100
|
+
justifyContent: 'center'
|
|
101
|
+
})
|
|
89
102
|
});
|
|
103
|
+
Object.assign(img.style, !err && imgStyle);
|
|
90
104
|
targetNode.element.appendChild(imageContainer);
|
|
91
105
|
Object.assign(imageContainer.style, {
|
|
92
106
|
height: `${imageContainer.clientHeight}px`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["parseStringWithUnitToNumber","createLoadingIndicator","inlineImageDefaultStyles","position","bottom","left","createImageElement","url","callback","imageContainer","document","createElement","contentEditable","setAttribute","img","Image","appendChild","onload","onerror","src","updateImageTreeNode","targetNode","newElement","imageMarginTop","paddingBottom","style","height","element","currentParent","parentElement","includes","getAttribute","Object","assign","addInlineImagePreview","currentInput","text","ranges","markdownStyle","_markdownStyle$inline","_markdownStyle$inline2","_markdownStyle$loadin","_markdownStyle$loadin2","linkRange","find","r","type","imageHref","substring","start","length","inlineImage","marginTop","imageMarginBottom","marginBottom","alreadyLoadedPreview","querySelector","loadedImageContainer","spinner","display","loadingIndicatorContainer","loadingIndicator","undefined","currentSpinner","remove","firstChild","minHeight","minWidth","maxHeight","maxWidth","borderRadius","clientHeight"],"sourceRoot":"../../../../src","sources":["web/inputElements/inlineImage.ts"],"mappings":"AAEA,SAAQA,2BAA2B,QAAO,kBAAkB;AAG5D,SAAQC,sBAAsB,QAAO,oBAAoB;AAEzD,MAAMC,wBAAwB,GAAG;EAC/BC,QAAQ,EAAE,UAAU;EACpBC,MAAM,EAAE,CAAC;EACTC,IAAI,EAAE;AACR,CAAC;AAED,SAASC,kBAAkBA,CAACC,GAAW,EAAEC,
|
|
1
|
+
{"version":3,"names":["parseStringWithUnitToNumber","createLoadingIndicator","INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS","inlineImageDefaultStyles","position","bottom","left","timeout","createImageElement","url","callback","clearTimeout","setTimeout","imageContainer","document","createElement","contentEditable","setAttribute","img","Image","appendChild","onload","onerror","err","src","updateImageTreeNode","targetNode","newElement","imageMarginTop","paddingBottom","style","height","element","cloneNode","currentParent","parentElement","includes","getAttribute","Object","assign","addInlineImagePreview","currentInput","text","ranges","markdownStyle","_markdownStyle$inline","_markdownStyle$inline2","_markdownStyle$loadin","_markdownStyle$loadin2","linkRange","find","r","type","imageHref","substring","start","length","inlineImage","marginTop","imageMarginBottom","marginBottom","alreadyLoadedPreview","querySelector","loadedImageContainer","spinner","display","loadingIndicatorContainer","loadingIndicator","undefined","currentSpinner","remove","firstChild","minHeight","minWidth","maxHeight","maxWidth","borderRadius","imgStyle","alignItems","justifyContent","clientHeight"],"sourceRoot":"../../../../src","sources":["web/inputElements/inlineImage.ts"],"mappings":"AAEA,SAAQA,2BAA2B,QAAO,kBAAkB;AAG5D,SAAQC,sBAAsB,QAAO,oBAAoB;AAEzD,MAAMC,qCAAqC,GAAG,GAAG;AAEjD,MAAMC,wBAAwB,GAAG;EAC/BC,QAAQ,EAAE,UAAU;EACpBC,MAAM,EAAE,CAAC;EACTC,IAAI,EAAE;AACR,CAAC;AAED,IAAIC,OAA8B,GAAG,IAAI;AAEzC,SAASC,kBAAkBA,CAACC,GAAW,EAAEC,QAA0D,EAAE;EACnG,IAAIH,OAAO,EAAE;IACXI,YAAY,CAACJ,OAAO,CAAC;EACvB;EAEAA,OAAO,GAAGK,UAAU,CAAC,MAAM;IACzB,MAAMC,cAAc,GAAGC,QAAQ,CAACC,aAAa,CAAC,MAAM,CAAC;IACrDF,cAAc,CAACG,eAAe,GAAG,OAAO;IACxCH,cAAc,CAACI,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC;IAE5D,MAAMC,GAAG,GAAG,IAAIC,KAAK,CAAC,CAAC;IACvBN,cAAc,CAACO,WAAW,CAACF,GAAG,CAAC;IAE/BA,GAAG,CAACF,eAAe,GAAG,OAAO;IAC7BE,GAAG,CAACG,MAAM,GAAG,MAAMX,QAAQ,CAACG,cAAc,CAAC;IAC3CK,GAAG,CAACI,OAAO,GAAIC,GAAG,IAAKb,QAAQ,CAACG,cAAc,EAAEU,GAAG,CAAC;IACpDL,GAAG,CAACM,GAAG,GAAGf,GAAG;EACf,CAAC,EAAEP,qCAAqC,CAAC;AAC3C;;AAEA;AACA,SAASuB,mBAAmBA,CAACC,UAAoB,EAAEC,UAA+B,EAAEC,cAAc,GAAG,CAAC,EAAE;EACtG,MAAMC,aAAa,GAAI,GAAE7B,2BAA2B,CAAC2B,UAAU,CAACG,KAAK,CAACC,MAAM,CAAC,GAAGH,cAAe,IAAG;EAClGF,UAAU,CAACM,OAAO,CAACZ,WAAW,CAACO,UAAU,CAACM,SAAS,CAAC,IAAI,CAAC,CAAC;EAE1D,IAAIC,aAAa,GAAGR,UAAU,CAACM,OAAO;EACtC,OAAOE,aAAa,CAACC,aAAa,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAACC,QAAQ,CAACF,aAAa,CAACG,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE;IAChHH,aAAa,GAAGA,aAAa,CAACC,aAAoC;EACpE;EACAG,MAAM,CAACC,MAAM,CAACL,aAAa,CAACJ,KAAK,EAAE;IACjCD;EACF,CAAC,CAAC;EAEF,OAAOH,UAAU;AACnB;;AAEA;AACA,SAASc,qBAAqBA,CAACC,YAAsC,EAAEf,UAAoB,EAAEgB,IAAY,EAAEC,MAAuB,EAAEC,aAAmC,EAAE;EAAA,IAAAC,qBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,sBAAA;EACvK,MAAMC,SAAS,GAAGN,MAAM,CAACO,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,KAAK,MAAM,CAAC;EACvD,IAAIC,SAAS,GAAG,EAAE;EAClB,IAAIJ,SAAS,EAAE;IACbI,SAAS,GAAGX,IAAI,CAACY,SAAS,CAACL,SAAS,CAACM,KAAK,EAAEN,SAAS,CAACM,KAAK,GAAGN,SAAS,CAACO,MAAM,CAAC;EACjF;EAEA,MAAM5B,cAAc,GAAG5B,2BAA2B,CAAE,IAAA6C,qBAAA,GAAED,aAAa,CAACa,WAAW,cAAAZ,qBAAA,uBAAzBA,qBAAA,CAA2Ba,SAAU,EAAC,CAAC;EAC7F,MAAMC,iBAAiB,GAAG3D,2BAA2B,CAAE,IAAA8C,sBAAA,GAAEF,aAAa,CAACa,WAAW,cAAAX,sBAAA,uBAAzBA,sBAAA,CAA2Bc,YAAa,EAAC,CAAC;;EAEnG;EACA;EACA,MAAMC,oBAAoB,GAAGpB,YAAY,CAACqB,aAAa,CAAE,YAAWT,SAAU,IAAG,CAAC;EAClF,MAAMU,oBAAoB,GAAGF,oBAAoB,aAApBA,oBAAoB,uBAApBA,oBAAoB,CAAE1B,aAAa;EAEhE,IAAI4B,oBAAoB,IAAIA,oBAAoB,CAAC1B,YAAY,CAAC,WAAW,CAAC,KAAK,kBAAkB,EAAE;IACjG,OAAOZ,mBAAmB,CAACC,UAAU,EAAEqC,oBAAoB,EAAyBnC,cAAc,CAAC;EACrG;;EAEA;EACA,MAAMoC,OAAO,GAAG/D,sBAAsB,CAACoD,SAAS,EAAET,aAAa,CAAC;EAChE,IAAIoB,OAAO,EAAE;IACXtC,UAAU,CAACM,OAAO,CAACZ,WAAW,CAAC4C,OAAO,CAAC;EACzC;EAEA1B,MAAM,CAACC,MAAM,CAACb,UAAU,CAACM,OAAO,CAACF,KAAK,EAAE;IACtCmC,OAAO,EAAE,OAAO;IAChBL,YAAY,EAAG,GAAED,iBAAkB,IAAG;IACtC9B,aAAa,EAAE,EAAAkB,qBAAA,GAAAH,aAAa,CAACsB,yBAAyB,cAAAnB,qBAAA,uBAAvCA,qBAAA,CAAyChB,MAAM,OAAAiB,sBAAA,GAAIJ,aAAa,CAACuB,gBAAgB,cAAAnB,sBAAA,uBAA9BA,sBAAA,CAAgCjB,MAAM,KAAK,CAAC,CAACa,aAAa,CAACuB,gBAAgB,IAAI,MAAO,IAAIC;EAC9J,CAAC,CAAC;EAEF5D,kBAAkB,CAAC6C,SAAS,EAAE,CAACxC,cAAc,EAAEU,GAAG,KAAK;IACrD;IACA,MAAM8C,cAAc,GAAG5B,YAAY,CAACqB,aAAa,CAAC,uBAAuB,CAAC;IAC1E;IACA,IAAIO,cAAc,EAAE;MAClBA,cAAc,CAACC,MAAM,CAAC,CAAC;IACzB;IAEA,MAAMpD,GAAG,GAAGL,cAAc,CAAC0D,UAA8B;IACzD,MAAM;MAACC,SAAS;MAAEC,QAAQ;MAAEC,SAAS;MAAEC,QAAQ;MAAEC;IAAY,CAAC,GAAGhC,aAAa,CAACa,WAAW,IAAI,CAAC,CAAC;IAChG,MAAMoB,QAAQ,GAAG;MACfL,SAAS;MACTC,QAAQ;MACRC,SAAS;MACTC,QAAQ;MACRC;IACF,CAAC;;IAED;IACAtC,MAAM,CAACC,MAAM,CAAC1B,cAAc,CAACiB,KAAK,EAAE;MAClC,GAAG3B,wBAAwB;MAC3B,IAAIoB,GAAG,IAAI;QACT,GAAGsD,QAAQ;QACXZ,OAAO,EAAE,MAAM;QACfa,UAAU,EAAE,QAAQ;QACpBC,cAAc,EAAE;MAClB,CAAC;IACH,CAAC,CAAC;IAEFzC,MAAM,CAACC,MAAM,CAACrB,GAAG,CAACY,KAAK,EAAE,CAACP,GAAG,IAAIsD,QAAQ,CAAC;IAE1CnD,UAAU,CAACM,OAAO,CAACZ,WAAW,CAACP,cAAc,CAAC;IAE9CyB,MAAM,CAACC,MAAM,CAAC1B,cAAc,CAACiB,KAAK,EAAE;MAClCC,MAAM,EAAG,GAAElB,cAAc,CAACmE,YAAa;IACzC,CAAC,CAAC;IACF;IACA1C,MAAM,CAACC,MAAM,CAACb,UAAU,CAACM,OAAO,CAACF,KAAK,EAAE;MACtCD,aAAa,EAAG,GAAEhB,cAAc,CAACmE,YAAY,GAAGpD,cAAe;IACjE,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,OAAOF,UAAU;AACnB;;AAEA;AACA,SAAQc,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineImage.d.ts","sourceRoot":"","sources":["../../../../../src/web/inputElements/inlineImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAC/F,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"inlineImage.d.ts","sourceRoot":"","sources":["../../../../../src/web/inputElements/inlineImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAC/F,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAiDjD,mEAAmE;AACnE,iBAAS,qBAAqB,CAAC,YAAY,EAAE,wBAAwB,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,aAAa,EAAE,oBAAoB,YA0EtK;AAGD,OAAO,EAAC,qBAAqB,EAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expensify/react-native-live-markdown",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.153",
|
|
4
4
|
"description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -5,30 +5,40 @@ import type {PartialMarkdownStyle} from '../../styleUtils';
|
|
|
5
5
|
import type {TreeNode} from '../utils/treeUtils';
|
|
6
6
|
import {createLoadingIndicator} from './loadingIndicator';
|
|
7
7
|
|
|
8
|
+
const INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS = 300;
|
|
9
|
+
|
|
8
10
|
const inlineImageDefaultStyles = {
|
|
9
11
|
position: 'absolute',
|
|
10
12
|
bottom: 0,
|
|
11
13
|
left: 0,
|
|
12
14
|
};
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
let timeout: NodeJS.Timeout | null = null;
|
|
17
|
+
|
|
18
|
+
function createImageElement(url: string, callback: (img: HTMLElement, err?: string | Event) => void) {
|
|
19
|
+
if (timeout) {
|
|
20
|
+
clearTimeout(timeout);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
timeout = setTimeout(() => {
|
|
24
|
+
const imageContainer = document.createElement('span');
|
|
25
|
+
imageContainer.contentEditable = 'false';
|
|
26
|
+
imageContainer.setAttribute('data-type', 'inline-container');
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
const img = new Image();
|
|
29
|
+
imageContainer.appendChild(img);
|
|
21
30
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
img.contentEditable = 'false';
|
|
32
|
+
img.onload = () => callback(imageContainer);
|
|
33
|
+
img.onerror = (err) => callback(imageContainer, err);
|
|
34
|
+
img.src = url;
|
|
35
|
+
}, INLINE_IMAGE_PREVIEW_DEBOUNCE_TIME_MS);
|
|
26
36
|
}
|
|
27
37
|
|
|
28
38
|
/** Adds already loaded image element from current input content to the tree node */
|
|
29
39
|
function updateImageTreeNode(targetNode: TreeNode, newElement: HTMLMarkdownElement, imageMarginTop = 0) {
|
|
30
40
|
const paddingBottom = `${parseStringWithUnitToNumber(newElement.style.height) + imageMarginTop}px`;
|
|
31
|
-
targetNode.element.appendChild(newElement);
|
|
41
|
+
targetNode.element.appendChild(newElement.cloneNode(true));
|
|
32
42
|
|
|
33
43
|
let currentParent = targetNode.element;
|
|
34
44
|
while (currentParent.parentElement && !['line', 'block'].includes(currentParent.getAttribute('data-type') || '')) {
|
|
@@ -56,6 +66,7 @@ function addInlineImagePreview(currentInput: MarkdownTextInputElement, targetNod
|
|
|
56
66
|
// Prevents from image flickering and layout jumps
|
|
57
67
|
const alreadyLoadedPreview = currentInput.querySelector(`img[src="${imageHref}"]`);
|
|
58
68
|
const loadedImageContainer = alreadyLoadedPreview?.parentElement;
|
|
69
|
+
|
|
59
70
|
if (loadedImageContainer && loadedImageContainer.getAttribute('data-type') === 'inline-container') {
|
|
60
71
|
return updateImageTreeNode(targetNode, loadedImageContainer as HTMLMarkdownElement, imageMarginTop);
|
|
61
72
|
}
|
|
@@ -72,7 +83,7 @@ function addInlineImagePreview(currentInput: MarkdownTextInputElement, targetNod
|
|
|
72
83
|
paddingBottom: markdownStyle.loadingIndicatorContainer?.height || markdownStyle.loadingIndicator?.height || (!!markdownStyle.loadingIndicator && '30px') || undefined,
|
|
73
84
|
});
|
|
74
85
|
|
|
75
|
-
createImageElement(imageHref, (imageContainer) => {
|
|
86
|
+
createImageElement(imageHref, (imageContainer, err) => {
|
|
76
87
|
// Verify if the current spinner is for the loaded image. If not, it means that the response came after the user changed the image url
|
|
77
88
|
const currentSpinner = currentInput.querySelector('[data-type="spinner"]');
|
|
78
89
|
// Remove the spinner
|
|
@@ -81,21 +92,28 @@ function addInlineImagePreview(currentInput: MarkdownTextInputElement, targetNod
|
|
|
81
92
|
}
|
|
82
93
|
|
|
83
94
|
const img = imageContainer.firstChild as HTMLImageElement;
|
|
84
|
-
|
|
85
|
-
// Set the image styles
|
|
86
|
-
Object.assign(imageContainer.style, {
|
|
87
|
-
...inlineImageDefaultStyles,
|
|
88
|
-
});
|
|
89
|
-
|
|
90
95
|
const {minHeight, minWidth, maxHeight, maxWidth, borderRadius} = markdownStyle.inlineImage || {};
|
|
91
|
-
|
|
96
|
+
const imgStyle = {
|
|
92
97
|
minHeight,
|
|
93
98
|
minWidth,
|
|
94
99
|
maxHeight,
|
|
95
100
|
maxWidth,
|
|
96
101
|
borderRadius,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// Set the image styles
|
|
105
|
+
Object.assign(imageContainer.style, {
|
|
106
|
+
...inlineImageDefaultStyles,
|
|
107
|
+
...(err && {
|
|
108
|
+
...imgStyle,
|
|
109
|
+
display: 'flex',
|
|
110
|
+
alignItems: 'center',
|
|
111
|
+
justifyContent: 'center',
|
|
112
|
+
}),
|
|
97
113
|
});
|
|
98
114
|
|
|
115
|
+
Object.assign(img.style, !err && imgStyle);
|
|
116
|
+
|
|
99
117
|
targetNode.element.appendChild(imageContainer);
|
|
100
118
|
|
|
101
119
|
Object.assign(imageContainer.style, {
|