From 1b43160ad416fc2a8b1917772d8ab2ab72cf93f0 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 7 Jan 2026 21:33:44 -0600 Subject: [PATCH 001/177] Normalize upload filenames --- src/api/MicroPubApi.js | 11 ++-- .../models/posting/uploadLargeMediaTask.js | 39 ++------------ src/utils/file_names.js | 51 +++++++++++++++++++ 3 files changed, 59 insertions(+), 42 deletions(-) create mode 100644 src/utils/file_names.js diff --git a/src/api/MicroPubApi.js b/src/api/MicroPubApi.js index 3509f104..425f5a52 100644 --- a/src/api/MicroPubApi.js +++ b/src/api/MicroPubApi.js @@ -1,7 +1,8 @@ -import { Alert, Platform } from 'react-native'; +import { Alert } from 'react-native'; import axios from 'axios'; import { DOMParser } from "@xmldom/xmldom"; import App from "./../stores/App"; +import { buildUploadFileName } from "../utils/file_names" export const FETCH_ERROR = 2 export const POST_ERROR = 3 @@ -330,13 +331,9 @@ class MicroPubApi { async upload_media(service, file, destination) { const data = new FormData() - // Get extension from file name, for example: 12345.jpg - let extension = file.uri.split('.').pop() - if (Platform.OS === "android" && file.name != null && file.name !== "") { - extension = file.name.split('.').pop() - } + const file_name = buildUploadFileName(file, Date.now()) data.append("file", { - name: `media.${extension.toLowerCase()}`, + name: file_name, type: file.type, uri: file.uri, }) diff --git a/src/stores/models/posting/uploadLargeMediaTask.js b/src/stores/models/posting/uploadLargeMediaTask.js index 58ba8503..625258b9 100644 --- a/src/stores/models/posting/uploadLargeMediaTask.js +++ b/src/stores/models/posting/uploadLargeMediaTask.js @@ -2,6 +2,7 @@ import { Platform } from "react-native" import RNFS from "react-native-fs" import axios from "axios" import MicroPubApi, { POST_ERROR, FETCH_ERROR } from "../../../api/MicroPubApi" +import { buildUploadFileName, inferExtensionFromType, sanitizeFileName } from "../../../utils/file_names" export const LARGE_UPLOAD_CHUNK_SIZE = 1000 * 1024 export const LARGE_UPLOAD_MAX_SIZE = 1024 * 1024 * 1024 @@ -10,38 +11,6 @@ export const LARGE_UPLOAD_MAX_ATTEMPTS = 45 const wait = ms => new Promise(resolve => setTimeout(resolve, ms)) -export const infer_extension_from_type = (mime = "") => { - if (mime.includes("quicktime")) { - return ".mov" - } - if (mime.includes("mp4")) { - return ".mp4" - } - if (mime.includes("m4v")) { - return ".m4v" - } - if (mime.includes("webm")) { - return ".webm" - } - if (mime.includes("ogg")) { - return ".ogv" - } - return ".mp4" -} - -export const build_file_name = (media, fallback_id) => { - if (media?.fileName) { - return media.fileName - } - if (media?.filename) { - return media.filename - } - if (media?.name) { - return media.name - } - return `upload-${fallback_id}${infer_extension_from_type(media?.type || "")}` -} - export const ensure_local_uri_for_upload = async (media, fallback_name) => { const current_uri = media?.cached_uri || media?.cachedUri || media?.uri if (!current_uri) { @@ -50,8 +19,8 @@ export const ensure_local_uri_for_upload = async (media, fallback_name) => { if (current_uri.startsWith("file://")) { return current_uri } - const target_name = fallback_name || `upload-${Date.now()}${infer_extension_from_type(media?.type || "")}` - const safe_name = target_name.replace(/[^\w.\-]/g, "_") + const target_name = fallback_name || `upload-${Date.now()}${inferExtensionFromType(media?.type || "")}` + const safe_name = sanitizeFileName(target_name) const target_path = `${RNFS.CachesDirectoryPath}/${Date.now()}-${safe_name}` let source_path = current_uri try { @@ -98,7 +67,7 @@ export async function upload_large_media_task({ const active_cancel_source = cancel_source || create_cancel_source() const file_id = Math.floor(Math.random() * 1000000) - const file_name = build_file_name(media, file_id) + const file_name = buildUploadFileName(media, file_id) const file_type = media?.type || "video/mp4" try { diff --git a/src/utils/file_names.js b/src/utils/file_names.js new file mode 100644 index 00000000..9d3fae60 --- /dev/null +++ b/src/utils/file_names.js @@ -0,0 +1,51 @@ +export const inferExtensionFromType = (mime = "") => { + if (mime.includes("quicktime")) { + return ".mov" + } + if (mime.includes("mp4")) { + return ".mp4" + } + if (mime.includes("m4v")) { + return ".m4v" + } + if (mime.includes("webm")) { + return ".webm" + } + if (mime.includes("ogg")) { + return ".ogv" + } + return ".mp4" +} + +const getExtension = name => { + if (!name) { + return "" + } + const parts = name.split(".") + if (parts.length < 2) { + return "" + } + const extension = parts.pop() + if (!extension) { + return "" + } + return `.${extension}` +} + +export const sanitizeFileName = name => { + if (!name) { + return "" + } + return name.trim().replace(/[^\w.\-]/g, "_") +} + +export const buildUploadFileName = (media, fallback_id) => { + const candidate_name = media?.fileName || media?.filename || media?.name + const safe_candidate = sanitizeFileName(candidate_name) + const base_name = safe_candidate || `upload-${fallback_id || Date.now()}` + const extension = getExtension(base_name) + if (!extension) { + return `${base_name}${inferExtensionFromType(media?.type || "")}` + } + return base_name +} From dfd88d22168d6144eff56a2b61d4c712409f643f Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 08:18:17 +0200 Subject: [PATCH 002/177] Getting ready for new beta. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 6e0fa4b7..509bc738 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -638,7 +638,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 3.6.5; + MARKETING_VERSION = 3.6.6; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; @@ -686,7 +686,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 3.6.5; + MARKETING_VERSION = 3.6.6; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = "blog.micro.ios.MicroBlog-Share"; @@ -722,7 +722,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.6.5; + MARKETING_VERSION = 3.6.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -759,7 +759,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.6.5; + MARKETING_VERSION = 3.6.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", From 08fc813bb3906835e3e302a8b3aba68cd8752410 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 08:50:45 +0200 Subject: [PATCH 003/177] Fixed posts search to wait before sending query, less flaky while typing. --- src/screens/posts/posts.js | 69 +++++++++++++++++++++++++++++++++----- src/stores/App.js | 30 ++++++++++++++--- 2 files changed, 86 insertions(+), 13 deletions(-) diff --git a/src/screens/posts/posts.js b/src/screens/posts/posts.js index 0d092d51..693af473 100644 --- a/src/screens/posts/posts.js +++ b/src/screens/posts/posts.js @@ -16,8 +16,10 @@ export default class PostsScreen extends React.Component{ super(props); this.state = { is_showing_drafts_button: false, - is_showing_drafts_posts: false + is_showing_drafts_posts: false, + post_search_text: App.post_search_query, }; + this.posts_search_timeout = null; } componentDidMount() { @@ -32,10 +34,62 @@ export default class PostsScreen extends React.Component{ } componentWillUnmount() { + this._clear_posts_search_timeout(); if (this.focusListener) { this.focusListener(); } } + + _open_search = () => { + this.setState({ post_search_text: App.post_search_query }); + App.toggle_post_search_is_open(); + } + + _submit_search = (event) => { + const { selected_service } = Auth.selected_user.posting; + const { config } = selected_service; + const text = event?.nativeEvent?.text ?? this.state.post_search_text; + + this._clear_posts_search_timeout(); + Keyboard.dismiss(); + this.setState({ post_search_text: text }); + App.set_posts_query(text, config.posts_destination(), this.state.is_showing_drafts_posts); + } + + _cancel_search = () => { + const { selected_service } = Auth.selected_user.posting; + const { config } = selected_service; + + this._clear_posts_search_timeout(); + this.setState({ post_search_text: '' }); + App.toggle_post_search_is_open(); + App.set_post_search_text(''); + App.set_posts_query('', config.posts_destination(), this.state.is_showing_drafts_posts); + } + + _clear_posts_search_timeout = () => { + if (this.posts_search_timeout) { + clearTimeout(this.posts_search_timeout); + this.posts_search_timeout = null; + } + } + + _schedule_posts_search = (text) => { + const { selected_service } = Auth.selected_user.posting; + const { config } = selected_service; + + this._clear_posts_search_timeout(); + this.posts_search_timeout = setTimeout(() => { + App.set_posts_query(text, config.posts_destination(), this.state.is_showing_drafts_posts); + this.posts_search_timeout = null; + }, 2000); + } + + _change_posts_search_text = (text) => { + this.setState({ post_search_text: text }); + App.set_post_search_text(text); + this._schedule_posts_search(text); + } _return_header = () => { const { config } = Auth.selected_user.posting.selected_service @@ -96,7 +150,7 @@ export default class PostsScreen extends React.Component{ borderRadius: 5, marginLeft: 5, }} - onPress={App.toggle_post_search_is_open} + onPress={this._open_search} > { Platform.OS === "ios" ? @@ -113,13 +167,10 @@ export default class PostsScreen extends React.Component{ : {Keyboard.dismiss()}} - onChangeText={(text) => App.set_posts_query(text, config.posts_destination(), this.state.is_showing_drafts_posts)} - value={App.post_search_query} - onCancel={() => { - App.toggle_post_search_is_open(); - App.set_posts_query("", null, this.state.is_showing_drafts_posts); - }} + onSubmitEditing={this._submit_search} + onChangeText={this._change_posts_search_text} + value={this.state.post_search_text} + onCancel={this._cancel_search} /> ) } diff --git a/src/stores/App.js b/src/stores/App.js index 76b8c196..1f791ff7 100644 --- a/src/stores/App.js +++ b/src/stores/App.js @@ -67,6 +67,7 @@ export default App = types.model('App', { current_raw_tab_key: null, keyboard_show_listener: null, keyboard_hide_listener: null, + post_search_request_id: 0, })) .actions(self => ({ @@ -779,25 +780,46 @@ export default App = types.model('App', { console.log("App:toggle_uploads_search_is_open") self.uploads_search_is_open = !self.uploads_search_is_open }), + + set_post_search_text(text) { + self.post_search_request_id += 1 + self.post_search_query = text + self.is_searching_posts = false + }, set_posts_query: flow(function*(text, destination, show_drafts = false) { console.log("App:set_posts_query", text, show_drafts) + self.post_search_request_id += 1 + const request_id = self.post_search_request_id self.post_search_query = text + if (text?.length > 2) { self.is_searching_posts = true const results = yield MicroBlogApi.search_posts_and_pages(text, destination?.uid, false, show_drafts) + if (request_id !== self.post_search_request_id || text !== self.post_search_query) { + return + } if (results !== API_ERROR && results.items != null) { if (show_drafts) { - destination.set_drafts(results.items); + destination?.set_drafts(results.items); } else { - destination.set_posts(results.items); + destination?.set_posts(results.items); } } self.is_searching_posts = false } - else if (self.post_search_query == "") { - Auth.selected_user.posting?.selected_service?.update_posts_for_active_destination() + else { + if (request_id !== self.post_search_request_id || text !== self.post_search_query) { + return + } + self.is_searching_posts = false + if (destination != null) { + Auth.selected_user.posting?.selected_service?.check_for_posts_for_destination(destination, show_drafts) + } + else if (self.post_search_query == "") { + Auth.selected_user.posting?.selected_service?.update_posts_for_active_destination() + } } }), From 88f24c82a462f37976ff326824b50c7796865303 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 09:02:54 +0200 Subject: [PATCH 004/177] =?UTF-8?q?Removed=20some=20of=20the=20=E2=80=9Cwh?= =?UTF-8?q?oops=E2=80=9D=20messages=20which=20are=20a=20bit=20too=20inform?= =?UTF-8?q?al.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/MicroPubApi.js | 2 +- src/api/XMLRPCApi.js | 12 ++++++------ src/components/web/error_view.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/api/MicroPubApi.js b/src/api/MicroPubApi.js index 425f5a52..65ce51b6 100644 --- a/src/api/MicroPubApi.js +++ b/src/api/MicroPubApi.js @@ -80,7 +80,7 @@ class MicroPubApi { return this.discover_micropub_endpoints(url, true) } else { - Alert.alert("Whoops, an error occurred trying to connect. Please try again.") + Alert.alert("An error occurred trying to connect. Please try again.") } return MICROPUB_NOT_FOUND } diff --git a/src/api/XMLRPCApi.js b/src/api/XMLRPCApi.js index a3de01c5..af94fab0 100644 --- a/src/api/XMLRPCApi.js +++ b/src/api/XMLRPCApi.js @@ -145,10 +145,10 @@ class XMLRPCApi { console.log('XMLRPCApi:error', err) // Check if error is incorrect password/username if (err?.toString()?.includes("username or password")) { - Alert.alert("Whoops. Your username or password is wrong. Please try again.") + Alert.alert("Your username or password is wrong. Please try again.") } else { - Alert.alert("Whoops, an error occured. Please try again.") + Alert.alert("An error occured. Please try again.") } return XML_ERROR }) @@ -172,10 +172,10 @@ class XMLRPCApi { console.log('XMLRPCApi:error', err) // Check if error is incorrect password/username if (err?.toString()?.includes("username or password")) { - Alert.alert("Whoops. Your username or password is wrong. Please try again.") + Alert.alert("Your username or password is wrong. Please try again.") } else { - Alert.alert("Whoops, an error occured. Please try again.") + Alert.alert("An error occured. Please try again.") } return XML_ERROR }) @@ -247,10 +247,10 @@ class XMLRPCApi { console.log('XMLRPCApi:error', err) // Check if error is incorrect password/username if (err?.toString()?.includes("username or password")) { - Alert.alert("Whoops. Your username or password is wrong. Please try again.") + Alert.alert("Your username or password is wrong. Please try again.") } else { - Alert.alert("Whoops, an error occured. Please try again.") + Alert.alert("An error occured. Please try again.") } return XML_ERROR }) diff --git a/src/components/web/error_view.js b/src/components/web/error_view.js index ba08c98f..0c11f9b9 100644 --- a/src/components/web/error_view.js +++ b/src/components/web/error_view.js @@ -9,7 +9,7 @@ export default class WebErrorViewModule extends React.Component{ render() { return ( - Whoops, an error occured. + Error loading content. {this.props.error_name} Please pull to refresh to try again... From c8c0aeea23c8d7ea5b05c9b15bb4d4c982aaabb6 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 09:06:59 +0200 Subject: [PATCH 005/177] Fixed updating drafts posts list when deleting. --- src/stores/models/posting/Service.js | 33 +++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/stores/models/posting/Service.js b/src/stores/models/posting/Service.js index 73347115..a9f4a63c 100644 --- a/src/stores/models/posting/Service.js +++ b/src/stores/models/posting/Service.js @@ -139,6 +139,20 @@ export default Service = types.model('Service', { self.check_for_posts_for_destination(active_destination) } }), + + refresh_posts_for_current_view: flow(function* (post = null) { + const active_destination = self.config.posts_destination() + const show_drafts = post?.is_draft ? post.is_draft() : false + + if(active_destination){ + if(App.post_search_query?.length > 2){ + yield App.set_posts_query(App.post_search_query, active_destination, show_drafts) + } + else { + yield self.check_for_posts_for_destination(active_destination, show_drafts) + } + } + }), set_active_destination: flow(function* (destination, type = null) { if(destination){ @@ -202,7 +216,7 @@ export default Service = types.model('Service', { const status = yield MicroPubApi.delete_post(self.service_object(), post.url) if(status !== DELETE_ERROR){ App.show_toast("Post was deleted.") - self.update_posts_for_active_destination() + yield self.refresh_posts_for_current_view(post) } else{ Alert.alert("Whoops", "Could not delete post. Please try again.") @@ -214,7 +228,7 @@ export default Service = types.model('Service', { const status = yield MicroPubApi.delete_post(self.service_object(), page.url) if(status !== DELETE_ERROR){ App.show_toast("Page was deleted.") - self.update_pages_for_active_destination() + yield self.refresh_pages_for_current_view() } else{ Alert.alert("Whoops", "Could not delete post. Please try again.") @@ -226,7 +240,7 @@ export default Service = types.model('Service', { const status = yield MicroPubApi.publish_draft(self.service_object(), post.content, post.url, post.name) if(status !== DELETE_ERROR){ App.show_toast("Post was published.") - self.update_posts_for_active_destination() + yield self.refresh_posts_for_current_view(post) } else{ Alert.alert("Error Publishing", "Could not publish the draft. Please try again.") @@ -252,6 +266,19 @@ export default Service = types.model('Service', { self.check_for_pages_for_destination(active_destination) } }), + + refresh_pages_for_current_view: flow(function* () { + const active_destination = self.config.pages_destination() + + if(active_destination){ + if(App.page_search_query?.length > 2){ + yield App.set_pages_query(App.page_search_query, active_destination) + } + else { + yield self.check_for_pages_for_destination(active_destination) + } + } + }), update_uploads_for_active_destination: flow(function* () { const active_destination = self.config.posts_destination() From 61a88a7d741d60d878de8ba6f60f85927d709c54 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 09:32:52 +0200 Subject: [PATCH 006/177] Adjusted loading bar background for more contrast. --- src/components/web/loading_banner.js | 14 +++++++------- src/stores/App.js | 3 +++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/components/web/loading_banner.js b/src/components/web/loading_banner.js index e06aefea..8b2964a3 100644 --- a/src/components/web/loading_banner.js +++ b/src/components/web/loading_banner.js @@ -84,6 +84,7 @@ const LoadingBanner = observer(({ visible, loading_text = "Loading posts...", to const defaultTop = Platform.OS === "ios" ? 12 : 8 const top = topOffset !== undefined ? topOffset : defaultTop + const is_dark_mode = App.is_dark_mode() return ( Date: Wed, 8 Apr 2026 10:05:47 +0200 Subject: [PATCH 007/177] Trying a switch to a different image zoom view. --- bun.lockb | Bin 779280 -> 779360 bytes package.json | 2 +- .../react-native-image-viewing+0.2.2.patch | 17 ------ src/components/images/image_modal.js | 53 ++++++++++++------ 4 files changed, 36 insertions(+), 36 deletions(-) delete mode 100644 patches/react-native-image-viewing+0.2.2.patch diff --git a/bun.lockb b/bun.lockb index 69225f06638115886d6d4ed3501c4da8db1ad5fb..bbcafc4795f65cdaf0a981a736b2924a361437f8 100755 GIT binary patch delta 106435 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 delta 106709 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

^aZ7$)?rmdDTTFdKT+3 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 OYXI^9Z$9Vx*?$1F_n 0 ? Math.max(1 / scale, 1) : 1; -+ const maxScale = scale && scale > 0 ? 3 : 1; - const imageOpacity = scrollValueY.interpolate({ - inputRange: [-SWIPE_CLOSE_OFFSET, 0, SWIPE_CLOSE_OFFSET], -- outputRange: [0.5, 1, 0.5], -+ outputRange: [0.95, 1, 0.95], - }); - const imagesStyles = getImageStyles(imageDimensions, translateValue, scaleValue); - const imageStylesWithOpacity = { ...imagesStyles, opacity: imageOpacity }; diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index 9bdb467e..c4b2a26b 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -1,11 +1,28 @@ import * as React from 'react'; import { observer } from 'mobx-react'; -import ImageView from "react-native-image-viewing"; +import { ImageZoom } from '@likashefqet/react-native-image-zoom'; +import { gestureHandlerRootHOC } from 'react-native-gesture-handler'; import App from "../../stores/App" -import { Platform, SafeAreaView, TouchableOpacity, Image } from 'react-native' +import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View } from 'react-native' import { SFSymbol } from "react-native-sfsymbols"; import ArrowBackIcon from './../../assets/icons/arrow_back.png'; +const ImageModalContent = gestureHandlerRootHOC(({ image_url, close_button }) => { + return ( + + + + {close_button()} + + + ) +}) + @observer export default class ImageModalModule extends React.Component{ @@ -32,26 +49,26 @@ export default class ImageModalModule extends React.Component{ style={{ width: 32, height: 32, tintColor: 'white' }} /> } - ) } render() { - if (App.image_modal_is_open) { - return ( - this.close_button()} - doubleTapToZoomEnabled={true} + return ( + + - ) - } - return null - } - -} \ No newline at end of file + + ) + } + +} From 3f9dbe2c2dd1134d10af24da98bb8715c5887d75 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 10:36:41 +0200 Subject: [PATCH 008/177] Added our own swipe down to dismiss. --- src/components/images/image_modal.js | 199 ++++++++++++++++++--------- 1 file changed, 137 insertions(+), 62 deletions(-) diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index c4b2a26b..bc5496d1 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -1,74 +1,149 @@ import * as React from 'react'; import { observer } from 'mobx-react'; import { ImageZoom } from '@likashefqet/react-native-image-zoom'; -import { gestureHandlerRootHOC } from 'react-native-gesture-handler'; +import { Gesture, GestureDetector, gestureHandlerRootHOC } from 'react-native-gesture-handler'; +import Animated, { Extrapolation, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated'; import App from "../../stores/App" -import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View } from 'react-native' +import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View, useWindowDimensions } from 'react-native' import { SFSymbol } from "react-native-sfsymbols"; import ArrowBackIcon from './../../assets/icons/arrow_back.png'; -const ImageModalContent = gestureHandlerRootHOC(({ image_url, close_button }) => { - return ( - - - - {close_button()} - - - ) -}) +const DISMISS_THRESHOLD = 120 +const DISMISS_VELOCITY = 900 +const SCALE_DISMISS_THRESHOLD = 1.02 -@observer -export default class ImageModalModule extends React.Component{ +const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { + const { height } = useWindowDimensions() + const scale = useSharedValue(1) + const translate_y = useSharedValue(0) - close_button = () => { - return ( - - - { - Platform.OS === 'ios' ? - - : - + const close_modal = React.useCallback(() => { + App.reset_image_modal() + }, []) + + React.useEffect(() => { + if (App.image_modal_is_open) { + scale.value = 1 + translate_y.value = 0 + } + }, [image_url, scale, translate_y]) + + const dismiss_gesture = Gesture.Pan() + .minPointers(1) + .maxPointers(1) + .activeOffsetY(12) + .failOffsetX([-25, 25]) + .onTouchesDown((_, manager) => { + if (scale.value > SCALE_DISMISS_THRESHOLD) { + manager.fail() + } + }) + .onUpdate((event) => { + if (scale.value > SCALE_DISMISS_THRESHOLD) { + return + } + translate_y.value = Math.max(0, event.translationY) + }) + .onEnd((event) => { + if (scale.value > SCALE_DISMISS_THRESHOLD) { + translate_y.value = withSpring(0) + return + } + + const should_dismiss = translate_y.value > DISMISS_THRESHOLD || event.velocityY > DISMISS_VELOCITY + if (should_dismiss) { + translate_y.value = withTiming(height, { duration: 180 }, (finished) => { + if (finished) { + runOnJS(close_modal)() } - - - ) - } + }) + } + else { + translate_y.value = withSpring(0, { + damping: 18, + stiffness: 180, + }) + } + }) + .onFinalize(() => { + if (scale.value > SCALE_DISMISS_THRESHOLD) { + translate_y.value = withSpring(0) + } + }) + + const backdrop_style = useAnimatedStyle(() => ({ + opacity: interpolate(translate_y.value, [0, height * 0.6], [1, 0], Extrapolation.CLAMP), + })) - render() { - return ( - - - - ) - } + const content_style = useAnimatedStyle(() => ({ + transform: [{ translateY: translate_y.value }], + })) + + return ( + + + + + + + + { + Platform.OS === 'ios' ? + + : + + } + + + + + + ) +})) + +const ImageModalModule = observer(() => { + return ( + + + + ) +}) -} +export default ImageModalModule From f9ee6ea592ee3cf476be759d128f464f18470359 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 10:40:13 +0200 Subject: [PATCH 009/177] Added progress spinner for image loading. --- src/components/images/image_modal.js | 57 +++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index bc5496d1..fe68d782 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -4,7 +4,7 @@ import { ImageZoom } from '@likashefqet/react-native-image-zoom'; import { Gesture, GestureDetector, gestureHandlerRootHOC } from 'react-native-gesture-handler'; import Animated, { Extrapolation, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated'; import App from "../../stores/App" -import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View, useWindowDimensions } from 'react-native' +import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View, useWindowDimensions, ActivityIndicator, Text } from 'react-native' import { SFSymbol } from "react-native-sfsymbols"; import ArrowBackIcon from './../../assets/icons/arrow_back.png'; @@ -16,6 +16,8 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { const { height } = useWindowDimensions() const scale = useSharedValue(1) const translate_y = useSharedValue(0) + const [is_loading_image, set_is_loading_image] = React.useState(true) + const [did_fail_image, set_did_fail_image] = React.useState(false) const close_modal = React.useCallback(() => { App.reset_image_modal() @@ -25,6 +27,8 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { if (App.image_modal_is_open) { scale.value = 1 translate_y.value = 0 + set_is_loading_image(true) + set_did_fail_image(false) } }, [image_url, scale, translate_y]) @@ -102,7 +106,58 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { resizeMode="contain" isDoubleTapEnabled={true} scale={scale} + onLoadStart={() => { + set_is_loading_image(true) + set_did_fail_image(false) + }} + onLoad={() => { + set_did_fail_image(false) + }} + onLoadEnd={() => { + set_is_loading_image(false) + }} + onError={() => { + set_did_fail_image(true) + set_is_loading_image(false) + }} /> + { + is_loading_image && + + + + } + { + did_fail_image && + + + Couldn't load image. + + + } { From d26a7bb9faf7030141e37421856caec5f3d150f7 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 10:44:50 +0200 Subject: [PATCH 010/177] =?UTF-8?q?Fixed=20so=20=E2=80=9Cx=E2=80=9D=20butt?= =?UTF-8?q?on=20doesn=E2=80=99t=20drag=20down=20with=20swipe=20to=20dismis?= =?UTF-8?q?s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/images/image_modal.js | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index fe68d782..3830487a 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -158,31 +158,31 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { } - - - { - Platform.OS === 'ios' ? - - : - - } - - + + + { + Platform.OS === 'ios' ? + + : + + } + + ) })) From b7f38c5f2dba01a0b03d00b84f38a18fe8f03a26 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 10:53:26 +0200 Subject: [PATCH 011/177] Added fading opacity of image close button too. --- src/components/images/image_modal.js | 51 ++++++++++++++++------------ 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index 3830487a..4f4f336b 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -83,6 +83,10 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { transform: [{ translateY: translate_y.value }], })) + const close_button_style = useAnimatedStyle(() => ({ + opacity: interpolate(translate_y.value, [0, height * 0.35], [1, 0], Extrapolation.CLAMP), + })) + return ( { } - - - { - Platform.OS === 'ios' ? - + + + { + Platform.OS === 'ios' ? + + : + - : - - } - - + } + + + ) })) @@ -191,8 +197,9 @@ const ImageModalModule = observer(() => { return ( From 3fc32b3af2facc347c4f49e8a5fb4276fba6e326 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Wed, 8 Apr 2026 11:16:10 +0200 Subject: [PATCH 012/177] New beta. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 509bc738..0836b8f5 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -624,7 +624,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 390; + CURRENT_PROJECT_VERSION = 430; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -672,7 +672,7 @@ CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 390; + CURRENT_PROJECT_VERSION = 430; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -713,7 +713,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 390; + CURRENT_PROJECT_VERSION = 430; DEVELOPMENT_TEAM = 3F9MDJ6K4E; ENABLE_BITCODE = NO; INFOPLIST_FILE = MicroBlog_RN/Info.plist; @@ -751,7 +751,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 390; + CURRENT_PROJECT_VERSION = 430; DEVELOPMENT_TEAM = 3F9MDJ6K4E; INFOPLIST_FILE = MicroBlog_RN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; From d691c173b049c9728fedda357ee4501269c63760 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Thu, 9 Apr 2026 10:25:28 +0200 Subject: [PATCH 013/177] Fixed uploads screen not using small sized images. --- src/components/cells/upload_cell.js | 2 +- src/stores/models/posting/Destination.js | 2 ++ src/stores/models/posting/Upload.js | 9 ++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/components/cells/upload_cell.js b/src/components/cells/upload_cell.js index 98e969e2..669c25ff 100644 --- a/src/components/cells/upload_cell.js +++ b/src/components/cells/upload_cell.js @@ -106,7 +106,7 @@ export default class UploadCell extends React.Component { > { }) } +const UploadVariants = types.model('UploadVariants', { + large: types.maybe(types.string), + medium: types.maybe(types.string), + small: types.maybe(types.string) +}) + export default Upload = types.model('Upload', { url: types.identifier, published: types.maybe(types.string), @@ -20,7 +26,8 @@ export default Upload = types.model('Upload', { width: types.maybe(types.number), height: types.maybe(types.number), is_ai: types.optional(types.boolean, true), - cdn: types.optional(types.map(types.string), {}) + sizes: types.optional(UploadVariants, {}), + cdn: types.optional(UploadVariants, {}) }) .actions(self => ({ From 4a7b487a1feb8ba1d11887bb5328fbc7fd5cb08a Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Fri, 10 Apr 2026 11:54:34 +0200 Subject: [PATCH 014/177] Attempting to fix iOS editor bugs by simplifying everything. --- ios/MicroBlog_RN/MBHighlightingTextManager.m | 48 ++++- ios/MicroBlog_RN/MBHighlightingTextView.h | 5 +- ios/MicroBlog_RN/MBHighlightingTextView.m | 194 +++++++------------ src/screens/pages/edit.ios.js | 15 +- src/screens/posts/edit.ios.js | 16 +- src/screens/posts/new.ios.js | 16 +- src/screens/share/post.ios.js | 6 +- 7 files changed, 148 insertions(+), 152 deletions(-) diff --git a/ios/MicroBlog_RN/MBHighlightingTextManager.m b/ios/MicroBlog_RN/MBHighlightingTextManager.m index 0b2be49c..2f39004b 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextManager.m +++ b/ios/MicroBlog_RN/MBHighlightingTextManager.m @@ -9,7 +9,9 @@ #import "MBHighlightingTextView.h" #import "MBHighlightingTextStorage.h" +#import #import +#import @implementation MBHighlightingTextManager @@ -21,11 +23,40 @@ @implementation MBHighlightingTextManager RCT_CUSTOM_VIEW_PROPERTY(inputAccessoryViewID, NSString, MBHighlightingTextView) { if (json) { -// NSString* input_id = [RCTConvert NSString:json]; -// NSLog(@"inputAccessoryViewID = %@", input_id); + NSString* native_id = [RCTConvert NSString:json]; + MBHighlightingTextView* text_view = view; + + __weak MBHighlightingTextManager* weak_self = self; + __weak MBHighlightingTextView* weak_view = text_view; + [self.bridge.uiManager rootViewForReactTag:text_view.reactTag withCompletion:^(UIView *root_view) { + MBHighlightingTextManager* strong_self = weak_self; + MBHighlightingTextView* strong_view = weak_view; + if (strong_self == nil || strong_view == nil || root_view == nil) { + return; + } + + UIView* accessory_view = [strong_self.bridge.uiManager viewForNativeID:native_id withRootTag:root_view.reactTag]; + if ([accessory_view isKindOfClass:[RCTInputAccessoryView class]]) { + strong_view.inputAccessoryView = ((RCTInputAccessoryView *)accessory_view).inputAccessoryView; + [strong_view reloadInputViews]; + [strong_view refreshInsets]; + } + }]; + } + else { + view.inputAccessoryView = nil; + [view reloadInputViews]; + [view refreshInsets]; } } +RCT_CUSTOM_VIEW_PROPERTY(bottomOverlayHeight, NSNumber, MBHighlightingTextView) +{ + CGFloat bottom_overlay_height = json ? [RCTConvert CGFloat:json] : 0; + view.bottom_overlay_height = bottom_overlay_height; + [view refreshInsets]; +} + RCT_CUSTOM_VIEW_PROPERTY(fontSize, NSNumber, MBHighlightingTextView) { if (json) { @@ -39,8 +70,9 @@ @implementation MBHighlightingTextManager if (json) { if (!self.isTyping) { NSString* new_text = [RCTConvert NSString:json]; - if (![[self.textStorage string] isEqualToString:new_text]) { - self.textView.text = new_text; + NSString* current_text = view.text != nil ? view.text : @""; + if (![current_text isEqualToString:new_text]) { + view.text = new_text; } } } @@ -60,7 +92,7 @@ @implementation MBHighlightingTextManager end_pos = [[pieces lastObject] integerValue]; } - self.textView.selectedRange = NSMakeRange(start_pos, end_pos - start_pos); + view.selectedRange = NSMakeRange(start_pos, end_pos - start_pos); } } @@ -69,7 +101,7 @@ @implementation MBHighlightingTextManager if (json) { BOOL needs_focus = [RCTConvert BOOL:json]; if (needs_focus) { - [self.textView becomeFirstResponder]; + [view becomeFirstResponder]; } } } @@ -113,7 +145,6 @@ - (UIView *) view // make the view self.textView = [[MBHighlightingTextView alloc] initWithFrame:r textContainer:text_container]; - self.textView.hidden = YES; self.textView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.textView.translatesAutoresizingMaskIntoConstraints = NO; self.textView.delegate = self; @@ -153,9 +184,6 @@ - (void) textViewDidChange:(UITextView *)textView // callback to JS MBHighlightingTextView* v = (MBHighlightingTextView *)textView; [v callTextChanged:textView.text]; - - // fix height and scrolling - [v adjustHeight]; } - (void) textViewDidChangeSelection:(UITextView *)textView diff --git a/ios/MicroBlog_RN/MBHighlightingTextView.h b/ios/MicroBlog_RN/MBHighlightingTextView.h index f40bd993..d4a0a055 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextView.h +++ b/ios/MicroBlog_RN/MBHighlightingTextView.h @@ -15,12 +15,11 @@ NS_ASSUME_NONNULL_BEGIN @property (copy, nonatomic) RCTBubblingEventBlock onChangeText; @property (copy, nonatomic) RCTBubblingEventBlock onSelectionChange; @property (strong, nonatomic) UIView* reactAccessoryView; -@property (assign, nonatomic) CGFloat keyboardHeight; +@property (assign, nonatomic) CGFloat bottom_overlay_height; - (void) callTextChanged:(NSString *)text; - (void) callSelectionChanged:(UITextRange *)range; - -- (void) adjustHeight; +- (void) refreshInsets; @end diff --git a/ios/MicroBlog_RN/MBHighlightingTextView.m b/ios/MicroBlog_RN/MBHighlightingTextView.m index 6dfdd10a..086277e5 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextView.m +++ b/ios/MicroBlog_RN/MBHighlightingTextView.m @@ -9,96 +9,68 @@ #import -@implementation MBHighlightingTextView +@interface MBHighlightingTextView () -- (id) init -{ - self = [super init]; - if (self) { - self.keyboardHeight = 0; - } +@property (assign, nonatomic) BOOL did_setup_keyboard_notifications; +@property (assign, nonatomic) UIEdgeInsets base_content_inset; +@property (assign, nonatomic) UIEdgeInsets base_scroll_indicator_inset; +@property (assign, nonatomic) CGFloat keyboard_overlap_height; - return self; -} +@end -- (void) setupNotifications -{ - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil]; -} +@implementation MBHighlightingTextView -- (void) setupAccessoryView +- (void) dealloc { - UIView* root = [self findRootView]; - UIView* v = [self findAccessoryViewFromView:root withNativeID:@"input_toolbar"]; - if (v) { - self.reactAccessoryView = v; - - if (self.inputAccessoryView == nil) { - self.inputAccessoryView = [self.reactAccessoryView inputAccessoryView]; - [self reloadInputViews]; - } + if (self.did_setup_keyboard_notifications) { + [[NSNotificationCenter defaultCenter] removeObserver:self]; } } -- (void) adjustHeight +- (void) setupKeyboardNotificationsIfNeeded { - [self adjustHeightForKeyboardHeight:self.keyboardHeight animated:NO]; -} + if (self.did_setup_keyboard_notifications) { + return; + } -- (void) adjustHeightForKeyboardHeight:(CGFloat)keyboardHeight -{ - [self adjustHeightForKeyboardHeight:keyboardHeight animated:YES]; + self.base_content_inset = self.contentInset; + self.base_scroll_indicator_inset = self.scrollIndicatorInsets; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrameNotification:) name:UIKeyboardWillChangeFrameNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil]; + + self.did_setup_keyboard_notifications = YES; } -- (void) adjustHeightForKeyboardHeight:(CGFloat)keyboardHeight animated:(BOOL)animated +- (void) applyBottomInset:(CGFloat)bottom_inset duration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve scrollCaretToSelection:(BOOL)scroll_caret_to_selection { - // adjust position and height taking into account other views - UIView* parent = self.superview; - if (parent) { - CGFloat top_views_height = 0; - CGFloat bottom_views_height = 0; - CGFloat bottom_safe_inset = 0; - - bottom_views_height += self.inputAccessoryView.bounds.size.height; - - for (UIView* sibling_v in self.superview.subviews) { - if ((sibling_v != self) && !sibling_v.hidden) { - // views with origin < 200 are probably above the text view - if (sibling_v.frame.origin.y < 200) { - top_views_height += sibling_v.bounds.size.height; - } - else { - bottom_views_height += sibling_v.bounds.size.height; - } - } - } + UIEdgeInsets content_inset = self.base_content_inset; + content_inset.bottom += bottom_inset; - bottom_safe_inset = self.window.safeAreaInsets.bottom; + UIEdgeInsets indicator_inset = self.base_scroll_indicator_inset; + indicator_inset.bottom += bottom_inset; - CGRect r = parent.bounds; - r.origin.y = top_views_height; - r.size.height = r.size.height - bottom_views_height - bottom_safe_inset - keyboardHeight; + UIViewAnimationOptions options = ((NSUInteger) curve << 16) | UIViewAnimationOptionBeginFromCurrentState; + [UIView animateWithDuration:duration delay:0 options:options animations:^{ + self.contentInset = content_inset; + self.scrollIndicatorInsets = indicator_inset; + } completion:nil]; - // only set frame and offset if height has changed - if (self.frame.size.height != r.size.height) { - self.frame = r; - [self setContentOffset:CGPointZero animated:animated]; - } + if (scroll_caret_to_selection && self.selectedTextRange != nil) { + CGRect caret_rect = [self caretRectForPosition:self.selectedTextRange.end]; + [self scrollRectToVisible:CGRectInset(caret_rect, 0, -8) animated:NO]; } } -- (void) finishSetup +- (void) updateInsetsWithDuration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve scrollCaretToSelection:(BOOL)scroll_caret_to_selection { - [self setupNotifications]; - [self setupAccessoryView]; - [self adjustHeightForKeyboardHeight:0 animated:NO]; - - self.hidden = NO; + CGFloat bottom_inset = self.keyboard_overlap_height + self.bottom_overlay_height; + [self applyBottomInset:bottom_inset duration:duration curve:curve scrollCaretToSelection:scroll_caret_to_selection]; } -- (void) didSetProps:(NSArray *)changedProps +- (void) refreshInsets { + [self updateInsetsWithDuration:0 curve:UIViewAnimationCurveEaseInOut scrollCaretToSelection:NO]; } - (BOOL) isIpad @@ -114,45 +86,18 @@ - (BOOL) isIpadPortrait return (is_ipad && is_portrait); } -- (UIView *) findRootView -{ - UIView* root = self; - while ([root superview] != nil) { - root = [root superview]; - } - - return root; -} - -- (UIView *) findAccessoryViewFromView:(UIView *)view withNativeID:(NSString *)nativeID +- (void) didMoveToWindow { - UIView* found_view = nil; - - // is this the view? - if ([[view nativeID] isEqualToString:nativeID]) { - return view; - } + [super didMoveToWindow]; - // look at subviews and call recursively - NSArray* subs = view.subviews; - for (UIView* sub in subs) { - found_view = [self findAccessoryViewFromView:sub withNativeID:nativeID]; - if (found_view) { - break; - } - } - - return found_view; + [self setupKeyboardNotificationsIfNeeded]; } -- (void) didMoveToSuperview +- (void) layoutSubviews { - [super didMoveToSuperview]; + [super layoutSubviews]; - if (self.superview != nil) { - // give the other React Native layout time to do whatever it's doing - [self performSelector:@selector(finishSetup) withObject:nil afterDelay:1.0]; - } + [self updateInsetsWithDuration:0 curve:UIViewAnimationCurveEaseInOut scrollCaretToSelection:NO]; } - (void) callTextChanged:(NSString *)text @@ -179,40 +124,31 @@ - (void) callSelectionChanged:(UITextRange *)range #pragma mark - -- (void) keyboardWillShowNotification:(NSNotification*)notification +- (void) keyboardWillChangeFrameNotification:(NSNotification*)notification { - CGFloat covered_height = 0.0; - - // in iPad portrait, keyboard does not cover anything NSDictionary* info = [notification userInfo]; CGRect kb_r = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; - - // convert to the same coordinate space as this view (i.e. the modal's content) - CGRect kb_in_view_r = [self.superview convertRect:kb_r fromView:nil]; - - // intersecction between modal in its own coordinates - CGRect modal_r = self.superview.bounds; - CGRect intersection = CGRectIntersection(modal_r, kb_in_view_r); - - // if intersection is non-empty, its height is how much the keyboard covers our content - covered_height = CGRectIsNull(intersection) ? 0.0 : intersection.size.height; - - // remember height for later layout - self.keyboardHeight = covered_height; - - [UIView animateWithDuration:0.3 animations:^{ - [self adjustHeightForKeyboardHeight:self.keyboardHeight]; - [self layoutIfNeeded]; - }]; + CGRect kb_in_view_r = [self convertRect:kb_r fromView:nil]; + CGRect intersection = CGRectIntersection(self.bounds, kb_in_view_r); + + CGFloat covered_height = CGRectIsNull(intersection) ? 0.0 : intersection.size.height; + if (covered_height > 0 && self.inputAccessoryView != nil && self.bottom_overlay_height <= 0) { + covered_height += self.inputAccessoryView.bounds.size.height; + } + + self.keyboard_overlap_height = covered_height; + NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + UIViewAnimationCurve curve = (UIViewAnimationCurve) [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; + [self updateInsetsWithDuration:duration curve:curve scrollCaretToSelection:YES]; } - -- (void) keyboardWillHideNotification:(NSNotification*)aNotification + +- (void) keyboardWillHideNotification:(NSNotification*)notification { - [UIView animateWithDuration:0.3 animations:^{ - [self adjustHeightForKeyboardHeight:0]; - [self layoutIfNeeded]; - }]; + NSDictionary* info = [notification userInfo]; + self.keyboard_overlap_height = 0; + NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + UIViewAnimationCurve curve = (UIViewAnimationCurve) [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; + [self updateInsetsWithDuration:duration curve:curve scrollCaretToSelection:NO]; } - @end diff --git a/src/screens/pages/edit.ios.js b/src/screens/pages/edit.ios.js index f3e67f00..391897f0 100644 --- a/src/screens/pages/edit.ios.js +++ b/src/screens/pages/edit.ios.js @@ -10,6 +10,13 @@ import LoadingComponent from '../../components/generic/loading'; @observer export default class PageEditScreen extends React.Component{ + + constructor(props) { + super(props) + this.state = { + toolbar_height: 0, + } + } render() { const { posting } = Auth.selected_user @@ -66,6 +73,7 @@ export default class PageEditScreen extends React.Component{ enablesReturnKeyAutomatically={true} underlineColorAndroid={'transparent'} value={posting.post_text} + bottomOverlayHeight={this.state.toolbar_height} selection={posting.text_selection_flat} onChangeText={({ nativeEvent: { text } }) => { !posting.is_sending_post ? posting.set_post_text_from_typing(text) : null @@ -75,7 +83,12 @@ export default class PageEditScreen extends React.Component{ }} /> - + { + const toolbar_height = nativeEvent.layout.height + if (toolbar_height !== this.state.toolbar_height) { + this.setState({ toolbar_height }) + } + }}> diff --git a/src/screens/posts/edit.ios.js b/src/screens/posts/edit.ios.js index e89dd034..fcf8c640 100644 --- a/src/screens/posts/edit.ios.js +++ b/src/screens/posts/edit.ios.js @@ -10,6 +10,13 @@ import LoadingComponent from '../../components/generic/loading'; @observer export default class PostEditScreen extends React.Component{ + + constructor(props) { + super(props) + this.state = { + toolbar_height: 0, + } + } render() { const { posting } = Auth.selected_user @@ -70,6 +77,7 @@ export default class PostEditScreen extends React.Component{ enablesReturnKeyAutomatically={true} underlineColorAndroid={'transparent'} value={posting.post_text} + bottomOverlayHeight={this.state.toolbar_height} selection={posting.text_selection_flat} onChangeText={({ nativeEvent: { text } }) => { !posting.is_sending_post ? posting.set_post_text_from_typing(text) : null @@ -77,10 +85,14 @@ export default class PostEditScreen extends React.Component{ onSelectionChange={({ nativeEvent: { selection } }) => { posting.set_text_selection(selection) }} - inputAccessoryViewID={this.input_accessory_view_id} /> - + { + const toolbar_height = nativeEvent.layout.height + if (toolbar_height !== this.state.toolbar_height) { + this.setState({ toolbar_height }) + } + }}> diff --git a/src/screens/posts/new.ios.js b/src/screens/posts/new.ios.js index bab6f006..effe0163 100644 --- a/src/screens/posts/new.ios.js +++ b/src/screens/posts/new.ios.js @@ -15,7 +15,9 @@ export default class PostingScreen extends React.Component{ constructor(props) { super(props) - this.input_accessory_view_id = "input_toolbar"; + this.state = { + toolbar_height: 0, + } } componentDidMount() { @@ -51,10 +53,9 @@ export default class PostingScreen extends React.Component{ autoCorrect={true} clearButtonMode={'while-editing'} enablesReturnKeyAutomatically={true} - underlineColorAndroid={'transparent'} + underlineColorAndroid={'transparent'} value={posting.post_title} onChangeText={(text) => !posting.is_sending_post ? posting.set_post_title(text) : null} - inputAccessoryViewID={this.input_accessory_view_id} /> : null } @@ -82,6 +83,7 @@ export default class PostingScreen extends React.Component{ enablesReturnKeyAutomatically={true} underlineColorAndroid={'transparent'} value={posting.post_text} + bottomOverlayHeight={this.state.toolbar_height} selection={posting.text_selection_flat} onChangeText={({ nativeEvent: { text } }) => { !posting.is_sending_post ? posting.set_post_text_from_typing(text) : null @@ -89,10 +91,14 @@ export default class PostingScreen extends React.Component{ onSelectionChange={({ nativeEvent: { selection } }) => { posting.set_text_selection(selection) }} - inputAccessoryViewID={this.input_accessory_view_id} /> - + { + const toolbar_height = nativeEvent.layout.height + if (toolbar_height !== this.state.toolbar_height) { + this.setState({ toolbar_height }) + } + }}> diff --git a/src/screens/share/post.ios.js b/src/screens/share/post.ios.js index 4f40880c..fa293b15 100644 --- a/src/screens/share/post.ios.js +++ b/src/screens/share/post.ios.js @@ -17,6 +17,7 @@ export default class SharePostScreen extends React.Component { render() { const { selected_user } = Share + const selection_flat = `${Share.text_selection.start} ${Share.text_selection.end}` return ( Share.is_logged_in() && selected_user?.posting != null ? @@ -37,11 +38,12 @@ export default class SharePostScreen extends React.Component { !selected_user?.posting.is_sending_post ? Share.set_post_text(text) : null} onSelectionChange={({ nativeEvent: { selection } }) => { Share.set_text_selection(selection) From f1855f43ff85c8b750f091d72c78dceed4580b46 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Fri, 10 Apr 2026 11:59:18 +0200 Subject: [PATCH 015/177] Fixed too big insets. --- ios/MicroBlog_RN/MBHighlightingTextManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/MicroBlog_RN/MBHighlightingTextManager.m b/ios/MicroBlog_RN/MBHighlightingTextManager.m index 2f39004b..c601e3fb 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextManager.m +++ b/ios/MicroBlog_RN/MBHighlightingTextManager.m @@ -165,7 +165,7 @@ - (UIView *) view }; NSAttributedString* attr_s = [[NSAttributedString alloc] initWithString:s attributes:attr_info]; self.textView.attributedText = attr_s; - self.textView.textContainerInset = UIEdgeInsetsMake (10, 5, 10, 5); + self.textView.textContainerInset = UIEdgeInsetsMake (8, 1, 8, 1); self.textView.font = [UIFont systemFontOfSize:[[self class] preferredPostingFontSize]]; [self.textStorage setAttributedString:attr_s]; From 2bf7978d6bcfc6ee7cdbb890d35aecb71459f937 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Fri, 10 Apr 2026 12:00:05 +0200 Subject: [PATCH 016/177] New beta. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 0836b8f5..e7ecda1f 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -624,7 +624,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 430; + CURRENT_PROJECT_VERSION = 431; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -672,7 +672,7 @@ CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 430; + CURRENT_PROJECT_VERSION = 431; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -713,7 +713,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 430; + CURRENT_PROJECT_VERSION = 431; DEVELOPMENT_TEAM = 3F9MDJ6K4E; ENABLE_BITCODE = NO; INFOPLIST_FILE = MicroBlog_RN/Info.plist; @@ -751,7 +751,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 430; + CURRENT_PROJECT_VERSION = 431; DEVELOPMENT_TEAM = 3F9MDJ6K4E; INFOPLIST_FILE = MicroBlog_RN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; From 62a2570748c3858e943267b6c24d4947c641cf56 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Fri, 10 Apr 2026 19:34:51 +0200 Subject: [PATCH 017/177] New beta. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index e7ecda1f..74522451 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -624,7 +624,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 431; + CURRENT_PROJECT_VERSION = 432; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -672,7 +672,7 @@ CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 431; + CURRENT_PROJECT_VERSION = 432; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -713,7 +713,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 431; + CURRENT_PROJECT_VERSION = 432; DEVELOPMENT_TEAM = 3F9MDJ6K4E; ENABLE_BITCODE = NO; INFOPLIST_FILE = MicroBlog_RN/Info.plist; @@ -751,7 +751,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 431; + CURRENT_PROJECT_VERSION = 432; DEVELOPMENT_TEAM = 3F9MDJ6K4E; INFOPLIST_FILE = MicroBlog_RN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; From 6b166f94e05b47913c1a889463f5b6d1c1a7fdfd Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 11:34:47 +0200 Subject: [PATCH 018/177] Fixed char count position for editing posts. --- src/screens/posts/edit.ios.js | 2 +- src/stores/models/Posting.js | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/screens/posts/edit.ios.js b/src/screens/posts/edit.ios.js index fcf8c640..f6077526 100644 --- a/src/screens/posts/edit.ios.js +++ b/src/screens/posts/edit.ios.js @@ -61,7 +61,7 @@ export default class PostEditScreen extends React.Component{ justifyContent: 'flex-start', alignItems: 'flex-start', marginTop: 0, - paddingBottom: posting.post_text_length() > posting.max_post_length() ? 150 : 0, + paddingBottom: posting.post_text_length() > posting.max_post_length() ? 50 : 0, flex: 1, padding: 8, color: App.theme_text_color() diff --git a/src/stores/models/Posting.js b/src/stores/models/Posting.js index e4f31247..3a056697 100644 --- a/src/stores/models/Posting.js +++ b/src/stores/models/Posting.js @@ -657,13 +657,7 @@ export default Posting = types.model('Posting', { }, post_chars_offset(is_post_edit) { - var offset = 0 - if (is_post_edit) { - offset = -55 - } - else { - offset = -35 - } + var offset = -35 if (App.found_users.length > 0) { // if usernames bar, move chars counter higher From 46ca06eecafa4a634c8e1061ad080ff69a71c941 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 11:41:34 +0200 Subject: [PATCH 019/177] Fixed char counter readability. --- src/components/keyboard/post_toolbar.js | 11 +++++++---- src/stores/App.js | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/keyboard/post_toolbar.js b/src/components/keyboard/post_toolbar.js index 1edd498e..2791be6c 100644 --- a/src/components/keyboard/post_toolbar.js +++ b/src/components/keyboard/post_toolbar.js @@ -303,13 +303,16 @@ export default class PostToolbar extends React.Component{ 5 ? App.theme_background_color() : null, - opacity: posting.post_assets.length > 5 ? .7 : 1 + right: -5, + backgroundColor: App.theme_chars_background_color(), + borderRadius: 6, + overflow: 'hidden', + zIndex: 5 }} > posting.max_post_length() ? '#a94442' : App.theme_text_color() }}>{posting.post_text_length()}/{posting.max_post_length()} } diff --git a/src/stores/App.js b/src/stores/App.js index 63b1ad2f..1061b903 100644 --- a/src/stores/App.js +++ b/src/stores/App.js @@ -1025,7 +1025,7 @@ export default App = types.model('App', { return self.theme === "dark" ? "rgba(0,0,0,0.7)" : "rgba(255,255,255,0.6)" }, theme_chars_background_color() { - return self.theme === "dark" ? "rgba(255,255,255,0.1)" : "rgba(255,255,255,0.6)" + return self.theme === "dark" ? "rgba(28,32,40,0.8)" : "rgba(255,255,255,0.8)" }, theme_settings_group_background_color() { return self.theme === "dark" ? "#1a232e" : "#e8eaed" From 77e9a65248f0f995cfa9acdadde15487373cb3bc Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 12:13:24 +0200 Subject: [PATCH 020/177] Fixed sharing char counter position. --- src/screens/share/post.ios.js | 89 ++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/src/screens/share/post.ios.js b/src/screens/share/post.ios.js index fa293b15..8f5af88e 100644 --- a/src/screens/share/post.ios.js +++ b/src/screens/share/post.ios.js @@ -17,9 +17,10 @@ export default class SharePostScreen extends React.Component { render() { const { selected_user } = Share + const { posting } = selected_user const selection_flat = `${Share.text_selection.start} ${Share.text_selection.end}` return ( - Share.is_logged_in() && selected_user?.posting != null ? + Share.is_logged_in() && posting != null ? { Share.error_message != null && @@ -35,39 +36,61 @@ export default class SharePostScreen extends React.Component { } - !selected_user?.posting.is_sending_post ? Share.set_post_text(text) : null} - onSelectionChange={({ nativeEvent: { selection } }) => { - Share.set_text_selection(selection) - }} - inputAccessoryViewID={this.input_accessory_view_id} - /> + + !posting.is_sending_post ? Share.set_post_text(text) : null} + onSelectionChange={({ nativeEvent: { selection } }) => { + Share.set_text_selection(selection) + }} + inputAccessoryViewID={this.input_accessory_view_id} + /> + - - + + { + !posting.post_title && + posting.max_post_length() ? '#a94442' : App.theme_text_color() }}>{posting.post_text_length()}/{posting.max_post_length()} + } + + + : null From 2148a3001ff2542ebe9519d2373fa32deb85b027 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 12:13:28 +0200 Subject: [PATCH 021/177] New build. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 74522451..0f397420 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -624,7 +624,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 432; + CURRENT_PROJECT_VERSION = 433; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -672,7 +672,7 @@ CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 432; + CURRENT_PROJECT_VERSION = 433; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -713,7 +713,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 432; + CURRENT_PROJECT_VERSION = 433; DEVELOPMENT_TEAM = 3F9MDJ6K4E; ENABLE_BITCODE = NO; INFOPLIST_FILE = MicroBlog_RN/Info.plist; @@ -751,7 +751,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 432; + CURRENT_PROJECT_VERSION = 433; DEVELOPMENT_TEAM = 3F9MDJ6K4E; INFOPLIST_FILE = MicroBlog_RN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; From 3fe4a438ab639e64aef2925c919bf4ccdd26bb58 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 12:26:48 +0200 Subject: [PATCH 022/177] Fixed potential share crash with no signed in user. --- src/screens/share/post.ios.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screens/share/post.ios.js b/src/screens/share/post.ios.js index 8f5af88e..bead5b84 100644 --- a/src/screens/share/post.ios.js +++ b/src/screens/share/post.ios.js @@ -17,7 +17,7 @@ export default class SharePostScreen extends React.Component { render() { const { selected_user } = Share - const { posting } = selected_user + const posting = selected_user?.posting const selection_flat = `${Share.text_selection.start} ${Share.text_selection.end}` return ( Share.is_logged_in() && posting != null ? From 0ab0b718ede09fadc686a91dd60d6ea5f1945ee8 Mon Sep 17 00:00:00 2001 From: Manton Reece Date: Sat, 11 Apr 2026 12:27:51 +0200 Subject: [PATCH 023/177] New build. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 0f397420..dca91f60 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -624,7 +624,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 433; + CURRENT_PROJECT_VERSION = 434; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -672,7 +672,7 @@ CODE_SIGN_ENTITLEMENTS = MicroBlog_Share/MicroBlog_Share.entitlements; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 433; + CURRENT_PROJECT_VERSION = 434; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 3F9MDJ6K4E; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -713,7 +713,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 433; + CURRENT_PROJECT_VERSION = 434; DEVELOPMENT_TEAM = 3F9MDJ6K4E; ENABLE_BITCODE = NO; INFOPLIST_FILE = MicroBlog_RN/Info.plist; @@ -751,7 +751,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = MicroBlog_RN/MicroBlog_RN.entitlements; - CURRENT_PROJECT_VERSION = 433; + CURRENT_PROJECT_VERSION = 434; DEVELOPMENT_TEAM = 3F9MDJ6K4E; INFOPLIST_FILE = MicroBlog_RN/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.6; From a2be913315c3984bb5e0f246718690a075e3e82e Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 15:30:46 +0200 Subject: [PATCH 024/177] Android build bump. --- android/app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d4ca0e3d..c67100a0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -88,8 +88,8 @@ android { applicationId "blog.micro.android" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 85 - versionName "2.6.5" + versionCode 86 + versionName "2.6.6" } signingConfigs { From e196b4cb27a3b83ef03b43568bf96d6c39600641 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 15:45:27 +0200 Subject: [PATCH 025/177] Fix Android image viewer close button safe area. --- src/components/images/image_modal.js | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/components/images/image_modal.js b/src/components/images/image_modal.js index 4f4f336b..5a2bc355 100644 --- a/src/components/images/image_modal.js +++ b/src/components/images/image_modal.js @@ -3,8 +3,9 @@ import { observer } from 'mobx-react'; import { ImageZoom } from '@likashefqet/react-native-image-zoom'; import { Gesture, GestureDetector, gestureHandlerRootHOC } from 'react-native-gesture-handler'; import Animated, { Extrapolation, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated'; +import { useSafeAreaInsets } from 'react-native-safe-area-context' import App from "../../stores/App" -import { Modal, Platform, SafeAreaView, TouchableOpacity, Image, View, useWindowDimensions, ActivityIndicator, Text } from 'react-native' +import { Modal, Platform, TouchableOpacity, Image, View, useWindowDimensions, ActivityIndicator, Text } from 'react-native' import { SFSymbol } from "react-native-sfsymbols"; import ArrowBackIcon from './../../assets/icons/arrow_back.png'; @@ -14,6 +15,7 @@ const SCALE_DISMISS_THRESHOLD = 1.02 const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { const { height } = useWindowDimensions() + const insets = useSafeAreaInsets() const scale = useSharedValue(1) const translate_y = useSharedValue(0) const [is_loading_image, set_is_loading_image] = React.useState(true) @@ -164,30 +166,28 @@ const ImageModalContent = gestureHandlerRootHOC(observer(({ image_url }) => { } - - - - { - Platform.OS === 'ios' ? - - : - + + { + Platform.OS === 'ios' ? + - } - - + : + + } + ) From b08fc0be37159d9d2521ddb238557997933514a4 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 15:52:00 +0200 Subject: [PATCH 026/177] Fix Android WebView resume recovery. - add guarded WebView remount and bootstrap recovery for Android renderer/session failures - register appearance and app state listeners once and remount WebViews when Android resumes with a changed theme - move WebView URL building into a helper that avoids URLSearchParams for Hermes compatibility --- src/components/web/webview_module.js | 315 ++++++++++++++------------- src/stores/App.js | 105 +++++++-- src/stores/Auth.js | 6 + src/utils/webview_recovery.js | 170 +++++++++++++++ 4 files changed, 423 insertions(+), 173 deletions(-) create mode 100644 src/utils/webview_recovery.js diff --git a/src/components/web/webview_module.js b/src/components/web/webview_module.js index 275209ab..95c88080 100644 --- a/src/components/web/webview_module.js +++ b/src/components/web/webview_module.js @@ -1,82 +1,109 @@ -import * as React from 'react'; -import { observer } from 'mobx-react'; -import { RefreshControl, Platform, View } from "react-native"; -import { useFocusEffect } from '@react-navigation/native'; -import Auth from '../../stores/Auth'; -import App from '../../stores/App'; -import { ScrollView } from 'react-native-gesture-handler'; -import WebView from 'react-native-webview'; -import WebErrorViewModule from './error_view'; -import LoadingBanner from './loading_banner'; +import * as React from 'react' +import { observer } from 'mobx-react' +import { RefreshControl, Platform, View } from "react-native" +import { useFocusEffect } from '@react-navigation/native' +import Auth from '../../stores/Auth' +import App from '../../stores/App' +import { ScrollView } from 'react-native-gesture-handler' +import WebView from 'react-native-webview' +import WebErrorViewModule from './error_view' +import LoadingBanner from './loading_banner' +import { + build_webview_source_uri, + get_base_webview_path, + is_signin_webview_path, + is_webview_endpoint_url, + should_attempt_webview_recovery, +} from '../../utils/webview_recovery' const WebViewModule = observer((props) => { - const webViewRef = React.useRef(null); - const hasSetDidLoadRef = React.useRef(false); - const [currentUrl, setCurrentUrl] = React.useState(() => { - const signinEndpoint = `hybrid/signin?token=${Auth.selected_user.token()}&redirect_to=${props.endpoint}&theme=${App.theme}&show_actions=true`; - return Auth.did_load_one_or_more_webviews ? props.endpoint : signinEndpoint; - }); + const webViewRef = React.useRef(null) + const hasSetDidLoadRef = React.useRef(false) + const hasAttemptedRecoveryRef = React.useRef(false) const [state, setState] = React.useState({ - endpoint: props.endpoint, - signin_endpoint: `hybrid/signin?token=${Auth.selected_user.token()}&redirect_to=${props.endpoint}&theme=${App.theme}&show_actions=true`, opacity: 0.0, is_pull_to_refresh_enabled: true, is_loading: true, is_initial_load: true, - loading_progress: 0 - }); - - React.useEffect(() => { - if (props.endpoint !== state.endpoint) { - const newSigninEndpoint = `hybrid/signin?token=${Auth.selected_user.token()}&redirect_to=${props.endpoint}&theme=${App.theme}&show_actions=true`; - const newUrl = Auth.did_load_one_or_more_webviews ? props.endpoint : newSigninEndpoint; - setCurrentUrl(newUrl); - setState(prevState => ({ - ...prevState, - endpoint: props.endpoint, - signin_endpoint: newSigninEndpoint, - loading_progress: 0, - is_loading: true - })); - } - }, [props.endpoint]); + loading_progress: 0, + }) - const web_url = "https://micro.blog"; + const web_url = "https://micro.blog" + const web_view_key = Platform.OS === 'android' + ? `${props.endpoint}:${App.web_view_epoch}` + : props.endpoint + const source_uri = build_webview_source_uri({ + did_load_one_or_more_webviews: Auth.did_load_one_or_more_webviews, + endpoint: props.endpoint, + theme: App.theme, + token: Auth.selected_user?.token?.() ?? '', + web_url, + }) useFocusEffect( React.useCallback(() => { - App.set_current_web_view_ref(webViewRef.current); + App.set_current_web_view_ref(webViewRef.current) }, []) - ); + ) + + React.useEffect(() => { + App.set_current_web_view_ref(webViewRef.current) + + if (!Auth.did_load_one_or_more_webviews) { + hasSetDidLoadRef.current = false + } + }) + + React.useEffect(() => { + hasAttemptedRecoveryRef.current = false + }, [props.endpoint]) const on_refresh = () => { setState(prevState => { if (!prevState.is_initial_load) { - return { ...prevState, is_loading: true, opacity: 1.0 }; + return { ...prevState, is_loading: true, opacity: 1.0 } } - return prevState; - }); - webViewRef.current?.injectJavaScript('window.location.reload();'); - }; - - const return_url_options = () => { - let url_options = props.endpoint.includes("#post_") ? "" : `show_actions=true&fontsize=17&theme=${App.theme}`; - if (url_options && url_options !== "") { - url_options = `${!props.is_search && !props.is_filtered ? "?" : "&"}${url_options}&theme=${App.theme}`; + + return prevState + }) + webViewRef.current?.reload() + } + + const trigger_android_webview_recovery = (url = '') => { + if (Platform.OS !== 'android') { + return false } - else if(!props.endpoint.includes("#post_")) { - url_options = `?theme=${App.theme}`; + + if (!should_attempt_webview_recovery({ + did_load_one_or_more_webviews: Auth.did_load_one_or_more_webviews, + has_attempted_recovery: hasAttemptedRecoveryRef.current, + url, + })) { + return false } - return url_options; - }; - const onContentProcessDidTerminate = () => webViewRef.current?.reload(); + console.log("WebViewModule:trigger_android_webview_recovery", url) + hasSetDidLoadRef.current = false + hasAttemptedRecoveryRef.current = true + Auth.invalidate_webview_bootstrap() + App.bump_web_view_epoch() + setState(prevState => ({ + ...prevState, + is_loading: true, + loading_progress: 0, + })) + + return true + } + + const onContentProcessDidTerminate = () => webViewRef.current?.reload() const _webview = () => { return ( { )} onLoadStart={() => { setState(prevState => { - return { - ...prevState, - is_loading: true, - loading_progress: 0 - }; - }); + return { + ...prevState, + is_loading: true, + loading_progress: 0, + } + }) }} onLoadProgress={(event) => { try { if (event && event.nativeEvent && typeof event.nativeEvent.progress === 'number') { - const progressValue = Math.max(0, Math.min(1, event.nativeEvent.progress)); + const progressValue = Math.max(0, Math.min(1, event.nativeEvent.progress)) setState(prevState => { - return { ...prevState, loading_progress: progressValue }; - }); + return { ...prevState, loading_progress: progressValue } + }) } } catch (error) { - console.log("WebViewModule:onLoadProgress:error", error); + console.log("WebViewModule:onLoadProgress:error", error) } }} onLoadEnd={(event) => { - const url = event?.nativeEvent?.url || ''; - const isSigninUrl = url.includes('hybrid/signin'); - const isActualEndpoint = url.includes(props.endpoint); - + const url = event?.nativeEvent?.url || '' + const isSigninUrl = is_signin_webview_path(url) + const isActualEndpoint = is_webview_endpoint_url({ endpoint: props.endpoint, url }) + setState(prevState => { if (isActualEndpoint && !isSigninUrl) { if (!hasSetDidLoadRef.current && !Auth.did_load_one_or_more_webviews) { - Auth.set_did_load_one_or_more_webviews(); - hasSetDidLoadRef.current = true; + Auth.set_did_load_one_or_more_webviews() + hasSetDidLoadRef.current = true + } + + hasAttemptedRecoveryRef.current = false + + const newState = { + ...prevState, + loading_progress: 1, } - - const newState = { - ...prevState, - loading_progress: 1 - }; - + setTimeout(() => { - setState(prevState => { - if (prevState.is_initial_load) { + setState(nextState => { + if (nextState.is_initial_load) { if (App.theme == "light") { - return { ...prevState, opacity: 1.0, is_initial_load: false, is_loading: false }; + return { ...nextState, opacity: 1.0, is_initial_load: false, is_loading: false } } - else { - setTimeout(() => { - setState(prev => ({ ...prev, opacity: 1.0, is_initial_load: false, is_loading: false })); - }, 200); - return { ...prevState, is_loading: false }; - } - } - else { - webViewRef.current?.injectJavaScript('window.scrollTo({ top: 0, behavior: "smooth" })'); - return { ...prevState, is_loading: false }; + + setTimeout(() => { + setState(prev => ({ ...prev, opacity: 1.0, is_initial_load: false, is_loading: false })) + }, 200) + + return { ...nextState, is_loading: false } } - }); - }, 300); - - return newState; + + webViewRef.current?.injectJavaScript('window.scrollTo({ top: 0, behavior: "smooth" })') + return { ...nextState, is_loading: false } + }) + }, 300) + + return newState } - - return prevState; - }); + + return prevState + }) }} nestedScrollEnabled={true} onShouldStartLoadWithRequest={(event) => { - const url = event.url; - - // Extract base path without query params for comparison - const getBasePath = (urlOrEndpoint) => { - // Remove protocol and domain if present - let path = urlOrEndpoint.replace(/^https?:\/\/[^\/]+/, ''); - // Remove leading slash - path = path.replace(/^\//, ''); - // Remove query params and hash - path = path.split('?')[0].split('#')[0]; - return path; - }; - - const urlBasePath = getBasePath(url); - const endpointBasePath = getBasePath(props.endpoint); - - // Allow signin URL to load (needed for initial authentication flow) + const url = event.url + const urlBasePath = get_base_webview_path(url) + const endpointBasePath = get_base_webview_path(props.endpoint) + if (urlBasePath === 'hybrid/signin') { - return true; + return true } - - // Allow if it's the same base endpoint (e.g., hybrid/favorites with different tag filters) + if (urlBasePath === endpointBasePath) { - return true; + return true } - - // Block navigation for different endpoints - if (urlBasePath !== endpointBasePath) { - App.handle_url_from_webview(event.url); - return false; - } - - return true; + + App.handle_url_from_webview(event.url) + return false }} onScroll={(e) => { if (e.nativeEvent.contentOffset != null && e.nativeEvent.contentOffset.y != null) { const y = e.nativeEvent.contentOffset.y - setState(prevState => ({ ...prevState, is_pull_to_refresh_enabled: y <= 0.15 })); + setState(prevState => ({ ...prevState, is_pull_to_refresh_enabled: y <= 0.15 })) } - App.set_is_scrolling(); + App.set_is_scrolling() }} onMessage={(event) => { - App.handle_web_view_message(event.nativeEvent.data); + App.handle_web_view_message(event.nativeEvent.data) + }} + onError={(event) => { + trigger_android_webview_recovery(event?.nativeEvent?.url ?? source_uri) + }} + onHttpError={(event) => { + trigger_android_webview_recovery(event?.nativeEvent?.url ?? source_uri) + }} + onRenderProcessGone={(event) => { + console.log("WebViewModule:onRenderProcessGone", event?.nativeEvent) + trigger_android_webview_recovery(event?.nativeEvent?.url ?? source_uri) }} style={{ flex: 1, backgroundColor: App.theme_background_color(), opacity: state.opacity }} renderError={(name, code, description) => } injectedJavaScript={Platform.OS === 'ios' ? `const meta = document.createElement('meta'); meta.setAttribute('content', 'width=width, initial-scale=${App.web_font_scale()}'); meta.setAttribute('name', 'viewport'); document.getElementsByTagName('head')[0].appendChild(meta);` : null} onContentProcessDidTerminate={onContentProcessDidTerminate} /> - ); - }; + ) + } - const profileHeaderRef = React.useRef(null); - const [profileHeaderHeight, setProfileHeaderHeight] = React.useState(0); - const is_conversation = props.endpoint.includes("conversation"); + const [profileHeaderHeight, setProfileHeaderHeight] = React.useState(0) + const is_conversation = props.endpoint.includes("conversation") return ( <> {!is_conversation && ( - { > { props.profile != null ? - { - const { height } = event.nativeEvent.layout; - if (height > 0) { - setProfileHeaderHeight(height); - } - }} - > - {props.profile} - + { + const { height } = event.nativeEvent.layout + if (height > 0) { + setProfileHeaderHeight(height) + } + }} + > + {props.profile} + : null } {_webview()} - ); -}); + ) +}) -export default WebViewModule; +export default WebViewModule diff --git a/src/stores/App.js b/src/stores/App.js index 1061b903..6632abc6 100644 --- a/src/stores/App.js +++ b/src/stores/App.js @@ -15,6 +15,7 @@ import Settings from "./Settings" import Services from './Services'; import Contact from './models/posting/Contact' import Push from './Push' +import { normalise_theme, should_remount_webview_on_android_resume } from '../utils/webview_recovery' let SCROLLING_TIMEOUT = null let CURRENT_WEB_VIEW_REF = null @@ -59,7 +60,8 @@ export default App = types.model('App', { is_publishing: types.optional(types.boolean, false), latest_published_url: types.maybeNull(types.string), keyboard_height: types.optional(types.number, 0), - is_keyboard_visible: types.optional(types.boolean, false) + is_keyboard_visible: types.optional(types.boolean, false), + web_view_epoch: types.optional(types.number, 0), }) .volatile(self => ({ navigation_ref: null, @@ -67,6 +69,11 @@ export default App = types.model('App', { current_raw_tab_key: null, keyboard_show_listener: null, keyboard_hide_listener: null, + app_state_listener: null, + appearance_listener: null, + font_scale_listener: null, + url_listener: null, + previous_app_state: AppState.currentState, post_search_request_id: 0, })) .actions(self => ({ @@ -137,6 +144,10 @@ export default App = types.model('App', { setup_keyboard_listeners: flow(function*() { console.log("App:setup_keyboard_listeners") + if (self.keyboard_show_listener != null || self.keyboard_hide_listener != null) { + return + } + if (Platform.OS === 'android') { self.keyboard_show_listener = Keyboard.addListener('keyboardDidShow', (event) => { console.log("Keyboard shown with height:", event.endCoordinates.height) @@ -164,7 +175,11 @@ export default App = types.model('App', { set_up_url_listener: flow(function*() { console.log("App:set_up_url_listener") - Linking.addEventListener('url', (event) => { + if (self.url_listener != null) { + return + } + + self.url_listener = Linking.addEventListener('url', (event) => { console.log("App:set_up_url_listener:event", event) if (event?.url && event?.url.indexOf('/signin/') > -1) { Login.trigger_login_from_url(event.url) @@ -601,35 +616,73 @@ export default App = types.model('App', { }), set_current_initial_theme: flow(function*() { - console.log("App:set_current_theme", Appearance.getColorScheme()) - self.theme = Appearance.getColorScheme() + const color_scheme = normalise_theme(Appearance.getColorScheme()) + console.log("App:set_current_theme", color_scheme) + self.theme = color_scheme App.set_up_appearance_listener() }), + handle_app_state_change: flow(function*(nextAppState) { + const should_force_web_view_remount = should_remount_webview_on_android_resume({ + next_app_state: nextAppState, + platform_os: Platform.OS, + previous_app_state: self.previous_app_state, + system_theme: Appearance.getColorScheme(), + theme: self.theme, + }) + + self.previous_app_state = nextAppState + + if (nextAppState === "active") { + const color_scheme = normalise_theme(Appearance.getColorScheme()) + if (self.theme !== color_scheme || should_force_web_view_remount) { + App.change_current_theme(color_scheme, should_force_web_view_remount) + } + } + }), + + handle_appearance_change: flow(function*(colorScheme) { + if (AppState.currentState === "background" || AppState.currentState === "inactive") { + return + } + + console.log("App:set_up_appearance_listener:change", colorScheme) + App.change_current_theme(colorScheme) + }), + set_up_appearance_listener: flow(function*() { console.log("App:set_up_appearance_listener") - AppState.addEventListener("change", nextAppState => { - if (nextAppState === "active") { - const colorScheme = Appearance.getColorScheme() - if (self.theme !== colorScheme) { - App.change_current_theme(colorScheme) - } - } + if (self.app_state_listener != null || self.appearance_listener != null) { + return + } + + self.previous_app_state = AppState.currentState + + self.app_state_listener = AppState.addEventListener("change", nextAppState => { + App.handle_app_state_change(nextAppState) }) - Appearance.addChangeListener(({ colorScheme }) => { - if (AppState.currentState === "background" || AppState.currentState === "inactive") { - return - } - console.log("App:set_up_appearance_listener:change", colorScheme) - App.change_current_theme(colorScheme) + self.appearance_listener = Appearance.addChangeListener(({ colorScheme }) => { + App.handle_appearance_change(colorScheme) }) }), - change_current_theme: flow(function*(color) { - console.log("App:change_current_theme", color) - self.is_switching_theme = true - self.theme = color - self.is_switching_theme = false + bump_web_view_epoch: flow(function*() { + self.web_view_epoch = self.web_view_epoch + 1 + }), + + change_current_theme: flow(function*(color, should_force_web_view_remount = false) { + const next_theme = normalise_theme(color) + console.log("App:change_current_theme", next_theme, should_force_web_view_remount) + + if (self.theme === next_theme && !should_force_web_view_remount) { + return + } + + self.theme = next_theme + + if (should_force_web_view_remount) { + App.bump_web_view_epoch() + } }), set_current_initial_font_scale: flow(function*() { @@ -641,7 +694,11 @@ export default App = types.model('App', { set_up_font_scale_listener: flow(function*() { console.log("App:set_up_font_scale_listener") - Dimensions.addEventListener( + if (self.font_scale_listener != null) { + return + } + + self.font_scale_listener = Dimensions.addEventListener( "change", ({ screen }) => { console.log("App:set_up_font_scale_listener:change", screen?.fontScale) @@ -1086,7 +1143,7 @@ export default App = types.model('App', { }, should_reload_web_view() { // When it returns true, this will trigger a reload of the webviews - return self.is_switching_theme || self.is_changing_font_scale + return self.is_changing_font_scale }, now() { let now = new Date() diff --git a/src/stores/Auth.js b/src/stores/Auth.js index 8799f6e4..2ca12cf9 100644 --- a/src/stores/Auth.js +++ b/src/stores/Auth.js @@ -7,6 +7,7 @@ import CookieManager from '@react-native-cookies/cookies'; import Push from './Push' import App from './App' import Toast from 'react-native-simple-toast'; +import { invalidate_webview_bootstrap_state } from '../utils/webview_recovery' export default Auth = types.model('Auth', { users: types.optional(types.array(User), []), @@ -141,6 +142,11 @@ export default Auth = types.model('Auth', { self.did_load_one_or_more_webviews = false }), + invalidate_webview_bootstrap: flow(function* () { + console.log("Auth:invalidate_webview_bootstrap") + invalidate_webview_bootstrap_state(self) + }), + set_did_load_one_or_more_webviews: flow(function* () { console.log("Auth:set_did_load_one_or_more_webviews") self.did_load_one_or_more_webviews = true diff --git a/src/utils/webview_recovery.js b/src/utils/webview_recovery.js new file mode 100644 index 00000000..8f27bf04 --- /dev/null +++ b/src/utils/webview_recovery.js @@ -0,0 +1,170 @@ +const DEFAULT_THEME = 'light' + +const decode_query_value = (value = '') => { + return decodeURIComponent(`${value}`.replace(/\+/g, ' ')) +} + +const parse_query_params = (query = '') => { + if (!query) { + return [] + } + + return query + .split('&') + .filter(Boolean) + .map(part => { + const [raw_key, ...raw_value_parts] = part.split('=') + + return [ + decode_query_value(raw_key), + decode_query_value(raw_value_parts.join('=')), + ] + }) +} + +const has_query_param = (params = [], key = '') => { + return params.some(([current_key]) => current_key === key) +} + +const set_query_param = (params = [], key = '', value = '') => { + const next_params = [] + let did_set = false + + params.forEach(([current_key, current_value]) => { + if (current_key === key) { + if (!did_set) { + next_params.push([key, value]) + did_set = true + } + + return + } + + next_params.push([current_key, current_value]) + }) + + if (!did_set) { + next_params.push([key, value]) + } + + return next_params +} + +const serialise_query_params = (params = []) => { + return params + .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(`${value}`)}`) + .join('&') +} + +export const normalise_theme = (theme = null) => { + return theme === 'dark' ? 'dark' : DEFAULT_THEME +} + +export const get_base_webview_path = (url_or_endpoint = '') => { + let path = `${url_or_endpoint}`.replace(/^https?:\/\/[^\/]+/, '') + path = path.replace(/^\//, '') + path = path.split('?')[0].split('#')[0] + return path +} + +export const is_signin_webview_path = (url_or_endpoint = '') => { + return get_base_webview_path(url_or_endpoint) === 'hybrid/signin' +} + +export const is_webview_endpoint_url = ({ endpoint = '', url = '' }) => { + return get_base_webview_path(endpoint) === get_base_webview_path(url) +} + +export const should_remount_webview_on_android_resume = ({ + next_app_state = '', + platform_os = '', + previous_app_state = '', + system_theme = null, + theme = DEFAULT_THEME, +}) => { + if (platform_os !== 'android') { + return false + } + + if (next_app_state !== 'active') { + return false + } + + if (previous_app_state !== 'background' && previous_app_state !== 'inactive') { + return false + } + + return normalise_theme(system_theme) !== normalise_theme(theme) +} + +export const invalidate_webview_bootstrap_state = (target = null) => { + if (target != null) { + target.did_load_one_or_more_webviews = false + } + + return target +} + +export const build_webview_endpoint = ({ + endpoint = '', + theme = DEFAULT_THEME, +}) => { + const hash_parts = `${endpoint}`.split('#') + const path_and_query = hash_parts[0] ?? '' + const hash = hash_parts.length > 1 ? `#${hash_parts.slice(1).join('#')}` : '' + const query_index = path_and_query.indexOf('?') + const path = query_index > -1 ? path_and_query.slice(0, query_index) : path_and_query + const query = query_index > -1 ? path_and_query.slice(query_index + 1) : '' + let params = parse_query_params(query) + + params = set_query_param(params, 'theme', normalise_theme(theme)) + + if (!hash) { + if (!has_query_param(params, 'show_actions')) { + params.push(['show_actions', 'true']) + } + + if (!has_query_param(params, 'fontsize')) { + params.push(['fontsize', '17']) + } + } + + const query_string = serialise_query_params(params) + + return `${path}${query_string ? `?${query_string}` : ''}${hash}` +} + +export const build_webview_source_uri = ({ + did_load_one_or_more_webviews = false, + endpoint = '', + theme = DEFAULT_THEME, + token = '', + web_url = '', +}) => { + const prepared_endpoint = build_webview_endpoint({ endpoint, theme }) + + if (did_load_one_or_more_webviews) { + return `${web_url}/${prepared_endpoint}` + } + + const query_string = serialise_query_params([ + ['token', token], + ['redirect_to', prepared_endpoint], + ['theme', normalise_theme(theme)], + ['show_actions', 'true'], + ]) + + return `${web_url}/hybrid/signin?${query_string}` +} + +export const should_attempt_webview_recovery = ({ + did_load_one_or_more_webviews = false, + has_attempted_recovery = false, + url = '', +}) => { + if (!did_load_one_or_more_webviews || has_attempted_recovery) { + return false + } + + return !is_signin_webview_path(url) +} From a2dc8548e2693b71addbae362f6b00205fa38846 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 17:52:52 +0200 Subject: [PATCH 027/177] Fix notification tap handling on app open. - move push notification bootstrap to app startup so initial notifications are captured reliably - queue tapped notifications until auth, navigation, and app state are ready before opening the target post - wire iOS notification response callbacks and Android intent updates for open-from-notification paths - add targeted routing tests and temporary debug logging for the remaining background-resume investigation --- .../java/blog/micro/android/MainActivity.kt | 6 + ios/MicroBlog_RN/AppDelegate.swift | 34 +++- src/bootstrap/push_notifications.js | 48 +++++ src/index.js | 3 +- src/screens/App.js | 3 + src/stores/App.js | 40 ++-- src/stores/Push.js | 177 +++++++++++++----- src/stores/models/Notification.js | 12 +- src/utils/push_notifications.js | 71 +++++++ src/utils/push_notifications.test.js | 112 +++++++++++ 10 files changed, 435 insertions(+), 71 deletions(-) create mode 100644 src/bootstrap/push_notifications.js create mode 100644 src/utils/push_notifications.js create mode 100644 src/utils/push_notifications.test.js diff --git a/android/app/src/main/java/blog/micro/android/MainActivity.kt b/android/app/src/main/java/blog/micro/android/MainActivity.kt index ad13d1ea..ad7c352b 100644 --- a/android/app/src/main/java/blog/micro/android/MainActivity.kt +++ b/android/app/src/main/java/blog/micro/android/MainActivity.kt @@ -1,5 +1,6 @@ package blog.micro.android; import expo.modules.ReactActivityDelegateWrapper +import android.content.Intent import android.os.Bundle; import com.swmansion.rnscreens.fragment.restoration.RNScreensFragmentFactory; @@ -29,4 +30,9 @@ class MainActivity : ReactActivity() { supportFragmentManager.fragmentFactory = RNScreensFragmentFactory() super.onCreate(savedInstanceState); } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } } diff --git a/ios/MicroBlog_RN/AppDelegate.swift b/ios/MicroBlog_RN/AppDelegate.swift index 6f24a43c..89f33fe9 100644 --- a/ios/MicroBlog_RN/AppDelegate.swift +++ b/ios/MicroBlog_RN/AppDelegate.swift @@ -11,9 +11,10 @@ import React import React_RCTAppDelegate import ReactAppDependencyProvider import RNShareMenu +import UserNotifications @main -class AppDelegate: UIResponder, UIApplicationDelegate { +class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? var reactNativeDelegate: ReactNativeDelegate? @@ -23,6 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil ) -> Bool { + NSLog("PushDebug:didFinishLaunchingWithOptions launchOptions=%@", String(describing: launchOptions)) let delegate = ReactNativeDelegate() let factory = RCTReactNativeFactory(delegate: delegate) delegate.dependencyProvider = RCTAppDependencyProvider() @@ -38,6 +40,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { launchOptions: launchOptions ) + UNUserNotificationCenter.current().delegate = self + return true } @@ -52,11 +56,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Required for the register event. func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + NSLog("PushDebug:didRegisterForRemoteNotificationsWithDeviceToken") RNCPushNotificationIOS.didRegisterForRemoteNotifications(withDeviceToken: deviceToken) } // Required for the notification event. You must call the completion handler after handling the remote notification. func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + NSLog("PushDebug:didReceiveRemoteNotification userInfo=%@", String(describing: userInfo)) RNCPushNotificationIOS.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler) } @@ -69,6 +75,32 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didReceive notification: UILocalNotification) { RNCPushNotificationIOS.didReceive(notification) } + + func userNotificationCenter( + _ center: UNUserNotificationCenter, + didReceive response: UNNotificationResponse, + withCompletionHandler completionHandler: @escaping () -> Void + ) { + NSLog( + "PushDebug:userNotificationCenter:didReceive response action=%@ userInfo=%@", + response.actionIdentifier, + String(describing: response.notification.request.content.userInfo) + ) + RNCPushNotificationIOS.didReceiveNotificationResponse(response) + completionHandler() + } + + func userNotificationCenter( + _ center: UNUserNotificationCenter, + willPresent notification: UNNotification, + withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void + ) { + NSLog( + "PushDebug:userNotificationCenter:willPresent userInfo=%@", + String(describing: notification.request.content.userInfo) + ) + completionHandler([.badge, .sound, .banner, .list]) + } } class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { diff --git a/src/bootstrap/push_notifications.js b/src/bootstrap/push_notifications.js new file mode 100644 index 00000000..7939ecca --- /dev/null +++ b/src/bootstrap/push_notifications.js @@ -0,0 +1,48 @@ +import PushNotification from 'react-native-push-notification' +import PushNotificationIOS from '@react-native-community/push-notification-ios' +import { AppState } from 'react-native' +import Push from '../stores/Push' + +let did_bootstrap = false + +export function bootstrap_push_notifications() { + if (did_bootstrap) { + return + } + + did_bootstrap = true + console.log("Push:bootstrap:start", AppState.currentState) + + PushNotification.configure({ + onRegister: function (data) { + console.log("Push:bootstrap:onRegister:data", data) + Push.set_token(data.token) + }, + onRegistrationError: function (error) { + console.log("Push:bootstrap:onRegistrationError:error", error) + }, + onNotification: function (notification) { + console.log("Push:bootstrap:onNotification", notification) + Push.handle_notification(notification) + if (typeof notification?.finish === 'function') { + notification.finish(PushNotificationIOS.FetchResult.NoData) + } + }, + onAction: function (data) { + console.log("Push:bootstrap:onAction:data", data) + }, + permissions: { + alert: true, + badge: true, + sound: true + }, + popInitialNotification: true, + requestPermissions: true + }) + + AppState.addEventListener('change', (nextAppState) => { + console.log("Push:bootstrap:app_state", nextAppState) + }) +} + +bootstrap_push_notifications() diff --git a/src/index.js b/src/index.js index 4d9f4b32..5702491e 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,5 @@ import { AppRegistry } from 'react-native'; +import './bootstrap/push_notifications' import MainApp from './screens/App'; import { name as appName } from './../app.json'; import './utils/dev'; @@ -6,4 +7,4 @@ import './utils/string_checker'; import './utils/snapshots'; import './utils/string_utils'; -AppRegistry.registerComponent(appName, () => MainApp); \ No newline at end of file +AppRegistry.registerComponent(appName, () => MainApp); diff --git a/src/screens/App.js b/src/screens/App.js index e692428e..70a44427 100644 --- a/src/screens/App.js +++ b/src/screens/App.js @@ -118,6 +118,9 @@ export default class MainApp extends React.Component { /> } { + App.set_navigation_ready(true) + }} onStateChange={(state) => { const route = state?.routes?.[state.index] const nested = route?.state?.routes?.[route.state?.index] diff --git a/src/stores/App.js b/src/stores/App.js index 6632abc6..32c988b9 100644 --- a/src/stores/App.js +++ b/src/stores/App.js @@ -23,6 +23,8 @@ let PUBLISHING_PROGRESS_TIMEOUT = null export default App = types.model('App', { is_loading: types.optional(types.boolean, false), + navigation_ready: types.optional(types.boolean, false), + app_state: types.optional(types.string, AppState.currentState || 'active'), image_modal_is_open: types.optional(types.boolean, false), current_image_url: types.maybeNull(types.string), is_scrolling: types.optional(types.boolean, false), @@ -83,34 +85,38 @@ export default App = types.model('App', { if (navigation) { self.navigation_ref = navigation } + else{ + self.navigation_ref = null + self.navigation_ready = false + } + }), + + set_navigation_ready: flow(function*(ready = true) { + console.log("App:set_navigation_ready", ready) + self.navigation_ready = ready + if (ready) { + Push.replay_pending_notification() + } }), hydrate: flow(function*() { console.log("App:hydrate") self.is_loading = true + self.navigation_ready = false + self.app_state = AppState.currentState || 'active' + Push.set_auth_ready(false) yield App.set_current_initial_theme() yield App.set_current_initial_font_scale() - yield Push.hydrate() - Settings.hydrate() - App.set_is_loading(false) App.set_up_url_listener() App.setup_keyboard_listeners() try{ yield Auth.hydrate() console.log("App:hydrate:started:is_logged_in", Auth.is_logged_in()) - yield App.set_current_initial_theme() - yield App.set_current_initial_font_scale() - yield Push.hydrate() - - Settings.hydrate() - App.set_is_loading(false) - App.set_up_url_listener() - App.setup_keyboard_listeners() if (Auth.is_logged_in()) { - Push.handle_first_notification() + Push.replay_pending_notification() } else if (!Auth.is_logged_in()) { App.navigate_to_screen("Login") @@ -119,6 +125,11 @@ export default App = types.model('App', { catch(error){ console.error(error) } + finally{ + Push.set_auth_ready(true) + Push.replay_pending_notification() + App.set_is_loading(false) + } }), prep_and_hydrate_share_extension: flow(function*() { @@ -287,7 +298,7 @@ export default App = types.model('App', { navigate_to_screen: flow(function*(screen_name = null, action_data = null, from_listener = false) { console.log("App:navigate_to_screen", screen_name, action_data, from_listener) - if (screen_name != null && self.navigation_ref != null && !self.is_scrolling) { + if (screen_name != null && self.navigation_ref != null && self.navigation_ready && !self.is_scrolling) { switch (screen_name) { case "photo": return App.set_image_modal_data_and_activate(action_data) @@ -623,6 +634,7 @@ export default App = types.model('App', { }), handle_app_state_change: flow(function*(nextAppState) { + console.log("App:handle_app_state_change", self.previous_app_state, "->", nextAppState) const should_force_web_view_remount = should_remount_webview_on_android_resume({ next_app_state: nextAppState, platform_os: Platform.OS, @@ -632,12 +644,14 @@ export default App = types.model('App', { }) self.previous_app_state = nextAppState + self.app_state = nextAppState if (nextAppState === "active") { const color_scheme = normalise_theme(Appearance.getColorScheme()) if (self.theme !== color_scheme || should_force_web_view_remount) { App.change_current_theme(color_scheme, should_force_web_view_remount) } + Push.replay_pending_notification() } }), diff --git a/src/stores/Push.js b/src/stores/Push.js index b2ad6b8a..d578bf49 100644 --- a/src/stores/Push.js +++ b/src/stores/Push.js @@ -1,48 +1,32 @@ -import { types, flow, destroy } from 'mobx-state-tree'; +import { types, flow, destroy } from 'mobx-state-tree' import MicroBlogApi, { API_ERROR } from '../api/MicroBlogApi' -import PushNotification from "react-native-push-notification"; +import PushNotification from "react-native-push-notification" import Notification from './models/Notification' import Auth from './Auth' -import PushNotificationIOS from "@react-native-community/push-notification-ios"; +import PushNotificationIOS from "@react-native-community/push-notification-ios" import { Platform, PermissionsAndroid } from 'react-native' import App from './App' import Device from './models/Device' +import { + normalise_notification_payload, + determine_notification_action, + determine_pending_notification_action +} from '../utils/push_notifications' export default Push = types.model('Push', { token: types.optional(types.string, ""), notifications: types.optional(types.array(Notification), []), notificiations_open: types.optional(types.boolean, false), - devices: types.optional(types.map(types.array(Device)), {}) + devices: types.optional(types.map(types.array(Device)), {}), + pending_notification: types.maybeNull(types.frozen()), + auth_ready: types.optional(types.boolean, false) }) .actions(self => ({ - hydrate: flow(function* () { + hydrate: flow(function* () { console.log("Push:hydrate") - - PushNotification.configure({ - onRegister: function (data) { - console.log("Push:hydrate:onRegister:data", data); - Push.set_token(data.token) - }, - onRegistrationError: function (error) { - console.log("Push:hydrate:onRegistrationError:error", error); - }, - onNotification: function(data) { - Push.handle_notification(data) - }, - onAction: function(data){ - console.log("Push:onAction:data", data); - }, - permissions: { - alert: true, - badge: true, - sound: true - }, - popInitialNotification: true, - requestPermissions: true - }) }), - + set_token: flow(function* (token) { console.log("Push::set_token", token) self.token = token @@ -59,7 +43,7 @@ export default Push = types.model('Push', { } } else if(self.token == "" && Auth.is_logged_in() && self.has_push_permissions){ - Push.request_permissions() + Push.request_permissions() } return false }), @@ -74,7 +58,7 @@ export default Push = types.model('Push', { } } else if(self.token == ""){ - return true + return true } return false }), @@ -114,25 +98,105 @@ export default Push = types.model('Push', { } }), - handle_notification: flow(function* (notification) { - console.log("Push::handle_notification", notification, Auth.selected_user) - const nice_notification_object = { - id: Platform.OS === 'ios' ? notification.data?.notificationId != null ? notification.data?.notificationId : notification.data?.post_id : notification.id, - message: notification.message, - post_id: notification.data?.post_id, - to_username: Platform.OS === 'ios' ? notification.data?.to_user?.username : JSON.parse(notification.data?.to_user)?.username, - from_username: Platform.OS === 'ios' ? notification.data?.from_user?.username : JSON.parse(notification.data?.from_user)?.username, - should_open: Platform.OS === 'ios' && notification.foreground === false, - did_load_before_user_was_loaded: Auth.selected_user == null - } - // Check if we have an existing notification in our array. - // This will never happen, except for DEV for sending through test messages. - const existing_notification = self.notifications.find(notification => notification.id === nice_notification_object.id) + set_pending_notification: flow(function* (notification) { + console.log("Push:set_pending_notification", notification) + self.pending_notification = notification + }), + + clear_pending_notification: flow(function* () { + console.log("Push:clear_pending_notification") + self.pending_notification = null + }), + + set_auth_ready: flow(function* (ready = true) { + console.log("Push:set_auth_ready", ready) + self.auth_ready = ready + }), + + store_notification: flow(function* (notification) { + console.log("Push:store_notification", notification) + const existing_notification = self.notifications.find(item => item.id === notification.id) if (existing_notification) { destroy(existing_notification) } - self.notifications.push(Notification.create(nice_notification_object)) - Push.open_notification_sheet() + self.notifications.push(Notification.create(notification)) + }), + + open_notification: flow(function* (notification) { + console.log("Push:open_notification", notification) + const local_user = self.local_user_for_notification(notification) + if (local_user != null && notification?.post_id != null) { + if (Auth.selected_user !== local_user) { + yield Auth.select_user(local_user) + } + App.navigate_to_screen("open", notification.post_id) + Push.close_notification_sheet() + return true + } + return false + }), + + handle_notification: flow(function* (notification) { + console.log("Push::handle_notification", notification, Auth.selected_user) + const nice_notification_object = normalise_notification_payload(notification, Platform.OS) + const action = determine_notification_action({ + notification: nice_notification_object, + has_navigation: self.has_navigation(), + has_local_user: self.local_user_for_notification(nice_notification_object) != null, + is_app_active: self.is_app_active() + }) + + if (action === 'open') { + return yield Push.open_notification(nice_notification_object) + } + + if (action === 'queue') { + yield Push.set_pending_notification(nice_notification_object) + return false + } + + yield Push.store_notification({ + ...nice_notification_object, + should_open: false + }) + yield Push.open_notification_sheet() + return false + }), + + replay_pending_notification: flow(function* () { + console.log("Push:replay_pending_notification", self.pending_notification) + if (self.pending_notification == null) { + return false + } + + if (!self.auth_ready) { + return false + } + + const pending_notification = self.pending_notification + const action = determine_pending_notification_action({ + notification: pending_notification, + has_navigation: self.has_navigation(), + has_local_user: self.local_user_for_notification(pending_notification) != null, + is_app_active: self.is_app_active() + }) + + if (action === 'wait') { + return false + } + + yield Push.clear_pending_notification() + + if (action === 'open') { + return yield Push.open_notification(pending_notification) + } + + yield Push.store_notification({ + ...pending_notification, + should_open: false + }) + yield Push.open_notification_sheet() + return false }), open_notification_sheet: flow(function* () { @@ -164,7 +228,7 @@ export default Push = types.model('Push', { } if(self.has_push_permissions() && user_token){ - return yield self.register_token(user_token) + return yield self.register_token(user_token) } }), @@ -181,7 +245,7 @@ export default Push = types.model('Push', { }, handle_first_notification() { - return self.notifications.find(n => n.did_load_before_user_was_loaded)?.handle_action() + return self.pending_notification != null ? Push.replay_pending_notification() : null }, has_push_permissions(callback) { @@ -202,6 +266,21 @@ export default Push = types.model('Push', { is_registered_device_for_user(username) { return self.devices.get(username)?.some(device => device.token === Push.token) + }, + + local_user_for_notification(notification) { + if (notification?.to_username == null) { + return null + } + return Auth.users.find(u => u.username === notification.to_username) + }, + + has_navigation() { + return App.navigation_ref != null && App.navigation_ready + }, + + is_app_active() { + return App.app_state === 'active' } })) diff --git a/src/stores/models/Notification.js b/src/stores/models/Notification.js index a6633451..d2bbd6fb 100644 --- a/src/stores/models/Notification.js +++ b/src/stores/models/Notification.js @@ -28,12 +28,7 @@ export default Notification = types.model('Notification', { }), afterCreate: flow(function* () { - if (self.should_open != null && self.should_open) { - self.handle_action() - } - else{ - self.hydrate() - } + self.hydrate() }), handle_action: flow(function* () { @@ -59,10 +54,13 @@ export default Notification = types.model('Notification', { }, can_show_notification() { - return self.message && this.local_user() != null && !self.should_open + return self.message && !self.should_open }, trimmed_message() { + if (!self.message) { + return null + } if (self.message.length > 255) { return `${self.message.slice(0, 250)}...` } diff --git a/src/utils/push_notifications.js b/src/utils/push_notifications.js new file mode 100644 index 00000000..7694e87d --- /dev/null +++ b/src/utils/push_notifications.js @@ -0,0 +1,71 @@ +export function parse_notification_user(value) { + if (value == null) { + return null + } + + if (typeof value === 'string') { + try { + return JSON.parse(value) + } + catch (_error) { + return null + } + } + + if (typeof value === 'object') { + return value + } + + return null +} + +export function normalise_notification_payload(notification, platform_os = 'ios') { + const data = notification?.data || {} + const to_user = parse_notification_user(data.to_user) + const from_user = parse_notification_user(data.from_user) + const tapped_from_os = notification?.userInteraction === true || notification?.foreground === false + const post_id = data?.post_id != null ? String(data.post_id) : null + + return { + id: platform_os === 'ios' + ? (data?.notificationId != null ? String(data.notificationId) : (post_id || notification?.id || notification?.message || `${Date.now()}`)) + : String(notification?.id || data?.id || post_id || notification?.message || `${Date.now()}`), + message: notification?.message || null, + post_id, + to_username: to_user?.username || null, + from_username: from_user?.username || null, + should_open: tapped_from_os && post_id != null + } +} + +export function determine_notification_action({ notification, has_navigation, has_local_user, is_app_active = true }) { + if (notification?.should_open) { + if (notification?.post_id == null) { + return 'show' + } + + if (has_navigation && has_local_user && is_app_active) { + return 'open' + } + + return 'queue' + } + + return 'show' +} + +export function determine_pending_notification_action({ notification, has_navigation, has_local_user, is_app_active = true }) { + if (!notification?.should_open || notification?.post_id == null) { + return 'show' + } + + if (!has_navigation || !is_app_active) { + return 'wait' + } + + if (!has_local_user) { + return 'show' + } + + return 'open' +} diff --git a/src/utils/push_notifications.test.js b/src/utils/push_notifications.test.js new file mode 100644 index 00000000..cd6ec916 --- /dev/null +++ b/src/utils/push_notifications.test.js @@ -0,0 +1,112 @@ +import { + normalise_notification_payload, + determine_notification_action, + determine_pending_notification_action +} from './push_notifications' + +describe('push notification routing', () => { + test('queues a tapped notification when the app is not ready to open it yet', () => { + const notification = normalise_notification_payload({ + message: 'Alice mentioned you', + data: { + post_id: '123', + to_user: { username: 'vincent' }, + from_user: { username: 'alice' } + }, + foreground: false, + userInteraction: true + }, 'ios') + + expect(determine_notification_action({ + notification, + has_navigation: false, + has_local_user: false, + is_app_active: false + })).toBe('queue') + }) + + test('opens a queued notification once auth and navigation are ready', () => { + const notification = { + post_id: '123', + to_username: 'vincent', + should_open: true + } + + expect(determine_pending_notification_action({ + notification, + has_navigation: true, + has_local_user: true, + is_app_active: true + })).toBe('open') + }) + + test('keeps a queued notification pending until navigation is ready', () => { + const notification = { + post_id: '123', + to_username: 'vincent', + should_open: true + } + + expect(determine_pending_notification_action({ + notification, + has_navigation: false, + has_local_user: true, + is_app_active: true + })).toBe('wait') + }) + + test('keeps a queued notification pending until the app becomes active', () => { + const notification = { + post_id: '123', + to_username: 'vincent', + should_open: true + } + + expect(determine_pending_notification_action({ + notification, + has_navigation: true, + has_local_user: true, + is_app_active: false + })).toBe('wait') + }) + + test('shows a foreground notification in the in-app sheet instead of auto-opening', () => { + const notification = normalise_notification_payload({ + id: 'abc', + message: 'Alice mentioned you', + data: { + post_id: '123', + to_user: '{"username":"vincent"}', + from_user: '{"username":"alice"}' + }, + foreground: true, + userInteraction: false + }, 'android') + + expect(determine_notification_action({ + notification, + has_navigation: true, + has_local_user: true, + is_app_active: true + })).toBe('show') + }) + + test('falls back to the in-app sheet when a tapped payload cannot be opened', () => { + const notification = normalise_notification_payload({ + message: 'Alice mentioned you', + data: { + to_user: { username: 'vincent' }, + from_user: { username: 'alice' } + }, + foreground: false, + userInteraction: true + }, 'ios') + + expect(determine_notification_action({ + notification, + has_navigation: true, + has_local_user: true, + is_app_active: true + })).toBe('show') + }) +}) From fe853c24eec342a2201cb6fd04730c349cc8a684 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 17:58:22 +0200 Subject: [PATCH 028/177] Update local build. Use correct notification swift call. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 22 ++++++++-------------- ios/MicroBlog_RN/AppDelegate.swift | 2 +- ios/Podfile.lock | 22 +++++++++++++++++----- ios/PrivacyInfo.xcprivacy | 12 ++++++------ 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index dca91f60..e98d0eb3 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -438,14 +438,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-frameworks.sh\"\n"; @@ -481,14 +477,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN/Pods-MicroBlog_RN-resources.sh\"\n"; @@ -502,14 +494,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN-MicroBlog_Share/Pods-MicroBlog_RN-MicroBlog_Share-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN-MicroBlog_Share/Pods-MicroBlog_RN-MicroBlog_Share-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MicroBlog_RN-MicroBlog_Share/Pods-MicroBlog_RN-MicroBlog_Share-resources.sh\"\n"; @@ -846,7 +834,10 @@ ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -914,7 +905,10 @@ MTL_ENABLE_DEBUG_INFO = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = "$(inherited)"; - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; diff --git a/ios/MicroBlog_RN/AppDelegate.swift b/ios/MicroBlog_RN/AppDelegate.swift index 89f33fe9..696cd59a 100644 --- a/ios/MicroBlog_RN/AppDelegate.swift +++ b/ios/MicroBlog_RN/AppDelegate.swift @@ -86,7 +86,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD response.actionIdentifier, String(describing: response.notification.request.content.userInfo) ) - RNCPushNotificationIOS.didReceiveNotificationResponse(response) + RNCPushNotificationIOS.didReceive(response) completionHandler() } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 092cfdfb..a900968a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,8 +1,12 @@ PODS: - boost (1.84.0) - DoubleConversion (1.1.6) + - EXApplication (6.1.5): + - ExpoModulesCore - EXConstants (17.1.7): - ExpoModulesCore + - EXNotifications (0.31.4): + - ExpoModulesCore - Expo (53.0.24): - DoubleConversion - ExpoModulesCore @@ -2393,7 +2397,9 @@ PODS: DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - EXApplication (from `../node_modules/expo-application/ios`) - EXConstants (from `../node_modules/expo-constants/ios`) + - EXNotifications (from `../node_modules/expo-notifications/ios`) - Expo (from `../node_modules/expo`) - ExpoAsset (from `../node_modules/expo-asset/ios`) - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) @@ -2513,8 +2519,12 @@ EXTERNAL SOURCES: :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" DoubleConversion: :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EXApplication: + :path: "../node_modules/expo-application/ios" EXConstants: :path: "../node_modules/expo-constants/ios" + EXNotifications: + :path: "../node_modules/expo-notifications/ios" Expo: :path: "../node_modules/expo" ExpoAsset: @@ -2716,9 +2726,11 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 - DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + boost: 1dca942403ed9342f98334bf4c3621f011aa7946 + DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 + EXApplication: 1e06972201838375ca1ec1ba34d586a98a5dc718 EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8 + EXNotifications: be5e949edf1d60b70e77178b81aa505298fadd07 Expo: d68c92f4bee50a21f0f0d7d2481dd6dbbd51e82b ExpoAsset: ef06e880126c375f580d4923fdd1cdf4ee6ee7d6 ExpoFileSystem: 7f92f7be2f5c5ed40a7c9efc8fa30821181d9d63 @@ -2730,8 +2742,8 @@ SPEC CHECKSUMS: ExpoWebBrowser: dc39a88485f007e61a3dff05d6a75f22ab4a2e92 fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 FBLazyVector: b60fe06f0f15b7d7408f169442176e69e8eeacde - fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd - glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 + glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a hermes-engine: 13c84524b3b6e884b2cf3b3b1e002ffd147d88a3 libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f @@ -2830,4 +2842,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 101be349ab1d704481c999dd0f31cc3ca05df79e -COCOAPODS: 1.16.2 +COCOAPODS: 1.15.2 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy index 5bb83c5d..49b8ded2 100644 --- a/ios/PrivacyInfo.xcprivacy +++ b/ios/PrivacyInfo.xcprivacy @@ -6,20 +6,20 @@ NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPITypeReasons - CA92.1 + C617.1 + 0A2A.1 + 3B52.1 NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPITypeReasons - 0A2A.1 - 3B52.1 - C617.1 + CA92.1 From 10aef227e5b4a7c7f306dadf18d24cd1a00bf785 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Sun, 12 Apr 2026 18:08:22 +0200 Subject: [PATCH 029/177] Fix notification replay timing edge cases. - keep navigation readiness in sync with the live navigation ref during remounts - retry pending notification replay across foreground banner and cold-boot timing windows - allow tapped foreground banners to open once navigation is ready - cover the foreground banner routing case in tests --- src/stores/App.js | 5 ++++- src/stores/Push.js | 22 +++++++++++++++++++++- src/utils/push_notifications.js | 12 +++++++++--- src/utils/push_notifications.test.js | 20 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/stores/App.js b/src/stores/App.js index 32c988b9..05c6156e 100644 --- a/src/stores/App.js +++ b/src/stores/App.js @@ -84,6 +84,8 @@ export default App = types.model('App', { console.log("App:set_navigation", navigation != null) if (navigation) { self.navigation_ref = navigation + self.navigation_ready = typeof navigation.isReady === 'function' ? navigation.isReady() : false + Push.replay_pending_notification() } else{ self.navigation_ref = null @@ -298,7 +300,8 @@ export default App = types.model('App', { navigate_to_screen: flow(function*(screen_name = null, action_data = null, from_listener = false) { console.log("App:navigate_to_screen", screen_name, action_data, from_listener) - if (screen_name != null && self.navigation_ref != null && self.navigation_ready && !self.is_scrolling) { + const navigation_is_ready = self.navigation_ref != null && self.navigation_ready && (typeof self.navigation_ref.isReady !== 'function' || self.navigation_ref.isReady()) + if (screen_name != null && navigation_is_ready && !self.is_scrolling) { switch (screen_name) { case "photo": return App.set_image_modal_data_and_activate(action_data) diff --git a/src/stores/Push.js b/src/stores/Push.js index d578bf49..4b1220fc 100644 --- a/src/stores/Push.js +++ b/src/stores/Push.js @@ -136,6 +136,15 @@ export default Push = types.model('Push', { return false }), + schedule_pending_notification_replay: flow(function* () { + console.log("Push:schedule_pending_notification_replay") + ;[0, 250, 500, 1000, 1500, 2500, 4000, 6000].forEach((delay) => { + setTimeout(() => { + Push.replay_pending_notification() + }, delay) + }) + }), + handle_notification: flow(function* (notification) { console.log("Push::handle_notification", notification, Auth.selected_user) const nice_notification_object = normalise_notification_payload(notification, Platform.OS) @@ -152,6 +161,7 @@ export default Push = types.model('Push', { if (action === 'queue') { yield Push.set_pending_notification(nice_notification_object) + yield Push.schedule_pending_notification_replay() return false } @@ -170,6 +180,7 @@ export default Push = types.model('Push', { } if (!self.auth_ready) { + console.log("Push:replay_pending_notification:waiting_for_auth") return false } @@ -180,6 +191,13 @@ export default Push = types.model('Push', { has_local_user: self.local_user_for_notification(pending_notification) != null, is_app_active: self.is_app_active() }) + console.log("Push:replay_pending_notification:action", action, { + has_navigation: self.has_navigation(), + has_local_user: self.local_user_for_notification(pending_notification) != null, + is_app_active: self.is_app_active(), + navigation_ready: App.navigation_ready, + app_state: App.app_state + }) if (action === 'wait') { return false @@ -276,7 +294,9 @@ export default Push = types.model('Push', { }, has_navigation() { - return App.navigation_ref != null && App.navigation_ready + return App.navigation_ref != null + && App.navigation_ready + && (typeof App.navigation_ref.isReady !== 'function' || App.navigation_ref.isReady()) }, is_app_active() { diff --git a/src/utils/push_notifications.js b/src/utils/push_notifications.js index 7694e87d..658876f5 100644 --- a/src/utils/push_notifications.js +++ b/src/utils/push_notifications.js @@ -24,6 +24,7 @@ export function normalise_notification_payload(notification, platform_os = 'ios' const to_user = parse_notification_user(data.to_user) const from_user = parse_notification_user(data.from_user) const tapped_from_os = notification?.userInteraction === true || notification?.foreground === false + const opened_from_foreground_banner = notification?.userInteraction === true && notification?.foreground === true const post_id = data?.post_id != null ? String(data.post_id) : null return { @@ -34,7 +35,8 @@ export function normalise_notification_payload(notification, platform_os = 'ios' post_id, to_username: to_user?.username || null, from_username: from_user?.username || null, - should_open: tapped_from_os && post_id != null + should_open: tapped_from_os && post_id != null, + opened_from_foreground_banner } } @@ -44,7 +46,7 @@ export function determine_notification_action({ notification, has_navigation, ha return 'show' } - if (has_navigation && has_local_user && is_app_active) { + if (has_navigation && has_local_user && (is_app_active || notification?.opened_from_foreground_banner)) { return 'open' } @@ -59,7 +61,11 @@ export function determine_pending_notification_action({ notification, has_naviga return 'show' } - if (!has_navigation || !is_app_active) { + if (!has_navigation) { + return 'wait' + } + + if (!is_app_active && !notification?.opened_from_foreground_banner) { return 'wait' } diff --git a/src/utils/push_notifications.test.js b/src/utils/push_notifications.test.js index cd6ec916..b33034b7 100644 --- a/src/utils/push_notifications.test.js +++ b/src/utils/push_notifications.test.js @@ -91,6 +91,26 @@ describe('push notification routing', () => { })).toBe('show') }) + test('opens a tapped foreground banner once navigation is ready', () => { + const notification = normalise_notification_payload({ + message: 'Alice mentioned you', + data: { + post_id: '123', + to_user: { username: 'vincent' }, + from_user: { username: 'alice' } + }, + foreground: true, + userInteraction: true + }, 'ios') + + expect(determine_notification_action({ + notification, + has_navigation: true, + has_local_user: true, + is_app_active: false + })).toBe('open') + }) + test('falls back to the in-app sheet when a tapped payload cannot be opened', () => { const notification = normalise_notification_payload({ message: 'Alice mentioned you', From 54a9455a1b8a83a9b74f1f89c6dc96b89fd5e9cb Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:11:55 +0200 Subject: [PATCH 030/177] Upgrade React Native to 0.83 and Expo SDK 55. - Align React Native, Expo, Metro, Babel, and lockfile dependencies with the 0.83/SDK 55 upgrade. - Update iOS Podfile, AppDelegate, privacy metadata, project settings, and resolved pods. - Update Android Gradle, application entry points, manifest, and Expo/RN autolinking setup. - Add patch-package fixes for Android dependencies that still reference jcenter. - Layer React Native and Expo Metro defaults to suppress the RN 0.73+ Metro config warning while retaining Expo behaviour. --- android/app/build.gradle | 30 +- android/app/src/main/AndroidManifest.xml | 4 +- .../java/blog/micro/android/MainActivity.kt | 76 +- .../blog/micro/android/MainApplication.kt | 57 +- android/build.gradle | 20 +- android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 43 +- babel.config.js | 5 +- bun.lockb | Bin 779360 -> 804496 bytes ios/MicroBlog_RN.xcodeproj/project.pbxproj | 36 +- ios/MicroBlog_RN/AppDelegate.swift | 31 +- ios/MicroBlog_RN/Info.plist | 6 +- ios/MicroBlog_Share/Info.plist | 2 + ios/Podfile | 47 +- ios/Podfile.lock | 1945 +++++++++-------- ios/PrivacyInfo.xcprivacy | 12 +- metro.config.js | 17 +- package.json | 60 +- .../@react-native-cookies+cookies+6.2.1.patch | 21 + ...react-native-push-notification+8.1.1.patch | 18 + 21 files changed, 1334 insertions(+), 1103 deletions(-) create mode 100644 patches/@react-native-cookies+cookies+6.2.1.patch create mode 100644 patches/react-native-push-notification+8.1.1.patch diff --git a/android/app/build.gradle b/android/app/build.gradle index c67100a0..141386ad 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -3,11 +3,24 @@ apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" apply plugin: 'com.google.gms.google-services' +def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() + /** * This is the configuration block to customize your React Native Android app. * By default you don't need to apply any configuration, just uncomment the lines you need. */ react { + entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) + reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + hermesCommand = new File(["node", "--print", "require.resolve('hermes-compiler/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/hermesc/%OS-BIN%/hermesc" + codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + + enableBundleCompression = (findProperty('android.enableBundleCompression') ?: false).toBoolean() + // Use Expo CLI to bundle the app, this ensures the Metro config + // works correctly with Expo projects. + cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) + bundleCommand = "export:embed" + /* Folders */ // The root of your project, i.e. where "package.json" lives. Default is '..' // root = file("../") @@ -53,11 +66,6 @@ react { /* Autolinking */ autolinkLibrariesWithApp() - // - // Added by install-expo-modules - entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", rootDir.getAbsoluteFile().getParentFile().getAbsolutePath(), "android", "absolute"].execute(null, rootDir).text.trim()) - cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim()) - bundleCommand = "export:embed" } /** @@ -90,6 +98,8 @@ android { targetSdkVersion rootProject.ext.targetSdkVersion versionCode 86 versionName "2.6.6" + + buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\"" } signingConfigs { @@ -113,6 +123,16 @@ android { } } + packagingOptions { + jniLibs { + def enableLegacyPackaging = findProperty('expo.useLegacyPackaging') ?: 'false' + useLegacyPackaging enableLegacyPackaging.toBoolean() + } + } + + androidResources { + ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' + } } dependencies { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 771ce6f8..e7830b8b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ - + @@ -47,4 +47,4 @@ - \ No newline at end of file + diff --git a/android/app/src/main/java/blog/micro/android/MainActivity.kt b/android/app/src/main/java/blog/micro/android/MainActivity.kt index ad7c352b..6af1675b 100644 --- a/android/app/src/main/java/blog/micro/android/MainActivity.kt +++ b/android/app/src/main/java/blog/micro/android/MainActivity.kt @@ -1,38 +1,64 @@ -package blog.micro.android; -import expo.modules.ReactActivityDelegateWrapper +package blog.micro.android + import android.content.Intent -import android.os.Bundle; -import com.swmansion.rnscreens.fragment.restoration.RNScreensFragmentFactory; +import android.os.Build +import android.os.Bundle import com.facebook.react.ReactActivity import com.facebook.react.ReactActivityDelegate import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled import com.facebook.react.defaults.DefaultReactActivityDelegate +import com.swmansion.rnscreens.fragment.restoration.RNScreensFragmentFactory +import expo.modules.ReactActivityDelegateWrapper class MainActivity : ReactActivity() { - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - override fun getMainComponentName(): String = "Micro.blog" - - /** - * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] - * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] - */ - override fun createReactActivityDelegate(): ReactActivityDelegate = - ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)) - - //react-native-screens override - override fun onCreate(savedInstanceState: Bundle?) { - supportFragmentManager.fragmentFactory = RNScreensFragmentFactory() - super.onCreate(savedInstanceState); - } + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "Micro.blog" - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - setIntent(intent) + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate { + return ReactActivityDelegateWrapper( + this, + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, + object : DefaultReactActivityDelegate( + this, + mainComponentName, + fabricEnabled + ) {} + ) + } + + // react-native-screens override + override fun onCreate(savedInstanceState: Bundle?) { + supportFragmentManager.fragmentFactory = RNScreensFragmentFactory() + super.onCreate(null) + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + } + + /** + * Align the back button behavior with Android S + * where moving root activities to background instead of finishing activities. + */ + override fun invokeDefaultOnBackPressed() { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + if (!moveTaskToBack(false)) { + super.invokeDefaultOnBackPressed() + } + return } + + super.invokeDefaultOnBackPressed() + } } diff --git a/android/app/src/main/java/blog/micro/android/MainApplication.kt b/android/app/src/main/java/blog/micro/android/MainApplication.kt index ebac1d96..29e37e00 100644 --- a/android/app/src/main/java/blog/micro/android/MainApplication.kt +++ b/android/app/src/main/java/blog/micro/android/MainApplication.kt @@ -1,48 +1,39 @@ -package blog.micro.android; -import android.content.res.Configuration -import expo.modules.ApplicationLifecycleDispatcher -import expo.modules.ReactNativeHostWrapper +package blog.micro.android import android.app.Application +import android.content.res.Configuration + import com.facebook.react.PackageList import com.facebook.react.ReactApplication import com.facebook.react.ReactHost -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader - -class MainApplication : Application(), ReactApplication { +import com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative +import com.facebook.react.common.ReleaseLevel +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint - override val reactNativeHost: ReactNativeHost = - ReactNativeHostWrapper(this, object : DefaultReactNativeHost(this) { - override fun getPackages(): List = - PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here, for example: - // add(MyReactNativePackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG +import expo.modules.ApplicationLifecycleDispatcher +import expo.modules.ExpoReactHostFactory - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - }) +class MainApplication : Application(), ReactApplication { - override val reactHost: ReactHost - get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) + override val reactHost: ReactHost by lazy { + ExpoReactHostFactory.getDefaultReactHost( + context = applicationContext, + packageList = + PackageList(this).packages.apply { + // Packages that cannot be autolinked yet can be added manually here, for example: + // add(MyReactNativePackage()) + } + ) + } override fun onCreate() { super.onCreate() - SoLoader.init(this, OpenSourceMergedSoMapping) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() + DefaultNewArchitectureEntryPoint.releaseLevel = try { + ReleaseLevel.valueOf(BuildConfig.REACT_NATIVE_RELEASE_LEVEL.uppercase()) + } catch (e: IllegalArgumentException) { + ReleaseLevel.STABLE } + loadReactNative(this) ApplicationLifecycleDispatcher.onApplicationCreate(this) } diff --git a/android/build.gradle b/android/build.gradle index b8f1e352..a1ab7b50 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { - buildToolsVersion = "35.0.0" + buildToolsVersion = "36.0.0" minSdkVersion = 24 - compileSdkVersion = 35 - targetSdkVersion = 35 + compileSdkVersion = 36 + targetSdkVersion = 36 ndkVersion = "27.1.12297006" - kotlinVersion = "2.0.21" + kotlinVersion = "2.1.20" androidXBrowser = "1.8.0" } repositories { @@ -17,12 +17,20 @@ buildscript { classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") - classpath 'com.google.gms:google-services:4.3.14' + classpath 'com.google.gms:google-services:4.4.4' } gradle.startParameter.excludedTaskNames.addAll( gradle.startParameter.taskNames.findAll { it.contains("testClasses") } ) } -apply plugin: "com.facebook.react.rootproject" +allprojects { + repositories { + google() + mavenCentral() + maven { url 'https://www.jitpack.io' } + } +} + apply plugin: "expo-root-project" +apply plugin: "com.facebook.react.rootproject" diff --git a/android/gradle.properties b/android/gradle.properties index 12b04542..d5c3ef8c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -39,3 +39,8 @@ newArchEnabled=true # Use this property to enable or disable the Hermes JS engine. # If set to false, you will be using JSC instead. hermesEnabled=true + +# Use this property to enable edge-to-edge display support. +# This allows your app to draw behind system bars for an immersive UI. +# Note: Only works with ReactActivity and should not be used with custom Activity. +edgeToEdgeEnabled=false diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 37f853b1..2a84e188 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/android/settings.gradle b/android/settings.gradle index 5643e70c..ec80d26e 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,12 @@ -pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") +pluginManagement { + def reactNativeGradlePlugin = new File( + providers.exec { + workingDir(rootDir) + commandLine("node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })") + }.standardOutput.asText.get().trim() + ).getParentFile().absolutePath + includeBuild(reactNativeGradlePlugin) + def expoPluginsPath = new File( providers.exec { workingDir(rootDir) @@ -8,27 +16,24 @@ pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") ).absolutePath includeBuild(expoPluginsPath) } -plugins { id("com.facebook.react.settings") -id("expo-autolinking-settings") + +plugins { + id("com.facebook.react.settings") + id("expo-autolinking-settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> - def command = [ - 'node', - '--no-warnings', - '--eval', - 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', - 'react-native-config', - '--json', - '--platform', - 'android' - ].toList() - ex.autolinkLibrariesFromCommand(command) + +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { + ex.autolinkLibrariesFromCommand() + } else { + ex.autolinkLibrariesFromCommand(expoAutolinking.rnConfigCommand) + } } +expoAutolinking.useExpoModules() + rootProject.name = 'Micro.blog' -include ':app' -includeBuild('../node_modules/@react-native/gradle-plugin') -apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle") -useExpoModules() expoAutolinking.useExpoVersionCatalog() + +include ':app' includeBuild(expoAutolinking.reactNativeGradlePlugin) diff --git a/babel.config.js b/babel.config.js index dea06b48..6a5d9c57 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,12 +1,11 @@ module.exports = { presets: ['babel-preset-expo'], plugins: [ - ["@babel/plugin-proposal-decorators", { "legacy": true }], - 'react-native-reanimated/plugin' + ["@babel/plugin-proposal-decorators", { "legacy": true }] ], env: { production: { plugins: ['transform-remove-console'] } } -}; +} diff --git a/bun.lockb b/bun.lockb index bbcafc4795f65cdaf0a981a736b2924a361437f8..66b9ca5f223be9a7a48d58d0a7c8f36d1cf0a97a 100755 GIT binary patch delta 214648 zcmcG%34Bdg_dk5@Ne(#(F~=NpT!NTx4x0oW)6wzrZsCR4h}WcTtW~- zsaa`@(o#dsO>2%utE$H8`(1mV9i+eK{XPHx=Y8*|vDSB;efF^S+H0-7&$+j`$D7QZ z?LW71gBQiRPGQa)9Y3qloWVzowIF;ZyN0#7IP3RYQ=%b2+nG`JL{`Dj@>-s$u`Akxce*Pmwc}Np*Bb{)I5HtV-VS{~0;YCu z8`sm~6JrwXk|e4Z{fM$hq>V!V5)$q4)X%Xg^sgjchi0h18R5=2!qd?nX2F&D5KI|d z7z-iw?;Hw}7M;~O9sx>fjkrQhmclyqp8p z5GkR9kh_>_0Z0QWcIOy-vLrcD65?AzHp(8Kk`W&%&BO|%Df-lpcT7}x1QpQzR1r}j z7abNI5Caid3}Bug^iOjxZcIi4n9fX$igl3rr)b+k&rD zF;(8cG-7wqa-h$Qaz#O5Mww5V@qsKvhe?C$e4u~2;fOH;VZF{2^Z=hWxPg4h5g$H6 zas}aWDUzr_Oo33jcWbVp)370GU`$*RRU;)t_%k{bqbUvf#`@f7Q(bl}YpA@OmG?{- zO$sngNjp?T%P>4LA(^b}bs!(H4Hc2f>l?Q7+=mZjaT`v1Ku($+8y*)+^^dXfdQzQ< zZ21KM7sGW|y|(;9L~?kf9iv_jOc!o~QUxu8`E@T;NF6!_O!Cp;DSpv$;iC=%(^Tv> z%02Yq<<7R_bV_@!K_@5~XXg%*1Q(JS1`N%+GXI2tRMH;;s_6X?uA0cv=(;3HqQS@* zznJ*w1j!FQr;bE0y-Ctv9eIbVpo4UO5l|XHQkp%@j{C2nLuG*9dymUSJ>ij&_QX_I ziuByLPy!ByY+(UZPE@RO7H|AwQasm*{q_bW)mTB{^)r|B;F^(oa%&z2N=CH_lr-?0alLCVK0>j~ZUa*} zu?&UZ5E?BAMZwU2NfZ=wDMnn_v$aKq)S$RAB`!Q=G*s(C2hi8d8AeCy867VRS{8D; zNc8jm{Qm3EEKPOS0sOuL9$5d>(+d#Lg)Jyh3Un2yC+K)kn$tv3>cDp2uZqUMxM|i+_e$YQ@KscV`L-O zE!B=-;J7kt7#DsUB}q+z4}$uGE(fI*FcFk090*DkGzF~>S{$@4=ncj>+sKx~HJO?c9-rY1PmLV? zH{^6ZF(x@Y72d6%2RA(7RRcUUbMfk~V?`yYIf@ChLR@;sDulupqg*4DO8{*E+R31| z#!6B%;OfA>pd~XT2{Aac`Z(_Uo&l2{PJz<>TR^LWJ}tuZ;>!F13@PIC2~5+OgD3JC zdlh(To<>0m*Y zS2znihZ|_50kimsCV^51?8(Uq$$s|qdLQ!ZjUXr6_c5qgXulcP(?8;ta~c%hiDiwh z1WA%a684`0D$CYzgNWQB!i$J5BD@I9A^;c8`gquR6LkWT&%8^Dw zPU;e#DIuKKm*^Ll5Q(J)8sm&fmA?Fh%Z=<``>l8-^Q)!YMjnFFV*CY^+WHZcrt~x@ z^=ZU%tyzgymGf5c8S3#VFW%OmH$T-rDACGwd=+-uB7j&f@`SeOjwxhbVS}B3}_1 zmq?^U#XsRj>ezWu>e$e1j&DM-g!=#&1C7Wa7l~9cJQ@B;lHxJ5k)!QWBiu*M>A4R& zNNZK(n3YW2O^?~hjqI}=z8~oiOd}K)8I8)wjYl8gD(?td6S($4KC)zcNiyQQ>{oFR}DQT%O$kKNJn{mCc zTP^H14<6<93AZWSq;ShqQBPykGh#pVPyVO z(5Tl{3QR*35Fzbz6rhob*qeunr~@+~Ck-41rtAA}@P>N-#B+~B%Frlh(x+yLi7lpcyLP5R~qZ zPl&>?MND!s+#j~!Qp9gsR+;Lq$FRH_xcn_Bb#onPJYdBXK??0=WqI zB9My!E&@6oGhfl5ZDkX)5PwkeR`&QYY$r}fd1zmf zzCy(`*J};h&Vx4;or26PH935K5fjr4ohwDh#Mu**6P$^uDN^^MyrI}QoNS^Vu>r2Q zh;LM=w`Eap31C`EBDI;ekOv-QDPb({PfUx?Ktf|br|=Eb3nwPrvT)zR%L%7txNBFY@bd-k6|0E6oCrK3u>5bKS42z^dPRhME5f}K z;CMiTk&6iSwKt3o4U0%60*nYGg#$=I;6Qw6hWiS~i^6e2#0L=E=EDV}#OZcC{ zeo6Qv;fI8q5dKNH5%{NpY|JG0{k90s~BJmA?cf|M^~P?rwfDZa9U)WO6})CKe&YVth9- zMoN;!*F@pPSqb-(_c-Ij{j)e0idZ zDYHmBMLH=q&%#@j_af5H|Kw(bd!cO6ML}4kg(BS( z$&_$AB1sYnv2a7eUx}pazja4%xgD3ttl#lFBC!?;_5XkF2l^+g7kTRc=znm%a6bC~ znfq}W>EnO$KO!9zd5~~J|Jy2`D)B6#a1v1XAjRdhbN|&Flr~e26hHQi4v*2;GsnUw zDVL&6Y*mO8l;XILvWmhO{XV}(`!KWd29|6-`30;n?z4|t)4 z-D%uqrbRY(#zZD3Ou%&tK^MoEm}@=`N}=V0vD{NSah)8Pce;t4#%(ZhPj?HL92wG? z)C@eV{hu`K`fpsT@cD&ZY+)7uUl^&2<+A*617{KN;k0}BuT+O}^DsgfQD&>jCboTy zONe5RCN2Wgk$B1!uBop;$w(6saiC!KNIwEx+*B8z+g($+%CW;>VXOHxenZTt_=IFT z9&;OyJbwAW#LgYJqk%f8up(#;(A(2_5F0Vm#2i}RStjOJ!e*FQhWa-!Mb&$t)UgL2 z@_Np@ASegH(T{j|+zd(uzlNOVIAwH<6QNa_f{G{?c1HuWQErRtgqwj@8FP7q+kh+MdjEO6Jy$0%)R2w~q{3F;O%Hz4`sF%uZk^L71|LkK`OE#p`uQFsNgv zP%%~Lv^(iO>5R_vgd?D2_1G5LqoJX=NM7;r#k{;Ys1pZt;y^Aj&6!B`JXk{QVg0Am zn;;Opz}%AR#2WMPQJNln&<^t-Ysj0G@({F)kpm-Z2IX)c2 zp#fq2OQNUZ2vNM5l39XhF5(T9!f&v|$3)uwQj;^p$lhDQM{YByIC@MOZI6q?sVBDX zqZ4paPAnG={tka1BthFb~Mzw#bkiK9MPLX`{%Yq&wr9 z(V=okj@Gq)b(h-?UVS2aS3#171Ct%x0Htbrfs$dz?c`Lf2=Sg#ja^3Xagvl6o{}Qo zeh5QfXd#IAjXuG0qk4kTO>zadHnSz}%1qtOm#El>*TMM6r@Y3vXpSO31FCBW|Mtf9~D8pfnV)4F>n17C@qvjpgy2$Kq)@W0Z1XPR9qd2G^@E)V%$iip^NE?93yDkAGll%~r=6<3<6G6$whHf#r z*hqUpKx<{^_gn*I&+s`d2Fg?xk4J^5xDCn?_Wps7RBUVAfGJQtJj>|@P-^)5b39BO z1|=+v6K6V+co;P5>RCio8c`G6Ky!5hl#Fh-L6;a6%`)hCgE~QJL?aE_7nDY1y2R^y z@*^LBczHmqs*Xmvp_lnUqg=)tXo0xEj0}`CA>K$^bA_w2D&$NP$qA$I2qGmlAt{+u zEuO24OJH%T;0?9|a57{=I}9(h^BUJoczR3%X>!DMUauC=(90F5@P}RrC`?PI?oWIa z!Z0fUllml3O8sJT`N|LvZH5EW5?uK+cTFFIQseJ~l9tAT(x5_6j-s~cOk_e_0!C3; z`s60B;0`F=ARdr*)Gjxy;VSI03nzBMTni_7(HJLnL!7EO@0r+RfQ|?FdJ*SJ;*pMc zgd@(Kj7LDOf=4#ujVy6m{_Z1xDHHE2(VS4|VyDh}J|9lRZ`>FD--Vh8C>|3-K1^&& zwqtuz6L=AO1qdh&5UiQRUHZPw6N(~=`1EtaRHtKVLQu$wB^A3tv zQ7!{hIcIn*9u~M_l8-|`73={e|8-1~nL4w8$t;(HQU@2AWY%+gI-Vlq6M_bq+VNC5 z)t;OYVBqtz% zW*w?vlsgPeIYBlkjc7F}-G8tsDhAyJN}Akk&?tKpPLCxiGJ(2}cPKGcE

EmVG^ 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%0A5c7AC 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 z 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 delta 202512 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

qA3S21@2WdOUo|6@J0O(Jf^lnAW5M{EP- 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 `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('expo/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -841,6 +831,7 @@ REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_VERSION = 5.0; USE_HERMES = true; }; @@ -911,6 +902,7 @@ ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; + SWIFT_ENABLE_EXPLICIT_MODULES = NO; SWIFT_VERSION = 5.0; USE_HERMES = true; VALIDATE_PRODUCT = YES; diff --git a/ios/MicroBlog_RN/AppDelegate.swift b/ios/MicroBlog_RN/AppDelegate.swift index 696cd59a..d2348814 100644 --- a/ios/MicroBlog_RN/AppDelegate.swift +++ b/ios/MicroBlog_RN/AppDelegate.swift @@ -4,29 +4,26 @@ // // Created by Vincent Ritter on 02/10/2025. // - - -import UIKit +internal import Expo import React -import React_RCTAppDelegate import ReactAppDependencyProvider import RNShareMenu import UserNotifications @main -class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { +class AppDelegate: ExpoAppDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? - var reactNativeDelegate: ReactNativeDelegate? + var reactNativeDelegate: ExpoReactNativeFactoryDelegate? var reactNativeFactory: RCTReactNativeFactory? - func application( + public override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil ) -> Bool { NSLog("PushDebug:didFinishLaunchingWithOptions launchOptions=%@", String(describing: launchOptions)) let delegate = ReactNativeDelegate() - let factory = RCTReactNativeFactory(delegate: delegate) + let factory = ExpoReactNativeFactory(delegate: delegate) delegate.dependencyProvider = RCTAppDependencyProvider() reactNativeDelegate = delegate @@ -42,11 +39,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD UNUserNotificationCenter.current().delegate = self - return true + return super.application(application, didFinishLaunchingWithOptions: launchOptions) } - func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { - return ShareMenuManager.application(application, open: url, options: options) + public override func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { + return ShareMenuManager.application(application, open: url, options: options) || super.application(application, open: url, options: options) } // Required to register for notifications @@ -55,19 +52,19 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD } // Required for the register event. - func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + public override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { NSLog("PushDebug:didRegisterForRemoteNotificationsWithDeviceToken") RNCPushNotificationIOS.didRegisterForRemoteNotifications(withDeviceToken: deviceToken) } // Required for the notification event. You must call the completion handler after handling the remote notification. - func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { + public override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { NSLog("PushDebug:didReceiveRemoteNotification userInfo=%@", String(describing: userInfo)) RNCPushNotificationIOS.didReceiveRemoteNotification(userInfo, fetchCompletionHandler: completionHandler) } // Required for the registrationError event. - func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + public override func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { RNCPushNotificationIOS.didFailToRegisterForRemoteNotificationsWithError(error) } @@ -103,14 +100,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD } } -class ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate { +class ReactNativeDelegate: ExpoReactNativeFactoryDelegate { override func sourceURL(for bridge: RCTBridge) -> URL? { - self.bundleURL() + bridge.bundleURL ?? bundleURL() } override func bundleURL() -> URL? { #if DEBUG - RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index") + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: ".expo/.virtual-metro-entry") #else Bundle.main.url(forResource: "main", withExtension: "jsbundle") #endif diff --git a/ios/MicroBlog_RN/Info.plist b/ios/MicroBlog_RN/Info.plist index 786f5d1e..0a8a1d57 100644 --- a/ios/MicroBlog_RN/Info.plist +++ b/ios/MicroBlog_RN/Info.plist @@ -56,10 +56,14 @@ The location may be used when posting photos. NSPhotoLibraryUsageDescription Micro.blog can upload photos to your microblog. + RCTNewArchEnabled + UIBackgroundModes remote-notification + UIDesignRequiresCompatibility + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -79,7 +83,5 @@ UIViewControllerBasedStatusBarAppearance - UIDesignRequiresCompatibility - diff --git a/ios/MicroBlog_Share/Info.plist b/ios/MicroBlog_Share/Info.plist index 304f9b6b..af41a85e 100644 --- a/ios/MicroBlog_Share/Info.plist +++ b/ios/MicroBlog_Share/Info.plist @@ -55,5 +55,7 @@ + RCTNewArchEnabled + diff --git a/ios/Podfile b/ios/Podfile index b2838b0e..6639765a 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,31 +1,35 @@ require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip - -platform :ios, min_ios_version_supported -prepare_react_native_project! +require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") + +require 'json' +podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} -linkage = ENV['USE_FRAMEWORKS'] -if linkage != nil - Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green - use_frameworks! :linkage => linkage.to_sym +def ccache_enabled?(podfile_properties) + return ENV['USE_CCACHE'] == '1' if ENV['USE_CCACHE'] + + podfile_properties['apple.ccacheEnabled'] == 'true' end +ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] ||= podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] +ENV['RCT_USE_RN_DEP'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true' +ENV['RCT_USE_PREBUILT_RNCORE'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true' +ENV['RCT_HERMES_V1_ENABLED'] ||= '1' if podfile_properties['expo.useHermesV1'] == 'true' + +platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1' +prepare_react_native_project! + target 'MicroBlog_RN' do use_expo_modules! if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' - config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]; + config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"] else config_command = [ 'node', '--no-warnings', '--eval', - 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', + 'require(\'expo/bin/autolinking\')', + 'expo-modules-autolinking', 'react-native-config', '--json', '--platform', @@ -35,10 +39,15 @@ target 'MicroBlog_RN' do config = use_native_modules!(config_command) + use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] + use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] + use_react_native!( :path => config[:reactNativePath], + :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/.." + :app_path => "#{Pod::Config.instance.installation_root}/..", + :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', ) target 'MicroBlog_Share' do @@ -46,13 +55,13 @@ target 'MicroBlog_RN' do end post_install do |installer| - # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( installer, config[:reactNativePath], - :mac_catalyst_enabled => false + :mac_catalyst_enabled => false, + :ccache_enabled => ccache_enabled?(podfile_properties), ) - + installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a900968a..ff3cb27c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,26 +1,17 @@ PODS: - - boost (1.84.0) - - DoubleConversion (1.1.6) - - EXApplication (6.1.5): + - EXConstants (55.0.15): - ExpoModulesCore - - EXConstants (17.1.7): + - Expo (55.0.17): - ExpoModulesCore - - EXNotifications (0.31.4): - - ExpoModulesCore - - Expo (53.0.24): - - DoubleConversion - - ExpoModulesCore - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -33,35 +24,38 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - ExpoAsset (11.1.7): + - ExpoAsset (55.0.16): - ExpoModulesCore - - ExpoFileSystem (18.1.11): + - ExpoDomWebView (55.0.5): - ExpoModulesCore - - ExpoFont (13.3.2): + - ExpoFileSystem (55.0.17): - ExpoModulesCore - - ExpoImage (2.4.1): + - ExpoFont (55.0.6): + - ExpoModulesCore + - ExpoImage (55.0.9): - ExpoModulesCore - libavif/libdav1d - SDWebImage (~> 5.21.0) - SDWebImageAVIFCoder (~> 0.11.0) - SDWebImageSVGCoder (~> 1.7.0) - SDWebImageWebPCoder (~> 0.14.6) - - ExpoKeepAwake (14.1.4): + - ExpoKeepAwake (55.0.6): - ExpoModulesCore - - ExpoModulesCore (2.5.0): - - DoubleConversion - - glog + - ExpoLogBox (55.0.11): + - React-Core + - ExpoModulesCore (55.0.23): + - ExpoModulesJSI - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-jsinspector @@ -73,18 +67,22 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNWorklets - Yoga - - ExpoSecureStore (14.2.4): + - ExpoModulesJSI (55.0.23): + - hermes-engine + - React-Core + - React-runtimescheduler + - ReactCommon + - ExpoSecureStore (55.0.13): - ExpoModulesCore - - ExpoWebBrowser (14.2.0): + - ExpoWebBrowser (55.0.14): - ExpoModulesCore - - fast_float (6.1.4) - - FBLazyVector (0.79.7) - - fmt (11.0.2) - - glog (0.3.5) - - hermes-engine (0.79.7): - - hermes-engine/Pre-built (= 0.79.7) - - hermes-engine/Pre-built (0.79.7) + - FBLazyVector (0.83.6) + - hermes-engine (0.14.1): + - hermes-engine/Pre-built (= 0.14.1) + - hermes-engine/Pre-built (0.14.1) - libavif/core (0.11.1) - libavif/libdav1d (0.11.1): - libavif/core @@ -102,68 +100,54 @@ PODS: - libwebp/sharpyuv (1.5.0) - libwebp/webp (1.5.0): - libwebp/sharpyuv - - RCT-Folly (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Default (= 2024.11.18.00) - - RCT-Folly/Default (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly/Fabric (2024.11.18.00): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCTDeprecation (0.79.7) - - RCTRequired (0.79.7) - - RCTTypeSafety (0.79.7): - - FBLazyVector (= 0.79.7) - - RCTRequired (= 0.79.7) - - React-Core (= 0.79.7) - - React (0.79.7): - - React-Core (= 0.79.7) - - React-Core/DevSupport (= 0.79.7) - - React-Core/RCTWebSocket (= 0.79.7) - - React-RCTActionSheet (= 0.79.7) - - React-RCTAnimation (= 0.79.7) - - React-RCTBlob (= 0.79.7) - - React-RCTImage (= 0.79.7) - - React-RCTLinking (= 0.79.7) - - React-RCTNetwork (= 0.79.7) - - React-RCTSettings (= 0.79.7) - - React-RCTText (= 0.79.7) - - React-RCTVibration (= 0.79.7) - - React-callinvoker (0.79.7) - - React-Core (0.79.7): - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation (0.83.6) + - RCTRequired (0.83.6) + - RCTSwiftUI (0.83.6) + - RCTSwiftUIWrapper (0.83.6): + - RCTSwiftUI + - RCTTypeSafety (0.83.6): + - FBLazyVector (= 0.83.6) + - RCTRequired (= 0.83.6) + - React-Core (= 0.83.6) + - React (0.83.6): + - React-Core (= 0.83.6) + - React-Core/DevSupport (= 0.83.6) + - React-Core/RCTWebSocket (= 0.83.6) + - React-RCTActionSheet (= 0.83.6) + - React-RCTAnimation (= 0.83.6) + - React-RCTBlob (= 0.83.6) + - React-RCTImage (= 0.83.6) + - React-RCTLinking (= 0.83.6) + - React-RCTNetwork (= 0.83.6) + - React-RCTSettings (= 0.83.6) + - React-RCTText (= 0.83.6) + - React-RCTVibration (= 0.83.6) + - React-callinvoker (0.83.6) + - React-Core (0.83.6): + - hermes-engine - RCTDeprecation - - React-Core/Default (= 0.79.7) + - React-Core-prebuilt + - React-Core/Default (= 0.83.6) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/CoreModulesHeaders (0.79.7): - - glog + - React-Core-prebuilt (0.83.6): + - ReactNativeDependencies + - React-Core/CoreModulesHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -171,53 +155,56 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/Default (0.79.7): - - glog + - React-Core/Default (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/DevSupport (0.79.7): - - glog + - React-Core/DevSupport (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.79.7) - - React-Core/RCTWebSocket (= 0.79.7) + - React-Core-prebuilt + - React-Core/Default (= 0.83.6) + - React-Core/RCTWebSocket (= 0.83.6) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTActionSheetHeaders (0.79.7): - - glog + - React-Core/RCTActionSheetHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -225,17 +212,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTAnimationHeaders (0.79.7): - - glog + - React-Core/RCTAnimationHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -243,17 +231,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTBlobHeaders (0.79.7): - - glog + - React-Core/RCTBlobHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -261,17 +250,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTImageHeaders (0.79.7): - - glog + - React-Core/RCTImageHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -279,17 +269,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTLinkingHeaders (0.79.7): - - glog + - React-Core/RCTLinkingHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -297,17 +288,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTNetworkHeaders (0.79.7): - - glog + - React-Core/RCTNetworkHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -315,17 +307,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTSettingsHeaders (0.79.7): - - glog + - React-Core/RCTSettingsHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -333,17 +326,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTTextHeaders (0.79.7): - - glog + - React-Core/RCTTextHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -351,17 +345,18 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTVibrationHeaders (0.79.7): - - glog + - React-Core/RCTVibrationHeaders (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation + - React-Core-prebuilt - React-Core/Default - React-cxxreact - React-featureflags @@ -369,1080 +364,1150 @@ PODS: - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-Core/RCTWebSocket (0.79.7): - - glog + - React-Core/RCTWebSocket (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTDeprecation - - React-Core/Default (= 0.79.7) + - React-Core-prebuilt + - React-Core/Default (= 0.83.6) - React-cxxreact - React-featureflags - React-hermes - React-jsi - React-jsiexecutor - React-jsinspector + - React-jsinspectorcdp - React-jsitooling - React-perflogger + - React-runtimeexecutor - React-runtimescheduler - React-utils - - SocketRocket (= 0.7.1) + - ReactNativeDependencies - Yoga - - React-CoreModules (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) - - RCTTypeSafety (= 0.79.7) - - React-Core/CoreModulesHeaders (= 0.79.7) - - React-jsi (= 0.79.7) + - React-CoreModules (0.83.6): + - RCTTypeSafety (= 0.83.6) + - React-Core-prebuilt + - React-Core/CoreModulesHeaders (= 0.83.6) + - React-debug + - React-jsi (= 0.83.6) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-NativeModulesApple - React-RCTBlob - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.79.7) + - React-RCTImage (= 0.83.6) + - React-runtimeexecutor + - React-utils - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.79.7): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.7) - - React-debug (= 0.79.7) - - React-jsi (= 0.79.7) + - ReactNativeDependencies + - React-cxxreact (0.83.6): + - hermes-engine + - React-callinvoker (= 0.83.6) + - React-Core-prebuilt + - React-debug (= 0.83.6) + - React-jsi (= 0.83.6) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-logger (= 0.79.7) - - React-perflogger (= 0.79.7) - - React-runtimeexecutor (= 0.79.7) - - React-timing (= 0.79.7) - - React-debug (0.79.7) - - React-defaultsnativemodule (0.79.7): - - hermes-engine - - RCT-Folly + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - React-runtimeexecutor + - React-timing (= 0.83.6) + - React-utils + - ReactNativeDependencies + - React-debug (0.83.6) + - React-defaultsnativemodule (0.83.6): + - hermes-engine + - React-Core-prebuilt - React-domnativemodule + - React-featureflags - React-featureflagsnativemodule - - React-hermes - React-idlecallbacksnativemodule + - React-intersectionobservernativemodule - React-jsi - React-jsiexecutor - React-microtasksnativemodule - React-RCTFBReactNativeSpec - - React-domnativemodule (0.79.7): + - React-webperformancenativemodule + - ReactNativeDependencies + - Yoga + - React-domnativemodule (0.83.6): - hermes-engine - - RCT-Folly + - React-Core-prebuilt - React-Fabric + - React-Fabric/bridging - React-FabricComponents - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec + - React-runtimeexecutor - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-Fabric (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/animations (= 0.79.7) - - React-Fabric/attributedstring (= 0.79.7) - - React-Fabric/componentregistry (= 0.79.7) - - React-Fabric/componentregistrynative (= 0.79.7) - - React-Fabric/components (= 0.79.7) - - React-Fabric/consistency (= 0.79.7) - - React-Fabric/core (= 0.79.7) - - React-Fabric/dom (= 0.79.7) - - React-Fabric/imagemanager (= 0.79.7) - - React-Fabric/leakchecker (= 0.79.7) - - React-Fabric/mounting (= 0.79.7) - - React-Fabric/observers (= 0.79.7) - - React-Fabric/scheduler (= 0.79.7) - - React-Fabric/telemetry (= 0.79.7) - - React-Fabric/templateprocessor (= 0.79.7) - - React-Fabric/uimanager (= 0.79.7) + - React-Fabric/animated (= 0.83.6) + - React-Fabric/animationbackend (= 0.83.6) + - React-Fabric/animations (= 0.83.6) + - React-Fabric/attributedstring (= 0.83.6) + - React-Fabric/bridging (= 0.83.6) + - React-Fabric/componentregistry (= 0.83.6) + - React-Fabric/componentregistrynative (= 0.83.6) + - React-Fabric/components (= 0.83.6) + - React-Fabric/consistency (= 0.83.6) + - React-Fabric/core (= 0.83.6) + - React-Fabric/dom (= 0.83.6) + - React-Fabric/imagemanager (= 0.83.6) + - React-Fabric/leakchecker (= 0.83.6) + - React-Fabric/mounting (= 0.83.6) + - React-Fabric/observers (= 0.83.6) + - React-Fabric/scheduler (= 0.83.6) + - React-Fabric/telemetry (= 0.83.6) + - React-Fabric/templateprocessor (= 0.83.6) + - React-Fabric/uimanager (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/animations (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animated (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animationbackend (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/animations (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/attributedstring (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/bridging (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.79.7) - - React-Fabric/components/root (= 0.79.7) - - React-Fabric/components/scrollview (= 0.79.7) - - React-Fabric/components/view (= 0.79.7) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/componentregistry (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/componentregistrynative (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/scrollview (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/components (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.83.6) + - React-Fabric/components/root (= 0.83.6) + - React-Fabric/components/scrollview (= 0.83.6) + - React-Fabric/components/view (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/components/legacyviewmanagerinterop (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/root (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/scrollview (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/components/view (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-renderercss - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-Fabric/consistency (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-Fabric/consistency (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/core (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/core (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/dom (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/dom (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/imagemanager (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/leakchecker (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - React-Fabric/mounting (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/observers (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug + - React-Fabric/observers/events (= 0.83.6) + - React-Fabric/observers/intersection (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/observers/events (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/observers/events (= 0.79.7) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/observers/intersection (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/scheduler (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric/observers/events - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-performancecdpmetrics - React-performancetimeline - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/telemetry (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/templateprocessor (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/uimanager (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - - React-Fabric/uimanager/consistency (= 0.79.7) + - React-Fabric/uimanager/consistency (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-Fabric/uimanager/consistency (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger - React-rendererconsistency - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core - - React-FabricComponents (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-FabricComponents (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components (= 0.79.7) - - React-FabricComponents/textlayoutmanager (= 0.79.7) + - React-FabricComponents/components (= 0.83.6) + - React-FabricComponents/textlayoutmanager (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.79.7) - - React-FabricComponents/components/iostextinput (= 0.79.7) - - React-FabricComponents/components/modal (= 0.79.7) - - React-FabricComponents/components/rncore (= 0.79.7) - - React-FabricComponents/components/safeareaview (= 0.79.7) - - React-FabricComponents/components/scrollview (= 0.79.7) - - React-FabricComponents/components/text (= 0.79.7) - - React-FabricComponents/components/textinput (= 0.79.7) - - React-FabricComponents/components/unimplementedview (= 0.79.7) + - React-FabricComponents/components/inputaccessory (= 0.83.6) + - React-FabricComponents/components/iostextinput (= 0.83.6) + - React-FabricComponents/components/modal (= 0.83.6) + - React-FabricComponents/components/rncore (= 0.83.6) + - React-FabricComponents/components/safeareaview (= 0.83.6) + - React-FabricComponents/components/scrollview (= 0.83.6) + - React-FabricComponents/components/switch (= 0.83.6) + - React-FabricComponents/components/text (= 0.83.6) + - React-FabricComponents/components/textinput (= 0.83.6) + - React-FabricComponents/components/unimplementedview (= 0.83.6) + - React-FabricComponents/components/virtualview (= 0.83.6) + - React-FabricComponents/components/virtualviewexperimental (= 0.83.6) - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/inputaccessory (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/inputaccessory (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/iostextinput (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/iostextinput (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/modal (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/modal (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/rncore (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/rncore (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/safeareaview (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/safeareaview (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/scrollview (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/scrollview (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/text (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/switch (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/textinput (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/text (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/components/unimplementedview (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/textinput (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricComponents/textlayoutmanager (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/unimplementedview (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-cxxreact - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-logger + - React-RCTFBReactNativeSpec - React-rendererdebug - React-runtimescheduler - React-utils - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-FabricImage (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - React-FabricComponents/components/virtualview (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - RCTRequired (= 0.79.7) - - RCTTypeSafety (= 0.79.7) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/components/virtualviewexperimental (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricComponents/textlayoutmanager (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-RCTFBReactNativeSpec + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-FabricImage (0.83.6): + - hermes-engine + - RCTRequired (= 0.83.6) + - RCTTypeSafety (= 0.83.6) + - React-Core-prebuilt - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - - React-jsiexecutor (= 0.79.7) + - React-jsiexecutor (= 0.83.6) - React-logger - React-rendererdebug - React-utils - ReactCommon + - ReactNativeDependencies - Yoga - - React-featureflags (0.79.7): - - RCT-Folly (= 2024.11.18.00) - - React-featureflagsnativemodule (0.79.7): + - React-featureflags (0.83.6): + - React-Core-prebuilt + - ReactNativeDependencies + - React-featureflagsnativemodule (0.83.6): - hermes-engine - - RCT-Folly + - React-Core-prebuilt - React-featureflags - - React-hermes - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - React-graphics (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-graphics (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - - React-hermes + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-utils - - React-hermes (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog + - ReactNativeDependencies + - React-hermes (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.7) + - React-Core-prebuilt + - React-cxxreact (= 0.83.6) - React-jsi - - React-jsiexecutor (= 0.79.7) + - React-jsiexecutor (= 0.83.6) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.79.7) + - React-oscompat + - React-perflogger (= 0.83.6) - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.79.7): - - glog + - ReactNativeDependencies + - React-idlecallbacksnativemodule (0.83.6): - hermes-engine - - RCT-Folly - - React-hermes + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec + - React-runtimeexecutor - React-runtimescheduler - ReactCommon/turbomodule/core - - React-ImageManager (0.79.7): - - glog - - RCT-Folly/Fabric + - ReactNativeDependencies + - React-ImageManager (0.83.6): + - React-Core-prebuilt - React-Core/Default - React-debug - React-Fabric - React-graphics - React-rendererdebug - React-utils - - React-jserrorhandler (0.79.7): - - glog + - ReactNativeDependencies + - React-intersectionobservernativemodule (0.83.6): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-Fabric + - React-Fabric/bridging + - React-graphics + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - React-runtimescheduler + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - Yoga + - React-jserrorhandler (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - React-jsi - ReactCommon/turbomodule/bridging - - React-jsi (0.79.7): - - boost - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-jsiexecutor (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.7) - - React-jsi (= 0.79.7) + - ReactNativeDependencies + - React-jsi (0.83.6): + - hermes-engine + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsiexecutor (0.83.6): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-debug + - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-perflogger (= 0.79.7) - - React-jsinspector (0.79.7): - - DoubleConversion - - glog + - React-perflogger + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspector (0.83.6): - hermes-engine - - RCT-Folly + - React-Core-prebuilt - React-featureflags - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork - React-jsinspectortracing - - React-perflogger (= 0.79.7) - - React-runtimeexecutor (= 0.79.7) - - React-jsinspectortracing (0.79.7): - - RCT-Folly - React-oscompat - - React-jsitooling (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact (= 0.79.7) - - React-jsi (= 0.79.7) + - React-perflogger (= 0.83.6) + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsinspectorcdp (0.83.6): + - React-Core-prebuilt + - ReactNativeDependencies + - React-jsinspectornetwork (0.83.6): + - React-Core-prebuilt + - React-jsinspectorcdp + - ReactNativeDependencies + - React-jsinspectortracing (0.83.6): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-jsinspectornetwork + - React-oscompat + - React-timing + - React-utils + - ReactNativeDependencies + - React-jsitooling (0.83.6): + - React-Core-prebuilt + - React-cxxreact (= 0.83.6) + - React-debug + - React-jsi (= 0.83.6) - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - - React-jsitracing (0.79.7): + - React-runtimeexecutor + - React-utils + - ReactNativeDependencies + - React-jsitracing (0.83.6): - React-jsi - - React-logger (0.79.7): - - glog - - React-Mapbuffer (0.79.7): - - glog + - React-logger (0.83.6): + - React-Core-prebuilt + - ReactNativeDependencies + - React-Mapbuffer (0.83.6): + - React-Core-prebuilt - React-debug - - React-microtasksnativemodule (0.79.7): + - ReactNativeDependencies + - React-microtasksnativemodule (0.83.6): - hermes-engine - - RCT-Folly - - React-hermes + - React-Core-prebuilt - React-jsi - React-jsiexecutor - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - - react-native-context-menu-view (1.20.0): + - ReactNativeDependencies + - react-native-context-menu-view (1.21.0): - React - react-native-cookies (6.2.1): - React-Core - react-native-document-picker (10.1.7): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1453,20 +1518,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-image-picker (7.2.3): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1477,23 +1540,21 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-keyboard-controller (1.20.1): - - DoubleConversion - - glog + - react-native-keyboard-controller (1.20.7): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - - react-native-keyboard-controller/common (= 1.20.1) + - react-native-keyboard-controller/common (= 1.20.7) - React-NativeModulesApple - React-RCTFabric - React-renderercss @@ -1502,20 +1563,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-keyboard-controller/common (1.20.1): - - DoubleConversion - - glog + - react-native-keyboard-controller/common (1.20.7): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1526,20 +1585,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - react-native-menu (1.2.4): - - DoubleConversion - - glog + - react-native-menu (2.0.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1550,20 +1607,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-safe-area-context (5.6.2): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - react-native-safe-area-context/common (= 5.6.2) @@ -1576,20 +1631,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-safe-area-context/common (5.6.2): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1600,20 +1653,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-safe-area-context/fabric (5.6.2): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - react-native-safe-area-context/common @@ -1625,24 +1676,22 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-sensitive-info (5.5.8): - React - react-native-sfsymbols (1.2.2): - React - react-native-simple-toast (3.3.2): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1653,21 +1702,19 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Toast (~> 4) - Yoga - react-native-video (6.18.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - react-native-video/Video (= 6.18.0) @@ -1679,20 +1726,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-video/Fabric (6.18.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1703,20 +1748,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-video/Video (6.18.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - react-native-video/Fabric @@ -1728,20 +1771,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - react-native-webview (13.16.0): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -1752,47 +1793,68 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - React-NativeModulesApple (0.79.7): - - glog + - React-NativeModulesApple (0.83.6): - hermes-engine - React-callinvoker - React-Core + - React-Core-prebuilt - React-cxxreact + - React-debug - React-featureflags - - React-hermes - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-runtimeexecutor - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - React-oscompat (0.79.7) - - React-perflogger (0.79.7): - - DoubleConversion - - RCT-Folly (= 2024.11.18.00) - - React-performancetimeline (0.79.7): - - RCT-Folly (= 2024.11.18.00) - - React-cxxreact + - ReactNativeDependencies + - React-networking (0.83.6): + - React-Core-prebuilt + - React-featureflags + - React-jsinspectornetwork + - React-jsinspectortracing + - React-performancetimeline + - React-timing + - ReactNativeDependencies + - React-oscompat (0.83.6) + - React-perflogger (0.83.6): + - React-Core-prebuilt + - ReactNativeDependencies + - React-performancecdpmetrics (0.83.6): + - hermes-engine + - React-Core-prebuilt + - React-jsi + - React-performancetimeline + - React-runtimeexecutor + - React-timing + - ReactNativeDependencies + - React-performancetimeline (0.83.6): + - React-Core-prebuilt - React-featureflags - React-jsinspectortracing - React-perflogger - React-timing - - React-RCTActionSheet (0.79.7): - - React-Core/RCTActionSheetHeaders (= 0.79.7) - - React-RCTAnimation (0.79.7): - - RCT-Folly (= 2024.11.18.00) + - ReactNativeDependencies + - React-RCTActionSheet (0.83.6): + - React-Core/RCTActionSheetHeaders (= 0.83.6) + - React-RCTAnimation (0.83.6): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTAnimationHeaders + - React-featureflags - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTAppDelegate (0.79.7): + - ReactNativeDependencies + - React-RCTAppDelegate (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-CoreModules - React-debug - React-defaultsnativemodule @@ -1810,130 +1872,162 @@ PODS: - React-rendererdebug - React-RuntimeApple - React-RuntimeCore + - React-runtimeexecutor - React-runtimescheduler - React-utils - ReactCommon - - React-RCTBlob (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) + - ReactNativeDependencies + - React-RCTBlob (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) + - React-Core-prebuilt - React-Core/RCTBlobHeaders - React-Core/RCTWebSocket - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-NativeModulesApple - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTFabric (0.79.7): - - glog + - ReactNativeDependencies + - React-RCTFabric (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTSwiftUIWrapper - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricComponents - React-FabricImage - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing + - React-networking + - React-performancecdpmetrics - React-performancetimeline - React-RCTAnimation + - React-RCTFBReactNativeSpec - React-RCTImage - React-RCTText - React-rendererconsistency - React-renderercss - React-rendererdebug + - React-runtimeexecutor - React-runtimescheduler - React-utils + - ReactNativeDependencies - Yoga - - React-RCTFBReactNativeSpec (0.79.7): + - React-RCTFBReactNativeSpec (0.83.6): - hermes-engine - - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core - - React-hermes + - React-Core-prebuilt + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec/components (= 0.83.6) + - ReactCommon + - ReactNativeDependencies + - React-RCTFBReactNativeSpec/components (0.83.6): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics - React-jsi - - React-jsiexecutor - React-NativeModulesApple + - React-rendererdebug + - React-utils - ReactCommon - - React-RCTImage (0.79.7): - - RCT-Folly (= 2024.11.18.00) + - ReactNativeDependencies + - Yoga + - React-RCTImage (0.83.6): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTImageHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - React-RCTNetwork - ReactCommon - - React-RCTLinking (0.79.7): - - React-Core/RCTLinkingHeaders (= 0.79.7) - - React-jsi (= 0.79.7) + - ReactNativeDependencies + - React-RCTLinking (0.83.6): + - React-Core/RCTLinkingHeaders (= 0.83.6) + - React-jsi (= 0.83.6) - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - ReactCommon/turbomodule/core (= 0.79.7) - - React-RCTNetwork (0.79.7): - - RCT-Folly (= 2024.11.18.00) + - ReactCommon/turbomodule/core (= 0.83.6) + - React-RCTNetwork (0.83.6): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTNetworkHeaders + - React-debug + - React-featureflags - React-jsi + - React-jsinspectorcdp + - React-jsinspectornetwork - React-NativeModulesApple + - React-networking - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTRuntime (0.79.7): - - glog + - ReactNativeDependencies + - React-RCTRuntime (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-Core - - React-hermes + - React-Core-prebuilt + - React-debug - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-RuntimeApple - React-RuntimeCore + - React-runtimeexecutor - React-RuntimeHermes - - React-RCTSettings (0.79.7): - - RCT-Folly (= 2024.11.18.00) + - React-utils + - ReactNativeDependencies + - React-RCTSettings (0.83.6): - RCTTypeSafety + - React-Core-prebuilt - React-Core/RCTSettingsHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-RCTText (0.79.7): - - React-Core/RCTTextHeaders (= 0.79.7) + - ReactNativeDependencies + - React-RCTText (0.83.6): + - React-Core/RCTTextHeaders (= 0.83.6) - Yoga - - React-RCTVibration (0.79.7): - - RCT-Folly (= 2024.11.18.00) + - React-RCTVibration (0.83.6): + - React-Core-prebuilt - React-Core/RCTVibrationHeaders - React-jsi - React-NativeModulesApple - React-RCTFBReactNativeSpec - ReactCommon - - React-rendererconsistency (0.79.7) - - React-renderercss (0.79.7): + - ReactNativeDependencies + - React-rendererconsistency (0.83.6) + - React-renderercss (0.83.6): - React-debug - React-utils - - React-rendererdebug (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - RCT-Folly (= 2024.11.18.00) + - React-rendererdebug (0.83.6): + - React-Core-prebuilt - React-debug - - React-rncore (0.79.7) - - React-RuntimeApple (0.79.7): + - ReactNativeDependencies + - React-RuntimeApple (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) - React-callinvoker + - React-Core-prebuilt - React-Core/Default - React-CoreModules - React-cxxreact @@ -1952,14 +2046,13 @@ PODS: - React-RuntimeHermes - React-runtimescheduler - React-utils - - React-RuntimeCore (0.79.7): - - glog + - ReactNativeDependencies + - React-RuntimeCore (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core-prebuilt - React-cxxreact - React-Fabric - React-featureflags - - React-hermes - React-jserrorhandler - React-jsi - React-jsiexecutor @@ -1969,29 +2062,36 @@ PODS: - React-runtimeexecutor - React-runtimescheduler - React-utils - - React-runtimeexecutor (0.79.7): - - React-jsi (= 0.79.7) - - React-RuntimeHermes (0.79.7): + - ReactNativeDependencies + - React-runtimeexecutor (0.83.6): + - React-Core-prebuilt + - React-debug + - React-featureflags + - React-jsi (= 0.83.6) + - React-utils + - ReactNativeDependencies + - React-RuntimeHermes (0.83.6): - hermes-engine - - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core-prebuilt - React-featureflags - React-hermes - React-jsi - React-jsinspector + - React-jsinspectorcdp - React-jsinspectortracing - React-jsitooling - React-jsitracing - React-RuntimeCore + - React-runtimeexecutor - React-utils - - React-runtimescheduler (0.79.7): - - glog + - ReactNativeDependencies + - React-runtimescheduler (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - React-callinvoker + - React-Core-prebuilt - React-cxxreact - React-debug - React-featureflags - - React-hermes - React-jsi - React-jsinspectortracing - React-performancetimeline @@ -2000,30 +2100,39 @@ PODS: - React-runtimeexecutor - React-timing - React-utils - - React-timing (0.79.7) - - React-utils (0.79.7): - - glog + - ReactNativeDependencies + - React-timing (0.83.6): + - React-debug + - React-utils (0.83.6): - hermes-engine - - RCT-Folly (= 2024.11.18.00) + - React-Core-prebuilt - React-debug - - React-hermes - - React-jsi (= 0.79.7) - - ReactAppDependencyProvider (0.79.7): + - React-jsi (= 0.83.6) + - ReactNativeDependencies + - React-webperformancenativemodule (0.83.6): + - hermes-engine + - React-Core-prebuilt + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-performancetimeline + - React-RCTFBReactNativeSpec + - React-runtimeexecutor + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - ReactAppDependencyProvider (0.83.6): - ReactCodegen - - ReactCodegen (0.79.7): - - DoubleConversion - - glog + - ReactCodegen (0.83.6): - hermes-engine - - RCT-Folly - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-FabricImage - React-featureflags - React-graphics - - React-hermes - React-jsi - React-jsiexecutor - React-NativeModulesApple @@ -2032,62 +2141,54 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - ReactCommon (0.79.7): - - ReactCommon/turbomodule (= 0.79.7) - - ReactCommon/turbomodule (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.7) - - React-cxxreact (= 0.79.7) - - React-jsi (= 0.79.7) - - React-logger (= 0.79.7) - - React-perflogger (= 0.79.7) - - ReactCommon/turbomodule/bridging (= 0.79.7) - - ReactCommon/turbomodule/core (= 0.79.7) - - ReactCommon/turbomodule/bridging (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.7) - - React-cxxreact (= 0.79.7) - - React-jsi (= 0.79.7) - - React-logger (= 0.79.7) - - React-perflogger (= 0.79.7) - - ReactCommon/turbomodule/core (0.79.7): - - DoubleConversion - - fast_float (= 6.1.4) - - fmt (= 11.0.2) - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - React-callinvoker (= 0.79.7) - - React-cxxreact (= 0.79.7) - - React-debug (= 0.79.7) - - React-featureflags (= 0.79.7) - - React-jsi (= 0.79.7) - - React-logger (= 0.79.7) - - React-perflogger (= 0.79.7) - - React-utils (= 0.79.7) - - RNCAsyncStorage (2.1.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.11.18.00) - - RCTRequired - - RCTTypeSafety - - React-Core + - ReactNativeDependencies + - ReactCommon (0.83.6): + - React-Core-prebuilt + - ReactCommon/turbomodule (= 0.83.6) + - ReactNativeDependencies + - ReactCommon/turbomodule (0.83.6): + - hermes-engine + - React-callinvoker (= 0.83.6) + - React-Core-prebuilt + - React-cxxreact (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - ReactCommon/turbomodule/bridging (= 0.83.6) + - ReactCommon/turbomodule/core (= 0.83.6) + - ReactNativeDependencies + - ReactCommon/turbomodule/bridging (0.83.6): + - hermes-engine + - React-callinvoker (= 0.83.6) + - React-Core-prebuilt + - React-cxxreact (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - ReactNativeDependencies + - ReactCommon/turbomodule/core (0.83.6): + - hermes-engine + - React-callinvoker (= 0.83.6) + - React-Core-prebuilt + - React-cxxreact (= 0.83.6) + - React-debug (= 0.83.6) + - React-featureflags (= 0.83.6) + - React-jsi (= 0.83.6) + - React-logger (= 0.83.6) + - React-perflogger (= 0.83.6) + - React-utils (= 0.83.6) + - ReactNativeDependencies + - ReactNativeDependencies (0.83.6) + - RNCAsyncStorage (2.2.0): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2098,20 +2199,18 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - RNCClipboard (1.16.3): - - DoubleConversion - - glog - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2122,26 +2221,24 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNCPushNotificationIOS (1.11.0): + - RNCPushNotificationIOS (1.12.0): - React-Core - RNDeviceInfo (8.7.1): - React-Core - RNFS (2.20.0): - React-Core - - RNGestureHandler (2.24.0): - - DoubleConversion - - glog + - RNGestureHandler (2.30.1): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple @@ -2152,15 +2249,14 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNReanimated (3.17.5): - - DoubleConversion - - glog + - RNReanimated (4.2.1): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2176,17 +2272,16 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.17.5) - - RNReanimated/worklets (= 3.17.5) + - ReactNativeDependencies + - RNReanimated/reanimated (= 4.2.1) + - RNWorklets - Yoga - - RNReanimated/reanimated (3.17.5): - - DoubleConversion - - glog + - RNReanimated/reanimated (4.2.1): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2202,16 +2297,16 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.17.5) + - ReactNativeDependencies + - RNReanimated/reanimated/apple (= 4.2.1) + - RNWorklets - Yoga - - RNReanimated/reanimated/apple (3.17.5): - - DoubleConversion - - glog + - RNReanimated/reanimated/apple (4.2.1): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2227,90 +2322,109 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNWorklets - Yoga - - RNReanimated/worklets (3.17.5): - - DoubleConversion - - glog + - RNScreens (4.23.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNReanimated/worklets/apple (= 3.17.5) + - ReactNativeDependencies + - RNScreens/common (= 4.23.0) - Yoga - - RNReanimated/worklets/apple (3.17.5): - - DoubleConversion - - glog + - RNScreens/common (4.23.0): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple - React-RCTFabric + - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - - RNScreens (4.18.0): - - DoubleConversion - - glog + - RNShareMenu (6.0.0): + - React + - RNSVG (15.15.3): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNSVG/common (= 15.15.3) + - Yoga + - RNSVG/common (15.15.3): + - hermes-engine + - RCTRequired + - RCTTypeSafety + - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags - React-graphics - - React-hermes - React-ImageManager - React-jsi - React-NativeModulesApple - React-RCTFabric - - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNScreens/common (= 4.18.0) + - ReactNativeDependencies - Yoga - - RNScreens/common (4.18.0): - - DoubleConversion - - glog + - RNWorklets (0.7.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2320,24 +2434,21 @@ PODS: - React-jsi - React-NativeModulesApple - React-RCTFabric - - React-RCTImage - React-renderercss - React-rendererdebug - React-utils - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies + - RNWorklets/worklets (= 0.7.4) - Yoga - - RNShareMenu (6.0.0): - - React - - RNSVG (15.11.2): - - DoubleConversion - - glog + - RNWorklets/worklets (0.7.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2353,16 +2464,15 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.11.2) + - ReactNativeDependencies + - RNWorklets/worklets/apple (= 0.7.4) - Yoga - - RNSVG/common (15.11.2): - - DoubleConversion - - glog + - RNWorklets/worklets/apple (0.7.4): - hermes-engine - - RCT-Folly (= 2024.11.18.00) - RCTRequired - RCTTypeSafety - React-Core + - React-Core-prebuilt - React-debug - React-Fabric - React-featureflags @@ -2378,6 +2488,7 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core + - ReactNativeDependencies - Yoga - SDWebImage (5.21.2): - SDWebImage/Core (= 5.21.2) @@ -2390,38 +2501,34 @@ PODS: - SDWebImageWebPCoder (0.14.6): - libwebp (~> 1.0) - SDWebImage/Core (~> 5.17) - - SocketRocket (0.7.1) - Toast (4.1.1) - Yoga (0.0.0) DEPENDENCIES: - - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) - - EXApplication (from `../node_modules/expo-application/ios`) - EXConstants (from `../node_modules/expo-constants/ios`) - - EXNotifications (from `../node_modules/expo-notifications/ios`) - Expo (from `../node_modules/expo`) - ExpoAsset (from `../node_modules/expo-asset/ios`) + - "ExpoDomWebView (from `../node_modules/@expo/dom-webview/ios`)" - ExpoFileSystem (from `../node_modules/expo-file-system/ios`) - ExpoFont (from `../node_modules/expo-font/ios`) - ExpoImage (from `../node_modules/expo-image/ios`) - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`) + - "ExpoLogBox (from `../node_modules/@expo/log-box`)" - ExpoModulesCore (from `../node_modules/expo-modules-core`) + - ExpoModulesJSI (from `../node_modules/expo-modules-core`) - ExpoSecureStore (from `../node_modules/expo-secure-store/ios`) - ExpoWebBrowser (from `../node_modules/expo-web-browser/ios`) - - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) - - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTSwiftUI (from `../node_modules/react-native/ReactApple/RCTSwiftUI`) + - RCTSwiftUIWrapper (from `../node_modules/react-native/ReactApple/RCTSwiftUIWrapper`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) - React (from `../node_modules/react-native/`) - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Core (from `../node_modules/react-native/`) + - React-Core-prebuilt (from `../node_modules/react-native/React-Core-prebuilt.podspec`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) @@ -2437,10 +2544,13 @@ DEPENDENCIES: - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) - React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) + - React-intersectionobservernativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver`) - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) + - React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) + - React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`) - React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) - React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`) - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) @@ -2460,8 +2570,10 @@ DEPENDENCIES: - react-native-video (from `../node_modules/react-native-video`) - react-native-webview (from `../node_modules/react-native-webview`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-networking (from `../node_modules/react-native/ReactCommon/react/networking`) - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancecdpmetrics (from `../node_modules/react-native/ReactCommon/react/performance/cdpmetrics`) - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) @@ -2479,7 +2591,6 @@ DEPENDENCIES: - React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`) - React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`) - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-rncore (from `../node_modules/react-native/ReactCommon`) - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) @@ -2487,9 +2598,11 @@ DEPENDENCIES: - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - React-timing (from `../node_modules/react-native/ReactCommon/react/timing`) - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - - ReactAppDependencyProvider (from `build/generated/ios`) - - ReactCodegen (from `build/generated/ios`) + - React-webperformancenativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/webperformance`) + - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) + - ReactCodegen (from `build/generated/ios/ReactCodegen`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - ReactNativeDependencies (from `../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)" - "RNCPushNotificationIOS (from `../node_modules/@react-native-community/push-notification-ios`)" @@ -2500,6 +2613,7 @@ DEPENDENCIES: - RNScreens (from `../node_modules/react-native-screens`) - RNShareMenu (from `../node_modules/react-native-share-menu`) - RNSVG (from `../node_modules/react-native-svg`) + - RNWorklets (from `../node_modules/react-native-worklets`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) SPEC REPOS: @@ -2511,24 +2625,17 @@ SPEC REPOS: - SDWebImageAVIFCoder - SDWebImageSVGCoder - SDWebImageWebPCoder - - SocketRocket - Toast EXTERNAL SOURCES: - boost: - :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" - DoubleConversion: - :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" - EXApplication: - :path: "../node_modules/expo-application/ios" EXConstants: :path: "../node_modules/expo-constants/ios" - EXNotifications: - :path: "../node_modules/expo-notifications/ios" Expo: :path: "../node_modules/expo" ExpoAsset: :path: "../node_modules/expo-asset/ios" + ExpoDomWebView: + :path: "../node_modules/@expo/dom-webview/ios" ExpoFileSystem: :path: "../node_modules/expo-file-system/ios" ExpoFont: @@ -2537,29 +2644,29 @@ EXTERNAL SOURCES: :path: "../node_modules/expo-image/ios" ExpoKeepAwake: :path: "../node_modules/expo-keep-awake/ios" + ExpoLogBox: + :path: "../node_modules/@expo/log-box" ExpoModulesCore: :path: "../node_modules/expo-modules-core" + ExpoModulesJSI: + :path: "../node_modules/expo-modules-core" ExpoSecureStore: :path: "../node_modules/expo-secure-store/ios" ExpoWebBrowser: :path: "../node_modules/expo-web-browser/ios" - fast_float: - :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" - fmt: - :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" - glog: - :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" hermes-engine: :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b - RCT-Folly: - :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + :tag: hermes-v0.14.1 RCTDeprecation: :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" RCTRequired: :path: "../node_modules/react-native/Libraries/Required" + RCTSwiftUI: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUI" + RCTSwiftUIWrapper: + :path: "../node_modules/react-native/ReactApple/RCTSwiftUIWrapper" RCTTypeSafety: :path: "../node_modules/react-native/Libraries/TypeSafety" React: @@ -2568,6 +2675,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/callinvoker" React-Core: :path: "../node_modules/react-native/" + React-Core-prebuilt: + :podspec: "../node_modules/react-native/React-Core-prebuilt.podspec" React-CoreModules: :path: "../node_modules/react-native/React/CoreModules" React-cxxreact: @@ -2596,6 +2705,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" React-ImageManager: :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-intersectionobservernativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver" React-jserrorhandler: :path: "../node_modules/react-native/ReactCommon/jserrorhandler" React-jsi: @@ -2604,6 +2715,10 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/jsiexecutor" React-jsinspector: :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsinspectorcdp: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" + React-jsinspectornetwork: + :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network" React-jsinspectortracing: :path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" React-jsitooling: @@ -2642,10 +2757,14 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-webview" React-NativeModulesApple: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-networking: + :path: "../node_modules/react-native/ReactCommon/react/networking" React-oscompat: :path: "../node_modules/react-native/ReactCommon/oscompat" React-perflogger: :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancecdpmetrics: + :path: "../node_modules/react-native/ReactCommon/react/performance/cdpmetrics" React-performancetimeline: :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" React-RCTActionSheet: @@ -2680,8 +2799,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/renderer/css" React-rendererdebug: :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" - React-rncore: - :path: "../node_modules/react-native/ReactCommon" React-RuntimeApple: :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" React-RuntimeCore: @@ -2696,12 +2813,16 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/react/timing" React-utils: :path: "../node_modules/react-native/ReactCommon/react/utils" + React-webperformancenativemodule: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" ReactAppDependencyProvider: - :path: build/generated/ios + :path: build/generated/ios/ReactAppDependencyProvider ReactCodegen: - :path: build/generated/ios + :path: build/generated/ios/ReactCodegen ReactCommon: :path: "../node_modules/react-native/ReactCommon" + ReactNativeDependencies: + :podspec: "../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" RNCAsyncStorage: :path: "../node_modules/@react-native-async-storage/async-storage" RNCClipboard: @@ -2722,124 +2843,130 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-share-menu" RNSVG: :path: "../node_modules/react-native-svg" + RNWorklets: + :path: "../node_modules/react-native-worklets" Yoga: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - boost: 1dca942403ed9342f98334bf4c3621f011aa7946 - DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 - EXApplication: 1e06972201838375ca1ec1ba34d586a98a5dc718 - EXConstants: 98bcf0f22b820f9b28f9fee55ff2daededadd2f8 - EXNotifications: be5e949edf1d60b70e77178b81aa505298fadd07 - Expo: d68c92f4bee50a21f0f0d7d2481dd6dbbd51e82b - ExpoAsset: ef06e880126c375f580d4923fdd1cdf4ee6ee7d6 - ExpoFileSystem: 7f92f7be2f5c5ed40a7c9efc8fa30821181d9d63 - ExpoFont: cf508bc2e6b70871e05386d71cab927c8524cc8e - ExpoImage: b0b4a838c62bb9d5438bb475cccc85619a5f59dc - ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7 - ExpoModulesCore: 00a1b5c73248465bd0b93f59f8538c4573dac579 - ExpoSecureStore: 3f1b632d6d40bcc62b4983ef9199cd079592a50a - ExpoWebBrowser: dc39a88485f007e61a3dff05d6a75f22ab4a2e92 - fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 - FBLazyVector: b60fe06f0f15b7d7408f169442176e69e8eeacde - fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 - glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a - hermes-engine: 13c84524b3b6e884b2cf3b3b1e002ffd147d88a3 + EXConstants: 5caf448ff399f60be9d1053e77aed32e39411900 + Expo: bfedba58da14bf45546ae57e6a5bd5152a1546b4 + ExpoAsset: f56ed740b6a127da2bfd90832cf688ae309d4410 + ExpoDomWebView: 2b2fbd9a07de8790569257cbf9dfdaa31cf95c70 + ExpoFileSystem: a0e4a5a09c9c4f84338289b273a172609452dec9 + ExpoFont: cdd7a1d574a376fa003c713eff49e0a4df8672c7 + ExpoImage: bd9e9c5bc4eff7a6883339be305f8b0bb5a0cf1c + ExpoKeepAwake: a1baf9810a2dee1905aa9bdd336852598f7220e9 + ExpoLogBox: 617da77cbc083627692b2ea050a3666808aef2cd + ExpoModulesCore: 121f306333afed9321507d99a9804fe5e795c03a + ExpoModulesJSI: 24121c9a2f32d5f6b6ca2f7ff54925be716d5841 + ExpoSecureStore: 38954f6bcef1287aa04c06fba3b86e8af3291ccd + ExpoWebBrowser: f88a3ba50a025b673236a46d2654a49b985953d6 + FBLazyVector: 427fa1856a481856091061293ce865a75aa4f20f + hermes-engine: 005e88ab86167d754a6dd6ccfef17c56bc4682bf libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7 libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 - RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 - RCTDeprecation: b9b1716eec53aaeaa859aa45e27de7b615cff732 - RCTRequired: 862acb469086f601f81aab298e00c2a13d572099 - RCTTypeSafety: 45120b9028ec6819266f3ef7a6b8e8a9f0a083d4 - React: 49e89943d7b1bc95c5895a05c6cf106ba112d037 - React-callinvoker: 9baafac613e363728c47ceaf65b9597bd1b96df0 - React-Core: 2f642fff28911adf30dd5169a7d9d2b95dc59bc9 - React-CoreModules: a499af0e4a8dfa78cbc04c131b59fa3286210148 - React-cxxreact: 1a485bb66f4bdde62f89eb0e5db1262182fc40e0 - React-debug: 40119ee63d9fb04f8b11d460c3c30b5997d9d737 - React-defaultsnativemodule: d578aae775984b79f126a0ffd8481b70c0f145fc - React-domnativemodule: 2351486bd32ead37c242b00a71cbdff8dabb274c - React-Fabric: 3e4c67dd7918274fe00fdc34a56696095e4d83f0 - React-FabricComponents: c82dfc3d8e1faf5cd87b08f5f9e2be0fe9b775f3 - React-FabricImage: a296eafd939fb33e0acf09d33239408fe4624582 - React-featureflags: 3fdf55dee69c3e165411fbde4f9f3acb9e428dfd - React-featureflagsnativemodule: 1139ddc9fc4c703ef9165a50c83cdca710baa674 - React-graphics: 4d1c605d894e9c9a887bb6934d9cca89d2ff36f5 - React-hermes: 59edcac48ec38831b40cf28ed34b6d4d735cbdd3 - React-idlecallbacksnativemodule: 23c6b73801992033086c2e8b9519bbf6aaf84165 - React-ImageManager: 2b2c8c39cc29e55a59dc1a0a9427ec7f89aae02b - React-jserrorhandler: 7d2f6eb3821818dc914a278f06586f047d623d72 - React-jsi: f6fee849355b8819936b02d5c5b23a55a3d69540 - React-jsiexecutor: cd6fd873482d7183206eb612ce362d02c6fb8556 - React-jsinspector: d2b58ae4a2fa080b3fcc4a5a81dfbd7727654a6d - React-jsinspectortracing: d3c7d7ec87d24f4c3832ecf141afcbf8844eee80 - React-jsitooling: bfde104a6ea4540830a246c6ffd9f1d07bf677b0 - React-jsitracing: 826dc37b6d98de03e0e64d8d6017b40af766dbf0 - React-logger: fbdc0814b62fefa412a90af7cacc666387f1bc9a - React-Mapbuffer: cfe4726ba1929b9dab4645c78376a9165375d62f - React-microtasksnativemodule: c99b8f1240609566de105b73f2569c0f22880ee1 - react-native-context-menu-view: 418877dcac6add4abba8fc2ee92c39f05b763f3a + RCTDeprecation: 9502b5eb8e3c9eb75ff5a333b2c591bab9d91e28 + RCTRequired: 0268a5d86aef1defea2e04289d74fdf3570197c1 + RCTSwiftUI: cff211c5e4d94e491dda240d663b8effd25296d7 + RCTSwiftUIWrapper: b731e4d3257895dfcc4bbe2dc3ae24249cd55f6e + RCTTypeSafety: c6ed564d0d54c9a01be7db724fbc753eb77b3dc1 + React: 9b033c7a99e1c8eec40960b6b2e6844e011e8bd1 + React-callinvoker: f64c8d57f45173835b6b9891cda27f1625551972 + React-Core: 341863a2597c4a2320f916b4232d280cb8a28e4b + React-Core-prebuilt: 09c1c72e1af4819464f8c12c8663e6c9482777df + React-CoreModules: 9370769c9b2b1732c58960687f4d50d9d3510efc + React-cxxreact: 41ae74bd9eab80af9c5da6a9b4934eb97e2c7569 + React-debug: eb0f19ff879ad3870dc760b6c21ad56cbb3e4b98 + React-defaultsnativemodule: aa25696c7d18115bae062629c2183c267d96e017 + React-domnativemodule: 016da08b63d25b2131eda8a3bb4836929a062dd7 + React-Fabric: 179061816251452fa8ec7dfe7a16df1d06e12a59 + React-FabricComponents: 3ea07086a38f4ff29aac97d2a99815e33ac71ffa + React-FabricImage: a55a5318d125f25ac9828e0465275ad081303720 + React-featureflags: b0327e47f6e97ae98bd844ba6ebf97d62f07f5ff + React-featureflagsnativemodule: d94042d8fa774a4e162627d77eadd79861771865 + React-graphics: 7eed2e1c4736871456c2b05926bc334e533f89eb + React-hermes: feafb2b23ca8a4c5a1892681ca12970c0861b2f5 + React-idlecallbacksnativemodule: 05aeb9baf9b55d3a61dd0650f17ac5a609107578 + React-ImageManager: 8dfcfe118282f2a0b3d279350d0f97a63e6b4034 + React-intersectionobservernativemodule: 2fdf4760cf45f6303427d54a006adb0983c6719d + React-jserrorhandler: 375f46da481dea08283cc395627545e113217efa + React-jsi: 98e544352782dad976e1bb9e428e572f5e618978 + React-jsiexecutor: cd242143c5973359a28edd6accfdfe8b281fd07d + React-jsinspector: bada2d53d66ca027cedab80327262df3e4686ef4 + React-jsinspectorcdp: 1f345e95c747c4abc0786193294b5d4ec8deae68 + React-jsinspectornetwork: f1191804c726ca36fd1d32a6b4806a6e6994183a + React-jsinspectortracing: 298ed7d8fb5fa6f0d78c5d13d0566db71847a5fd + React-jsitooling: d108a612810309154369fc74b89caa8793506485 + React-jsitracing: 80caa0cbcff315e795d7f6cc013530367871a649 + React-logger: 702a49dadb10a6bd63d56b297c3350b5ea552141 + React-Mapbuffer: bcd9f00a498b2981c7b390f00fd2b7cd6e0ead29 + React-microtasksnativemodule: 203b41906d627dac7d697bccba6137b630951fae + react-native-context-menu-view: da39a4612c1294d651907162529cfba8421e9b89 react-native-cookies: d648ab7025833b977c0b19e142503034f5f29411 - react-native-document-picker: 52817f2ac5174b08fb218dedb00440787e315936 - react-native-image-picker: 8a3f16000e794f5381a7fe47bb48fd8d06741e47 - react-native-keyboard-controller: 0faec0497327d901a610bd3f5810525a41a17bf1 - react-native-menu: 9efed55ad478c20b85bbd5c376f15b2cc5e41181 - react-native-safe-area-context: 0b8555c40461feb7198e999912a3446602e7c601 + react-native-document-picker: 4aa06b45d0f6dfc7fac5bcb5d1cee4f45af5d68a + react-native-image-picker: 168d6972e50ea848defe4ac4c222faa9bc52aea0 + react-native-keyboard-controller: c872321fc580f8d815e9e2ad5558b24c26c18b4f + react-native-menu: 2de122c54dc10056932c0c0f73b82adfa4231faf + react-native-safe-area-context: 37e680fc4cace3c0030ee46e8987d24f5d3bdab2 react-native-sensitive-info: 31674faa5e17977b394fb67986c35ef94f8ffe81 react-native-sfsymbols: 3309f24c98d32705568c84b714268f3ec62017c7 - react-native-simple-toast: c441c833fe4c18473c09fd3b5789f0b279dd074d - react-native-video: 1f5605e948f042fa137f0b2c97f5776675952783 - react-native-webview: 1d8659a52cb8b8504f6c965555d1b27bdd313880 - React-NativeModulesApple: 74051ff264ce0b89ac799b56314f8f440a95ee4d - React-oscompat: 0047f0ce53a328ce225777a6c617970556602c7c - React-perflogger: bf00d816c3c3ad91658b44f93ce9ee343b4c70df - React-performancetimeline: 75139687f2db7ca68fd0377466949af0b3408995 - React-RCTActionSheet: 9b3b04bbe75241c964d59a3ec18716d0bec22b2c - React-RCTAnimation: 2ffefa3b11df9aa1248182fac5b74e6a9b5ebd21 - React-RCTAppDelegate: 535dd2b407b204bbdd0c46d4c7050ee1a28fa6f9 - React-RCTBlob: 3cf08a694a3f7b082e23717c7587b8d914685582 - React-RCTFabric: 2026fe43aa1142896e7e68237f6e88e283f8cab3 - React-RCTFBReactNativeSpec: 43cea3b898e0e7e81abfeafd2dd4084dd8afe662 - React-RCTImage: 4eaca67175ed2a33d39eeb8bad0e724c849bdc11 - React-RCTLinking: 5133d7bf648707bc3fb65fb7ab3cfa7f445e9893 - React-RCTNetwork: 708cf70b59721a23cc362cde08dd204375c9d0ac - React-RCTRuntime: b361aa130a54eeb9bd3129fe0335513c981353b3 - React-RCTSettings: 6d413683ae5a36e80c7965f1ff8efa893b211a17 - React-RCTText: 0bd1e63583ba3dab0358f62ade056732b76463f8 - React-RCTVibration: bab25bb8bc2f017e4729deb59d26bb32240b16db - React-rendererconsistency: 32ded9b29e3dc4c2607b2c2f774bc16320fbf7ed - React-renderercss: a1e299ffd55c69fbc57e4a77a0e4dbf4a8069ada - React-rendererdebug: b640acffa5b80be66f7c5e463ffef60fa74fbbce - React-rncore: 6faaf52d39dca54cb3e63fd45cd4bd2004bceba7 - React-RuntimeApple: c734fb41922e0d6afbcbf6326b04c41c44d4e166 - React-RuntimeCore: b84b58450e647cb1e912857b81b9761317e29af0 - React-runtimeexecutor: e6aceac245c2e4f0dca15c2c57182d1dabc90e11 - React-RuntimeHermes: 9ae57e883b94d3da384b52ab3e4b22a7ac49d639 - React-runtimescheduler: e7a8619f43121a426f1ea44a6a76b22259bc56cc - React-timing: 10c2421a49f1c2906d6bb95027248a4543ac113f - React-utils: 9ec29e69f3e6347a4c93745f84c2a214b5b1ce64 - ReactAppDependencyProvider: b203bace11326361b7f0513b3f5854cd340aa929 - ReactCodegen: 6a29ad4365aeeceecb951cfd6546a99ce617cc50 - ReactCommon: 4e460daed3ccb6af9e3de3176920362d8b888a17 - RNCAsyncStorage: 39c42c1e478e1f5166d1db52b5055e090e85ad66 - RNCClipboard: ea6045252d5c0753cf17f62290f647dc0096f6ac - RNCPushNotificationIOS: 6c4ca3388c7434e4a662b92e4dfeeee858e6f440 + react-native-simple-toast: ff99357a514443f8140527b0698bced724cf99a9 + react-native-video: f5982e21efab0dc356d92541a8a9e19581307f58 + react-native-webview: 3e303e80cadb5f17118c8c1502aa398e9287e415 + React-NativeModulesApple: 9068613f7650828eed29ead6fc0d0a1620117e6a + React-networking: 233dd85e1b890ca191f64f0896153165571b3039 + React-oscompat: 05afae2c7689405dbb4f6458110d501d55357980 + React-perflogger: e3b6c4e302c1db7ef30ea2484d22350cb91ed209 + React-performancecdpmetrics: 78d0eea925c56b851ffc62377ed2c55be985a89b + React-performancetimeline: 0dd54019ec9fe7de84bfb1fc8a9ede032af8a7e9 + React-RCTActionSheet: 6905f5568a98e1466071904ecce56f412477276b + React-RCTAnimation: 2296d52d6ea82e69c5019b8def1e7fd6c2adbeed + React-RCTAppDelegate: 1fe1d13018c2f556b583819219f7de73d5b70a68 + React-RCTBlob: fa1130cb4e2f880ddc6cd910543d1e634330ee72 + React-RCTFabric: 12abb4c93fac4af6a9de3fc6676a6263720b7f9e + React-RCTFBReactNativeSpec: 6e025ccbdb0d36a7ee57d79863da9a5b0d4a1c6d + React-RCTImage: cdae5d3d50e30ff8eb587134a87f742d37bc795a + React-RCTLinking: eeb33d8033a41c0ebab879110063a25f1a282f45 + React-RCTNetwork: 066703b5cc088bd682f748a0d6b0fe7fbabc898f + React-RCTRuntime: ec68db9d8ab02e031053be5a6624be8018f79876 + React-RCTSettings: 5fc7087bc8fd37c43f727ad7840d9014fb14625b + React-RCTText: 3e79e3df3a37e7ecf75b0a19815b8031531bfb06 + React-RCTVibration: bfbc37851c3fb413ca206d768c1745fb9fce7cc4 + React-rendererconsistency: ecc195511eaba84d5c9f3a9ef92f1c3942b2c825 + React-renderercss: c72c11962925fbcad46ee6dc30ea04667f4ed089 + React-rendererdebug: ea9f3d3c2bc5bdd5ee2d8e3ebc2abc72c27698ab + React-RuntimeApple: 1413c7dad511cea861046a1e5150bf0ae9f0c5c7 + React-RuntimeCore: 337347732af37d78e93bbcc619ce973224a98eb9 + React-runtimeexecutor: 096e0b91e643b6ed51c206dcfa4b9657eeadf7dc + React-RuntimeHermes: 44accf583d9d3aba9be9b9dbeef3e80504e215a3 + React-runtimescheduler: c4b30a7b110b377f3b59b78ef1b78dba997614c6 + React-timing: 84de84d0ad5b053a07d58be44a6f4913882759c2 + React-utils: f1ec2d55598341eae23adcc8d946e9de5d6bd789 + React-webperformancenativemodule: a9bba1ed256de5fb6607a038f37e2466e0f01fbf + ReactAppDependencyProvider: 3ec8fc5d32ad422f5b805523a5a5ea5556d8b3a2 + ReactCodegen: 169fa6c4ad3c3065f98fa2364bf95e9a21c3afec + ReactCommon: ba28cd4e7d9e24014d2772a80e32da020c732b00 + ReactNativeDependencies: 1b6406c8f01077c05d4896bf0ca80ec47ad45836 + RNCAsyncStorage: 3a4f5e2777dae1688b781a487923a08569e27fe4 + RNCClipboard: 88d7eeb555d1183915f0885bdbc5c97eb6f7f3ba + RNCPushNotificationIOS: 85957a0534fd1309b4c028ccbe5b1baf9ab5cf57 RNDeviceInfo: d3e91ffb33ee97a7982108476edb68cb3672efa6 RNFS: 89de7d7f4c0f6bafa05343c578f61118c8282ed8 - RNGestureHandler: 7d0931a61d7ba0259f32db0ba7d0963c3ed15d2b - RNReanimated: 2313402fe27fecb7237619e9c6fcee3177f08a65 - RNScreens: f38464ec1e83bda5820c3b05ccf4908e3841c5cc + RNGestureHandler: 0ea8153746a92b3744d4eaadade647debedf646e + RNReanimated: 86e5991396f1aa514db90d6c79d4c3e37a37bb10 + RNScreens: 14243fa0d9842ffa7f8bb2d00b6c3cfd3ca817e8 RNShareMenu: e1cdfa3b9af89416afc75a80377cfd0de4f30ded - RNSVG: 794f269526df9ddc1f79b3d1a202b619df0368e3 + RNSVG: 0bd149b873018bc6e0e3321e2f6435bdba294460 + RNWorklets: 5eddf924d11308d62920405addeddc3dfe1daaaa SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a SDWebImageAVIFCoder: afe194a084e851f70228e4be35ef651df0fc5c57 SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e - Yoga: 9663a18d096f7f7e17a535cf00849db756709955 + Yoga: e41d64347f52d634dd8c2f6bac33f95081959fd3 -PODFILE CHECKSUM: 101be349ab1d704481c999dd0f31cc3ca05df79e +PODFILE CHECKSUM: b7b0b21e39ec98e457fc86268586d1a897a022df COCOAPODS: 1.15.2 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy index 49b8ded2..5bb83c5d 100644 --- a/ios/PrivacyInfo.xcprivacy +++ b/ios/PrivacyInfo.xcprivacy @@ -6,20 +6,20 @@ NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPICategoryUserDefaults NSPrivacyAccessedAPITypeReasons - C617.1 - 0A2A.1 - 3B52.1 + CA92.1 NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPICategoryFileTimestamp NSPrivacyAccessedAPITypeReasons - CA92.1 + 0A2A.1 + 3B52.1 + C617.1 diff --git a/metro.config.js b/metro.config.js index ad594534..b512365d 100644 --- a/metro.config.js +++ b/metro.config.js @@ -1,11 +1,14 @@ -const { getDefaultConfig } = require('expo/metro-config'); -const { mergeConfig } = require('@react-native/metro-config'); +const { + getDefaultConfig: getReactNativeDefaultConfig, + mergeConfig, +} = require('@react-native/metro-config') +const { getDefaultConfig: getExpoDefaultConfig } = require('expo/metro-config') /** * Metro configuration * https://reactnative.dev/docs/metro * - * @type {import('metro-config').MetroConfig} + * @type {import('@react-native/metro-config').MetroConfig} */ const config = { transformer: { @@ -16,6 +19,10 @@ const config = { }, }), }, -}; +} -module.exports = mergeConfig(getDefaultConfig(__dirname), config); +module.exports = mergeConfig( + getReactNativeDefaultConfig(__dirname), + getExpoDefaultConfig(__dirname), + config +) diff --git a/package.json b/package.json index b5c5b880..570c85c5 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "microblog_rn", "version": "0.0.1", "private": true, + "main": "index.js", "scripts": { "android": "react-native run-android", "ios": "react-native run-ios", @@ -16,48 +17,49 @@ }, "dependencies": { "@likashefqet/react-native-image-zoom": "likashefqet/react-native-image-zoom", - "@react-native-async-storage/async-storage": "2.1.2", + "@react-native-async-storage/async-storage": "2.2.0", "@react-native-clipboard/clipboard": "^1.16.3", - "@react-native-community/push-notification-ios": "^1.11.0", + "@react-native-community/push-notification-ios": "^1.12.0", "@react-native-cookies/cookies": "^6.2.1", "@react-native-documents/picker": "^10.1.7", - "@react-native-menu/menu": "^1.2.4", + "@react-native-menu/menu": "^2.0.0", "@react-navigation/bottom-tabs": "^7.8.8", "@react-navigation/native": "^7.1.22", "@react-navigation/native-stack": "^7.8.2", "@xmldom/xmldom": "^0.9.8", "axios": "^0.22.0", - "expo": "~53.0.24", - "expo-image": "~2.4.1", - "expo-secure-store": "~14.2.4", - "expo-web-browser": "~14.2.0", + "expo": "~55.0.17", + "expo-image": "~55.0.9", + "expo-secure-store": "~55.0.13", + "expo-web-browser": "~55.0.14", "fast-xml-parser": "^5.3.2", "markdown-it": "^14.1.0", "mobx": "^6.15.0", "mobx-react": "^7.6.0", "mobx-state-tree": "^7.0.2", - "react": "19.0.0", - "react-native": "0.79.7", + "react": "19.2.0", + "react-native": "0.83.6", "react-native-actions-sheet": "^0.9.8", - "react-native-context-menu-view": "^1.20.0", + "react-native-context-menu-view": "^1.21.0", "react-native-device-info": "^8.7.1", "react-native-fs": "^2.20.0", - "react-native-gesture-handler": "~2.24.0", + "react-native-gesture-handler": "~2.30.0", "react-native-hyperlink": "^0.0.22", "react-native-image-picker": "7.2.3", - "react-native-keyboard-controller": "^1.20.1", + "react-native-keyboard-controller": "1.20.7", "react-native-push-notification": "^8.1.1", - "react-native-reanimated": "~3.17.5", - "react-native-safe-area-context": "^5.6.2", - "react-native-screens": "^4.18.0", + "react-native-reanimated": "4.2.1", + "react-native-safe-area-context": "~5.6.2", + "react-native-screens": "~4.23.0", "react-native-sensitive-info": "5.5.8", "react-native-sfsymbols": "^1.2.2", "react-native-share-menu": "microdotblog/react-native-share-menu", "react-native-simple-toast": "^3.3.2", - "react-native-svg": "15.11.2", + "react-native-svg": "15.15.3", "react-native-url-polyfill": "^2.0.0", "react-native-video": "^6.18.0", - "react-native-webview": "13.16.0" + "react-native-webview": "13.16.0", + "react-native-worklets": "0.7.4" }, "devDependencies": { "@babel/core": "^7.28.5", @@ -65,36 +67,36 @@ "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/preset-env": "^7.28.5", "@babel/runtime": "^7.28.4", - "@react-native-community/cli": "15.0.1", - "@react-native-community/cli-platform-android": "15.0.1", - "@react-native-community/cli-platform-ios": "15.0.1", + "@react-native-community/cli": "20.0.0", + "@react-native-community/cli-platform-android": "20.0.0", + "@react-native-community/cli-platform-ios": "20.0.0", "@react-native-community/eslint-config": "^3.2.0", - "@react-native/babel-preset": "0.79.7", - "@react-native/eslint-config": "0.79.7", - "@react-native/metro-config": "0.79.7", - "@react-native/typescript-config": "0.79.7", + "@react-native/babel-preset": "0.83.6", + "@react-native/eslint-config": "0.83.6", + "@react-native/metro-config": "0.83.6", + "@react-native/typescript-config": "0.83.6", "@tsconfig/react-native": "^2.0.3", "@types/jest": "^29.5.14", - "@types/react": "~19.0.14", + "@types/react": "^19.2.0", "@types/react-test-renderer": "^19.1.0", "babel-jest": "^29.7.0", "babel-plugin-transform-remove-console": "^6.9.4", - "babel-preset-expo": "~13.0.0", + "babel-preset-expo": "~55.0.18", "eslint": "^8.57.1", "jest": "^29.7.0", "patch-package": "^6.5.1", "postinstall-postinstall": "^2.1.0", "prettier": "2.8.8", - "react-test-renderer": "19.0.0", + "react-test-renderer": "19.2.0", "typescript": "~5.8.3" }, "jest": { "preset": "react-native" }, "engines": { - "node": ">=18" + "node": ">=20.19.4" }, "patchedDependencies": { "react-native-sensitive-info@5.5.8": "patches/react-native-sensitive-info@5.5.8.patch" } -} \ No newline at end of file +} diff --git a/patches/@react-native-cookies+cookies+6.2.1.patch b/patches/@react-native-cookies+cookies+6.2.1.patch new file mode 100644 index 00000000..8d604948 --- /dev/null +++ b/patches/@react-native-cookies+cookies+6.2.1.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/@react-native-cookies/cookies/android/build.gradle b/node_modules/@react-native-cookies/cookies/android/build.gradle +--- a/node_modules/@react-native-cookies/cookies/android/build.gradle ++++ b/node_modules/@react-native-cookies/cookies/android/build.gradle +@@ -31,7 +31,7 @@ buildscript { + if (project == rootProject) { + repositories { + google() +- jcenter() ++ mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.3' +@@ -67,7 +67,7 @@ repositories { + url "$rootDir/../node_modules/jsc-android/dist" + } + google() +- jcenter() ++ mavenCentral() + } + + dependencies { diff --git a/patches/react-native-push-notification+8.1.1.patch b/patches/react-native-push-notification+8.1.1.patch new file mode 100644 index 00000000..fee83136 --- /dev/null +++ b/patches/react-native-push-notification+8.1.1.patch @@ -0,0 +1,18 @@ +diff --git a/node_modules/react-native-push-notification/android/build.gradle b/node_modules/react-native-push-notification/android/build.gradle +--- a/node_modules/react-native-push-notification/android/build.gradle ++++ b/node_modules/react-native-push-notification/android/build.gradle +@@ -2,7 +2,6 @@ buildscript { + repositories { + mavenCentral() + google() +- jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.2.0' +@@ -13,7 +12,6 @@ allprojects { + repositories { + mavenCentral() + google() +- jcenter() + } + } From 6f80e6b912795d45e3a45d9c7058a0dd72e652b3 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:25:01 +0200 Subject: [PATCH 031/177] Patch hyperlink key props. --- bun.lockb | Bin 804496 -> 804568 bytes package.json | 1 + patches/react-native-hyperlink@0.0.22.patch | 98 ++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 patches/react-native-hyperlink@0.0.22.patch diff --git a/bun.lockb b/bun.lockb index 66b9ca5f223be9a7a48d58d0a7c8f36d1cf0a97a..cd1261465231f0c70911003230c5e954268c95c1 100755 GIT binary patch delta 167 zcmbQxYj~sAaDpGBN27nMKVz#uQ>#C7t3OMtKWnQ$TdO~Nt3St9e@@32jE(IRUvL63 z*Y=4oxR1tg6eN};XQUSEPY-y@DaP(#pl6_GWHdd%l}C*8fGZCJ2wa$+@5-Yl{m`-H z^QsGPCYxOsF|_o0F-^h^BJJVEGo9xko5b|Pt~|C9^J177v>6y0z&e4%Hk&UF)5TAi KPv0oYIspL8^EKxH delta 126 zcmcc7Yd8Uj{1_P;{agJRTm6|@{h3?+Sz7&BTm9Ku{n=anIkx(9I=)~GYoGXn6NtIC zPkh0BG)9sE3JM%coHJZgTxPiPfJGKepXJJcX4JFQ76EZamX@4zfv1 O|Ln?RJAI=l>jVHVU?>^@ diff --git a/package.json b/package.json index 570c85c5..0c1323a8 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "node": ">=20.19.4" }, "patchedDependencies": { + "react-native-hyperlink@0.0.22": "patches/react-native-hyperlink@0.0.22.patch", "react-native-sensitive-info@5.5.8": "patches/react-native-sensitive-info@5.5.8.patch" } } diff --git a/patches/react-native-hyperlink@0.0.22.patch b/patches/react-native-hyperlink@0.0.22.patch new file mode 100644 index 00000000..f12a5c3c --- /dev/null +++ b/patches/react-native-hyperlink@0.0.22.patch @@ -0,0 +1,98 @@ +diff --git a/src/Hyperlink.tsx b/src/Hyperlink.tsx +index c2d8ef6..e54501d 100644 +--- a/src/Hyperlink.tsx ++++ b/src/Hyperlink.tsx +@@ -73,11 +73,11 @@ class Hyperlink extends Component { + let elements = []; + let _lastIndex = 0; + +- const componentProps = { +- ...component.props, +- ref: undefined, +- key: undefined, +- }; ++ const componentProps = { ++ ...component.props, ++ }; ++ delete componentProps.key; ++ delete componentProps.ref; + + try { + this.state.linkifyIt +@@ -136,11 +136,11 @@ class Hyperlink extends Component { + let { props: { children } = { children: undefined } } = component || {}; + if (!children) return component; + +- const componentProps = { +- ...component.props, +- ref: undefined, +- key: undefined, +- }; ++ const componentProps = { ++ ...component.props, ++ }; ++ delete componentProps.key; ++ delete componentProps.ref; + + return React.cloneElement( + component, +diff --git a/dist/commonjs/Hyperlink.js b/dist/commonjs/Hyperlink.js +index 69385a6..f4a98bf 100644 +--- a/dist/commonjs/Hyperlink.js ++++ b/dist/commonjs/Hyperlink.js +@@ -56,9 +56,8 @@ class Hyperlink extends _react.Component { + if (!this.state.linkifyIt.pretest(component.props.children) || !this.state.linkifyIt.test(component.props.children)) return component; + let elements = []; + let _lastIndex = 0; +- const componentProps = { ...component.props, +- ref: undefined, +- key: undefined +- }; ++ const componentProps = { ...component.props }; ++ delete componentProps.key; ++ delete componentProps.ref; + + try { +@@ -117,9 +116,8 @@ class Hyperlink extends _react.Component { + } + } = component || {}; + if (!children) return component; +- const componentProps = { ...component.props, +- ref: undefined, +- key: undefined +- }; ++ const componentProps = { ...component.props }; ++ delete componentProps.key; ++ delete componentProps.ref; + return /*#__PURE__*/_react.default.cloneElement(component, componentProps, _react.default.Children.map(children, child => { + let { +diff --git a/dist/module/Hyperlink.js b/dist/module/Hyperlink.js +index 4b798f3..49d08b7 100644 +--- a/dist/module/Hyperlink.js ++++ b/dist/module/Hyperlink.js +@@ -36,9 +36,8 @@ class Hyperlink extends Component { + if (!this.state.linkifyIt.pretest(component.props.children) || !this.state.linkifyIt.test(component.props.children)) return component; + let elements = []; + let _lastIndex = 0; +- const componentProps = { ...component.props, +- ref: undefined, +- key: undefined +- }; ++ const componentProps = { ...component.props }; ++ delete componentProps.key; ++ delete componentProps.ref; + + try { +@@ -97,9 +96,8 @@ class Hyperlink extends Component { + } + } = component || {}; + if (!children) return component; +- const componentProps = { ...component.props, +- ref: undefined, +- key: undefined +- }; ++ const componentProps = { ...component.props }; ++ delete componentProps.key; ++ delete componentProps.ref; + return /*#__PURE__*/React.cloneElement(component, componentProps, React.Children.map(children, child => { + let { From 9ff74330af6e056d44caa459eee279d64a2d7739 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:31:04 +0200 Subject: [PATCH 032/177] Use Bun patched dependencies for package patches. --- bun.lockb | Bin 804568 -> 799216 bytes package.json | 6 +++--- .../@react-native-cookies+cookies+6.2.1.patch | 6 +++--- patches/react-native-fs+2.20.0.patch | 6 +++--- ...react-native-push-notification+8.1.1.patch | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/bun.lockb b/bun.lockb index cd1261465231f0c70911003230c5e954268c95c1..aff6ab54bbc7b72e7fc5d2245b6c98969a90ec0e 100755 GIT binary patch delta 148454 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%0DYzbPPznvx-ozv(*dVl&*^}B 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 Hd(8g>XM?d$ delta 151207 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

9X}1!K-Pe&|7=hnq4AV9 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 Y{ZqUz>-2t8)%!ImaDOEX*lX(l0`^k73;+NC diff --git a/package.json b/package.json index 0c1323a8..e76631e2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "start": "react-native start --client-logs", "test": "jest", "lint": "eslint .", - "postinstall": "patch-package", "check-dependencies": "rnx-align-deps", "fix-dependencies": "rnx-align-deps --write", "pods": "npx pod-install ios", @@ -84,8 +83,6 @@ "babel-preset-expo": "~55.0.18", "eslint": "^8.57.1", "jest": "^29.7.0", - "patch-package": "^6.5.1", - "postinstall-postinstall": "^2.1.0", "prettier": "2.8.8", "react-test-renderer": "19.2.0", "typescript": "~5.8.3" @@ -97,7 +94,10 @@ "node": ">=20.19.4" }, "patchedDependencies": { + "@react-native-cookies/cookies@6.2.1": "patches/@react-native-cookies+cookies+6.2.1.patch", + "react-native-fs@2.20.0": "patches/react-native-fs+2.20.0.patch", "react-native-hyperlink@0.0.22": "patches/react-native-hyperlink@0.0.22.patch", + "react-native-push-notification@8.1.1": "patches/react-native-push-notification+8.1.1.patch", "react-native-sensitive-info@5.5.8": "patches/react-native-sensitive-info@5.5.8.patch" } } diff --git a/patches/@react-native-cookies+cookies+6.2.1.patch b/patches/@react-native-cookies+cookies+6.2.1.patch index 8d604948..f3c231ad 100644 --- a/patches/@react-native-cookies+cookies+6.2.1.patch +++ b/patches/@react-native-cookies+cookies+6.2.1.patch @@ -1,6 +1,6 @@ -diff --git a/node_modules/@react-native-cookies/cookies/android/build.gradle b/node_modules/@react-native-cookies/cookies/android/build.gradle ---- a/node_modules/@react-native-cookies/cookies/android/build.gradle -+++ b/node_modules/@react-native-cookies/cookies/android/build.gradle +diff --git a/android/build.gradle b/android/build.gradle +--- a/android/build.gradle ++++ b/android/build.gradle @@ -31,7 +31,7 @@ buildscript { if (project == rootProject) { repositories { diff --git a/patches/react-native-fs+2.20.0.patch b/patches/react-native-fs+2.20.0.patch index 3938548f..c1b461fc 100644 --- a/patches/react-native-fs+2.20.0.patch +++ b/patches/react-native-fs+2.20.0.patch @@ -1,7 +1,7 @@ -diff --git a/node_modules/react-native-fs/RNFSManager.m b/node_modules/react-native-fs/RNFSManager.m +diff --git a/RNFSManager.m b/RNFSManager.m index 5ddd941..7bca62a 100755 ---- a/node_modules/react-native-fs/RNFSManager.m -+++ b/node_modules/react-native-fs/RNFSManager.m +--- a/RNFSManager.m ++++ b/RNFSManager.m @@ -294,8 +294,8 @@ + (BOOL)requiresMainQueueSetup } diff --git a/patches/react-native-push-notification+8.1.1.patch b/patches/react-native-push-notification+8.1.1.patch index fee83136..63d0ffd2 100644 --- a/patches/react-native-push-notification+8.1.1.patch +++ b/patches/react-native-push-notification+8.1.1.patch @@ -1,6 +1,6 @@ -diff --git a/node_modules/react-native-push-notification/android/build.gradle b/node_modules/react-native-push-notification/android/build.gradle ---- a/node_modules/react-native-push-notification/android/build.gradle -+++ b/node_modules/react-native-push-notification/android/build.gradle +diff --git a/android/build.gradle b/android/build.gradle +--- a/android/build.gradle ++++ b/android/build.gradle @@ -2,7 +2,6 @@ buildscript { repositories { mavenCentral() @@ -9,7 +9,7 @@ diff --git a/node_modules/react-native-push-notification/android/build.gradle b/ } dependencies { classpath 'com.android.tools.build:gradle:3.2.0' -@@ -13,7 +12,6 @@ allprojects { +@@ -12,6 +12,5 @@ allprojects { repositories { mavenCentral() google() From 0e77b89ef5a2852ee90b9a8e80e3c15c6462dd64 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:44:25 +0200 Subject: [PATCH 033/177] Enable Liquid Glass native navigation. Switch the tab bar to React Navigation's native bottom tab navigator so iOS can use UIKit's Liquid Glass tab bar. Route iOS 26 header controls through native-stack header items while keeping the existing custom button behaviour. Remove the iOS design compatibility opt-out and register the bottom-tabs patch needed for the installed react-native-screens exports. --- bun.lockb | Bin 799216 -> 799296 bytes ios/MicroBlog_RN/Info.plist | 2 - package.json | 1 + .../@react-navigation+bottom-tabs+7.8.8.patch | 39 +++++++ src/screens/App.js | 11 +- src/screens/stacks/BookmarksStack.js | 11 +- src/screens/stacks/DiscoverStack.js | 9 +- src/screens/stacks/MentionsStack.js | 7 +- src/screens/stacks/PostEditStack.js | 5 +- src/screens/stacks/PostingStack.js | 17 +-- src/screens/stacks/SharedStack.js | 21 ++-- src/screens/stacks/TabNavigator.js | 108 ++++++++++++++---- src/screens/stacks/TimelineStack.js | 7 +- src/utils/navigation.js | 33 ++++++ src/utils/ui.js | 20 +++- 15 files changed, 223 insertions(+), 68 deletions(-) create mode 100644 patches/@react-navigation+bottom-tabs+7.8.8.patch create mode 100644 src/utils/navigation.js diff --git a/bun.lockb b/bun.lockb index aff6ab54bbc7b72e7fc5d2245b6c98969a90ec0e..fee565cccf49b4e0e7c9ccbf3674b955afe81355 100755 GIT binary patch delta 203 zcmezH*x4jXZ69B3BL%09{ delta 122 zcmX@`#NfkYg9(0&361`({*0~uOs)RRt^O>n{;aM3Y_0z6t^OQa{W&eKF remote-notification - UIDesignRequiresCompatibility - UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/package.json b/package.json index e76631e2..7bf7db02 100644 --- a/package.json +++ b/package.json @@ -95,6 +95,7 @@ }, "patchedDependencies": { "@react-native-cookies/cookies@6.2.1": "patches/@react-native-cookies+cookies+6.2.1.patch", + "@react-navigation/bottom-tabs@7.8.8": "patches/@react-navigation+bottom-tabs+7.8.8.patch", "react-native-fs@2.20.0": "patches/react-native-fs+2.20.0.patch", "react-native-hyperlink@0.0.22": "patches/react-native-hyperlink@0.0.22.patch", "react-native-push-notification@8.1.1": "patches/react-native-push-notification+8.1.1.patch", diff --git a/patches/@react-navigation+bottom-tabs+7.8.8.patch b/patches/@react-navigation+bottom-tabs+7.8.8.patch new file mode 100644 index 00000000..ce1a3ade --- /dev/null +++ b/patches/@react-navigation+bottom-tabs+7.8.8.patch @@ -0,0 +1,39 @@ +diff --git a/src/unstable/NativeBottomTabView.native.tsx b/src/unstable/NativeBottomTabView.native.tsx +--- a/src/unstable/NativeBottomTabView.native.tsx ++++ b/src/unstable/NativeBottomTabView.native.tsx +@@ -15,8 +15,7 @@ import Color from 'color'; + import * as React from 'react'; + import { type ColorValue, Platform, PlatformColor } from 'react-native'; + import { +- BottomTabs, +- BottomTabsScreen, ++ Tabs, + type BottomTabsScreenItemStateAppearance, + type PlatformIcon, + } from 'react-native-screens'; +@@ -31,6 +30,9 @@ import type { + NativeBottomTabNavigationProp, + } from './types'; ++ ++const BottomTabs = Tabs.Host; ++const BottomTabsScreen = Tabs.Screen; ++ + type Props = NativeBottomTabNavigationConfig & { + state: TabNavigationState; + navigation: NativeBottomTabNavigationHelpers; +diff --git a/lib/module/unstable/NativeBottomTabView.native.js b/lib/module/unstable/NativeBottomTabView.native.js +--- a/lib/module/unstable/NativeBottomTabView.native.js ++++ b/lib/module/unstable/NativeBottomTabView.native.js +@@ -5,9 +5,11 @@ import { CommonActions, StackActions, useTheme } from '@react-navigation/native'; + import Color from 'color'; + import * as React from 'react'; + import { Platform, PlatformColor } from 'react-native'; +-import { BottomTabs, BottomTabsScreen } from 'react-native-screens'; ++import { Tabs } from 'react-native-screens'; + import { NativeScreen } from "./NativeScreen/NativeScreen.js"; + import { jsx as _jsx } from "react/jsx-runtime"; ++const BottomTabs = Tabs.Host; ++const BottomTabsScreen = Tabs.Screen; + export function NativeBottomTabView({ + state, + navigation, diff --git a/src/screens/App.js b/src/screens/App.js index 70a44427..04c24649 100644 --- a/src/screens/App.js +++ b/src/screens/App.js @@ -37,6 +37,7 @@ import Share from '../stores/Share' import ShareMenu from 'react-native-share-menu' import ShareScreen from './share' import PublishingProgress from '../components/generic/publishing_progress' +import { headerLeftElement, headerRightElement } from '../utils/navigation' const Stack = createNativeStackNavigator(); @@ -163,7 +164,7 @@ export default class MainApp extends React.Component { presentation: "fullScreenModal", headerShown: true, gestureEnabled: true, - headerLeft: () => + ...headerLeftElement(() => ) }} > ({ headerTitle: "New Reply", gestureEnabled: true, - headerRight: () => + ...headerRightElement(() => ) })} /> + ...headerRightElement(() => ) }} /> , - headerRight: () => + ...headerLeftElement(() => ), + ...headerRightElement(() => ) }} /> ({ - headerLeft: () => , - headerRight: () => ( + ...headerLeftElement(() => ), + ...headerRightElement(() => ( - ) + )) })} /> ({ - headerLeft: () => , + ...headerLeftElement(() => ), headerBackTitleVisible: false })} > @@ -52,7 +53,7 @@ export default class Bookmarks extends React.Component{ component={BookmarkScreen} options={({ }) => ({ headerTitle: `Bookmark`, - headerRight: () => + ...headerRightElement(() => ) })} /> diff --git a/src/screens/stacks/DiscoverStack.js b/src/screens/stacks/DiscoverStack.js index 34aa6578..a8ab478a 100644 --- a/src/screens/stacks/DiscoverStack.js +++ b/src/screens/stacks/DiscoverStack.js @@ -9,6 +9,7 @@ import BackButton from '../../components/header/back'; import DiscoverTopicScreen from '../../screens/discover/topic'; import { getSharedScreens } from './SharedStack' import App from '../../stores/App' +import { headerLeftElement, headerRightElement } from '../../utils/navigation' const DiscoverStack = createNativeStackNavigator(); @@ -29,13 +30,13 @@ export default class Discover extends React.Component{ name="Discover" component={DiscoverScreen} options={({ route }) => ({ - headerLeft: () => , - headerRight: () => + ...headerLeftElement(() => ), + ...headerRightElement(() => ) })} /> ({ - headerLeft: () => , + ...headerLeftElement(() => ), headerBackTitleVisible: false })} > @@ -45,7 +46,7 @@ export default class Discover extends React.Component{ component={DiscoverTopicScreen} options={({ route }) => ({ headerTitle: `${route.params?.topic.emoji} ${route.params?.topic.title}`, - headerRight: () => + ...headerRightElement(() => ) })} /> diff --git a/src/screens/stacks/MentionsStack.js b/src/screens/stacks/MentionsStack.js index 1d0282db..a7def58e 100644 --- a/src/screens/stacks/MentionsStack.js +++ b/src/screens/stacks/MentionsStack.js @@ -8,6 +8,7 @@ import NewPostButton from '../../components/header/new_post'; import BackButton from '../../components/header/back'; import { getSharedScreens } from './SharedStack' import App from '../../stores/App' +import { headerLeftElement, headerRightElement } from '../../utils/navigation' const MentionsStack = createNativeStackNavigator(); @@ -28,13 +29,13 @@ export default class Mentions extends React.Component{ name="Mentions" component={MentionsScreen} options={({ route }) => ({ - headerLeft: () => , - headerRight: () => + ...headerLeftElement(() => ), + ...headerRightElement(() => ) })} /> ({ - headerLeft: () => , + ...headerLeftElement(() => ), headerBackTitleVisible: false })} > diff --git a/src/screens/stacks/PostEditStack.js b/src/screens/stacks/PostEditStack.js index 97beed38..33d09ea4 100644 --- a/src/screens/stacks/PostEditStack.js +++ b/src/screens/stacks/PostEditStack.js @@ -7,6 +7,7 @@ import PostingOptionsScreen from '../../screens/posts/options'; import ClosePostClearButton from '../../components/header/close_post_clear'; import UpdatePostButton from '../../components/header/update_post'; import App from '../../stores/App' +import { headerLeftElement, headerRightElement } from '../../utils/navigation' const PostingEditStack = createNativeStackNavigator(); @@ -31,8 +32,8 @@ export default class PostEditStack extends React.Component{ component={PostEditScreen} options={{ headerTitle: "Edit Post", - headerRight: () => , - headerLeft: () => + ...headerRightElement(() => ), + ...headerLeftElement(() => ) }} /> , - headerRight: () => + ...headerLeftElement(() => ), + ...headerRightElement(() => ) }} /> + ...headerLeftElement(() => ) }} /> ({ headerTitle: "Image Options", - headerLeft: () => , - headerRight: () => + ...headerLeftElement(() => ), + ...headerRightElement(() => ) })} /> , - headerRight: () => { + ...headerLeftElement(() => ), + ...headerRightElement(() => { return ( ) - } + }) }} /> diff --git a/src/screens/stacks/SharedStack.js b/src/screens/stacks/SharedStack.js index dac5d236..c064f5e4 100644 --- a/src/screens/stacks/SharedStack.js +++ b/src/screens/stacks/SharedStack.js @@ -16,6 +16,7 @@ import CollectionsScreen from '../uploads/collections' import NewPostButton from '../../components/header/new_post'; import NewCollectionButton from '../../components/header/new_collection'; import App from '../../stores/App' +import { headerRightElement } from '../../utils/navigation' export const getSharedScreens = (Stack, tab_name) => { return [ @@ -25,7 +26,7 @@ export const getSharedScreens = (Stack, tab_name) => { component={ProfileScreen} options={({ route }) => ({ headerTitle: `@${route.params?.username}`, - headerRight: () => + ...headerRightElement(() => ) })} />, { component={ConversationScreen} options={({ route }) => ({ headerTitle: `Conversation`, - headerRight: () => + ...headerRightElement(() => ) })} listeners={() => ({ focus: () => { @@ -51,7 +52,7 @@ export const getSharedScreens = (Stack, tab_name) => { component={FollowingScreen} options={({ route }) => ({ headerTitle: `Following`, - headerRight: () => + ...headerRightElement(() => ) })} />, { component={UploadsScreen} options={({ route }) => ({ headerTitle: `Uploads`, - headerRight: () => { + ...headerRightElement(() => { return ( ) - } + }) })} />, { component={RepliesScreen} options={({ route }) => ({ headerTitle: "Replies", - headerRight: () => + ...headerRightElement(() => ) })} />, { component={PagesScreen} options={({ route }) => ({ headerTitle: "Pages", - headerRight: () => + ...headerRightElement(() => ) })} />, { component={PostsScreen} options={({ route }) => ({ headerTitle: "Posts", - headerRight: () => + ...headerRightElement(() => ) })} />, { component={CollectionsScreen} options={({ route }) => ({ headerTitle: "Collections", - headerRight: () => + ...headerRightElement(() => ) })} />, { component={MutingScreen} options={({ route }) => ({ headerTitle: "Muting", - headerRight: () => + ...headerRightElement(() => ) })} />, ] diff --git a/src/screens/stacks/TabNavigator.js b/src/screens/stacks/TabNavigator.js index 1b11ab20..014f7041 100644 --- a/src/screens/stacks/TabNavigator.js +++ b/src/screens/stacks/TabNavigator.js @@ -1,40 +1,106 @@ -import * as React from 'react'; -import { observer } from 'mobx-react'; -import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; -import App from '../../stores/App'; -import TimelineStack from './TimelineStack'; -import MentionsStack from './MentionsStack'; -import BookmarksStack from './BookmarksStack'; -import DiscoverStack from './DiscoverStack'; -import TabIcon from '../../components/tabs/tab'; +import * as React from 'react' +import { Platform } from 'react-native' +import { observer } from 'mobx-react' +import { createNativeBottomTabNavigator } from '@react-navigation/bottom-tabs/unstable' +import App from '../../stores/App' +import TimelineStack from './TimelineStack' +import MentionsStack from './MentionsStack' +import BookmarksStack from './BookmarksStack' +import DiscoverStack from './DiscoverStack' +import TimelineIcon from './../../assets/icons/tab_bar/timeline.png' +import MentionsIcon from './../../assets/icons/tab_bar/mentions.png' +import DiscoverIcon from './../../assets/icons/tab_bar/discover.png' +import BookmarksIcon from './../../assets/icons/nav/bookmarks.png' +import { isLiquidGlass, liquidGlassTintColor } from '../../utils/ui' -const Tab = createBottomTabNavigator(); +const Tab = createNativeBottomTabNavigator() + +const TAB_ICONS = { + TimelineStack: { + ios: { + default: 'bubble.left.and.bubble.right', + selected: 'bubble.left.and.bubble.right.fill' + }, + image: TimelineIcon + }, + MentionsStack: { + ios: { + default: 'at', + selected: 'at' + }, + image: MentionsIcon + }, + BookmarksStack: { + ios: { + default: 'star', + selected: 'star.fill' + }, + image: BookmarksIcon + }, + DiscoverStack: { + ios: { + default: 'magnifyingglass', + selected: 'magnifyingglass' + }, + image: DiscoverIcon + } +} @observer export default class TabNavigator extends React.Component { + tab_icon(route_name, focused) { + const icon = TAB_ICONS[route_name] + + if (Platform.OS === 'ios') { + return { + type: 'sfSymbol', + name: focused ? icon.ios.selected : icon.ios.default + } + } + + return { + type: 'image', + source: icon.image + } + } + + tab_tint_color() { + return isLiquidGlass() ? liquidGlassTintColor() : App.theme_accent_color() + } + + inactive_tab_tint_color() { + return isLiquidGlass() ? liquidGlassTintColor() : App.theme_text_color() + } + + tab_bar_style() { + if (isLiquidGlass()) { + return undefined + } + + return { + backgroundColor: App.theme_navbar_background_color(), + shadowColor: App.theme_tabbar_divider_color() + } + } + render() { return ( ({ - tabBarStyle: { - borderTopColor: App.theme_tabbar_divider_color(), - borderTopWidth: 0.5, - backgroundColor: App.theme_navbar_background_color(), - elevation: 0, - shadowOpacity: 0 - }, - tabBarIcon: ({ focused, color, size }) => { - return ; + tabBarStyle: this.tab_bar_style(), + tabBarIcon: ({ focused }) => { + return this.tab_icon(route.name, focused) }, headerShown: false, - tabBarActiveTintColor: App.theme_accent_color() + tabBarActiveTintColor: this.tab_tint_color(), + tabBarInactiveTintColor: this.inactive_tab_tint_color() })} screenListeners={{ state: (e) => { - App.set_current_tab_index(e.data.state.index) + App.set_current_tab_index(e.data?.state?.index) }, focus: (e) => { App.set_current_tab_key(e.target) diff --git a/src/screens/stacks/TimelineStack.js b/src/screens/stacks/TimelineStack.js index dad6729d..27a2855c 100644 --- a/src/screens/stacks/TimelineStack.js +++ b/src/screens/stacks/TimelineStack.js @@ -9,6 +9,7 @@ import NewPostButton from '../../components/header/new_post'; import BackButton from '../../components/header/back'; import { getSharedScreens } from './SharedStack' import App from '../../stores/App' +import { headerLeftElement, headerRightElement } from '../../utils/navigation' const TimelineStack = createNativeStackNavigator(); @@ -29,13 +30,13 @@ export default class Timeline extends React.Component{ name="Timeline" component={TimelineScreen} options={({ route }) => ({ - headerLeft: () => , - headerRight: () => , + ...headerLeftElement(() => ), + ...headerRightElement(() => ), })} /> ({ - headerLeft: () => , + ...headerLeftElement(() => ), headerBackTitleVisible: false, })} > diff --git a/src/utils/navigation.js b/src/utils/navigation.js new file mode 100644 index 00000000..447d3c6a --- /dev/null +++ b/src/utils/navigation.js @@ -0,0 +1,33 @@ +import { isLiquidGlass } from './ui' + +function customHeaderItem(element) { + return { + type: 'custom', + element, + hidesSharedBackground: false + } +} + +export function headerLeftElement(renderElement) { + if (isLiquidGlass()) { + return { + unstable_headerLeftItems: () => [customHeaderItem(renderElement())] + } + } + + return { + headerLeft: renderElement + } +} + +export function headerRightElement(renderElement) { + if (isLiquidGlass()) { + return { + unstable_headerRightItems: () => [customHeaderItem(renderElement())] + } + } + + return { + headerRight: renderElement + } +} diff --git a/src/utils/ui.js b/src/utils/ui.js index 1179c6ee..11f0e6ad 100644 --- a/src/utils/ui.js +++ b/src/utils/ui.js @@ -1,10 +1,20 @@ -import { Platform } from 'react-native'; +import { DynamicColorIOS, Platform } from 'react-native' -export const STANDARD_SLOP = 10; +export const STANDARD_SLOP = 10 export function isLiquidGlass() { return ( - false - // (Platform.OS == 'ios') && (parseInt(Platform.Version, 10) >= 26) - ); + (Platform.OS === 'ios') && (parseInt(Platform.Version, 10) >= 26) + ) +} + +export function liquidGlassTintColor() { + if (Platform.OS === 'ios') { + return DynamicColorIOS({ + dark: 'white', + light: 'black' + }) + } + + return undefined } From 6438ed0cc5a114af1bfceec6ebf9876bcada3590 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:56:07 +0200 Subject: [PATCH 034/177] Fix iOS editor selection event registration. --- ios/MicroBlog_RN/MBHighlightingTextManager.m | 2 +- ios/MicroBlog_RN/MBHighlightingTextView.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/MicroBlog_RN/MBHighlightingTextManager.m b/ios/MicroBlog_RN/MBHighlightingTextManager.m index c601e3fb..cda0d07e 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextManager.m +++ b/ios/MicroBlog_RN/MBHighlightingTextManager.m @@ -18,7 +18,7 @@ @implementation MBHighlightingTextManager RCT_EXPORT_MODULE(MBHighlightingTextView) RCT_EXPORT_VIEW_PROPERTY(onChangeText, RCTBubblingEventBlock) -RCT_EXPORT_VIEW_PROPERTY(onSelectionChange, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(onSelectionChange, RCTDirectEventBlock) RCT_CUSTOM_VIEW_PROPERTY(inputAccessoryViewID, NSString, MBHighlightingTextView) { diff --git a/ios/MicroBlog_RN/MBHighlightingTextView.h b/ios/MicroBlog_RN/MBHighlightingTextView.h index d4a0a055..c9dd19e6 100644 --- a/ios/MicroBlog_RN/MBHighlightingTextView.h +++ b/ios/MicroBlog_RN/MBHighlightingTextView.h @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN @interface MBHighlightingTextView : UITextView @property (copy, nonatomic) RCTBubblingEventBlock onChangeText; -@property (copy, nonatomic) RCTBubblingEventBlock onSelectionChange; +@property (copy, nonatomic) RCTDirectEventBlock onSelectionChange; @property (strong, nonatomic) UIView* reactAccessoryView; @property (assign, nonatomic) CGFloat bottom_overlay_height; From 44d68553bc3c6036783947b7476a799cbfe3b3f8 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 09:57:47 +0200 Subject: [PATCH 035/177] Centre Liquid Glass header controls. --- src/components/header/back.js | 10 +++------- src/components/header/close.js | 6 ++---- src/components/header/close_post_clear.js | 10 +++++++--- src/components/header/new_post.js | 9 +++++++-- src/components/header/profile_image.js | 6 ++++-- src/components/header/reply.js | 8 +++++--- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/components/header/back.js b/src/components/header/back.js index 69759d77..dc432882 100644 --- a/src/components/header/back.js +++ b/src/components/header/back.js @@ -15,14 +15,10 @@ const BackButtonContent = observer(() => { if (isLiquidGlass()) { button_style = { - marginRight: 0 - STANDARD_SLOP, - marginLeft: 16 - STANDARD_SLOP, - marginTop: 2 - STANDARD_SLOP, - marginBottom: 0 - STANDARD_SLOP, - padding: STANDARD_SLOP, - minWidth: 44, - minHeight: 44, + width: 44, + height: 44, flexDirection: 'row', + justifyContent: 'center', alignItems: 'center' } } diff --git a/src/components/header/close.js b/src/components/header/close.js index fd9c5a8b..c1e3b8f2 100644 --- a/src/components/header/close.js +++ b/src/components/header/close.js @@ -24,10 +24,8 @@ export default class CloseModalButton extends React.Component { if (isLiquidGlass()) { button_style = { - paddingLeft: 7, - paddingTop: 4, - minWidth: 44, - minHeight: 44, + width: 44, + height: 44, alignItems: 'center', justifyContent: 'center', flexDirection: 'row' diff --git a/src/components/header/close_post_clear.js b/src/components/header/close_post_clear.js index 22d64420..41d2c88d 100644 --- a/src/components/header/close_post_clear.js +++ b/src/components/header/close_post_clear.js @@ -13,8 +13,12 @@ export default class ClosePostClearButton extends React.Component { let button_style = {}; if (isLiquidGlass()) { - button_style.paddingLeft = 8; - button_style.paddingTop = 5; + button_style = { + width: 44, + height: 44, + alignItems: 'center', + justifyContent: 'center' + } } return ( @@ -49,4 +53,4 @@ export default class ClosePostClearButton extends React.Component { ) } -} \ No newline at end of file +} diff --git a/src/components/header/new_post.js b/src/components/header/new_post.js index 7737e288..cd6e9287 100644 --- a/src/components/header/new_post.js +++ b/src/components/header/new_post.js @@ -17,7 +17,12 @@ export default class NewPostButton extends React.Component{ }; if (isLiquidGlass()) { - button_style.paddingLeft = 4; + button_style = { + width: 44, + height: 44, + justifyContent: 'center', + alignItems: 'center' + } } if(Auth.selected_user != null && Auth.selected_user.posting?.posting_enabled()){ @@ -45,4 +50,4 @@ export default class NewPostButton extends React.Component{ return null } -} \ No newline at end of file +} diff --git a/src/components/header/profile_image.js b/src/components/header/profile_image.js index 2ff1bce9..aa5789b7 100644 --- a/src/components/header/profile_image.js +++ b/src/components/header/profile_image.js @@ -18,8 +18,10 @@ export default class ProfileImage extends React.Component{ if (isLiquidGlass()) { button_style = { - paddingLeft: 4, - paddingTop: 2 + width: 44, + height: 44, + alignItems: 'center', + justifyContent: 'center' } } diff --git a/src/components/header/reply.js b/src/components/header/reply.js index 38878558..3435dc61 100644 --- a/src/components/header/reply.js +++ b/src/components/header/reply.js @@ -14,8 +14,10 @@ export default class ReplyButton extends React.Component { if (isLiquidGlass()) { button_style = { - marginLeft: 7, - marginTop: 2 + width: 44, + height: 44, + alignItems: 'center', + justifyContent: 'center' } } @@ -49,4 +51,4 @@ export default class ReplyButton extends React.Component { ) } -} \ No newline at end of file +} From b28fcd5a68e5c067439d22c275462690bcef5e54 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 10:16:04 +0200 Subject: [PATCH 036/177] Correct Liquid Glass header control shapes. Shrink custom header content so native glass backdrops render as circular controls. Hide shared glass backgrounds for non-interactive refresh indicators on pages and posts so inactive spinners do not leave empty circles. --- src/components/header/back.js | 4 ++-- src/components/header/close.js | 4 ++-- src/components/header/close_post_clear.js | 4 ++-- src/components/header/new_post.js | 4 ++-- src/components/header/profile_image.js | 4 ++-- src/components/header/refresh_activity.js | 14 ++++++++++++-- src/components/header/reply.js | 4 ++-- src/screens/stacks/SharedStack.js | 20 ++++++++++++++++---- src/utils/navigation.js | 12 ++++++------ 9 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/components/header/back.js b/src/components/header/back.js index dc432882..f5427290 100644 --- a/src/components/header/back.js +++ b/src/components/header/back.js @@ -15,8 +15,8 @@ const BackButtonContent = observer(() => { if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, flexDirection: 'row', justifyContent: 'center', alignItems: 'center' diff --git a/src/components/header/close.js b/src/components/header/close.js index c1e3b8f2..9ecbeed3 100644 --- a/src/components/header/close.js +++ b/src/components/header/close.js @@ -24,8 +24,8 @@ export default class CloseModalButton extends React.Component { if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, alignItems: 'center', justifyContent: 'center', flexDirection: 'row' diff --git a/src/components/header/close_post_clear.js b/src/components/header/close_post_clear.js index 41d2c88d..7064f15a 100644 --- a/src/components/header/close_post_clear.js +++ b/src/components/header/close_post_clear.js @@ -14,8 +14,8 @@ export default class ClosePostClearButton extends React.Component { if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, alignItems: 'center', justifyContent: 'center' } diff --git a/src/components/header/new_post.js b/src/components/header/new_post.js index cd6e9287..49f98bd0 100644 --- a/src/components/header/new_post.js +++ b/src/components/header/new_post.js @@ -18,8 +18,8 @@ export default class NewPostButton extends React.Component{ if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, justifyContent: 'center', alignItems: 'center' } diff --git a/src/components/header/profile_image.js b/src/components/header/profile_image.js index aa5789b7..f7b8975a 100644 --- a/src/components/header/profile_image.js +++ b/src/components/header/profile_image.js @@ -18,8 +18,8 @@ export default class ProfileImage extends React.Component{ if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, alignItems: 'center', justifyContent: 'center' } diff --git a/src/components/header/refresh_activity.js b/src/components/header/refresh_activity.js index 007569d9..fe24c537 100644 --- a/src/components/header/refresh_activity.js +++ b/src/components/header/refresh_activity.js @@ -4,6 +4,7 @@ import { ActivityIndicator, Platform } from 'react-native'; import Replies from './../../stores/Replies'; import Auth from './../../stores/Auth'; import App from './../../stores/App'; +import { isLiquidGlass } from './../../utils/ui'; @observer export default class RefreshActivity extends React.Component{ @@ -26,9 +27,18 @@ export default class RefreshActivity extends React.Component{ default: is_loading = Replies.is_loading } + if (isLiquidGlass() && !is_loading) { + return null + } + + const style = isLiquidGlass() ? + { width: 28, height: 28, alignItems: 'center', justifyContent: 'center' } + : + { marginRight: Platform.OS === "android" ? 8 : 0 } + return( - + ) } -} \ No newline at end of file +} diff --git a/src/components/header/reply.js b/src/components/header/reply.js index 3435dc61..dffde5b7 100644 --- a/src/components/header/reply.js +++ b/src/components/header/reply.js @@ -14,8 +14,8 @@ export default class ReplyButton extends React.Component { if (isLiquidGlass()) { button_style = { - width: 44, - height: 44, + width: 28, + height: 28, alignItems: 'center', justifyContent: 'center' } diff --git a/src/screens/stacks/SharedStack.js b/src/screens/stacks/SharedStack.js index c064f5e4..e9b8bf46 100644 --- a/src/screens/stacks/SharedStack.js +++ b/src/screens/stacks/SharedStack.js @@ -77,7 +77,10 @@ export const getSharedScreens = (Stack, tab_name) => { component={RepliesScreen} options={({ route }) => ({ headerTitle: "Replies", - ...headerRightElement(() => ) + ...headerRightElement( + () => , + { hidesSharedBackground: true } + ) })} />, { component={PagesScreen} options={({ route }) => ({ headerTitle: "Pages", - ...headerRightElement(() => ) + ...headerRightElement( + () => , + { hidesSharedBackground: true } + ) })} />, { component={PostsScreen} options={({ route }) => ({ headerTitle: "Posts", - ...headerRightElement(() => ) + ...headerRightElement( + () => , + { hidesSharedBackground: true } + ) })} />, { component={MutingScreen} options={({ route }) => ({ headerTitle: "Muting", - ...headerRightElement(() => ) + ...headerRightElement( + () => , + { hidesSharedBackground: true } + ) })} />, ] diff --git a/src/utils/navigation.js b/src/utils/navigation.js index 447d3c6a..5b2f29a2 100644 --- a/src/utils/navigation.js +++ b/src/utils/navigation.js @@ -1,17 +1,17 @@ import { isLiquidGlass } from './ui' -function customHeaderItem(element) { +function customHeaderItem(element, options = {}) { return { type: 'custom', element, - hidesSharedBackground: false + hidesSharedBackground: options.hidesSharedBackground === true } } -export function headerLeftElement(renderElement) { +export function headerLeftElement(renderElement, options = {}) { if (isLiquidGlass()) { return { - unstable_headerLeftItems: () => [customHeaderItem(renderElement())] + unstable_headerLeftItems: () => [customHeaderItem(renderElement(), options)] } } @@ -20,10 +20,10 @@ export function headerLeftElement(renderElement) { } } -export function headerRightElement(renderElement) { +export function headerRightElement(renderElement, options = {}) { if (isLiquidGlass()) { return { - unstable_headerRightItems: () => [customHeaderItem(renderElement())] + unstable_headerRightItems: () => [customHeaderItem(renderElement(), options)] } } From d5129b129a6f2b6c294be1be309fb4633a513757 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 10:55:09 +0200 Subject: [PATCH 037/177] Modernise post keyboard toolbar. - Add rounded floating toolbar surfaces and segmented settings control.\n- Update site and user suggestion lists to match the rounded treatment.\n- Add a close control for username autocomplete suggestions. --- src/components/keyboard/post_toolbar.js | 164 +++++++++++++------- src/components/keyboard/username_toolbar.js | 149 +++++++++++++----- 2 files changed, 212 insertions(+), 101 deletions(-) diff --git a/src/components/keyboard/post_toolbar.js b/src/components/keyboard/post_toolbar.js index 2791be6c..54402bda 100644 --- a/src/components/keyboard/post_toolbar.js +++ b/src/components/keyboard/post_toolbar.js @@ -1,6 +1,6 @@ import { observer } from 'mobx-react' import * as React from 'react' -import { Image, Platform, ScrollView, Text, TouchableOpacity, View } from 'react-native' +import { Image, Platform, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native' import { SFSymbol } from 'react-native-sfsymbols' import PhotoLibrary from '../../assets/icons/toolbar/photo_library.png' import SettingsIcon from '../../assets/icons/toolbar/settings.png' @@ -14,17 +14,49 @@ import MBImage from '../common/MBImage' @observer export default class PostToolbar extends React.Component{ + _toolbar_background_color() { + return App.is_dark_mode() ? 'rgba(55, 65, 81, 0.92)' : 'rgba(255, 255, 255, 0.9)' + } + + _toolbar_border_color() { + return App.is_dark_mode() ? 'rgba(255, 255, 255, 0.12)' : 'rgba(31, 41, 55, 0.12)' + } + + _toolbar_shadow_style() { + if (Platform.OS === 'ios') { + return { + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: App.is_dark_mode() ? 0.24 : 0.1, + shadowRadius: 14 + } + } + + return { + elevation: 3 + } + } + + _toolbar_container_style() { + return { + backgroundColor: this._toolbar_background_color(), + borderColor: this._toolbar_border_color(), + borderRadius: 22, + borderWidth: StyleSheet.hairlineWidth + } + } + _render_users_select() { const { users } = Platform.OS === "ios" ? Share : Auth if (App.is_share_extension && users?.length > 1 && Share.toolbar_select_user_open) { return ( - + { Share.sorted_users().map((user, index) => { const is_selected_user = Share.selected_user?.username == user.username return ( - Share.select_user(user)} style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', padding: 5, borderRadius: 5, backgroundColor: is_selected_user ? App.theme_selected_button_color() : App.theme_section_background_color(), marginRight: 5 }}> + Share.select_user(user)} style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingVertical: 4, paddingHorizontal: 10, borderRadius: 18, backgroundColor: is_selected_user ? App.theme_selected_button_color() : 'transparent', marginRight: 4 }}> {user.username} @@ -42,13 +74,13 @@ export default class PostToolbar extends React.Component{ const { posting } = this.props.posting != null ? this.props : Auth.selected_user if (posting?.selected_service?.config?.active_destination() != null && posting?.selected_service?.config?.destination?.length > 1 && App.toolbar_select_destination_open) { return ( - + { posting.selected_service?.config?.sorted_destinations().map((destination, index) => { const is_selected_destination = posting.selected_service?.config?.active_destination()?.uid == destination.uid return ( - { posting.selected_service?.config?.set_default_destination(destination); posting.reset_post_syndicates(); App.toggle_select_destination() }} style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', padding: 5, borderRadius: 5, backgroundColor: is_selected_destination ? App.theme_selected_button_color() : App.theme_section_background_color(), marginRight: 5 }}> + { posting.selected_service?.config?.set_default_destination(destination); posting.reset_post_syndicates(); App.toggle_select_destination() }} style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'center', paddingVertical: 6, paddingHorizontal: 10, borderRadius: 18, backgroundColor: is_selected_destination ? App.theme_selected_button_color() : 'transparent', marginRight: 4 }}> {destination.name} ) @@ -62,10 +94,10 @@ export default class PostToolbar extends React.Component{ } _render_categories() { - const { posting } = this.props.posting != null ? this.props : Auth.selected_user + const { posting } = this.props.posting != null ? this.props : Auth.selected_user if(App.is_share_extension && posting.selected_service.config?.active_destination()?.categories.length && App.toolbar_categories_open){ return( - + { posting.selected_service.config.active_destination().categories.map((category) => { @@ -100,7 +132,11 @@ export default class PostToolbar extends React.Component{ return ( {this._render_destinations()} @@ -108,15 +144,22 @@ export default class PostToolbar extends React.Component{ {this._render_categories()} - + + { App.is_share_extension && Share.selected_user != null && @@ -253,72 +296,73 @@ export default class PostToolbar extends React.Component{ } { !this.props.is_post_edit && posting.selected_service?.config?.active_destination() != null && (posting.selected_service?.config?.destination?.length > 1 || (!posting.selected_service?.is_microblog && !App.is_share_extension)) ? - {!posting.selected_service?.is_microblog ? App.navigate_to_screen("post_service", App.is_share_extension ? Share.selected_user : Auth.selected_user) : App.toggle_select_destination()}}> - + {!posting.selected_service?.is_microblog ? App.navigate_to_screen("post_service", App.is_share_extension ? Share.selected_user : Auth.selected_user) : App.toggle_select_destination()}}> + {posting.selected_service.config.active_destination().name} : !this.props.is_post_edit && posting.selected_service?.config?.active_destination() == null && !posting.selected_service?.is_microblog && !App.is_share_extension ? - {!posting.selected_service?.is_microblog ? App.navigate_to_screen("post_service", App.is_share_extension ? Share.selected_user : Auth.selected_user) : App.toggle_select_destination()}}> - + {!posting.selected_service?.is_microblog ? App.navigate_to_screen("post_service", App.is_share_extension ? Share.selected_user : Auth.selected_user) : App.toggle_select_destination()}}> + {posting.selected_service?.name} : null } - - { - !App.is_share_extension && !this.props.hide_settings && + + { + !App.is_share_extension && !this.props.hide_settings && + App.navigate_to_screen(this.props.is_post_edit ? "PostEditOptions" : "PostingOptions")} accessibilityRole="button" accessibilityLabel="Post options" > - { - Platform.OS === 'ios' ? - - : - - } + { + Platform.OS === 'ios' ? + + : + + } - } - { - !posting.post_title && !this.props.hide_count && ((!App.toolbar_select_destination_open && !App.is_share_extension ) || App.is_share_extension) && - posting.max_post_length() ? '#a94442' : App.theme_text_color() }}>{posting.post_text_length()}/{posting.max_post_length()} - } + + } + { + !posting.post_title && !this.props.hide_count && ((!App.toolbar_select_destination_open && !App.is_share_extension ) || App.is_share_extension) && + posting.max_post_length() ? '#a94442' : App.theme_text_color() }}>{posting.post_text_length()}/{posting.max_post_length()} + } - ) } diff --git a/src/components/keyboard/username_toolbar.js b/src/components/keyboard/username_toolbar.js index b7125412..f69ad23d 100644 --- a/src/components/keyboard/username_toolbar.js +++ b/src/components/keyboard/username_toolbar.js @@ -7,11 +7,35 @@ import { Image, Platform, ScrollView, + StyleSheet, } from "react-native"; +import { SFSymbol } from "react-native-sfsymbols"; import App from "../../stores/App"; @observer export default class UsernameToolbar extends React.Component { + toolbar_background_color() { + return App.is_dark_mode() ? "rgba(55, 65, 81, 0.92)" : "rgba(255, 255, 255, 0.9)" + } + + toolbar_border_color() { + return App.is_dark_mode() ? "rgba(255, 255, 255, 0.12)" : "rgba(31, 41, 55, 0.12)" + } + + toolbar_control_style() { + return { + backgroundColor: this.toolbar_background_color(), + borderColor: this.toolbar_border_color(), + borderRadius: 22, + borderWidth: StyleSheet.hairlineWidth, + width: 38, + minHeight: 38, + marginRight: 5, + alignItems: "center", + justifyContent: "center", + } + } + render() { if (App.found_users.length == 0) { return null; @@ -20,59 +44,102 @@ export default class UsernameToolbar extends React.Component { - App.clear_found_users()} + accessibilityRole="button" + accessibilityLabel="Close username suggestions" > - {App.found_users.map((u, index) => { - return ( - + : + { - App.update_autocomplete(u.username, this.props.object); + color: App.theme_text_color(), + fontSize: 16, + fontWeight: "600", + lineHeight: 18, }} > - + } + + + + {App.found_users.map((u, index) => { + return ( + - { + App.update_autocomplete(u.username, this.props.object); }} > - @{u.username} - - - ); - })} - + + + @{u.username} + + + ); + })} + + ); } From c686731f0b3edb701a047a7e33e1f8ed31c58623 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:02:48 +0200 Subject: [PATCH 038/177] Modernise reply keyboard toolbar. --- src/components/keyboard/reply_toolbar.js | 58 +++++++++++++++++++----- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/components/keyboard/reply_toolbar.js b/src/components/keyboard/reply_toolbar.js index b4285d40..b3bb1645 100644 --- a/src/components/keyboard/reply_toolbar.js +++ b/src/components/keyboard/reply_toolbar.js @@ -1,6 +1,6 @@ import * as React from 'react'; import { observer } from 'mobx-react'; -import { View, Text, TouchableOpacity, Platform, ScrollView, TextInput, ActivityIndicator } from 'react-native'; +import { View, Text, TouchableOpacity, Platform, ScrollView, TextInput, ActivityIndicator, StyleSheet } from 'react-native'; import App from '../../stores/App'; import { SFSymbol } from 'react-native-sfsymbols' import { SvgXml } from 'react-native-svg' @@ -72,13 +72,48 @@ export default class ReplyToolbar extends React.Component{ App.clear_found_users() } + toolbar_background_color() { + return App.is_dark_mode() ? 'rgba(55, 65, 81, 0.92)' : 'rgba(255, 255, 255, 0.9)' + } + + toolbar_border_color() { + return App.is_dark_mode() ? 'rgba(255, 255, 255, 0.12)' : 'rgba(31, 41, 55, 0.12)' + } + + toolbar_shadow_style() { + if (Platform.OS === 'ios') { + return { + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: App.is_dark_mode() ? 0.24 : 0.1, + shadowRadius: 14 + } + } + + return { + elevation: 3 + } + } + + toolbar_container_style() { + return { + backgroundColor: this.toolbar_background_color(), + borderColor: this.toolbar_border_color(), + borderRadius: 22, + borderWidth: StyleSheet.hairlineWidth + } + } + render() { const use_absolute = this.props.use_absolute !== false return( )} + style={[this.toolbar_container_style(), this.toolbar_shadow_style(), { + alignSelf: 'stretch', + paddingVertical: 3, + paddingHorizontal: 12, + minHeight: 42, + flexDirection: 'row', + alignItems: 'center', + position: 'relative' + }]} + > this.props.reply?.handle_text_action("**")}> { Platform.OS === 'ios' ? From e7a2dc1ad540b0d719003e5154df4bc05c054143 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:25:51 +0200 Subject: [PATCH 039/177] Fix share extension React Native bootstrap. Use a local share view controller that starts React Native through the Expo factory and registers RCTAppDependencyProvider for the upgraded runtime. Point the share target at the local controller instead of the stale controller in react-native-share-menu. Note: the share extension still needs follow-up work beyond restoring the native bootstrap. --- ios/MicroBlog_RN.xcodeproj/project.pbxproj | 2 +- .../ReactShareViewController.swift | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 ios/MicroBlog_Share/ReactShareViewController.swift diff --git a/ios/MicroBlog_RN.xcodeproj/project.pbxproj b/ios/MicroBlog_RN.xcodeproj/project.pbxproj index 6f30e4ba..d2ae0935 100644 --- a/ios/MicroBlog_RN.xcodeproj/project.pbxproj +++ b/ios/MicroBlog_RN.xcodeproj/project.pbxproj @@ -69,7 +69,7 @@ 0221AB3329D42CE400838597 /* MicroBlog_Share-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MicroBlog_Share-Bridging-Header.h"; sourceTree = ""; }; 0221AB3429D42CE500838597 /* ShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ShareViewController.swift"; sourceTree = ""; }; 0221AB3629D4307300838597 /* MicroBlog_Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MicroBlog_Share.entitlements; sourceTree = ""; }; - 0221AB3729D4327B00838597 /* ReactShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ReactShareViewController.swift; path = "../../node_modules/react-native-share-menu/ios/ReactShareViewController.swift"; sourceTree = ""; }; + 0221AB3729D4327B00838597 /* ReactShareViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReactShareViewController.swift; sourceTree = ""; }; 0251EE442716191900B475D5 /* MicroBlog_RN-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MicroBlog_RN-Bridging-Header.h"; sourceTree = ""; }; 0251EE452716191A00B475D5 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; 02A72C7B2C2AB086006EF653 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; diff --git a/ios/MicroBlog_Share/ReactShareViewController.swift b/ios/MicroBlog_Share/ReactShareViewController.swift new file mode 100644 index 00000000..3a541385 --- /dev/null +++ b/ios/MicroBlog_Share/ReactShareViewController.swift @@ -0,0 +1,94 @@ +// +// ReactShareViewController.swift +// MicroBlog_Share +// + +internal import Expo +import React +import ReactAppDependencyProvider +import RNShareMenu + +class ReactShareViewController: ShareViewController, ReactShareViewDelegate { + private var reactNativeDelegate: ShareReactNativeDelegate? + private var reactNativeFactory: ExpoReactNativeFactory? + + override func viewDidLoad() { + super.viewDidLoad() + + let delegate = ShareReactNativeDelegate() + let factory = ExpoReactNativeFactory(delegate: delegate) + delegate.dependencyProvider = RCTAppDependencyProvider() + + reactNativeDelegate = delegate + reactNativeFactory = factory + + let rootView = factory.rootViewFactory.view( + withModuleName: "ShareMenuModuleComponent", + initialProperties: nil, + launchOptions: nil + ) + rootView.backgroundColor = configuredBackgroundColor() + + view = rootView + + ShareMenuReactView.attachViewDelegate(self) + } + + override func viewDidDisappear(_ animated: Bool) { + cancel() + ShareMenuReactView.detachViewDelegate() + + super.viewDidDisappear(animated) + } + + func loadExtensionContext() -> NSExtensionContext { + return extensionContext! + } + + func openApp() { + openHostApp() + } + + func continueInApp(with items: [NSExtensionItem], and extraData: [String:Any]?) { + handlePost(items, extraData: extraData) + } + + private func configuredBackgroundColor() -> UIColor? { + guard let backgroundColorConfig = Bundle.main.infoDictionary?[REACT_SHARE_VIEW_BACKGROUND_COLOR_KEY] as? [String:Any] else { + return UIColor(red: 1, green: 1, blue: 1, alpha: 1) + } + + if let transparent = backgroundColorConfig[COLOR_TRANSPARENT_KEY] as? Bool, transparent { + return nil + } + + let red = numberValue(backgroundColorConfig[COLOR_RED_KEY], fallback: 1) + let green = numberValue(backgroundColorConfig[COLOR_GREEN_KEY], fallback: 1) + let blue = numberValue(backgroundColorConfig[COLOR_BLUE_KEY], fallback: 1) + let alpha = numberValue(backgroundColorConfig[COLOR_ALPHA_KEY], fallback: 1) + + return UIColor(red: red, green: green, blue: blue, alpha: alpha) + } + + private func numberValue(_ value: Any?, fallback: CGFloat) -> CGFloat { + guard let number = value as? NSNumber else { + return fallback + } + + return CGFloat(number.floatValue) + } +} + +class ShareReactNativeDelegate: ExpoReactNativeFactoryDelegate { + override func sourceURL(for bridge: RCTBridge) -> URL? { + bridge.bundleURL ?? bundleURL() + } + + override func bundleURL() -> URL? { +#if DEBUG + RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index.share") +#else + Bundle.main.url(forResource: "main", withExtension: "jsbundle") +#endif + } +} From a70b1f17d1d20a87889709ec550c9d4252d47a12 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:27:33 +0200 Subject: [PATCH 040/177] Use accent colour for active tabs. --- src/screens/stacks/TabNavigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screens/stacks/TabNavigator.js b/src/screens/stacks/TabNavigator.js index 014f7041..e7b97ecb 100644 --- a/src/screens/stacks/TabNavigator.js +++ b/src/screens/stacks/TabNavigator.js @@ -66,7 +66,7 @@ export default class TabNavigator extends React.Component { } tab_tint_color() { - return isLiquidGlass() ? liquidGlassTintColor() : App.theme_accent_color() + return App.theme_accent_color() } inactive_tab_tint_color() { From d93aecbfa343c779152239fc1a019d83ecd76544 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:41:17 +0200 Subject: [PATCH 041/177] Guard media uploads after asset removal. Avoid passing live MST nodes directly into async upload requests and guard progress/completion callbacks when assets are removed while an upload is in flight. Pass asset URIs through the image options route so navigation params do not hold onto detachable MST objects. --- src/components/header/remove_image.js | 23 ++++---- src/screens/posts/image_options.js | 25 +++++++-- src/screens/stacks/PostingStack.js | 2 +- src/stores/models/Posting.js | 52 +++++++++++++----- src/stores/models/posting/Destination.js | 68 ++++++++++++++++-------- src/stores/models/posting/MediaAsset.js | 30 +++++++++-- src/stores/models/posting/TempUpload.js | 18 ++++++- 7 files changed, 163 insertions(+), 55 deletions(-) diff --git a/src/components/header/remove_image.js b/src/components/header/remove_image.js index a2f885ee..0d3025c3 100644 --- a/src/components/header/remove_image.js +++ b/src/components/header/remove_image.js @@ -1,17 +1,20 @@ -import * as React from 'react'; -import { observer } from 'mobx-react'; -import { Button, Alert } from 'react-native'; -import App from './../../stores/App'; -import Auth from '../../stores/Auth'; -import { StackActions } from '@react-navigation/native'; +import * as React from 'react' +import { observer } from 'mobx-react' +import { Button, Alert } from 'react-native' +import App from './../../stores/App' +import Auth from '../../stores/Auth' @observer export default class RemoveImageButton extends React.Component { _handle_image_remove = () => { const { posting } = Auth.selected_user - const { asset, index } = this.props; - const existing_index = posting.post_assets?.findIndex(file => file.uri === asset.uri) + const { asset_uri } = this.props + const current_asset = posting.post_assets?.find(file => file.uri === asset_uri) + if (!current_asset) { + return + } + const existing_index = posting.post_assets?.findIndex(file => file.uri === current_asset.uri) if (existing_index > -1) { Alert.alert( "Remove upload?", @@ -27,7 +30,7 @@ export default class RemoveImageButton extends React.Component { this.props.navigation.goBack() // delay, seems to create problems otherwise setTimeout(() => { - posting.remove_asset(index) + posting.remove_asset(existing_index) }, 500); }, style: 'destructive' @@ -48,4 +51,4 @@ export default class RemoveImageButton extends React.Component { ) } -} \ No newline at end of file +} diff --git a/src/screens/posts/image_options.js b/src/screens/posts/image_options.js index b46fc08d..52b0d0dd 100644 --- a/src/screens/posts/image_options.js +++ b/src/screens/posts/image_options.js @@ -6,8 +6,8 @@ import Auth from '../../stores/Auth'; import App from '../../stores/App' import Clipboard from '@react-native-clipboard/clipboard'; import Video from 'react-native-video'; -import MicroPubApi from '../../api/MicroPubApi'; -import MBImage from '../../components/common/MBImage'; +import MicroPubApi from '../../api/MicroPubApi' +import MBImage from '../../components/common/MBImage' @observer export default class ImageOptionsScreen extends React.Component{ @@ -41,9 +41,21 @@ export default class ImageOptionsScreen extends React.Component{ }); } + _current_asset = () => { + const { asset_uri } = this.props.route.params || {} + const posting = Auth.selected_user.posting + if (asset_uri) { + return posting.post_assets.find(file => file.uri === asset_uri) + } + return null + } + _check_uploads_for_text(results) { - const { asset } = this.props.route.params; - let found = false; + const asset = this._current_asset() + if (!asset) { + return false + } + let found = false if (results.items != null) { for (let item of results.items) { @@ -79,7 +91,10 @@ export default class ImageOptionsScreen extends React.Component{ render() { const { posting } = Auth.selected_user - const { asset } = this.props.route.params + const asset = this._current_asset() + if (!asset) { + return null + } const max_media_height = 250; // cap media height const window_width = Dimensions.get('window').width; diff --git a/src/screens/stacks/PostingStack.js b/src/screens/stacks/PostingStack.js index fcc7147f..3c602ab1 100644 --- a/src/screens/stacks/PostingStack.js +++ b/src/screens/stacks/PostingStack.js @@ -56,7 +56,7 @@ export default class Posting extends React.Component{ options={({ route, navigation }) => ({ headerTitle: "Image Options", ...headerLeftElement(() => ), - ...headerRightElement(() => ) + ...headerRightElement(() => ) })} /> media_asset.cancelled, - on_progress: progress => media_asset.update_progress(progress), - on_local_uri: uri => media_asset.set_cached_uri(uri) + is_cancelled: () => !isAlive(media_asset) || media_asset.cancelled, + on_progress: progress => { + if (isAlive(media_asset)) { + media_asset.update_progress(progress) + } + }, + on_local_uri: uri => { + if (isAlive(media_asset)) { + media_asset.set_cached_uri(uri) + } + } }) + if (!isAlive(media_asset)) { + return false + } media_asset.remote_url = result.url if (result.poster) { media_asset.remote_poster_url = result.poster @@ -345,19 +369,23 @@ export default Posting = types.model('Posting', { media_asset.did_upload = true } catch (error) { - const was_cancelled = media_asset.cancelled + const was_cancelled = !isAlive(media_asset) || media_asset.cancelled console.log("Posting:upload_video_asset:error", error) if (!was_cancelled) { Alert.alert("Upload Failed", error?.message || "Could not upload video.") } - media_asset.did_upload = false - if (!was_cancelled) { - media_asset.progress = 0 + if (isAlive(media_asset)) { + media_asset.did_upload = false + if (!was_cancelled) { + media_asset.progress = 0 + } } } finally { - media_asset.is_uploading = false - media_asset.cancel_source = null + if (isAlive(media_asset)) { + media_asset.is_uploading = false + media_asset.cancel_source = null + } } }), @@ -406,7 +434,7 @@ export default Posting = types.model('Posting', { console.log("Posting:asset_option_screen:blocked - upload in progress") return false } - return App.navigate_to_screen("ImageOptions", { asset: asset, index: index }) + return App.navigate_to_screen("ImageOptions", { asset_uri: asset.uri, index: index }) }), remove_asset: flow(function* (media_index) { diff --git a/src/stores/models/posting/Destination.js b/src/stores/models/posting/Destination.js index 8d98cc42..def68c1e 100644 --- a/src/stores/models/posting/Destination.js +++ b/src/stores/models/posting/Destination.js @@ -1,4 +1,4 @@ -import { types, flow } from "mobx-state-tree" +import { types, flow, isAlive } from "mobx-state-tree" import { Alert } from "react-native" import Post from "./Post" import Page from "./Page" @@ -183,51 +183,73 @@ export default Destination = types.model('Destination', { media, service_object, cancel_source, - is_cancelled: () => temp_upload.cancelled, - on_progress: progress => temp_upload.update_progress(progress), - on_local_uri: uri => temp_upload.set_cached_uri(uri) + is_cancelled: () => !isAlive(temp_upload) || temp_upload.cancelled, + on_progress: progress => { + if (isAlive(temp_upload)) { + temp_upload.update_progress(progress) + } + }, + on_local_uri: uri => { + if (isAlive(temp_upload)) { + temp_upload.set_cached_uri(uri) + } + } }) + if (!isAlive(self) || !isAlive(temp_upload)) { + return + } temp_upload.url = result.url if (result.poster) { temp_upload.poster = result.poster } temp_upload.did_upload = true + const uploaded_url = temp_upload.url + const uploaded_poster = temp_upload.poster const upload_entry = { - url: temp_upload.url, - poster: temp_upload.poster + url: uploaded_url, + poster: uploaded_poster } self.uploads.unshift(upload_entry) yield service.check_for_uploads_for_destination(self) - const asset = self.uploads.find(a => a.url === temp_upload.url) + if (!isAlive(self)) { + return + } + const asset = self.uploads.find(a => a.url === uploaded_url) if (App.post_modal_is_open && asset) { Auth.selected_user.posting?.add_to_post_text(asset.best_post_markup()) } - const temp_index = self.temp_uploads.indexOf(temp_upload) - if (temp_index >= 0) { - self.temp_uploads.splice(temp_index, 1) + if (isAlive(temp_upload)) { + const temp_index = self.temp_uploads.indexOf(temp_upload) + if (temp_index >= 0) { + self.temp_uploads.splice(temp_index, 1) + } } } catch (error) { - const was_cancelled = temp_upload.cancelled + const was_cancelled = !isAlive(temp_upload) || temp_upload.cancelled console.log("Destination:upload_large_media:error", error) if (!was_cancelled) { Alert.alert("Upload Failed", error?.message || "Could not upload video.") } - temp_upload.did_upload = false - yield temp_upload.update_progress(0) - const temp_index = self.temp_uploads.indexOf(temp_upload) - if (temp_index >= 0) { - self.temp_uploads.splice(temp_index, 1) + if (isAlive(temp_upload)) { + temp_upload.did_upload = false + yield temp_upload.update_progress(0) + const temp_index = self.temp_uploads.indexOf(temp_upload) + if (temp_index >= 0) { + self.temp_uploads.splice(temp_index, 1) + } } } finally { - temp_upload.is_uploading = false - temp_upload.cancel_source = null + if (isAlive(temp_upload)) { + temp_upload.is_uploading = false + temp_upload.cancel_source = null + } } }), @@ -236,18 +258,20 @@ export default Destination = types.model('Destination', { const temp_upload = TempUpload.create(media) self.temp_uploads.push(temp_upload) const result = yield temp_upload.upload(service.service_object(), self) - if (result) { + if (result && isAlive(self) && isAlive(temp_upload)) { console.log("Destination:upload_media:success", result) + const uploaded_url = temp_upload.url + const uploaded_poster = temp_upload.poster const upload = { - url: temp_upload.url, - poster: temp_upload.poster, + url: uploaded_url, + poster: uploaded_poster, } self.uploads.unshift(upload) self.temp_uploads.remove(temp_upload) // Because we're uploading from within the post editor, we also // want to automatically set the upload within the post. if(App.post_modal_is_open){ - const asset = self.uploads.find(a => a.url === upload.url) + const asset = self.uploads.find(a => a.url === uploaded_url) if(asset){ Auth.selected_user.posting?.add_to_post_text(asset.best_post_markup()) // TODO: Should we bring this back? diff --git a/src/stores/models/posting/MediaAsset.js b/src/stores/models/posting/MediaAsset.js index 94507e30..f095ed60 100644 --- a/src/stores/models/posting/MediaAsset.js +++ b/src/stores/models/posting/MediaAsset.js @@ -1,4 +1,4 @@ -import { types, flow } from 'mobx-state-tree'; +import { types, flow, isAlive } from 'mobx-state-tree'; import MicroPubApi, { POST_ERROR } from './../../../api/MicroPubApi'; import XMLRPCApi, { XML_ERROR } from '../../../api/XMLRPCApi'; const FS = require("react-native-fs") @@ -33,7 +33,22 @@ export default MediaAsset = types.model('MediaAsset', { self.is_uploading = true if (service_object.type !== "xmlrpc") { self.cancel_source = axios.CancelToken.source() - const response = yield MicroPubApi.upload_image(service_object, self) + const file_extension = self.file_extension() + const upload_file = { + uri: self.uri, + type: self.type, + cancel_source: self.cancel_source, + file_extension: () => file_extension, + update_progress: progress => { + if (isAlive(self)) { + self.update_progress(progress) + } + } + } + const response = yield MicroPubApi.upload_image(service_object, upload_file) + if (!isAlive(self)) { + return false + } console.log("MediaAsset:upload", response) if (response !== POST_ERROR && response.success) { const upload_url = response.headers?.location || response.data?.url @@ -56,7 +71,15 @@ export default MediaAsset = types.model('MediaAsset', { } else { console.log("MediaAsset:upload:base64", self.base64 != null) - const response = yield XMLRPCApi.upload_image(service_object, self) + const upload_file = { + type: self.type, + mime: self.mime, + base64: self.base64 + } + const response = yield XMLRPCApi.upload_image(service_object, upload_file) + if (!isAlive(self)) { + return false + } console.log("MediaAsset:upload", response) if (response !== XML_ERROR && response.success) { if (response.link && response.link.trim() !== "") { @@ -75,6 +98,7 @@ export default MediaAsset = types.model('MediaAsset', { } self.is_uploading = false + return self.did_upload && self.remote_url != null }), set_alt_text: flow(function* (text) { diff --git a/src/stores/models/posting/TempUpload.js b/src/stores/models/posting/TempUpload.js index cbe6770d..395ccf27 100644 --- a/src/stores/models/posting/TempUpload.js +++ b/src/stores/models/posting/TempUpload.js @@ -1,5 +1,5 @@ import Clipboard from '@react-native-clipboard/clipboard' -import { types, flow } from 'mobx-state-tree' +import { types, flow, isAlive } from 'mobx-state-tree' import { Image } from 'react-native' import Toast from 'react-native-simple-toast' import axios from 'axios' @@ -39,7 +39,21 @@ export default TempUpload = types.model('TempUpload', { console.log("TempUpload:upload", service_object, destination.uri) self.is_uploading = true self.cancel_source = axios.CancelToken.source() - const response = yield MicroPubApi.upload_media(service_object, self, destination.uri) + const upload_file = { + uri: self.uri, + type: self.type, + name: self.name, + cancel_source: self.cancel_source, + update_progress: progress => { + if (isAlive(self)) { + self.update_progress(progress) + } + } + } + const response = yield MicroPubApi.upload_media(service_object, upload_file, destination.uri) + if (!isAlive(self)) { + return false + } console.log("TempUpload:upload", response) if (response !== POST_ERROR && response.success) { const upload_url = response.headers?.location || response.data?.url From 24b08bf51162fcf1774623fa5b3178ae74f4de38 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:48:36 +0200 Subject: [PATCH 042/177] Prefer local media previews after upload. Use local asset URIs for post editor previews so newly uploaded images render immediately. Fall back to the remote upload URL in the asset toolbar when the local temporary file is no longer available. --- src/components/keyboard/asset_toolbar.js | 167 +++++++++++++---------- src/screens/posts/image_options.js | 3 +- 2 files changed, 100 insertions(+), 70 deletions(-) diff --git a/src/components/keyboard/asset_toolbar.js b/src/components/keyboard/asset_toolbar.js index 841ad7ea..0d1daab8 100644 --- a/src/components/keyboard/asset_toolbar.js +++ b/src/components/keyboard/asset_toolbar.js @@ -8,6 +8,29 @@ import MBImage from '../common/MBImage' @observer export default class AssetToolbar extends React.Component{ + + state = { + failed_preview_uris: {} + } + + image_uri_for_asset(uri, remote_url) { + if (uri && !this.state.failed_preview_uris[uri]) { + return uri + } + return remote_url ? remote_url : uri + } + + handle_image_error(uri, remote_url) { + if (!uri || !remote_url || this.state.failed_preview_uris[uri]) { + return + } + this.setState({ + failed_preview_uris: { + ...this.state.failed_preview_uris, + [uri]: true + } + }) + } render() { const { posting } = this.props.posting != null ? this.props : Auth.selected_user @@ -24,77 +47,83 @@ export default class AssetToolbar extends React.Component{ }} > { - posting.post_assets.map((asset, index) => ( - { - if (asset.is_uploading) { - return; // Prevent navigation during upload - } - App.is_share_extension ? Share.trigger_image_options(asset) : posting.asset_option_screen(asset, index) - }} - onLongPress={() => { - if (asset.is_uploading) { - // Cancel and remove uploading asset - asset.cancel_upload(); - posting.remove_asset(index); - } else if (asset.remote_url != null && !asset.is_video) { - // Inline completed asset - posting.inline_asset(asset); - } - }} - key={`${asset.uri}-${index}`} - style={{ - marginRight: 4, - position: 'relative', - justifyContent: 'center', - alignItems: 'center', - width: 50, - height: 50 - }}> - { - asset.is_video ? - <> - - - : - - } - { - asset.is_uploading ? + posting.post_assets.map((asset, index) => { + const asset_uri = asset.uri + const asset_remote_url = asset.remote_url + const image_uri = this.image_uri_for_asset(asset_uri, asset_remote_url) + const video_poster_uri = asset.remote_poster_url ? asset.remote_poster_url : asset.uri + return ( + { + if (asset.is_uploading) { + return; // Prevent navigation during upload + } + App.is_share_extension ? Share.trigger_image_options(asset) : posting.asset_option_screen(asset, index) + }} + onLongPress={() => { + if (asset.is_uploading) { + // Cancel and remove uploading asset + asset.cancel_upload(); + posting.remove_asset(index); + } else if (asset.remote_url != null && !asset.is_video) { + // Inline completed asset + posting.inline_asset(asset); + } + }} + key={`${asset.uri}-${index}`} + style={{ + marginRight: 4, + position: 'relative', + justifyContent: 'center', + alignItems: 'center', + width: 50, + height: 50 + }}> + { + asset.is_video ? <> - - - - + - : null - } - - )) + : + this.handle_image_error(asset_uri, asset_remote_url)} style={{ width: 50, height: 50, borderRadius: 5, backgroundColor: '#E5E7EB' }} /> + } + { + asset.is_uploading ? + <> + + + + + + : null + } + + ) + }) } ) diff --git a/src/screens/posts/image_options.js b/src/screens/posts/image_options.js index 52b0d0dd..d6b88beb 100644 --- a/src/screens/posts/image_options.js +++ b/src/screens/posts/image_options.js @@ -110,6 +110,7 @@ export default class ImageOptionsScreen extends React.Component{ media_width = max_media_height * aspect_ratio; } } + const image_uri = asset.uri ? asset.uri : asset.remote_url return( @@ -135,7 +136,7 @@ export default class ImageOptionsScreen extends React.Component{ repeat /> : - + } { asset.is_uploading ? From 768c55763855ada90ca06cd6fb7d0528ae192613 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 11:57:34 +0200 Subject: [PATCH 043/177] Fix iOS menu icon colours. --- src/components/cells/temp_upload_cell.js | 2 ++ src/components/cells/upload_cell.js | 11 +++++++++++ src/components/header/new_upload.js | 9 ++++++--- src/components/header/tags_button.js | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/components/cells/temp_upload_cell.js b/src/components/cells/temp_upload_cell.js index 03169f5c..48bb09e6 100644 --- a/src/components/cells/temp_upload_cell.js +++ b/src/components/cells/temp_upload_cell.js @@ -12,6 +12,7 @@ export default class TempUploadCell extends React.Component { render() { const { upload } = this.props; const dimension = Dimensions.get("screen")?.width / 4 - 10; + const destructive_icon_color = App.theme_warning_text_color() const actions = [ { title: "Cancel upload", @@ -19,6 +20,7 @@ export default class TempUploadCell extends React.Component { image: Platform.select({ ios: "trash", }), + imageColor: destructive_icon_color, attributes: { destructive: true, }, diff --git a/src/components/cells/upload_cell.js b/src/components/cells/upload_cell.js index 669c25ff..8d108288 100644 --- a/src/components/cells/upload_cell.js +++ b/src/components/cells/upload_cell.js @@ -138,6 +138,9 @@ export default class UploadCell extends React.Component { render() { const { upload } = this.props; + const icon_color = App.theme_text_color() + const destructive_icon_color = App.theme_warning_text_color() + if (this.props.add_to_editor) { return ( { @@ -31,14 +32,16 @@ export default class NewUploadButton extends React.Component { id: "upload_media", image: Platform.select({ ios: 'photo' - }) + }), + imageColor: icon_color }, { title: "Files", id: "upload_file", image: Platform.select({ ios: 'folder' - }) + }), + imageColor: icon_color } ]} > @@ -61,4 +64,4 @@ export default class NewUploadButton extends React.Component { return null } -} \ No newline at end of file +} diff --git a/src/components/header/tags_button.js b/src/components/header/tags_button.js index b4209a29..1466fcba 100644 --- a/src/components/header/tags_button.js +++ b/src/components/header/tags_button.js @@ -11,6 +11,8 @@ import { MenuView } from '@react-native-menu/menu'; export default class TagsButton extends React.Component { _outer_container = (children) => { + const icon_color = App.theme_text_color() + return( Auth.selected_user?.bookmark_tags?.length > 0 && Auth.selected_user?.bookmark_recent_tags?.length > 0 ? Date: Mon, 27 Apr 2026 12:09:40 +0200 Subject: [PATCH 044/177] Add Liquid Glass padding to hybrid webviews. Inject a bottom padding CSS variable and body inline style into iOS hybrid WebViews so content clears the Liquid Glass tab bar. Add tests for the iOS 26 padding helper. --- src/components/web/webview_module.js | 39 +++++++++++++++++++++++++++- src/utils/ui.js | 17 +++++++++--- src/utils/ui.test.js | 21 +++++++++++++++ 3 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 src/utils/ui.test.js diff --git a/src/components/web/webview_module.js b/src/components/web/webview_module.js index 95c88080..08297806 100644 --- a/src/components/web/webview_module.js +++ b/src/components/web/webview_module.js @@ -2,6 +2,7 @@ import * as React from 'react' import { observer } from 'mobx-react' import { RefreshControl, Platform, View } from "react-native" import { useFocusEffect } from '@react-navigation/native' +import { useSafeAreaInsets } from 'react-native-safe-area-context' import Auth from '../../stores/Auth' import App from '../../stores/App' import { ScrollView } from 'react-native-gesture-handler' @@ -15,8 +16,10 @@ import { is_webview_endpoint_url, should_attempt_webview_recovery, } from '../../utils/webview_recovery' +import { liquidGlassWebViewBottomInset } from '../../utils/ui' const WebViewModule = observer((props) => { + const insets = useSafeAreaInsets() const webViewRef = React.useRef(null) const hasSetDidLoadRef = React.useRef(false) const hasAttemptedRecoveryRef = React.useRef(false) @@ -39,6 +42,33 @@ const WebViewModule = observer((props) => { token: Auth.selected_user?.token?.() ?? '', web_url, }) + const web_view_bottom_padding = liquidGlassWebViewBottomInset(insets.bottom) + const web_view_css_properties_javascript = ` + (() => { + const bottom_padding = '${web_view_bottom_padding}px' + const apply_bottom_padding = () => { + document.documentElement.style.setProperty('--microblog-webview-bottom-padding', bottom_padding) + + if (document.body) { + document.body.style.setProperty('padding-bottom', 'var(--microblog-webview-bottom-padding)') + } + } + + apply_bottom_padding() + + if (!document.body) { + document.addEventListener('DOMContentLoaded', apply_bottom_padding, { once: true }) + } + })() + true + ` + const web_view_injected_javascript = Platform.OS === 'ios' ? ` + const meta = document.createElement('meta') + meta.setAttribute('content', 'width=width, initial-scale=${App.web_font_scale()}') + meta.setAttribute('name', 'viewport') + document.getElementsByTagName('head')[0].appendChild(meta) + ${web_view_css_properties_javascript} + ` : null useFocusEffect( React.useCallback(() => { @@ -58,6 +88,12 @@ const WebViewModule = observer((props) => { hasAttemptedRecoveryRef.current = false }, [props.endpoint]) + React.useEffect(() => { + if (Platform.OS === 'ios') { + webViewRef.current?.injectJavaScript(web_view_css_properties_javascript) + } + }, [web_view_css_properties_javascript]) + const on_refresh = () => { setState(prevState => { if (!prevState.is_initial_load) { @@ -215,7 +251,8 @@ const WebViewModule = observer((props) => { }} style={{ flex: 1, backgroundColor: App.theme_background_color(), opacity: state.opacity }} renderError={(name, code, description) => } - injectedJavaScript={Platform.OS === 'ios' ? `const meta = document.createElement('meta'); meta.setAttribute('content', 'width=width, initial-scale=${App.web_font_scale()}'); meta.setAttribute('name', 'viewport'); document.getElementsByTagName('head')[0].appendChild(meta);` : null} + injectedJavaScript={web_view_injected_javascript} + injectedJavaScriptBeforeContentLoaded={Platform.OS === 'ios' ? web_view_css_properties_javascript : null} onContentProcessDidTerminate={onContentProcessDidTerminate} /> ) diff --git a/src/utils/ui.js b/src/utils/ui.js index 11f0e6ad..fa63e442 100644 --- a/src/utils/ui.js +++ b/src/utils/ui.js @@ -1,11 +1,20 @@ import { DynamicColorIOS, Platform } from 'react-native' export const STANDARD_SLOP = 10 +export const LIQUID_GLASS_WEBVIEW_TAB_BAR_PADDING = 56 -export function isLiquidGlass() { - return ( - (Platform.OS === 'ios') && (parseInt(Platform.Version, 10) >= 26) - ) +export function isLiquidGlass(platform = Platform) { + return ( + (platform.OS === 'ios') && (parseInt(platform.Version, 10) >= 26) + ) +} + +export function liquidGlassWebViewBottomInset(bottom_safe_area_inset = 0, platform = Platform) { + if (!isLiquidGlass(platform)) { + return 0 + } + + return bottom_safe_area_inset + LIQUID_GLASS_WEBVIEW_TAB_BAR_PADDING } export function liquidGlassTintColor() { diff --git a/src/utils/ui.test.js b/src/utils/ui.test.js new file mode 100644 index 00000000..8c194ec6 --- /dev/null +++ b/src/utils/ui.test.js @@ -0,0 +1,21 @@ +import { + LIQUID_GLASS_WEBVIEW_TAB_BAR_PADDING, + isLiquidGlass, + liquidGlassWebViewBottomInset +} from './ui' + +describe('ui helpers', () => { + test('detects Liquid Glass only on iOS 26 and newer', () => { + expect(isLiquidGlass({ OS: 'ios', Version: '26.0' })).toBe(true) + expect(isLiquidGlass({ OS: 'ios', Version: '25.4' })).toBe(false) + expect(isLiquidGlass({ OS: 'android', Version: '26' })).toBe(false) + }) + + test('adds webview bottom padding only for Liquid Glass', () => { + expect(liquidGlassWebViewBottomInset(34, { OS: 'ios', Version: '26.0' })).toBe( + 34 + LIQUID_GLASS_WEBVIEW_TAB_BAR_PADDING + ) + expect(liquidGlassWebViewBottomInset(34, { OS: 'ios', Version: '25.4' })).toBe(0) + expect(liquidGlassWebViewBottomInset(34, { OS: 'android', Version: '26' })).toBe(0) + }) +}) From 9e8d77447a823af47d18dd0613fcf1c9e3993c4b Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 16:18:45 +0200 Subject: [PATCH 045/177] Fix iOS reply toolbar visibility. --- src/components/sheets/reply_sheet.ios.js | 85 ++++++++++-------------- 1 file changed, 36 insertions(+), 49 deletions(-) diff --git a/src/components/sheets/reply_sheet.ios.js b/src/components/sheets/reply_sheet.ios.js index 629d1da0..8092aa93 100644 --- a/src/components/sheets/reply_sheet.ios.js +++ b/src/components/sheets/reply_sheet.ios.js @@ -1,6 +1,6 @@ import * as React from 'react' import { observer } from 'mobx-react' -import { View, TextInput, InputAccessoryView, KeyboardAvoidingView, TouchableOpacity, Text } from 'react-native' +import { View, TextInput, TouchableOpacity, Text } from 'react-native' import ActionSheet from 'react-native-actions-sheet' import Reply from '../../stores/Reply' import ReplyToolbar from '../keyboard/reply_toolbar' @@ -10,11 +10,6 @@ import LoadingComponent from '../generic/loading' @observer export default class ReplySheet extends React.Component { - constructor(props) { - super(props) - this.input_accessory_view_id = 'input_toolbar' - } - handleClose = () => { App.close_sheet('reply_sheet') } @@ -53,50 +48,42 @@ export default class ReplySheet extends React.Component { Send - - - 0 ? 35 : 0 - }} - editable={!Reply.is_sending_reply} - multiline={true} - scrollEnabled={true} - returnKeyType={'default'} - keyboardType={'default'} - autoFocus={true} - autoCorrect={true} - clearButtonMode={'while-editing'} - enablesReturnKeyAutomatically={true} - underlineColorAndroid={'transparent'} - value={Reply.reply_text} - onChangeText={text => !Reply.is_sending_reply ? Reply.set_reply_text_from_typing(text) : null} - onSelectionChange={({ nativeEvent: { selection } }) => { - Reply.set_text_selection(selection) - }} - inputAccessoryViewID={this.input_accessory_view_id} - /> - - - - - - + + 0 ? 35 : 0 + }} + editable={!Reply.is_sending_reply} + multiline={true} + scrollEnabled={true} + returnKeyType={'default'} + keyboardType={'default'} + autoFocus={true} + autoCorrect={true} + clearButtonMode={'while-editing'} + enablesReturnKeyAutomatically={true} + underlineColorAndroid={'transparent'} + value={Reply.reply_text} + onChangeText={text => !Reply.is_sending_reply ? Reply.set_reply_text_from_typing(text) : null} + onSelectionChange={({ nativeEvent: { selection } }) => { + Reply.set_text_selection(selection) + }} + /> + + + ) } From 654643eea2ed823fcd08ab56212cba43e76f4c01 Mon Sep 17 00:00:00 2001 From: Vincent Ritter Date: Mon, 27 Apr 2026 16:35:54 +0200 Subject: [PATCH 046/177] Fix iOS share extension toolbar visibility. --- src/screens/share/index.js | 111 +++++++++++------------ src/screens/share/post.ios.js | 162 ++++++++++++++++++---------------- 2 files changed, 143 insertions(+), 130 deletions(-) diff --git a/src/screens/share/index.js b/src/screens/share/index.js index 436a3c7d..1fe780e5 100644 --- a/src/screens/share/index.js +++ b/src/screens/share/index.js @@ -1,6 +1,7 @@ import { observer } from 'mobx-react' import * as React from 'react' import { ActivityIndicator, Button, Text, View, Platform } from 'react-native' +import { KeyboardProvider } from "react-native-keyboard-controller" import App from '../../stores/App' import Share from '../../stores/Share' import SharePostScreen from './post' @@ -17,64 +18,66 @@ export default class ShareScreen extends React.Component { render() { return ( - - { - Share.is_loading ? - - - { - Platform.OS === "ios" ? - {Share.temp_direct_shared_data} - : null - } - - : - Share.is_logged_in() ? - - + + + { + Share.is_loading ? + + { - Share.image_options_open ? - - : - <> - - { - Share.selected_user?.posting.is_sending_post || Share.selected_user?.posting.is_adding_bookmark ? - - - - { Share.selected_user?.posting.is_sending_post ? "Sending post..." : "Saving bookmark..." } - - - : null - } - + Platform.OS === "ios" ? + {Share.temp_direct_shared_data} + : null } : - - Using the Micro.blog app, please sign in before using the share extension. -