From ce6e4069f60f95424d44540e5bfac26fed822e67 Mon Sep 17 00:00:00 2001 From: X Developer Date: Tue, 21 Jul 2026 17:00:38 +0430 Subject: [PATCH 1/5] Fix markdown cursor restore Range offset crash --- ...y+react-native-live-markdown+0.1.329.patch | 108 ++++++++++++++++++ .../step/IOURequestStepDescription.tsx | 3 +- .../request/step/IOURequestStepMerchant.tsx | 3 +- 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 patches/@expensify+react-native-live-markdown+0.1.329.patch diff --git a/patches/@expensify+react-native-live-markdown+0.1.329.patch b/patches/@expensify+react-native-live-markdown+0.1.329.patch new file mode 100644 index 000000000000..dbfd93ea5b26 --- /dev/null +++ b/patches/@expensify+react-native-live-markdown+0.1.329.patch @@ -0,0 +1,108 @@ +diff --git a/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js b/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js +index e6f6308..f262b2d 100644 +--- a/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js ++++ b/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js +@@ -10,6 +10,12 @@ exports.scrollIntoView = scrollIntoView; + exports.setCursorPosition = setCursorPosition; + var _blockUtils = require("./blockUtils.js"); + var _treeUtils = require("./treeUtils.js"); ++function getMaxRangeOffset(node) { ++ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; ++} ++function getClampedRangeOffset(node, offset) { ++ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); ++} + function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) { + // We don't want to move the cursor if the target is not focused + if (!target.tree || target !== document.activeElement) { +@@ -32,13 +38,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto + range.setStartBefore(startTreeNode.element); + } else { + const startElement = startTreeNode.element; +- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start); ++ const startNode = startElement.childNodes[0] || startElement; ++ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); + } + if (endTreeNode.type === 'br') { + range.setEndBefore(endTreeNode.element); + } else { + const endElement = endTreeNode.element; +- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start); ++ const endNode = endElement.childNodes[0] || endElement; ++ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); + } + if (!end) { + range.collapse(true); +diff --git a/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js b/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js +index 7bafaf7..e20cb5e 100644 +--- a/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js ++++ b/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js +@@ -2,6 +2,12 @@ + + import { isChildOfMultilineMarkdownElement } from "./blockUtils.js"; + import { findHTMLElementInTree, getTreeNodeByIndex } from "./treeUtils.js"; ++function getMaxRangeOffset(node) { ++ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; ++} ++function getClampedRangeOffset(node, offset) { ++ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); ++} + function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) { + // We don't want to move the cursor if the target is not focused + if (!target.tree || target !== document.activeElement) { +@@ -24,13 +30,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto + range.setStartBefore(startTreeNode.element); + } else { + const startElement = startTreeNode.element; +- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start); ++ const startNode = startElement.childNodes[0] || startElement; ++ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); + } + if (endTreeNode.type === 'br') { + range.setEndBefore(endTreeNode.element); + } else { + const endElement = endTreeNode.element; +- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start); ++ const endNode = endElement.childNodes[0] || endElement; ++ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); + } + if (!end) { + range.collapse(true); +diff --git a/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts b/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts +index 82eebc7..f35f474 100644 +--- a/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts ++++ b/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts +@@ -3,6 +3,14 @@ import {isChildOfMultilineMarkdownElement} from './blockUtils'; + import {findHTMLElementInTree, getTreeNodeByIndex} from './treeUtils'; + import type {TreeNode} from './treeUtils'; + ++function getMaxRangeOffset(node: ChildNode): number { ++ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; ++} ++ ++function getClampedRangeOffset(node: ChildNode, offset: number): number { ++ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); ++} ++ + function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, endIndex: number | null = null, shouldScrollIntoView = false) { + // We don't want to move the cursor if the target is not focused + if (!target.tree || target !== document.activeElement) { +@@ -29,14 +37,16 @@ function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, + range.setStartBefore(startTreeNode.element); + } else { + const startElement = startTreeNode.element; +- range.setStart((startElement.childNodes[0] || startElement) as ChildNode, start - startTreeNode.start); ++ const startNode = (startElement.childNodes[0] || startElement) as ChildNode; ++ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); + } + + if (endTreeNode.type === 'br') { + range.setEndBefore(endTreeNode.element); + } else { + const endElement = endTreeNode.element; +- range.setEnd((endElement.childNodes[0] || endElement) as ChildNode, (end || start) - endTreeNode.start); ++ const endNode = (endElement.childNodes[0] || endElement) as ChildNode; ++ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); + } + + if (!end) { diff --git a/src/pages/iou/request/step/IOURequestStepDescription.tsx b/src/pages/iou/request/step/IOURequestStepDescription.tsx index 9fa96817c288..1968b928d044 100644 --- a/src/pages/iou/request/step/IOURequestStepDescription.tsx +++ b/src/pages/iou/request/step/IOURequestStepDescription.tsx @@ -16,6 +16,7 @@ import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep'; import useThemeStyles from '@hooks/useThemeStyles'; import {addErrorMessage} from '@libs/ErrorUtils'; +import focusComposerWithDelay from '@libs/focusComposerWithDelay'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; import {shouldUseTransactionDraft} from '@libs/IOUUtils'; import Navigation from '@libs/Navigation/Navigation'; @@ -186,7 +187,7 @@ function IOURequestStepDescription({ useDiscardChangesConfirmation({ onCancel: () => { - inputRef.current?.focus(); + focusComposerWithDelay(inputRef.current)(true); }, getHasUnsavedChanges: () => { if (isSaved) { diff --git a/src/pages/iou/request/step/IOURequestStepMerchant.tsx b/src/pages/iou/request/step/IOURequestStepMerchant.tsx index 7b4d235032b4..10127acb7e03 100644 --- a/src/pages/iou/request/step/IOURequestStepMerchant.tsx +++ b/src/pages/iou/request/step/IOURequestStepMerchant.tsx @@ -16,6 +16,7 @@ import useRestartOnReceiptFailure from '@hooks/useRestartOnReceiptFailure'; import useShowNotFoundPageInIOUStep from '@hooks/useShowNotFoundPageInIOUStep'; import useThemeStyles from '@hooks/useThemeStyles'; +import focusComposerWithDelay from '@libs/focusComposerWithDelay'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; import Navigation from '@libs/Navigation/Navigation'; import {skipNextFocusRestore} from '@libs/NavigationFocusReturn'; @@ -182,7 +183,7 @@ function IOURequestStepMerchant({ useDiscardChangesConfirmation({ onCancel: () => { - inputRef.current?.focus(); + focusComposerWithDelay(inputRef.current)(true); }, getHasUnsavedChanges: () => { if (isSaved) { From 9d382fe2726a116401af0e1a6fb6f383abc875a6 Mon Sep 17 00:00:00 2001 From: X Developer Date: Wed, 22 Jul 2026 10:18:03 +0430 Subject: [PATCH 2/5] Add patch to clamp Range offsets for live-markdown cursor restoration to prevent crashes --- ...own+0.1.329+001+clamp-cursor-range-offset.patch} | 0 patches/@expensify/details.md | 13 +++++++++++++ 2 files changed, 13 insertions(+) rename patches/{@expensify+react-native-live-markdown+0.1.329.patch => @expensify/@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch} (100%) create mode 100644 patches/@expensify/details.md diff --git a/patches/@expensify+react-native-live-markdown+0.1.329.patch b/patches/@expensify/@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch similarity index 100% rename from patches/@expensify+react-native-live-markdown+0.1.329.patch rename to patches/@expensify/@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch diff --git a/patches/@expensify/details.md b/patches/@expensify/details.md new file mode 100644 index 000000000000..4c02a8031fb8 --- /dev/null +++ b/patches/@expensify/details.md @@ -0,0 +1,13 @@ +# `@expensify` patches + +### [@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch](@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch) + +- Reason: + + ``` + This patch prevents a web crash in live-markdown cursor restoration by clamping Range offsets against the actual DOM node bounds before calling Range.setStart and Range.setEnd. + ``` + +- Upstream PR/issue: 🛑 TODO - upstream this fix to `@expensify/react-native-live-markdown` after validating the App PR +- E/App issue: https://github.com/Expensify/App/issues/95347 +- PR introducing patch: 🛑 TODO - current PR From b0d5922ec88359cecb1687f6760102a0ea5db6ec Mon Sep 17 00:00:00 2001 From: X Developer Date: Wed, 22 Jul 2026 10:28:49 +0430 Subject: [PATCH 3/5] fix version mismatch of patch with package --- ...e-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch} | 0 patches/@expensify/details.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename patches/@expensify/{@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch => @expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch} (100%) diff --git a/patches/@expensify/@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch b/patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch similarity index 100% rename from patches/@expensify/@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch rename to patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch diff --git a/patches/@expensify/details.md b/patches/@expensify/details.md index 4c02a8031fb8..856670adc9a2 100644 --- a/patches/@expensify/details.md +++ b/patches/@expensify/details.md @@ -1,6 +1,6 @@ # `@expensify` patches -### [@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch](@expensify+react-native-live-markdown+0.1.329+001+clamp-cursor-range-offset.patch) +### [@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch](@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch) - Reason: From 5b70267fe58c4e7ff67a41a88b86bd04e374e7ca Mon Sep 17 00:00:00 2001 From: X Developer Date: Wed, 29 Jul 2026 16:39:11 +0430 Subject: [PATCH 4/5] Update live markdown cursor fix from upstream --- package-lock.json | 8 +- package.json | 2 +- ....1.333+001+clamp-cursor-range-offset.patch | 108 ------------------ patches/@expensify/details.md | 13 --- 4 files changed, 5 insertions(+), 126 deletions(-) delete mode 100644 patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch delete mode 100644 patches/@expensify/details.md diff --git a/package-lock.json b/package-lock.json index 8166aa26040a..8d49cafc09f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@expensify/nitro-utils": "file:./modules/ExpensifyNitroUtils", "@expensify/react-native-background-task": "file:./modules/background-task", "@expensify/react-native-hybrid-app": "file:./modules/hybrid-app", - "@expensify/react-native-live-markdown": "0.1.333", + "@expensify/react-native-live-markdown": "0.1.334", "@expensify/react-native-wallet": "0.1.22", "@expo/metro-config": "56.0.14", "@expo/metro-runtime": "56.0.13", @@ -5546,9 +5546,9 @@ "link": true }, "node_modules/@expensify/react-native-live-markdown": { - "version": "0.1.333", - "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.333.tgz", - "integrity": "sha512-S4z67bBeVolrvJ+Mg/026+v1PRYCjJks2vLfgcIdMf5dPFLAu0htf9KsH1so3CqLTEOWJxuBRHExAdOxUo6C+A==", + "version": "0.1.334", + "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.334.tgz", + "integrity": "sha512-ymousLqFN87xExVJkm17Wa8bw/Ra0PoV+2ng38wUPuK3WNJwToeiovYtGdxscIgqVrJ4SLxkdq10yMlHqP6Iiw==", "license": "MIT", "workspaces": [ "./example", diff --git a/package.json b/package.json index 88b0ae985513..5b6b5f6b0cd2 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "@expensify/nitro-utils": "file:./modules/ExpensifyNitroUtils", "@expensify/react-native-background-task": "file:./modules/background-task", "@expensify/react-native-hybrid-app": "file:./modules/hybrid-app", - "@expensify/react-native-live-markdown": "0.1.333", + "@expensify/react-native-live-markdown": "0.1.334", "@expensify/react-native-wallet": "0.1.22", "@expo/metro-config": "56.0.14", "@expo/metro-runtime": "56.0.13", diff --git a/patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch b/patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch deleted file mode 100644 index dbfd93ea5b26..000000000000 --- a/patches/@expensify/@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch +++ /dev/null @@ -1,108 +0,0 @@ -diff --git a/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js b/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js -index e6f6308..f262b2d 100644 ---- a/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js -+++ b/node_modules/@expensify/react-native-live-markdown/lib/commonjs/web/utils/cursorUtils.js -@@ -10,6 +10,12 @@ exports.scrollIntoView = scrollIntoView; - exports.setCursorPosition = setCursorPosition; - var _blockUtils = require("./blockUtils.js"); - var _treeUtils = require("./treeUtils.js"); -+function getMaxRangeOffset(node) { -+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; -+} -+function getClampedRangeOffset(node, offset) { -+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); -+} - function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) { - // We don't want to move the cursor if the target is not focused - if (!target.tree || target !== document.activeElement) { -@@ -32,13 +38,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto - range.setStartBefore(startTreeNode.element); - } else { - const startElement = startTreeNode.element; -- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start); -+ const startNode = startElement.childNodes[0] || startElement; -+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); - } - if (endTreeNode.type === 'br') { - range.setEndBefore(endTreeNode.element); - } else { - const endElement = endTreeNode.element; -- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start); -+ const endNode = endElement.childNodes[0] || endElement; -+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); - } - if (!end) { - range.collapse(true); -diff --git a/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js b/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js -index 7bafaf7..e20cb5e 100644 ---- a/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js -+++ b/node_modules/@expensify/react-native-live-markdown/lib/module/web/utils/cursorUtils.js -@@ -2,6 +2,12 @@ - - import { isChildOfMultilineMarkdownElement } from "./blockUtils.js"; - import { findHTMLElementInTree, getTreeNodeByIndex } from "./treeUtils.js"; -+function getMaxRangeOffset(node) { -+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; -+} -+function getClampedRangeOffset(node, offset) { -+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); -+} - function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) { - // We don't want to move the cursor if the target is not focused - if (!target.tree || target !== document.activeElement) { -@@ -24,13 +30,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto - range.setStartBefore(startTreeNode.element); - } else { - const startElement = startTreeNode.element; -- range.setStart(startElement.childNodes[0] || startElement, start - startTreeNode.start); -+ const startNode = startElement.childNodes[0] || startElement; -+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); - } - if (endTreeNode.type === 'br') { - range.setEndBefore(endTreeNode.element); - } else { - const endElement = endTreeNode.element; -- range.setEnd(endElement.childNodes[0] || endElement, (end || start) - endTreeNode.start); -+ const endNode = endElement.childNodes[0] || endElement; -+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); - } - if (!end) { - range.collapse(true); -diff --git a/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts b/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts -index 82eebc7..f35f474 100644 ---- a/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts -+++ b/node_modules/@expensify/react-native-live-markdown/src/web/utils/cursorUtils.ts -@@ -3,6 +3,14 @@ import {isChildOfMultilineMarkdownElement} from './blockUtils'; - import {findHTMLElementInTree, getTreeNodeByIndex} from './treeUtils'; - import type {TreeNode} from './treeUtils'; - -+function getMaxRangeOffset(node: ChildNode): number { -+ return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length; -+} -+ -+function getClampedRangeOffset(node: ChildNode, offset: number): number { -+ return Math.max(0, Math.min(offset, getMaxRangeOffset(node))); -+} -+ - function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, endIndex: number | null = null, shouldScrollIntoView = false) { - // We don't want to move the cursor if the target is not focused - if (!target.tree || target !== document.activeElement) { -@@ -29,14 +37,16 @@ function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, - range.setStartBefore(startTreeNode.element); - } else { - const startElement = startTreeNode.element; -- range.setStart((startElement.childNodes[0] || startElement) as ChildNode, start - startTreeNode.start); -+ const startNode = (startElement.childNodes[0] || startElement) as ChildNode; -+ range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start)); - } - - if (endTreeNode.type === 'br') { - range.setEndBefore(endTreeNode.element); - } else { - const endElement = endTreeNode.element; -- range.setEnd((endElement.childNodes[0] || endElement) as ChildNode, (end || start) - endTreeNode.start); -+ const endNode = (endElement.childNodes[0] || endElement) as ChildNode; -+ range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start)); - } - - if (!end) { diff --git a/patches/@expensify/details.md b/patches/@expensify/details.md deleted file mode 100644 index 856670adc9a2..000000000000 --- a/patches/@expensify/details.md +++ /dev/null @@ -1,13 +0,0 @@ -# `@expensify` patches - -### [@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch](@expensify+react-native-live-markdown+0.1.333+001+clamp-cursor-range-offset.patch) - -- Reason: - - ``` - This patch prevents a web crash in live-markdown cursor restoration by clamping Range offsets against the actual DOM node bounds before calling Range.setStart and Range.setEnd. - ``` - -- Upstream PR/issue: 🛑 TODO - upstream this fix to `@expensify/react-native-live-markdown` after validating the App PR -- E/App issue: https://github.com/Expensify/App/issues/95347 -- PR introducing patch: 🛑 TODO - current PR From ebae450b0051d6d67d93d6e1c904d44cd5c4d050 Mon Sep 17 00:00:00 2001 From: X Developer Date: Thu, 30 Jul 2026 11:49:11 +0430 Subject: [PATCH 5/5] install pods: bump RNLiveMarkdown to version 0.1.334 --- ios/Podfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b20798be1b90..9707de6fb2ae 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -3741,7 +3741,7 @@ PODS: - RNGoogleSignin (10.0.1): - GoogleSignIn (~> 7.0) - React-Core - - RNLiveMarkdown (0.1.333): + - RNLiveMarkdown (0.1.334): - boost - DoubleConversion - fast_float @@ -4887,7 +4887,7 @@ SPEC CHECKSUMS: GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 GzipSwift: 893f3e48e597a1a4f62fafcb6514220fcf8287fa - hermes-engine: a042a38ee8fd790f69526e722127b3d187cfbc52 + hermes-engine: b9fce68308a7c2ec975e1717cb7fabe2dc9dd83e libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 @@ -5006,7 +5006,7 @@ SPEC CHECKSUMS: RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 RNGestureHandler: e580deecf0c372b61e073437ac37f62511265777 RNGoogleSignin: 89877c73f0fbf6af2038fbdb7b73b5a25b8330cc - RNLiveMarkdown: b6923a4b941161f6b8832c413f035564a6f4c46e + RNLiveMarkdown: 014c79e3eb3384ad574e4697460c41d997530478 RNLocalize: 05e367a873223683f0e268d0af9a8a8e6aed3b26 rnmapbox-maps: 8b7629ef3ae59dd96340470e568cbc7c08c54ff9 RNNitroSQLite: a9b5965d511ed6e99ce903380e64934d043a0d2c