@expensify/react-native-live-markdown 0.1.151 → 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.
@@ -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
- 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 = () => callback(imageContainer);
23
- img.src = url;
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
- Object.assign(img.style, {
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":"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"}
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
- const imageContainer = document.createElement('span');
10
- imageContainer.contentEditable = 'false';
11
- imageContainer.setAttribute('data-type', 'inline-container');
12
- const img = new Image();
13
- imageContainer.appendChild(img);
14
- img.contentEditable = 'false';
15
- img.onload = () => callback(imageContainer);
16
- img.onerror = () => callback(imageContainer);
17
- img.src = url;
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
- Object.assign(img.style, {
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":"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"}
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":"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"}
@@ -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;AAuCjD,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,YAkEtK;AAGD,OAAO,EAAC,qBAAqB,EAAC,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.151",
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
- function createImageElement(url: string, callback: (img: HTMLElement) => void) {
15
- const imageContainer = document.createElement('span');
16
- imageContainer.contentEditable = 'false';
17
- imageContainer.setAttribute('data-type', 'inline-container');
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
- const img = new Image();
20
- imageContainer.appendChild(img);
28
+ const img = new Image();
29
+ imageContainer.appendChild(img);
21
30
 
22
- img.contentEditable = 'false';
23
- img.onload = () => callback(imageContainer);
24
- img.onerror = () => callback(imageContainer);
25
- img.src = url;
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
- Object.assign(img.style, {
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, {