tangled mirror of catsky-🐱 Soothing soft social-app fork with all the niche toggles! (Unofficial); for issues and PRs please put them on github:NekoDrone/catsky-social

new arch (#8295)

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: Charlotte Som <charlotte@som.codes>
Co-authored-by: Hailey <me@haileyok.com>

+14 -37
__tests__/lib/images.test.ts
··· 1 - import {deleteAsync} from 'expo-file-system' 1 + import {createDownloadResumable, deleteAsync} from 'expo-file-system' 2 2 import {manipulateAsync, SaveFormat} from 'expo-image-manipulator' 3 - import RNFetchBlob from 'rn-fetch-blob' 4 3 5 4 import { 6 5 downloadAndResize, 7 - DownloadAndResizeOpts, 6 + type DownloadAndResizeOpts, 8 7 getResizedDimensions, 9 8 } from '../../src/lib/media/manip' 10 9 ··· 32 31 }) 33 32 34 33 it('should return resized image for valid URI and options', async () => { 35 - const mockedFetch = RNFetchBlob.fetch as jest.Mock 36 - mockedFetch.mockResolvedValueOnce({ 37 - path: jest.fn().mockReturnValue('file://downloaded-image.jpg'), 38 - info: jest.fn().mockReturnValue({status: 200}), 39 - flush: jest.fn(), 34 + const mockedFetch = createDownloadResumable as jest.Mock 35 + mockedFetch.mockReturnValue({ 36 + cancelAsync: jest.fn(), 37 + downloadAsync: jest 38 + .fn() 39 + .mockResolvedValue({uri: 'file://resized-image.jpg'}), 40 40 }) 41 41 42 42 const opts: DownloadAndResizeOpts = { ··· 50 50 51 51 const result = await downloadAndResize(opts) 52 52 expect(result).toEqual(mockResizedImage) 53 - expect(RNFetchBlob.config).toHaveBeenCalledWith({ 54 - fileCache: true, 55 - appendExt: 'jpeg', 56 - }) 57 - expect(RNFetchBlob.fetch).toHaveBeenCalledWith( 58 - 'GET', 59 - 'https://example.com/image.jpg', 53 + expect(createDownloadResumable).toHaveBeenCalledWith( 54 + opts.uri, 55 + expect.anything(), 56 + { 57 + cache: true, 58 + }, 60 59 ) 61 60 62 61 // First time it gets called is to get dimensions ··· 83 82 84 83 const result = await downloadAndResize(opts) 85 84 expect(errorSpy).toHaveBeenCalled() 86 - expect(result).toBeUndefined() 87 - }) 88 - 89 - it('should return undefined for non-200 response', async () => { 90 - const mockedFetch = RNFetchBlob.fetch as jest.Mock 91 - mockedFetch.mockResolvedValueOnce({ 92 - path: jest.fn().mockReturnValue('file://downloaded-image'), 93 - info: jest.fn().mockReturnValue({status: 400}), 94 - flush: jest.fn(), 95 - }) 96 - 97 - const opts: DownloadAndResizeOpts = { 98 - uri: 'https://example.com/image', 99 - width: 100, 100 - height: 100, 101 - maxSize: 500000, 102 - mode: 'cover', 103 - timeout: 10000, 104 - } 105 - 106 - const result = await downloadAndResize(opts) 107 - expect(errorSpy).not.toHaveBeenCalled() 108 85 expect(result).toBeUndefined() 109 86 }) 110 87
+1 -1
app.config.js
··· 219 219 compileSdkVersion: 35, 220 220 targetSdkVersion: 35, 221 221 buildToolsVersion: '35.0.0', 222 - newArchEnabled: false, 222 + newArchEnabled: true, 223 223 }, 224 224 }, 225 225 ],
+2 -7
jest/jestSetup.js
··· 33 33 } 34 34 }) 35 35 36 - jest.mock('rn-fetch-blob', () => ({ 37 - config: jest.fn().mockReturnThis(), 38 - cancel: jest.fn(), 39 - fetch: jest.fn(), 40 - })) 41 - 42 36 jest.mock('expo-file-system', () => ({ 43 37 getInfoAsync: jest.fn().mockResolvedValue({exists: true, size: 100}), 44 38 deleteAsync: jest.fn(), 39 + createDownloadResumable: jest.fn(), 45 40 })) 46 41 47 42 jest.mock('expo-image-manipulator', () => ({ ··· 101 96 } 102 97 } 103 98 }), 104 - requireNativeViewManager: jest.fn().mockImplementation(moduleName => { 99 + requireNativeViewManager: jest.fn().mockImplementation(_ => { 105 100 return () => null 106 101 }), 107 102 }))
+40 -38
package.json
··· 74 74 "@braintree/sanitize-url": "^6.0.2", 75 75 "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", 76 76 "@emoji-mart/react": "^1.1.1", 77 - "@expo/html-elements": "^0.12.4", 77 + "@expo/html-elements": "^0.12.5", 78 78 "@expo/webpack-config": "^19.0.1", 79 79 "@floating-ui/dom": "^1.6.3", 80 80 "@floating-ui/react-dom": "^2.0.8", ··· 85 85 "@fortawesome/free-regular-svg-icons": "^6.1.1", 86 86 "@fortawesome/free-solid-svg-icons": "^6.1.1", 87 87 "@fortawesome/react-native-fontawesome": "^0.3.2", 88 - "@haileyok/bluesky-video": "0.2.6", 88 + "@haileyok/bluesky-video": "0.3.1", 89 89 "@ipld/dag-cbor": "^9.2.0", 90 90 "@lingui/react": "^4.14.1", 91 - "@mattermost/react-native-paste-input": "^0.7.1", 92 - "@miblanchard/react-native-slider": "^2.3.1", 93 - "@mozzius/expo-dynamic-app-icon": "^1.5.0", 91 + "@mattermost/react-native-paste-input": "mattermost/react-native-paste-input", 92 + "@miblanchard/react-native-slider": "^2.6.0", 93 + "@mozzius/expo-dynamic-app-icon": "1.5.0", 94 94 "@react-native-async-storage/async-storage": "2.1.2", 95 95 "@react-native-menu/menu": "^1.2.3", 96 96 "@react-native-picker/picker": "2.11.0", ··· 98 98 "@react-navigation/drawer": "^7.3.12", 99 99 "@react-navigation/native": "^7.1.9", 100 100 "@react-navigation/native-stack": "^7.3.13", 101 - "@sentry/react-native": "~6.10.0", 101 + "@sentry/react-native": "~6.14.0", 102 102 "@tanstack/query-async-storage-persister": "^5.25.0", 103 103 "@tanstack/react-query": "^5.8.1", 104 104 "@tanstack/react-query-persist-client": "^5.25.0", ··· 130 130 "emoji-mart": "^5.5.2", 131 131 "emoji-regex": "^10.4.0", 132 132 "eventemitter3": "^5.0.1", 133 - "expo": "^53.0.5", 133 + "expo": "53.0.11", 134 134 "expo-application": "~6.1.4", 135 - "expo-blur": "~14.1.4", 135 + "expo-blur": "~14.1.5", 136 136 "expo-build-properties": "~0.14.6", 137 - "expo-camera": "~16.1.6", 137 + "expo-camera": "~16.1.8", 138 138 "expo-clipboard": "~7.1.4", 139 - "expo-dev-client": "~5.1.7", 139 + "expo-dev-client": "~5.2.0", 140 140 "expo-device": "~7.1.4", 141 - "expo-file-system": "~18.1.8", 142 - "expo-font": "~13.3.0", 141 + "expo-file-system": "~18.1.10", 142 + "expo-font": "~13.3.1", 143 143 "expo-haptics": "~14.1.4", 144 - "expo-image": "~2.1.6", 144 + "expo-image": "~2.2.1", 145 145 "expo-image-crop-tool": "^0.1.8", 146 - "expo-image-manipulator": "~13.1.5", 146 + "expo-image-manipulator": "~13.1.7", 147 147 "expo-image-picker": "~16.1.4", 148 - "expo-linear-gradient": "~14.1.4", 149 - "expo-linking": "~7.1.4", 148 + "expo-linear-gradient": "~14.1.5", 149 + "expo-linking": "~7.1.5", 150 150 "expo-localization": "~16.1.5", 151 - "expo-media-library": "~17.1.6", 152 - "expo-notifications": "~0.31.1", 153 - "expo-screen-orientation": "~8.1.5", 151 + "expo-media-library": "~17.1.7", 152 + "expo-notifications": "~0.31.3", 153 + "expo-screen-orientation": "~8.1.7", 154 154 "expo-sharing": "~13.1.5", 155 - "expo-splash-screen": "~0.30.8", 156 - "expo-system-ui": "~5.0.7", 155 + "expo-splash-screen": "~0.30.9", 156 + "expo-system-ui": "~5.0.8", 157 157 "expo-task-manager": "~13.1.5", 158 - "expo-updates": "~0.28.12", 159 - "expo-video": "~2.1.8", 158 + "expo-updates": "~0.28.14", 159 + "expo-video": "~2.2.1", 160 160 "expo-web-browser": "~14.1.6", 161 161 "fast-text-encoding": "^1.0.6", 162 162 "history": "^5.3.0", ··· 182 182 "react-image-crop": "^11.0.7", 183 183 "react-is": "19", 184 184 "react-keyed-flatten-children": "^5.0.0", 185 - "react-native": "0.79.2", 186 - "react-native-compressor": "1.11.0", 185 + "react-native": "^0.79.3", 186 + "react-native-compressor": "^1.11.0", 187 187 "react-native-date-picker": "^5.0.12", 188 - "react-native-drawer-layout": "^4.1.6", 188 + "react-native-drawer-layout": "^4.1.8", 189 189 "react-native-edge-to-edge": "^1.6.0", 190 190 "react-native-gesture-handler": "2.25.0", 191 191 "react-native-get-random-values": "~1.11.0", 192 192 "react-native-ios-context-menu": "^1.15.3", 193 193 "react-native-keyboard-controller": "^1.17.1", 194 194 "react-native-mmkv": "^2.12.2", 195 - "react-native-pager-view": "6.7.1", 195 + "react-native-pager-view": "^6.7.1", 196 196 "react-native-progress": "bluesky-social/react-native-progress", 197 197 "react-native-qrcode-styled": "^0.3.3", 198 198 "react-native-reanimated": "~3.17.5", 199 - "react-native-root-siblings": "^4.1.1", 199 + "react-native-root-siblings": "^5.0.1", 200 200 "react-native-safe-area-context": "5.4.0", 201 201 "react-native-screens": "^4.11.1", 202 - "react-native-svg": "15.11.2", 202 + "react-native-svg": "15.12.0", 203 203 "react-native-uitextview": "^1.4.0", 204 204 "react-native-url-polyfill": "^1.3.0", 205 205 "react-native-uuid": "^2.0.3", 206 206 "react-native-view-shot": "^4.0.3", 207 207 "react-native-web": "~0.20.0", 208 208 "react-native-web-webview": "^1.0.2", 209 - "react-native-webview": "13.13.5", 209 + "react-native-webview": "^13.13.5", 210 210 "react-remove-scroll-bar": "^2.3.8", 211 211 "react-responsive": "^9.0.2", 212 212 "react-textarea-autosize": "^8.5.3", 213 - "rn-fetch-blob": "^0.12.0", 214 213 "statsig-react-native-expo": "^4.6.1", 215 214 "tippy.js": "^6.3.7", 216 215 "tlds": "^1.234.0", ··· 227 226 "@lingui/cli": "^4.14.1", 228 227 "@lingui/macro": "^4.14.1", 229 228 "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", 230 - "@react-native/eslint-config": "^0.79.2", 231 - "@react-native/typescript-config": "^0.79.2", 229 + "@react-native/babel-preset": "0.79.3", 230 + "@react-native/eslint-config": "^0.79.3", 231 + "@react-native/typescript-config": "^0.79.3", 232 232 "@sentry/webpack-plugin": "^3.2.2", 233 233 "@testing-library/jest-native": "^5.4.3", 234 234 "@testing-library/react-native": "^13.2.0", ··· 247 247 "babel-plugin-module-resolver": "^5.0.2", 248 248 "babel-plugin-react-compiler": "^19.1.0-rc.1", 249 249 "babel-preset-expo": "~13.1.11", 250 + "browserslist": "^4.25.0", 250 251 "eslint": "^8.19.0", 251 252 "eslint-plugin-bsky-internal": "link:./eslint", 252 253 "eslint-plugin-ft-flow": "^2.0.3", ··· 260 261 "husky": "^8.0.3", 261 262 "is-ci": "^3.0.1", 262 263 "jest": "^29.7.0", 263 - "jest-expo": "~53.0.3", 264 + "jest-expo": "~53.0.7", 264 265 "jest-junit": "^16.0.0", 265 266 "lint-staged": "^13.2.3", 266 267 "lockfile-lint": "^4.14.0", ··· 275 276 }, 276 277 "resolutions": { 277 278 "@expo/image-utils": "0.6.3", 278 - "@react-native/babel-preset": "0.79.2", 279 - "@react-native/normalize-colors": "0.79.2", 279 + "@react-native/babel-preset": "0.79.3", 280 + "@react-native/normalize-colors": "0.79.3", 280 281 "@types/react": "^18", 281 282 "**/expo-constants": "17.0.3", 282 - "**/expo-device": "7.0.1", 283 + "**/expo-device": "7.1.4", 283 284 "**/zod": "3.23.8", 284 285 "**/multiformats": "9.9.0" 285 286 }, ··· 359 360 ], 360 361 "allowedUrls": [ 361 362 "https://codeload.github.com/bluesky-social/react-native-bottom-sheet/tar.gz/28a87d1bb55e10fc355fa1455545a30734995908", 362 - "https://codeload.github.com/bluesky-social/react-native-progress/tar.gz/5a372f4f2ce5feb26f4f47b6a4d187ab9b923ab4" 363 + "https://codeload.github.com/bluesky-social/react-native-progress/tar.gz/5a372f4f2ce5feb26f4f47b6a4d187ab9b923ab4", 364 + "https://codeload.github.com/mattermost/react-native-paste-input/tar.gz/f260447edc645a817ab1ba7b46d8341d84dba8e9" 363 365 ], 364 366 "emptyHostname": false, 365 367 "validatePackageNames": true,
-157
patches/@mattermost+react-native-paste-input+0.7.1.patch
··· 1 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 2 - index e916023..5049c33 100644 3 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 4 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 5 - @@ -4,6 +4,7 @@ 6 - // 7 - // Created by Elias Nahum on 04-11-20. 8 - // Copyright © 2020 Facebook. All rights reserved. 9 - +// Updated to remove parent’s default text view 10 - // 11 - 12 - #import "PasteInputView.h" 13 - @@ -12,49 +13,78 @@ 14 - 15 - @implementation PasteInputView 16 - { 17 - - PasteInputTextView *_backedTextInputView; 18 - + // We'll store the custom text view in this ivar 19 - + PasteInputTextView *_customBackedTextView; 20 - } 21 - 22 - - (instancetype)initWithBridge:(RCTBridge *)bridge 23 - { 24 - + // Must call the super’s designated initializer 25 - if (self = [super initWithBridge:bridge]) { 26 - - _backedTextInputView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 27 - - _backedTextInputView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 28 - - _backedTextInputView.textInputDelegate = self; 29 - + // 1. The parent (RCTMultilineTextInputView) has already created 30 - + // its own _backedTextInputView = [RCTUITextView new] in super init. 31 - + // We can remove that subview: 32 - 33 - - [self addSubview:_backedTextInputView]; 34 - - } 35 - + id<RCTBackedTextInputViewProtocol> parentInputView = super.backedTextInputView; 36 - + if ([parentInputView isKindOfClass:[UIView class]]) { 37 - + UIView *parentSubview = (UIView *)parentInputView; 38 - + if (parentSubview.superview == self) { 39 - + [parentSubview removeFromSuperview]; 40 - + } 41 - + } 42 - 43 - + // 2. Now create our custom PasteInputTextView 44 - + _customBackedTextView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 45 - + _customBackedTextView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 46 - + _customBackedTextView.textInputDelegate = self; 47 - + 48 - + // Optional: disable inline predictions for iOS 17+ 49 - + if (@available(iOS 17.0, *)) { 50 - + _customBackedTextView.inlinePredictionType = UITextInlinePredictionTypeNo; 51 - + } 52 - + 53 - + // 3. Add your custom text view as the only subview 54 - + [self addSubview:_customBackedTextView]; 55 - + } 56 - return self; 57 - } 58 - 59 - +/** 60 - + * Override the parent's accessor so that anywhere in RN that calls 61 - + * `self.backedTextInputView` will get the custom PasteInputTextView. 62 - + */ 63 - - (id<RCTBackedTextInputViewProtocol>)backedTextInputView 64 - { 65 - - return _backedTextInputView; 66 - + return _customBackedTextView; 67 - } 68 - 69 - -- (void)setDisableCopyPaste:(BOOL)disableCopyPaste { 70 - - _backedTextInputView.disableCopyPaste = disableCopyPaste; 71 - +#pragma mark - Setters for React Props 72 - + 73 - +- (void)setDisableCopyPaste:(BOOL)disableCopyPaste 74 - +{ 75 - + _customBackedTextView.disableCopyPaste = disableCopyPaste; 76 - } 77 - 78 - -- (void)setOnPaste:(RCTDirectEventBlock)onPaste { 79 - - _backedTextInputView.onPaste = onPaste; 80 - +- (void)setOnPaste:(RCTDirectEventBlock)onPaste 81 - +{ 82 - + _customBackedTextView.onPaste = onPaste; 83 - } 84 - 85 - -- (void)setSmartPunctuation:(NSString *)smartPunctuation { 86 - - if ([smartPunctuation isEqualToString:@"enable"]) { 87 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeYes]; 88 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeYes]; 89 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 90 - - } else if ([smartPunctuation isEqualToString:@"disable"]) { 91 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeNo]; 92 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeNo]; 93 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 94 - - } else { 95 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeDefault]; 96 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 97 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 98 - - } 99 - +- (void)setSmartPunctuation:(NSString *)smartPunctuation 100 - +{ 101 - + if ([smartPunctuation isEqualToString:@"enable"]) { 102 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeYes]; 103 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeYes]; 104 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 105 - + } else if ([smartPunctuation isEqualToString:@"disable"]) { 106 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeNo]; 107 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeNo]; 108 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 109 - + } else { 110 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeDefault]; 111 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 112 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 113 - + } 114 - } 115 - 116 - #pragma mark - UIScrollViewDelegate 117 - @@ -62,7 +92,6 @@ 118 - - (void)scrollViewDidScroll:(UIScrollView *)scrollView 119 - { 120 - RCTDirectEventBlock onScroll = self.onScroll; 121 - - 122 - if (onScroll) { 123 - CGPoint contentOffset = scrollView.contentOffset; 124 - CGSize contentSize = scrollView.contentSize; 125 - @@ -71,22 +100,22 @@ 126 - 127 - onScroll(@{ 128 - @"contentOffset": @{ 129 - - @"x": @(contentOffset.x), 130 - - @"y": @(contentOffset.y) 131 - + @"x": @(contentOffset.x), 132 - + @"y": @(contentOffset.y) 133 - }, 134 - @"contentInset": @{ 135 - - @"top": @(contentInset.top), 136 - - @"left": @(contentInset.left), 137 - - @"bottom": @(contentInset.bottom), 138 - - @"right": @(contentInset.right) 139 - + @"top": @(contentInset.top), 140 - + @"left": @(contentInset.left), 141 - + @"bottom": @(contentInset.bottom), 142 - + @"right": @(contentInset.right) 143 - }, 144 - @"contentSize": @{ 145 - - @"width": @(contentSize.width), 146 - - @"height": @(contentSize.height) 147 - + @"width": @(contentSize.width), 148 - + @"height": @(contentSize.height) 149 - }, 150 - @"layoutMeasurement": @{ 151 - - @"width": @(size.width), 152 - - @"height": @(size.height) 153 - + @"width": @(size.width), 154 - + @"height": @(size.height) 155 - }, 156 - @"zoomScale": @(scrollView.zoomScale ?: 1), 157 - });
+264
patches/@mattermost+react-native-paste-input+0.8.1.patch.disabled
··· 1 + diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 2 + index e916023..5049c33 100644 3 + --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 4 + +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 5 + @@ -4,6 +4,7 @@ 6 + // 7 + // Created by Elias Nahum on 04-11-20. 8 + // Copyright © 2020 Facebook. All rights reserved. 9 + +// Updated to remove parent’s default text view 10 + // 11 + 12 + #import "PasteInputView.h" 13 + @@ -12,49 +13,78 @@ 14 + 15 + @implementation PasteInputView 16 + { 17 + - PasteInputTextView *_backedTextInputView; 18 + + // We'll store the custom text view in this ivar 19 + + PasteInputTextView *_customBackedTextView; 20 + } 21 + 22 + - (instancetype)initWithBridge:(RCTBridge *)bridge 23 + { 24 + + // Must call the super’s designated initializer 25 + if (self = [super initWithBridge:bridge]) { 26 + - _backedTextInputView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 27 + - _backedTextInputView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 28 + - _backedTextInputView.textInputDelegate = self; 29 + + // 1. The parent (RCTMultilineTextInputView) has already created 30 + + // its own _backedTextInputView = [RCTUITextView new] in super init. 31 + + // We can remove that subview: 32 + 33 + - [self addSubview:_backedTextInputView]; 34 + - } 35 + + id<RCTBackedTextInputViewProtocol> parentInputView = super.backedTextInputView; 36 + + if ([parentInputView isKindOfClass:[UIView class]]) { 37 + + UIView *parentSubview = (UIView *)parentInputView; 38 + + if (parentSubview.superview == self) { 39 + + [parentSubview removeFromSuperview]; 40 + + } 41 + + } 42 + 43 + + // 2. Now create our custom PasteInputTextView 44 + + _customBackedTextView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 45 + + _customBackedTextView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 46 + + _customBackedTextView.textInputDelegate = self; 47 + + 48 + + // Optional: disable inline predictions for iOS 17+ 49 + + if (@available(iOS 17.0, *)) { 50 + + _customBackedTextView.inlinePredictionType = UITextInlinePredictionTypeNo; 51 + + } 52 + + 53 + + // 3. Add your custom text view as the only subview 54 + + [self addSubview:_customBackedTextView]; 55 + + } 56 + return self; 57 + } 58 + 59 + +/** 60 + + * Override the parent's accessor so that anywhere in RN that calls 61 + + * `self.backedTextInputView` will get the custom PasteInputTextView. 62 + + */ 63 + - (id<RCTBackedTextInputViewProtocol>)backedTextInputView 64 + { 65 + - return _backedTextInputView; 66 + + return _customBackedTextView; 67 + } 68 + 69 + -- (void)setDisableCopyPaste:(BOOL)disableCopyPaste { 70 + - _backedTextInputView.disableCopyPaste = disableCopyPaste; 71 + +#pragma mark - Setters for React Props 72 + + 73 + +- (void)setDisableCopyPaste:(BOOL)disableCopyPaste 74 + +{ 75 + + _customBackedTextView.disableCopyPaste = disableCopyPaste; 76 + } 77 + 78 + -- (void)setOnPaste:(RCTDirectEventBlock)onPaste { 79 + - _backedTextInputView.onPaste = onPaste; 80 + +- (void)setOnPaste:(RCTDirectEventBlock)onPaste 81 + +{ 82 + + _customBackedTextView.onPaste = onPaste; 83 + } 84 + 85 + -- (void)setSmartPunctuation:(NSString *)smartPunctuation { 86 + - if ([smartPunctuation isEqualToString:@"enable"]) { 87 + - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeYes]; 88 + - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeYes]; 89 + - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 90 + - } else if ([smartPunctuation isEqualToString:@"disable"]) { 91 + - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeNo]; 92 + - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeNo]; 93 + - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 94 + - } else { 95 + - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeDefault]; 96 + - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 97 + - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 98 + - } 99 + +- (void)setSmartPunctuation:(NSString *)smartPunctuation 100 + +{ 101 + + if ([smartPunctuation isEqualToString:@"enable"]) { 102 + + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeYes]; 103 + + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeYes]; 104 + + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 105 + + } else if ([smartPunctuation isEqualToString:@"disable"]) { 106 + + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeNo]; 107 + + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeNo]; 108 + + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 109 + + } else { 110 + + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeDefault]; 111 + + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 112 + + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 113 + + } 114 + } 115 + 116 + #pragma mark - UIScrollViewDelegate 117 + @@ -62,7 +92,6 @@ - (void)setSmartPunctuation:(NSString *)smartPunctuation { 118 + - (void)scrollViewDidScroll:(UIScrollView *)scrollView 119 + { 120 + RCTDirectEventBlock onScroll = self.onScroll; 121 + - 122 + if (onScroll) { 123 + CGPoint contentOffset = scrollView.contentOffset; 124 + CGSize contentSize = scrollView.contentSize; 125 + @@ -71,22 +100,22 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView 126 + 127 + onScroll(@{ 128 + @"contentOffset": @{ 129 + - @"x": @(contentOffset.x), 130 + - @"y": @(contentOffset.y) 131 + + @"x": @(contentOffset.x), 132 + + @"y": @(contentOffset.y) 133 + }, 134 + @"contentInset": @{ 135 + - @"top": @(contentInset.top), 136 + - @"left": @(contentInset.left), 137 + - @"bottom": @(contentInset.bottom), 138 + - @"right": @(contentInset.right) 139 + + @"top": @(contentInset.top), 140 + + @"left": @(contentInset.left), 141 + + @"bottom": @(contentInset.bottom), 142 + + @"right": @(contentInset.right) 143 + }, 144 + @"contentSize": @{ 145 + - @"width": @(contentSize.width), 146 + - @"height": @(contentSize.height) 147 + + @"width": @(contentSize.width), 148 + + @"height": @(contentSize.height) 149 + }, 150 + @"layoutMeasurement": @{ 151 + - @"width": @(size.width), 152 + - @"height": @(size.height) 153 + + @"width": @(size.width), 154 + + @"height": @(size.height) 155 + }, 156 + @"zoomScale": @(scrollView.zoomScale ?: 1), 157 + }); 158 + diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 159 + index dd50053..2ed7017 100644 160 + --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 161 + +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 162 + @@ -122,8 +122,8 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & 163 + const auto &newTextInputProps = static_cast<const PasteTextInputProps &>(*props); 164 + 165 + // Traits: 166 + - if (newTextInputProps.traits.multiline != oldTextInputProps.traits.multiline) { 167 + - [self _setMultiline:newTextInputProps.traits.multiline]; 168 + + if (newTextInputProps.multiline != oldTextInputProps.multiline) { 169 + + [self _setMultiline:newTextInputProps.multiline]; 170 + } 171 + 172 + if (newTextInputProps.traits.autocapitalizationType != oldTextInputProps.traits.autocapitalizationType) { 173 + @@ -421,7 +421,7 @@ - (void)textInputDidChangeSelection 174 + return; 175 + } 176 + const auto &props = static_cast<const PasteTextInputProps &>(*_props); 177 + - if (props.traits.multiline && ![_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { 178 + + if (props.multiline && ![_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { 179 + [self textInputDidChange]; 180 + _ignoreNextTextInputCall = YES; 181 + } 182 + @@ -708,11 +708,11 @@ - (BOOL)_textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldTe 183 + - (SubmitBehavior)getSubmitBehavior 184 + { 185 + const auto &props = static_cast<const PasteTextInputProps &>(*_props); 186 + - const SubmitBehavior submitBehaviorDefaultable = props.traits.submitBehavior; 187 + + const SubmitBehavior submitBehaviorDefaultable = props.submitBehavior; 188 + 189 + // We should always have a non-default `submitBehavior`, but in case we don't, set it based on multiline. 190 + if (submitBehaviorDefaultable == SubmitBehavior::Default) { 191 + - return props.traits.multiline ? SubmitBehavior::Newline : SubmitBehavior::BlurAndSubmit; 192 + + return props.multiline ? SubmitBehavior::Newline : SubmitBehavior::BlurAndSubmit; 193 + } 194 + 195 + return submitBehaviorDefaultable; 196 + diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 197 + index 29e094f..7ef519a 100644 198 + --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 199 + +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 200 + @@ -22,8 +22,7 @@ PasteTextInputProps::PasteTextInputProps( 201 + const PropsParserContext &context, 202 + const PasteTextInputProps &sourceProps, 203 + const RawProps& rawProps) 204 + - : ViewProps(context, sourceProps, rawProps), 205 + - BaseTextProps(context, sourceProps, rawProps), 206 + + : BaseTextInputProps(context, sourceProps, rawProps), 207 + traits(convertRawProp(context, rawProps, sourceProps.traits, {})), 208 + smartPunctuation(convertRawProp(context, rawProps, "smartPunctuation", sourceProps.smartPunctuation, {})), 209 + disableCopyPaste(convertRawProp(context, rawProps, "disableCopyPaste", sourceProps.disableCopyPaste, {false})), 210 + @@ -133,7 +132,7 @@ TextAttributes PasteTextInputProps::getEffectiveTextAttributes(Float fontSizeMul 211 + ParagraphAttributes PasteTextInputProps::getEffectiveParagraphAttributes() const { 212 + auto result = paragraphAttributes; 213 + 214 + - if (!traits.multiline) { 215 + + if (!multiline) { 216 + result.maximumNumberOfLines = 1; 217 + } 218 + 219 + diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 220 + index 723d00c..31cfe66 100644 221 + --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 222 + +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 223 + @@ -15,6 +15,7 @@ 224 + #include <react/renderer/components/iostextinput/conversions.h> 225 + #include <react/renderer/components/iostextinput/primitives.h> 226 + #include <react/renderer/components/text/BaseTextProps.h> 227 + +#include <react/renderer/components/textinput/BaseTextInputProps.h> 228 + #include <react/renderer/components/view/ViewProps.h> 229 + #include <react/renderer/core/Props.h> 230 + #include <react/renderer/core/PropsParserContext.h> 231 + @@ -25,7 +26,7 @@ 232 + 233 + namespace facebook::react { 234 + 235 + -class PasteTextInputProps final : public ViewProps, public BaseTextProps { 236 + +class PasteTextInputProps final : public BaseTextInputProps { 237 + public: 238 + PasteTextInputProps() = default; 239 + PasteTextInputProps(const PropsParserContext& context, const PasteTextInputProps& sourceProps, const RawProps& rawProps); 240 + diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 241 + index 31e07e3..7f0ebfb 100644 242 + --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 243 + +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 244 + @@ -91,20 +91,11 @@ void PasteTextInputShadowNode::updateStateIfNeeded( 245 + const auto& state = getStateData(); 246 + 247 + react_native_assert(textLayoutManager_); 248 + - react_native_assert( 249 + - (!state.layoutManager || state.layoutManager == textLayoutManager_) && 250 + - "`StateData` refers to a different `TextLayoutManager`"); 251 + - 252 + - if (state.reactTreeAttributedString == reactTreeAttributedString && 253 + - state.layoutManager == textLayoutManager_) { 254 + - return; 255 + - } 256 + 257 + auto newState = TextInputState{}; 258 + newState.attributedStringBox = AttributedStringBox{reactTreeAttributedString}; 259 + newState.paragraphAttributes = getConcreteProps().paragraphAttributes; 260 + newState.reactTreeAttributedString = reactTreeAttributedString; 261 + - newState.layoutManager = textLayoutManager_; 262 + newState.mostRecentEventCount = getConcreteProps().mostRecentEventCount; 263 + setStateData(std::move(newState)); 264 + }
patches/@sentry+react-native+6.10.0.patch patches/@sentry+react-native+6.14.0.patch
patches/expo-media-library+17.1.6.patch patches/expo-media-library+17.1.7.patch
patches/expo-modules-core+2.3.12.patch patches/expo-modules-core+2.4.0.patch
patches/expo-modules-core+2.3.12.patch.md patches/expo-modules-core+2.4.0.patch.md
patches/expo-notifications+0.31.1.patch patches/expo-notifications+0.31.3.patch
patches/expo-notifications+0.31.1.patch.md patches/expo-notifications+0.31.3.patch.md
patches/expo-updates+0.28.12.patch patches/expo-updates+0.28.14.patch
patches/expo-updates+0.28.12.patch.md patches/expo-updates+0.28.14.patch.md
+33 -16
patches/react-native+0.79.2.patch patches/react-native+0.79.3.patch
··· 1 + diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 2 + index 914a249..0deac55 100644 3 + --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 4 + +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 5 + @@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN 6 + */ 7 + @interface RCTPullToRefreshViewComponentView : RCTViewComponentView <RCTCustomPullToRefreshViewProtocol> 8 + 9 + +- (void)beginRefreshingProgrammatically; 10 + + 11 + @end 12 + 13 + NS_ASSUME_NONNULL_END 14 + diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 15 + index d029337..0f63ea3 100644 16 + --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 17 + +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 18 + @@ -1003,6 +1003,11 @@ - (void)_adjustForMaintainVisibleContentPosition 19 + } 20 + } 21 + 22 + ++ (BOOL)shouldBeRecycled 23 + +{ 24 + + return NO; 25 + +} 26 + + 27 + @end 28 + 29 + Class<RCTComponentViewProtocol> RCTScrollViewCls(void) 1 30 diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 2 31 index e9b330f..ec5f58c 100644 3 32 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h ··· 15 44 index 53bfd04..ff1b1ed 100644 16 45 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 17 46 +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 18 - @@ -23,6 +23,7 @@ 47 + @@ -23,6 +23,7 @@ @implementation RCTRefreshControl { 19 48 UIColor *_titleColor; 20 49 CGFloat _progressViewOffset; 21 50 BOOL _hasMovedToWindow; ··· 23 52 } 24 53 25 54 - (instancetype)init 26 - @@ -58,6 +59,12 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) 55 + @@ -58,6 +59,12 @@ - (void)layoutSubviews 27 56 _isInitialRender = false; 28 57 } 29 58 ··· 36 65 - (void)didMoveToWindow 37 66 { 38 67 [super didMoveToWindow]; 39 - @@ -221,4 +228,50 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) 68 + @@ -221,4 +228,50 @@ - (void)refreshControlValueChanged 40 69 } 41 70 } 42 71 ··· 91 120 index 40aaf9c..1c60164 100644 92 121 --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 93 122 +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 94 - @@ -22,11 +22,12 @@ RCT_EXPORT_MODULE() 123 + @@ -22,11 +22,12 @@ - (UIView *)view 95 124 96 125 RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock) 97 126 RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL) ··· 105 134 RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing) 106 135 { 107 136 [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) { 108 - diff --git a/node_modules/react-native/React/Views/ScrollView/RCTScrollViewManager.m b/node_modules/react-native/React/Views/ScrollView/RCTScrollViewManager.m 109 - index cd1e7eb..c1d0172 100644 110 - --- a/node_modules/react-native/React/Views/ScrollView/RCTScrollViewManager.m 111 - +++ b/node_modules/react-native/React/Views/ScrollView/RCTScrollViewManager.m 112 - @@ -83,6 +83,7 @@ RCT_EXPORT_VIEW_PROPERTY(showsVerticalScrollIndicator, BOOL) 113 - RCT_EXPORT_VIEW_PROPERTY(scrollEventThrottle, NSTimeInterval) 114 - RCT_EXPORT_VIEW_PROPERTY(zoomScale, CGFloat) 115 - RCT_EXPORT_VIEW_PROPERTY(contentInset, UIEdgeInsets) 116 - +RCT_EXPORT_VIEW_PROPERTY(scrollIndicatorInsets, UIEdgeInsets) 117 - RCT_EXPORT_VIEW_PROPERTY(verticalScrollIndicatorInsets, UIEdgeInsets) 118 - RCT_EXPORT_VIEW_PROPERTY(scrollToOverflowEnabled, BOOL) 119 - RCT_EXPORT_VIEW_PROPERTY(snapToInterval, int)
patches/react-native+0.79.2.patch.md patches/react-native+0.79.3.patch.md
patches/react-native-svg+15.11.2.patch patches/react-native-svg+15.12.0.patch
+7 -7
src/components/forms/TextField.tsx
··· 1 1 import React from 'react' 2 2 import { 3 - AccessibilityProps, 3 + type AccessibilityProps, 4 4 StyleSheet, 5 5 TextInput, 6 - TextInputProps, 7 - TextStyle, 6 + type TextInputProps, 7 + type TextStyle, 8 8 View, 9 - ViewStyle, 9 + type ViewStyle, 10 10 } from 'react-native' 11 11 12 12 import {HITSLOP_20} from '#/lib/constants' ··· 16 16 applyFonts, 17 17 atoms as a, 18 18 ios, 19 - TextStyleProp, 19 + type TextStyleProp, 20 20 useAlf, 21 21 useTheme, 22 22 web, 23 23 } from '#/alf' 24 24 import {useInteractionState} from '#/components/hooks/useInteractionState' 25 - import {Props as SVGIconProps} from '#/components/icons/common' 25 + import {type Props as SVGIconProps} from '#/components/icons/common' 26 26 import {Text} from '#/components/Typography' 27 27 28 28 const Context = React.createContext<{ ··· 196 196 minWidth: 0, 197 197 }, 198 198 ios({paddingTop: 12, paddingBottom: 13}), 199 - android(a.py_sm), 199 + android(a.py_md), 200 200 // fix for autofill styles covering border 201 201 web({ 202 202 paddingTop: 10,
-39
src/lib/hooks/useHandleRef.ts
··· 1 - import {useState} from 'react' 2 - import {AnimatedRef, measure, MeasuredDimensions} from 'react-native-reanimated' 3 - 4 - export type HandleRef = { 5 - (node: any): void 6 - current: null | number 7 - } 8 - 9 - // This is a lighterweight alternative to `useAnimatedRef()` for imperative UI thread actions. 10 - // Render it like <View ref={ref} />, then pass `ref.current` to `measureHandle()` and such. 11 - export function useHandleRef(): HandleRef { 12 - return useState(() => { 13 - const ref = (node: any) => { 14 - if (node) { 15 - ref.current = 16 - node._nativeTag ?? 17 - node.__nativeTag ?? 18 - node.canonical?.nativeTag ?? 19 - null 20 - } else { 21 - ref.current = null 22 - } 23 - } 24 - ref.current = null 25 - return ref 26 - })[0] as HandleRef 27 - } 28 - 29 - // When using this version, you need to read ref.current on the JS thread, and pass it to UI. 30 - export function measureHandle( 31 - current: number | null, 32 - ): MeasuredDimensions | null { 33 - 'worklet' 34 - if (current !== null) { 35 - return measure((() => current) as AnimatedRef<any>) 36 - } else { 37 - return null 38 - } 39 - }
+37 -50
src/lib/media/manip.ts
··· 1 - import {Image as RNImage, Share as RNShare} from 'react-native' 1 + import {Image as RNImage} from 'react-native' 2 2 import uuid from 'react-native-uuid' 3 3 import { 4 4 cacheDirectory, 5 5 copyAsync, 6 + createDownloadResumable, 6 7 deleteAsync, 7 8 EncodingType, 8 9 getInfoAsync, ··· 14 15 import * as MediaLibrary from 'expo-media-library' 15 16 import * as Sharing from 'expo-sharing' 16 17 import {Buffer} from 'buffer' 17 - import RNFetchBlob from 'rn-fetch-blob' 18 18 19 19 import {POST_IMG_MAX} from '#/lib/constants' 20 20 import {logger} from '#/logger' ··· 68 68 return 69 69 } 70 70 71 - let downloadRes 71 + const path = createPath(appendExt) 72 + 72 73 try { 73 - const downloadResPromise = RNFetchBlob.config({ 74 - fileCache: true, 75 - appendExt, 76 - }).fetch('GET', opts.uri) 77 - const to1 = setTimeout(() => downloadResPromise.cancel(), opts.timeout) 78 - downloadRes = await downloadResPromise 79 - clearTimeout(to1) 80 - 81 - const status = downloadRes.info().status 82 - if (status !== 200) { 83 - return 84 - } 85 - 86 - const localUri = normalizePath(downloadRes.path(), true) 87 - return await doResize(localUri, opts) 74 + await downloadImage(opts.uri, path, opts.timeout) 75 + return await doResize(path, opts) 88 76 } finally { 89 - // TODO Whenever we remove `rn-fetch-blob`, we will need to replace this `flush()` with a `deleteAsync()` -hailey 90 - if (downloadRes) { 91 - downloadRes.flush() 92 - } 77 + safeDeleteAsync(path) 93 78 } 94 79 } 95 80 ··· 98 83 // TODO might need to give an error to the user in this case -prf 99 84 return 100 85 } 101 - const downloadResponse = await RNFetchBlob.config({ 102 - fileCache: true, 103 - }).fetch('GET', uri) 104 86 105 - // NOTE 106 - // assuming PNG 107 87 // we're currently relying on the fact our CDN only serves pngs 108 88 // -prf 109 - 110 - let imagePath = downloadResponse.path() 111 - imagePath = normalizePath(await moveToPermanentPath(imagePath, '.png'), true) 112 - 113 - // NOTE 114 - // for some reason expo-sharing refuses to work on iOS 115 - // ...and visa versa 116 - // -prf 117 - if (isIOS) { 118 - await RNShare.share({url: imagePath}) 119 - } else { 120 - await Sharing.shareAsync(imagePath, { 121 - mimeType: 'image/png', 122 - UTI: 'image/png', 123 - }) 124 - } 125 - 126 - safeDeleteAsync(imagePath) 89 + const imageUri = await downloadImage(uri, createPath('png'), 5e3) 90 + const imagePath = await moveToPermanentPath(imageUri, '.png') 91 + safeDeleteAsync(imageUri) 92 + await Sharing.shareAsync(imagePath, { 93 + mimeType: 'image/png', 94 + UTI: 'image/png', 95 + }) 127 96 } 128 97 129 98 const ALBUM_NAME = 'Bluesky' ··· 134 103 // assuming PNG 135 104 // we're currently relying on the fact our CDN only serves pngs 136 105 // -prf 137 - const downloadResponse = await RNFetchBlob.config({ 138 - fileCache: true, 139 - }).fetch('GET', uri) 140 - let imagePath = downloadResponse.path() 141 - imagePath = normalizePath(await moveToPermanentPath(imagePath, '.png'), true) 106 + const imageUri = await downloadImage(uri, createPath('png'), 5e3) 107 + const imagePath = await moveToPermanentPath(imageUri, '.png') 142 108 143 109 // save 144 110 try { ··· 403 369 height: Math.round(originalDims.height * ratio), 404 370 } 405 371 } 372 + 373 + function createPath(ext: string) { 374 + // cacheDirectory will never be null on native, so the null check here is not necessary except for typescript. 375 + // we use a web-only function for downloadAndResize on web 376 + return `${cacheDirectory ?? ''}/${uuid.v4()}.${ext}` 377 + } 378 + 379 + async function downloadImage(uri: string, path: string, timeout: number) { 380 + const dlResumable = createDownloadResumable(uri, path, {cache: true}) 381 + 382 + const to1 = setTimeout(() => dlResumable.cancelAsync(), timeout) 383 + 384 + const dlRes = await dlResumable.downloadAsync() 385 + clearTimeout(to1) 386 + 387 + if (!dlRes?.uri) { 388 + throw new Error('Failed to download image - dlRes is undefined') 389 + } 390 + 391 + return normalizePath(dlRes.uri) 392 + }
+12 -12
src/screens/Profile/Header/Shell.tsx
··· 1 - import React, {memo, useEffect} from 'react' 1 + import {memo, useCallback, useEffect, useMemo} from 'react' 2 2 import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' 3 - import { 3 + import Animated, { 4 + measure, 4 5 type MeasuredDimensions, 5 6 runOnJS, 6 7 runOnUI, 8 + useAnimatedRef, 7 9 } from 'react-native-reanimated' 8 10 import {useSafeAreaInsets} from 'react-native-safe-area-context' 9 11 import {type AppBskyActorDefs, type ModerationDecision} from '@atproto/api' ··· 14 16 import {useActorStatus} from '#/lib/actor-status' 15 17 import {BACK_HITSLOP} from '#/lib/constants' 16 18 import {useHaptics} from '#/lib/haptics' 17 - import {measureHandle, useHandleRef} from '#/lib/hooks/useHandleRef' 18 19 import {type NavigationProp} from '#/lib/routes/types' 19 20 import {logger} from '#/logger' 20 21 import {isIOS} from '#/platform/detection' ··· 59 60 const playHaptic = useHaptics() 60 61 const liveStatusControl = useDialogControl() 61 62 62 - const aviRef = useHandleRef() 63 + const aviRef = useAnimatedRef() 63 64 64 - const onPressBack = React.useCallback(() => { 65 + const onPressBack = useCallback(() => { 65 66 if (navigation.canGoBack()) { 66 67 navigation.goBack() 67 68 } else { ··· 69 70 } 70 71 }, [navigation]) 71 72 72 - const _openLightbox = React.useCallback( 73 + const _openLightbox = useCallback( 73 74 (uri: string, thumbRect: MeasuredDimensions | null) => { 74 75 openLightbox({ 75 76 images: [ ··· 92 93 [openLightbox], 93 94 ) 94 95 95 - const isMe = React.useMemo( 96 + const isMe = useMemo( 96 97 () => currentAccount?.did === profile.did, 97 98 [currentAccount, profile], 98 99 ) ··· 109 110 } 110 111 }, [live.isActive, profile.did]) 111 112 112 - const onPressAvi = React.useCallback(() => { 113 + const onPressAvi = useCallback(() => { 113 114 if (live.isActive) { 114 115 playHaptic('Light') 115 116 logger.metric( ··· 122 123 const modui = moderation.ui('avatar') 123 124 const avatar = profile.avatar 124 125 if (avatar && !(modui.blur && modui.noOverride)) { 125 - const aviHandle = aviRef.current 126 126 runOnUI(() => { 127 127 'worklet' 128 - const rect = measureHandle(aviHandle) 128 + const rect = measure(aviRef) 129 129 runOnJS(_openLightbox)(avatar, rect) 130 130 })() 131 131 } ··· 223 223 styles.avi, 224 224 profile.associated?.labeler && styles.aviLabeler, 225 225 ]}> 226 - <View ref={aviRef} collapsable={false}> 226 + <Animated.View ref={aviRef} collapsable={false}> 227 227 <UserAvatar 228 228 type={profile.associated?.labeler ? 'labeler' : 'user'} 229 229 size={live.isActive ? 88 : 90} ··· 231 231 moderation={moderation.ui('avatar')} 232 232 /> 233 233 {live.isActive && <LiveIndicator size="large" />} 234 - </View> 234 + </Animated.View> 235 235 </View> 236 236 </TouchableWithoutFeedback> 237 237 </GrowableAvatar>
+7 -7
src/view/com/composer/text-input/TextInput.tsx
··· 1 1 import React, { 2 - ComponentProps, 2 + type ComponentProps, 3 3 forwardRef, 4 4 useCallback, 5 5 useMemo, ··· 7 7 useState, 8 8 } from 'react' 9 9 import { 10 - NativeSyntheticEvent, 10 + type NativeSyntheticEvent, 11 11 Text as RNText, 12 - TextInput as RNTextInput, 13 - TextInputSelectionChangeEventData, 12 + type TextInput as RNTextInput, 13 + type TextInputSelectionChangeEventData, 14 14 View, 15 15 } from 'react-native' 16 16 import {AppBskyRichtextFacet, RichText} from '@atproto/api' 17 17 import PasteInput, { 18 - PastedFile, 19 - PasteInputRef, 18 + type PastedFile, 19 + type PasteInputRef, // @ts-expect-error no types when installing from github 20 20 } from '@mattermost/react-native-paste-input' 21 21 22 22 import {POST_IMG_MAX} from '#/lib/constants' ··· 27 27 import {useTheme} from '#/lib/ThemeContext' 28 28 import {isAndroid, isNative} from '#/platform/detection' 29 29 import { 30 - LinkFacetMatch, 30 + type LinkFacetMatch, 31 31 suggestLinkCardUri, 32 32 } from '#/view/com/composer/text-input/text-input-util' 33 33 import {atoms as a, useAlf} from '#/alf'
+114 -106
src/view/com/pager/Pager.tsx
··· 1 - import React, {forwardRef, useCallback, useContext} from 'react' 1 + import { 2 + useCallback, 3 + useContext, 4 + useImperativeHandle, 5 + useRef, 6 + useState, 7 + } from 'react' 2 8 import {View} from 'react-native' 3 9 import {DrawerGestureContext} from 'react-native-drawer-layout' 4 10 import {Gesture, GestureDetector} from 'react-native-gesture-handler' 5 11 import PagerView, { 6 - PagerViewOnPageScrollEventData, 7 - PagerViewOnPageSelectedEvent, 8 - PagerViewOnPageSelectedEventData, 9 - PageScrollStateChangedNativeEventData, 12 + type PagerViewOnPageScrollEventData, 13 + type PagerViewOnPageSelectedEvent, 14 + type PagerViewOnPageSelectedEventData, 15 + type PageScrollStateChangedNativeEventData, 10 16 } from 'react-native-pager-view' 11 17 import Animated, { 12 18 runOnJS, 13 - SharedValue, 19 + type SharedValue, 14 20 useEvent, 15 21 useHandler, 16 22 useSharedValue, ··· 36 42 export type RenderTabBarFn = (props: RenderTabBarFnProps) => JSX.Element 37 43 38 44 interface Props { 45 + ref?: React.Ref<PagerRef> 39 46 initialPage?: number 40 47 renderTabBar: RenderTabBarFn 48 + // tab pressed, yet to scroll to page 49 + onTabPressed?: (index: number) => void 50 + // scroll settled 41 51 onPageSelected?: (index: number) => void 42 52 onPageScrollStateChanged?: ( 43 53 scrollState: 'idle' | 'dragging' | 'settling', ··· 47 57 48 58 const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) 49 59 50 - export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>( 51 - function PagerImpl( 52 - { 53 - children, 54 - initialPage = 0, 55 - renderTabBar, 56 - onPageScrollStateChanged: parentOnPageScrollStateChanged, 57 - onPageSelected: parentOnPageSelected, 58 - testID, 59 - }: React.PropsWithChildren<Props>, 60 - ref, 61 - ) { 62 - const [selectedPage, setSelectedPage] = React.useState(initialPage) 63 - const pagerView = React.useRef<PagerView>(null) 60 + export function Pager({ 61 + ref, 62 + children, 63 + initialPage = 0, 64 + renderTabBar, 65 + onPageSelected: parentOnPageSelected, 66 + onTabPressed: parentOnTabPressed, 67 + onPageScrollStateChanged: parentOnPageScrollStateChanged, 68 + testID, 69 + }: React.PropsWithChildren<Props>) { 70 + const [selectedPage, setSelectedPage] = useState(initialPage) 71 + const pagerView = useRef<PagerView>(null) 64 72 65 - const [isIdle, setIsIdle] = React.useState(true) 66 - const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() 67 - useFocusEffect( 68 - useCallback(() => { 69 - const canSwipeDrawer = selectedPage === 0 && isIdle 70 - setDrawerSwipeDisabled(!canSwipeDrawer) 71 - return () => { 72 - setDrawerSwipeDisabled(false) 73 - } 74 - }, [setDrawerSwipeDisabled, selectedPage, isIdle]), 75 - ) 73 + const [isIdle, setIsIdle] = useState(true) 74 + const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() 75 + useFocusEffect( 76 + useCallback(() => { 77 + const canSwipeDrawer = selectedPage === 0 && isIdle 78 + setDrawerSwipeDisabled(!canSwipeDrawer) 79 + return () => { 80 + setDrawerSwipeDisabled(false) 81 + } 82 + }, [setDrawerSwipeDisabled, selectedPage, isIdle]), 83 + ) 76 84 77 - React.useImperativeHandle(ref, () => ({ 78 - setPage: (index: number) => { 79 - pagerView.current?.setPage(index) 80 - }, 81 - })) 85 + useImperativeHandle(ref, () => ({ 86 + setPage: (index: number) => { 87 + pagerView.current?.setPage(index) 88 + }, 89 + })) 82 90 83 - const onPageSelectedJSThread = React.useCallback( 84 - (nextPosition: number) => { 85 - setSelectedPage(nextPosition) 86 - parentOnPageSelected?.(nextPosition) 87 - }, 88 - [setSelectedPage, parentOnPageSelected], 89 - ) 91 + const onPageSelectedJSThread = useCallback( 92 + (nextPosition: number) => { 93 + setSelectedPage(nextPosition) 94 + parentOnPageSelected?.(nextPosition) 95 + }, 96 + [setSelectedPage, parentOnPageSelected], 97 + ) 90 98 91 - const onTabBarSelect = React.useCallback( 92 - (index: number) => { 93 - pagerView.current?.setPage(index) 94 - }, 95 - [pagerView], 96 - ) 99 + const onTabBarSelect = useCallback( 100 + (index: number) => { 101 + parentOnTabPressed?.(index) 102 + pagerView.current?.setPage(index) 103 + }, 104 + [pagerView, parentOnTabPressed], 105 + ) 97 106 98 - const dragState = useSharedValue<'idle' | 'settling' | 'dragging'>('idle') 99 - const dragProgress = useSharedValue(selectedPage) 100 - const didInit = useSharedValue(false) 101 - const handlePageScroll = usePagerHandlers( 102 - { 103 - onPageScroll(e: PagerViewOnPageScrollEventData) { 104 - 'worklet' 105 - if (didInit.get() === false) { 106 - // On iOS, there's a spurious scroll event with 0 position 107 - // even if a different page was supplied as the initial page. 108 - // Ignore it and wait for the first confirmed selection instead. 109 - return 110 - } 111 - dragProgress.set(e.offset + e.position) 112 - }, 113 - onPageScrollStateChanged(e: PageScrollStateChangedNativeEventData) { 114 - 'worklet' 115 - runOnJS(setIsIdle)(e.pageScrollState === 'idle') 116 - if (dragState.get() === 'idle' && e.pageScrollState === 'settling') { 117 - // This is a programmatic scroll on Android. 118 - // Stay "idle" to match iOS and avoid confusing downstream code. 119 - return 120 - } 121 - dragState.set(e.pageScrollState) 122 - parentOnPageScrollStateChanged?.(e.pageScrollState) 123 - }, 124 - onPageSelected(e: PagerViewOnPageSelectedEventData) { 125 - 'worklet' 126 - didInit.set(true) 127 - runOnJS(onPageSelectedJSThread)(e.position) 128 - }, 107 + const dragState = useSharedValue<'idle' | 'settling' | 'dragging'>('idle') 108 + const dragProgress = useSharedValue(selectedPage) 109 + const didInit = useSharedValue(false) 110 + const handlePageScroll = usePagerHandlers( 111 + { 112 + onPageScroll(e: PagerViewOnPageScrollEventData) { 113 + 'worklet' 114 + if (didInit.get() === false) { 115 + // On iOS, there's a spurious scroll event with 0 position 116 + // even if a different page was supplied as the initial page. 117 + // Ignore it and wait for the first confirmed selection instead. 118 + return 119 + } 120 + dragProgress.set(e.offset + e.position) 121 + }, 122 + onPageScrollStateChanged(e: PageScrollStateChangedNativeEventData) { 123 + 'worklet' 124 + runOnJS(setIsIdle)(e.pageScrollState === 'idle') 125 + if (dragState.get() === 'idle' && e.pageScrollState === 'settling') { 126 + // This is a programmatic scroll on Android. 127 + // Stay "idle" to match iOS and avoid confusing downstream code. 128 + return 129 + } 130 + dragState.set(e.pageScrollState) 131 + parentOnPageScrollStateChanged?.(e.pageScrollState) 129 132 }, 130 - [parentOnPageScrollStateChanged], 131 - ) 133 + onPageSelected(e: PagerViewOnPageSelectedEventData) { 134 + 'worklet' 135 + didInit.set(true) 136 + runOnJS(onPageSelectedJSThread)(e.position) 137 + }, 138 + }, 139 + [parentOnPageScrollStateChanged], 140 + ) 132 141 133 - const drawerGesture = useContext(DrawerGestureContext) ?? Gesture.Native() // noop for web 134 - const nativeGesture = 135 - Gesture.Native().requireExternalGestureToFail(drawerGesture) 142 + const drawerGesture = useContext(DrawerGestureContext) ?? Gesture.Native() // noop for web 143 + const nativeGesture = 144 + Gesture.Native().requireExternalGestureToFail(drawerGesture) 136 145 137 - return ( 138 - <View testID={testID} style={[a.flex_1, native(a.overflow_hidden)]}> 139 - {renderTabBar({ 140 - selectedPage, 141 - onSelect: onTabBarSelect, 142 - dragProgress, 143 - dragState, 144 - })} 145 - <GestureDetector gesture={nativeGesture}> 146 - <AnimatedPagerView 147 - ref={pagerView} 148 - style={[a.flex_1]} 149 - initialPage={initialPage} 150 - onPageScroll={handlePageScroll}> 151 - {children} 152 - </AnimatedPagerView> 153 - </GestureDetector> 154 - </View> 155 - ) 156 - }, 157 - ) 146 + return ( 147 + <View testID={testID} style={[a.flex_1, native(a.overflow_hidden)]}> 148 + {renderTabBar({ 149 + selectedPage, 150 + onSelect: onTabBarSelect, 151 + dragProgress, 152 + dragState, 153 + })} 154 + <GestureDetector gesture={nativeGesture}> 155 + <AnimatedPagerView 156 + ref={pagerView} 157 + style={[a.flex_1]} 158 + initialPage={initialPage} 159 + onPageScroll={handlePageScroll}> 160 + {children} 161 + </AnimatedPagerView> 162 + </GestureDetector> 163 + </View> 164 + ) 165 + } 158 166 159 167 function usePagerHandlers( 160 168 handlers: {
+30 -17
src/view/com/pager/Pager.web.tsx
··· 1 - import React from 'react' 1 + import { 2 + Children, 3 + useCallback, 4 + useImperativeHandle, 5 + useRef, 6 + useState, 7 + } from 'react' 2 8 import {View} from 'react-native' 3 9 import {flushSync} from 'react-dom' 4 10 5 11 import {s} from '#/lib/styles' 12 + import {atoms as a} from '#/alf' 13 + 14 + export interface PagerRef { 15 + setPage: (index: number) => void 16 + } 6 17 7 18 export interface RenderTabBarFnProps { 8 19 selectedPage: number ··· 12 23 export type RenderTabBarFn = (props: RenderTabBarFnProps) => JSX.Element 13 24 14 25 interface Props { 26 + ref?: React.Ref<PagerRef> 15 27 initialPage?: number 16 28 renderTabBar: RenderTabBarFn 17 29 onPageSelected?: (index: number) => void 18 30 } 19 - export const Pager = React.forwardRef(function PagerImpl( 20 - { 21 - children, 22 - initialPage = 0, 23 - renderTabBar, 24 - onPageSelected, 25 - }: React.PropsWithChildren<Props>, 31 + 32 + export function Pager({ 26 33 ref, 27 - ) { 28 - const [selectedPage, setSelectedPage] = React.useState(initialPage) 29 - const scrollYs = React.useRef<Array<number | null>>([]) 30 - const anchorRef = React.useRef(null) 34 + children, 35 + initialPage = 0, 36 + renderTabBar, 37 + onPageSelected, 38 + }: React.PropsWithChildren<Props>) { 39 + const [selectedPage, setSelectedPage] = useState(initialPage) 40 + const scrollYs = useRef<Array<number | null>>([]) 41 + const anchorRef = useRef(null) 31 42 32 - React.useImperativeHandle(ref, () => ({ 43 + useImperativeHandle(ref, () => ({ 33 44 setPage: (index: number) => { 34 45 onTabBarSelect(index) 35 46 }, 36 47 })) 37 48 38 - const onTabBarSelect = React.useCallback( 49 + const onTabBarSelect = useCallback( 39 50 (index: number) => { 40 51 const scrollY = window.scrollY 41 52 // We want to determine if the tabbar is already "sticking" at the top (in which ··· 75 86 tabBarAnchor: <View ref={anchorRef} />, 76 87 onSelect: e => onTabBarSelect(e), 77 88 })} 78 - {React.Children.map(children, (child, i) => ( 79 - <View style={selectedPage === i ? s.flex1 : s.hidden} key={`page-${i}`}> 89 + {Children.map(children, (child, i) => ( 90 + <View 91 + style={selectedPage === i ? a.flex_1 : a.hidden} 92 + key={`page-${i}`}> 80 93 {child} 81 94 </View> 82 95 ))} 83 96 </View> 84 97 ) 85 - }) 98 + }
+155 -160
src/view/com/pager/PagerWithHeader.tsx
··· 1 - import * as React from 'react' 1 + import {memo, useCallback, useEffect, useRef, useState} from 'react' 2 2 import { 3 - LayoutChangeEvent, 4 - NativeScrollEvent, 5 - ScrollView, 3 + type LayoutChangeEvent, 4 + type NativeScrollEvent, 5 + type ScrollView, 6 6 StyleSheet, 7 7 View, 8 8 } from 'react-native' 9 9 import Animated, { 10 - AnimatedRef, 11 - runOnJS, 10 + type AnimatedRef, 12 11 runOnUI, 13 12 scrollTo, 14 - SharedValue, 13 + type SharedValue, 15 14 useAnimatedRef, 16 15 useAnimatedStyle, 17 16 useSharedValue, ··· 20 19 import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' 21 20 import {ScrollProvider} from '#/lib/ScrollContext' 22 21 import {isIOS} from '#/platform/detection' 23 - import {Pager, PagerRef, RenderTabBarFnProps} from '#/view/com/pager/Pager' 22 + import { 23 + Pager, 24 + type PagerRef, 25 + type RenderTabBarFnProps, 26 + } from '#/view/com/pager/Pager' 24 27 import {useTheme} from '#/alf' 25 - import {ListMethods} from '../util/List' 28 + import {type ListMethods} from '../util/List' 26 29 import {PagerHeaderProvider} from './PagerHeaderContext' 27 30 import {TabBar} from './TabBar' 28 31 ··· 33 36 } 34 37 35 38 export interface PagerWithHeaderProps { 39 + ref?: React.Ref<PagerRef> 36 40 testID?: string 37 41 children: 38 42 | (((props: PagerWithHeaderChildParams) => JSX.Element) | null)[] ··· 49 53 onCurrentPageSelected?: (index: number) => void 50 54 allowHeaderOverScroll?: boolean 51 55 } 52 - export const PagerWithHeader = React.forwardRef<PagerRef, PagerWithHeaderProps>( 53 - function PageWithHeaderImpl( 54 - { 55 - children, 56 - testID, 56 + export function PagerWithHeader({ 57 + ref, 58 + children, 59 + testID, 60 + items, 61 + isHeaderReady, 62 + renderHeader, 63 + initialPage, 64 + onPageSelected, 65 + onCurrentPageSelected, 66 + allowHeaderOverScroll, 67 + }: PagerWithHeaderProps) { 68 + const [currentPage, setCurrentPage] = useState(0) 69 + const [tabBarHeight, setTabBarHeight] = useState(0) 70 + const [headerOnlyHeight, setHeaderOnlyHeight] = useState(0) 71 + const scrollY = useSharedValue(0) 72 + const headerHeight = headerOnlyHeight + tabBarHeight 73 + 74 + // capture the header bar sizing 75 + const onTabBarLayout = useNonReactiveCallback((evt: LayoutChangeEvent) => { 76 + const height = evt.nativeEvent.layout.height 77 + if (height > 0) { 78 + // The rounding is necessary to prevent jumps on iOS 79 + setTabBarHeight(Math.round(height * 2) / 2) 80 + } 81 + }) 82 + const onHeaderOnlyLayout = useNonReactiveCallback((height: number) => { 83 + if (height > 0) { 84 + // The rounding is necessary to prevent jumps on iOS 85 + setHeaderOnlyHeight(Math.round(height * 2) / 2) 86 + } 87 + }) 88 + 89 + const renderTabBar = useCallback( 90 + (props: RenderTabBarFnProps) => { 91 + return ( 92 + <PagerHeaderProvider scrollY={scrollY} headerHeight={headerOnlyHeight}> 93 + <PagerTabBar 94 + headerOnlyHeight={headerOnlyHeight} 95 + items={items} 96 + isHeaderReady={isHeaderReady} 97 + renderHeader={renderHeader} 98 + currentPage={currentPage} 99 + onCurrentPageSelected={onCurrentPageSelected} 100 + onTabBarLayout={onTabBarLayout} 101 + onHeaderOnlyLayout={onHeaderOnlyLayout} 102 + onSelect={props.onSelect} 103 + scrollY={scrollY} 104 + testID={testID} 105 + allowHeaderOverScroll={allowHeaderOverScroll} 106 + dragProgress={props.dragProgress} 107 + dragState={props.dragState} 108 + /> 109 + </PagerHeaderProvider> 110 + ) 111 + }, 112 + [ 113 + headerOnlyHeight, 57 114 items, 58 115 isHeaderReady, 59 116 renderHeader, 60 - initialPage, 61 - onPageSelected, 117 + currentPage, 62 118 onCurrentPageSelected, 119 + onTabBarLayout, 120 + onHeaderOnlyLayout, 121 + scrollY, 122 + testID, 63 123 allowHeaderOverScroll, 64 - }: PagerWithHeaderProps, 65 - ref, 66 - ) { 67 - const [currentPage, setCurrentPage] = React.useState(0) 68 - const [tabBarHeight, setTabBarHeight] = React.useState(0) 69 - const [headerOnlyHeight, setHeaderOnlyHeight] = React.useState(0) 70 - const scrollY = useSharedValue(0) 71 - const headerHeight = headerOnlyHeight + tabBarHeight 124 + ], 125 + ) 72 126 73 - // capture the header bar sizing 74 - const onTabBarLayout = useNonReactiveCallback((evt: LayoutChangeEvent) => { 75 - const height = evt.nativeEvent.layout.height 76 - if (height > 0) { 77 - // The rounding is necessary to prevent jumps on iOS 78 - setTabBarHeight(Math.round(height * 2) / 2) 79 - } 80 - }) 81 - const onHeaderOnlyLayout = useNonReactiveCallback((height: number) => { 82 - if (height > 0) { 83 - // The rounding is necessary to prevent jumps on iOS 84 - setHeaderOnlyHeight(Math.round(height * 2) / 2) 85 - } 86 - }) 127 + const scrollRefs = useSharedValue<Array<AnimatedRef<any> | null>>([]) 128 + const registerRef = useCallback( 129 + (scrollRef: AnimatedRef<any> | null, atIndex: number) => { 130 + scrollRefs.modify(refs => { 131 + 'worklet' 132 + refs[atIndex] = scrollRef 133 + return refs 134 + }) 135 + }, 136 + [scrollRefs], 137 + ) 87 138 88 - const renderTabBar = React.useCallback( 89 - (props: RenderTabBarFnProps) => { 90 - return ( 91 - <PagerHeaderProvider 92 - scrollY={scrollY} 93 - headerHeight={headerOnlyHeight}> 94 - <PagerTabBar 95 - headerOnlyHeight={headerOnlyHeight} 96 - items={items} 97 - isHeaderReady={isHeaderReady} 98 - renderHeader={renderHeader} 99 - currentPage={currentPage} 100 - onCurrentPageSelected={onCurrentPageSelected} 101 - onTabBarLayout={onTabBarLayout} 102 - onHeaderOnlyLayout={onHeaderOnlyLayout} 103 - onSelect={props.onSelect} 104 - scrollY={scrollY} 105 - testID={testID} 106 - allowHeaderOverScroll={allowHeaderOverScroll} 107 - dragProgress={props.dragProgress} 108 - dragState={props.dragState} 109 - /> 110 - </PagerHeaderProvider> 111 - ) 112 - }, 113 - [ 114 - headerOnlyHeight, 115 - items, 116 - isHeaderReady, 117 - renderHeader, 118 - currentPage, 119 - onCurrentPageSelected, 120 - onTabBarLayout, 121 - onHeaderOnlyLayout, 122 - scrollY, 123 - testID, 124 - allowHeaderOverScroll, 125 - ], 126 - ) 127 - 128 - const scrollRefs = useSharedValue<Array<AnimatedRef<any> | null>>([]) 129 - const registerRef = React.useCallback( 130 - (scrollRef: AnimatedRef<any> | null, atIndex: number) => { 131 - scrollRefs.modify(refs => { 132 - 'worklet' 133 - refs[atIndex] = scrollRef 134 - return refs 135 - }) 136 - }, 137 - [scrollRefs], 138 - ) 139 - 140 - const lastForcedScrollY = useSharedValue(0) 141 - const adjustScrollForOtherPages = () => { 139 + const lastForcedScrollY = useSharedValue(0) 140 + const adjustScrollForOtherPages = useCallback( 141 + (scrollState: 'idle' | 'dragging' | 'settling') => { 142 142 'worklet' 143 + if (scrollState !== 'dragging') return 143 144 const currentScrollY = scrollY.get() 144 145 const forcedScrollY = Math.min(currentScrollY, headerOnlyHeight) 145 146 if (lastForcedScrollY.get() !== forcedScrollY) { ··· 152 153 } 153 154 } 154 155 } 155 - } 156 + }, 157 + [currentPage, headerOnlyHeight, lastForcedScrollY, scrollRefs, scrollY], 158 + ) 156 159 157 - const throttleTimeout = React.useRef<ReturnType<typeof setTimeout> | null>( 158 - null, 159 - ) 160 - const queueThrottledOnScroll = useNonReactiveCallback(() => { 161 - if (!throttleTimeout.current) { 162 - throttleTimeout.current = setTimeout(() => { 163 - throttleTimeout.current = null 164 - runOnUI(adjustScrollForOtherPages)() 165 - }, 80 /* Sync often enough you're unlikely to catch it unsynced */) 160 + const onScrollWorklet = useCallback( 161 + (e: NativeScrollEvent) => { 162 + 'worklet' 163 + const nextScrollY = e.contentOffset.y 164 + // HACK: onScroll is reporting some strange values on load (negative header height). 165 + // Highly improbable that you'd be overscrolled by over 400px - 166 + // in fact, I actually can't do it, so let's just ignore those. -sfn 167 + const isPossiblyInvalid = 168 + headerHeight > 0 && Math.round(nextScrollY * 2) / 2 === -headerHeight 169 + if (!isPossiblyInvalid) { 170 + scrollY.set(nextScrollY) 166 171 } 167 - }) 172 + }, 173 + [scrollY, headerHeight], 174 + ) 168 175 169 - const onScrollWorklet = React.useCallback( 170 - (e: NativeScrollEvent) => { 171 - 'worklet' 172 - const nextScrollY = e.contentOffset.y 173 - // HACK: onScroll is reporting some strange values on load (negative header height). 174 - // Highly improbable that you'd be overscrolled by over 400px - 175 - // in fact, I actually can't do it, so let's just ignore those. -sfn 176 - const isPossiblyInvalid = 177 - headerHeight > 0 && Math.round(nextScrollY * 2) / 2 === -headerHeight 178 - if (!isPossiblyInvalid) { 179 - scrollY.set(nextScrollY) 180 - runOnJS(queueThrottledOnScroll)() 181 - } 182 - }, 183 - [scrollY, queueThrottledOnScroll, headerHeight], 184 - ) 176 + const onPageSelectedInner = useCallback( 177 + (index: number) => { 178 + setCurrentPage(index) 179 + onPageSelected?.(index) 180 + }, 181 + [onPageSelected, setCurrentPage], 182 + ) 185 183 186 - const onPageSelectedInner = React.useCallback( 187 - (index: number) => { 188 - setCurrentPage(index) 189 - onPageSelected?.(index) 190 - }, 191 - [onPageSelected, setCurrentPage], 192 - ) 184 + const onTabPressed = useCallback(() => { 185 + runOnUI(adjustScrollForOtherPages)('dragging') 186 + }, [adjustScrollForOtherPages]) 193 187 194 - return ( 195 - <Pager 196 - ref={ref} 197 - testID={testID} 198 - initialPage={initialPage} 199 - onPageSelected={onPageSelectedInner} 200 - renderTabBar={renderTabBar}> 201 - {toArray(children) 202 - .filter(Boolean) 203 - .map((child, i) => { 204 - const isReady = 205 - isHeaderReady && headerOnlyHeight > 0 && tabBarHeight > 0 206 - return ( 207 - <View key={i} collapsable={false}> 208 - <PagerItem 209 - headerHeight={headerHeight} 210 - index={i} 211 - isReady={isReady} 212 - isFocused={i === currentPage} 213 - onScrollWorklet={i === currentPage ? onScrollWorklet : noop} 214 - registerRef={registerRef} 215 - renderTab={child} 216 - /> 217 - </View> 218 - ) 219 - })} 220 - </Pager> 221 - ) 222 - }, 223 - ) 188 + return ( 189 + <Pager 190 + ref={ref} 191 + testID={testID} 192 + initialPage={initialPage} 193 + onTabPressed={onTabPressed} 194 + onPageSelected={onPageSelectedInner} 195 + renderTabBar={renderTabBar} 196 + onPageScrollStateChanged={adjustScrollForOtherPages}> 197 + {toArray(children) 198 + .filter(Boolean) 199 + .map((child, i) => { 200 + const isReady = 201 + isHeaderReady && headerOnlyHeight > 0 && tabBarHeight > 0 202 + return ( 203 + <View key={i} collapsable={false}> 204 + <PagerItem 205 + headerHeight={headerHeight} 206 + index={i} 207 + isReady={isReady} 208 + isFocused={i === currentPage} 209 + onScrollWorklet={i === currentPage ? onScrollWorklet : noop} 210 + registerRef={registerRef} 211 + renderTab={child} 212 + /> 213 + </View> 214 + ) 215 + })} 216 + </Pager> 217 + ) 218 + } 224 219 225 220 let PagerTabBar = ({ 226 221 currentPage, ··· 258 253 dragState: SharedValue<'idle' | 'dragging' | 'settling'> 259 254 }): React.ReactNode => { 260 255 const t = useTheme() 261 - const [minimumHeaderHeight, setMinimumHeaderHeight] = React.useState(0) 256 + const [minimumHeaderHeight, setMinimumHeaderHeight] = useState(0) 262 257 const headerTransform = useAnimatedStyle(() => { 263 258 const translateY = 264 259 Math.min( ··· 275 270 ], 276 271 } 277 272 }) 278 - const headerRef = React.useRef(null) 273 + const headerRef = useRef(null) 279 274 return ( 280 275 <Animated.View 281 276 pointerEvents={isIOS ? 'auto' : 'box-none'} ··· 327 322 </Animated.View> 328 323 ) 329 324 } 330 - PagerTabBar = React.memo(PagerTabBar) 325 + PagerTabBar = memo(PagerTabBar) 331 326 332 327 function PagerItem({ 333 328 headerHeight, ··· 348 343 }) { 349 344 const scrollElRef = useAnimatedRef() 350 345 351 - React.useEffect(() => { 346 + useEffect(() => { 352 347 registerRef(scrollElRef, index) 353 348 return () => { 354 349 registerRef(null, index)
+14 -10
src/view/com/profile/ProfileSubpageHeader.tsx
··· 1 1 import React from 'react' 2 2 import {Pressable, View} from 'react-native' 3 - import {MeasuredDimensions, runOnJS, runOnUI} from 'react-native-reanimated' 4 - import {AppBskyGraphDefs} from '@atproto/api' 3 + import Animated, { 4 + measure, 5 + type MeasuredDimensions, 6 + runOnJS, 7 + runOnUI, 8 + useAnimatedRef, 9 + } from 'react-native-reanimated' 10 + import {type AppBskyGraphDefs} from '@atproto/api' 5 11 import {msg, Trans} from '@lingui/macro' 6 12 import {useLingui} from '@lingui/react' 7 13 import {useNavigation} from '@react-navigation/native' 8 14 9 - import {measureHandle, useHandleRef} from '#/lib/hooks/useHandleRef' 10 15 import {usePalette} from '#/lib/hooks/usePalette' 11 16 import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 12 17 import {makeProfileLink} from '#/lib/routes/links' 13 - import {NavigationProp} from '#/lib/routes/types' 18 + import {type NavigationProp} from '#/lib/routes/types' 14 19 import {sanitizeHandle} from '#/lib/strings/handles' 15 20 import {emitSoftReset} from '#/state/events' 16 21 import {useLightboxControls} from '#/state/lightbox' 17 22 import {TextLink} from '#/view/com/util/Link' 18 23 import {LoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' 19 24 import {Text} from '#/view/com/util/text/Text' 20 - import {UserAvatar, UserAvatarType} from '#/view/com/util/UserAvatar' 25 + import {UserAvatar, type UserAvatarType} from '#/view/com/util/UserAvatar' 21 26 import {StarterPack} from '#/components/icons/StarterPack' 22 27 import * as Layout from '#/components/Layout' 23 28 ··· 52 57 const {openLightbox} = useLightboxControls() 53 58 const pal = usePalette('default') 54 59 const canGoBack = navigation.canGoBack() 55 - const aviRef = useHandleRef() 60 + const aviRef = useAnimatedRef() 56 61 57 62 const _openLightbox = React.useCallback( 58 63 (uri: string, thumbRect: MeasuredDimensions | null) => { ··· 81 86 if ( 82 87 avatar // TODO && !(view.moderation.avatar.blur && view.moderation.avatar.noOverride) 83 88 ) { 84 - const aviHandle = aviRef.current 85 89 runOnUI(() => { 86 90 'worklet' 87 - const rect = measureHandle(aviHandle) 91 + const rect = measure(aviRef) 88 92 runOnJS(_openLightbox)(avatar, rect) 89 93 })() 90 94 } ··· 111 115 paddingBottom: 14, 112 116 paddingHorizontal: isMobile ? 12 : 14, 113 117 }}> 114 - <View ref={aviRef} collapsable={false}> 118 + <Animated.View ref={aviRef} collapsable={false}> 115 119 <Pressable 116 120 testID="headerAviButton" 117 121 onPress={onPressAvi} ··· 125 129 <UserAvatar type={avatarType} size={58} avatar={avatar} /> 126 130 )} 127 131 </Pressable> 128 - </View> 132 + </Animated.View> 129 133 <View style={{flex: 1, gap: 4}}> 130 134 {isLoading ? ( 131 135 <LoadingPlaceholder
-1
src/view/com/util/Toast.web.tsx
··· 9 9 type FontAwesomeIconStyle, 10 10 type Props as FontAwesomeProps, 11 11 } from '@fortawesome/react-native-fontawesome' 12 - import type React from 'react' 13 12 14 13 const DURATION = 3500 15 14
+14 -8
src/view/com/util/images/AutoSizedImage.tsx
··· 1 1 import React, {useRef} from 'react' 2 - import {DimensionValue, Pressable, View} from 'react-native' 2 + import {type DimensionValue, Pressable, View} from 'react-native' 3 + import Animated, { 4 + type AnimatedRef, 5 + useAnimatedRef, 6 + } from 'react-native-reanimated' 3 7 import {Image} from 'expo-image' 4 - import {AppBskyEmbedImages} from '@atproto/api' 8 + import {type AppBskyEmbedImages} from '@atproto/api' 5 9 import {msg} from '@lingui/macro' 6 10 import {useLingui} from '@lingui/react' 7 11 8 - import {HandleRef, useHandleRef} from '#/lib/hooks/useHandleRef' 9 - import type {Dimensions} from '#/lib/media/types' 12 + import {type Dimensions} from '#/lib/media/types' 10 13 import {isNative} from '#/platform/detection' 11 14 import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge' 12 15 import {atoms as a, useBreakpoints, useTheme} from '#/alf' ··· 68 71 image: AppBskyEmbedImages.ViewImage 69 72 crop?: 'none' | 'square' | 'constrained' 70 73 hideBadge?: boolean 71 - onPress?: (containerRef: HandleRef, fetchedDims: Dimensions | null) => void 74 + onPress?: ( 75 + containerRef: AnimatedRef<any>, 76 + fetchedDims: Dimensions | null, 77 + ) => void 72 78 onLongPress?: () => void 73 79 onPressIn?: () => void 74 80 }) { 75 81 const t = useTheme() 76 82 const {_} = useLingui() 77 83 const largeAlt = useLargeAltBadgeEnabled() 78 - const containerRef = useHandleRef() 84 + const containerRef = useAnimatedRef() 79 85 const fetchedDimsRef = useRef<{width: number; height: number} | null>(null) 80 86 81 87 let aspectRatio: number | undefined ··· 103 109 const hasAlt = !!image.alt 104 110 105 111 const contents = ( 106 - <View ref={containerRef} collapsable={false} style={{flex: 1}}> 112 + <Animated.View ref={containerRef} collapsable={false} style={{flex: 1}}> 107 113 <Image 108 114 contentFit={isContain ? 'contain' : 'cover'} 109 115 style={[a.w_full, a.h_full]} ··· 185 191 )} 186 192 </View> 187 193 ) : null} 188 - </View> 194 + </Animated.View> 189 195 ) 190 196 191 197 if (cropDisabled) {
+8 -8
src/view/com/util/images/Gallery.tsx
··· 1 - import React from 'react' 2 - import {Pressable, StyleProp, View, ViewStyle} from 'react-native' 3 - import {Image, ImageStyle} from 'expo-image' 4 - import {AppBskyEmbedImages} from '@atproto/api' 1 + import {Pressable, type StyleProp, View, type ViewStyle} from 'react-native' 2 + import {type AnimatedRef} from 'react-native-reanimated' 3 + import {Image, type ImageStyle} from 'expo-image' 4 + import {type AppBskyEmbedImages} from '@atproto/api' 5 5 import {msg} from '@lingui/macro' 6 6 import {useLingui} from '@lingui/react' 7 + import type React from 'react' 7 8 8 - import {HandleRef} from '#/lib/hooks/useHandleRef' 9 - import {Dimensions} from '#/lib/media/types' 9 + import {type Dimensions} from '#/lib/media/types' 10 10 import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge' 11 11 import {PostEmbedViewContext} from '#/view/com/util/post-embeds/types' 12 12 import {atoms as a, useTheme} from '#/alf' ··· 20 20 index: number 21 21 onPress?: ( 22 22 index: number, 23 - containerRefs: HandleRef[], 23 + containerRefs: AnimatedRef<any>[], 24 24 fetchedDims: (Dimensions | null)[], 25 25 ) => void 26 26 onLongPress?: EventFunction ··· 28 28 imageStyle?: StyleProp<ImageStyle> 29 29 viewContext?: PostEmbedViewContext 30 30 insetBorderStyle?: StyleProp<ViewStyle> 31 - containerRefs: HandleRef[] 31 + containerRefs: AnimatedRef<any>[] 32 32 thumbDimsRef: React.MutableRefObject<(Dimensions | null)[]> 33 33 } 34 34
+10 -10
src/view/com/util/images/ImageLayoutGrid.tsx
··· 1 1 import React from 'react' 2 - import {StyleProp, StyleSheet, View, ViewStyle} from 'react-native' 3 - import {AppBskyEmbedImages} from '@atproto/api' 2 + import {type StyleProp, StyleSheet, View, type ViewStyle} from 'react-native' 3 + import {type AnimatedRef, useAnimatedRef} from 'react-native-reanimated' 4 + import {type AppBskyEmbedImages} from '@atproto/api' 4 5 5 - import {HandleRef, useHandleRef} from '#/lib/hooks/useHandleRef' 6 6 import {PostEmbedViewContext} from '#/view/com/util/post-embeds/types' 7 7 import {atoms as a, useBreakpoints} from '#/alf' 8 - import {Dimensions} from '../../lightbox/ImageViewing/@types' 8 + import {type Dimensions} from '../../lightbox/ImageViewing/@types' 9 9 import {GalleryItem} from './Gallery' 10 10 11 11 interface ImageLayoutGridProps { 12 12 images: AppBskyEmbedImages.ViewImage[] 13 13 onPress?: ( 14 14 index: number, 15 - containerRefs: HandleRef[], 15 + containerRefs: AnimatedRef<any>[], 16 16 fetchedDims: (Dimensions | null)[], 17 17 ) => void 18 18 onLongPress?: (index: number) => void ··· 43 43 images: AppBskyEmbedImages.ViewImage[] 44 44 onPress?: ( 45 45 index: number, 46 - containerRefs: HandleRef[], 46 + containerRefs: AnimatedRef<any>[], 47 47 fetchedDims: (Dimensions | null)[], 48 48 ) => void 49 49 onLongPress?: (index: number) => void ··· 56 56 const gap = props.gap 57 57 const count = props.images.length 58 58 59 - const containerRef1 = useHandleRef() 60 - const containerRef2 = useHandleRef() 61 - const containerRef3 = useHandleRef() 62 - const containerRef4 = useHandleRef() 59 + const containerRef1 = useAnimatedRef() 60 + const containerRef2 = useAnimatedRef() 61 + const containerRef3 = useAnimatedRef() 62 + const containerRef4 = useAnimatedRef() 63 63 const thumbDimsRef = React.useRef<(Dimensions | null)[]>([]) 64 64 65 65 switch (count) {
+7 -4
src/view/com/util/post-embeds/index.tsx
··· 7 7 type ViewStyle, 8 8 } from 'react-native' 9 9 import { 10 + type AnimatedRef, 11 + measure, 10 12 type MeasuredDimensions, 11 13 runOnJS, 12 14 runOnUI, ··· 25 27 type ModerationDecision, 26 28 } from '@atproto/api' 27 29 28 - import {type HandleRef, measureHandle} from '#/lib/hooks/useHandleRef' 29 30 import {usePalette} from '#/lib/hooks/usePalette' 30 31 import {useLightboxControls} from '#/state/lightbox' 31 32 import {useModerationOpts} from '#/state/preferences/moderation-opts' ··· 162 163 } 163 164 const onPress = ( 164 165 index: number, 165 - refs: HandleRef[], 166 + refs: AnimatedRef<any>[], 166 167 fetchedDims: (Dimensions | null)[], 167 168 ) => { 168 - const handles = refs.map(r => r.current) 169 169 runOnUI(() => { 170 170 'worklet' 171 - const rects = handles.map(measureHandle) 171 + const rects: (MeasuredDimensions | null)[] = [] 172 + for (const r of refs) { 173 + rects.push(measure(r)) 174 + } 172 175 runOnJS(_openLightbox)(index, rects, fetchedDims) 173 176 })() 174 177 }
+397 -369
yarn.lock
··· 3776 3776 resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d" 3777 3777 integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== 3778 3778 3779 - "@expo/cli@0.24.10": 3780 - version "0.24.10" 3781 - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.24.10.tgz#f23d150f011cdebd6f503343d9be3c6283fb4096" 3782 - integrity sha512-auPE4MSRdkJkHsWJk935VoqX/BGMKARgXOLtJybTFUi64K3MkvdUoBrujcn/QzXl5DTGhacFd9qxUeQss6/qwg== 3779 + "@expo/cli@0.24.14": 3780 + version "0.24.14" 3781 + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.24.14.tgz#af2e7ea5a08e3574e868cb0ec2110e68d32672e0" 3782 + integrity sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg== 3783 3783 dependencies: 3784 3784 "@0no-co/graphql.web" "^1.0.8" 3785 3785 "@babel/runtime" "^7.20.0" 3786 3786 "@expo/code-signing-certificates" "^0.0.5" 3787 - "@expo/config" "~11.0.7" 3787 + "@expo/config" "~11.0.10" 3788 3788 "@expo/config-plugins" "~10.0.2" 3789 3789 "@expo/devcert" "^1.1.2" 3790 3790 "@expo/env" "~1.0.5" 3791 3791 "@expo/image-utils" "^0.7.4" 3792 3792 "@expo/json-file" "^9.1.4" 3793 - "@expo/metro-config" "~0.20.12" 3793 + "@expo/metro-config" "~0.20.14" 3794 3794 "@expo/osascript" "^2.2.4" 3795 3795 "@expo/package-manager" "^1.8.4" 3796 3796 "@expo/plist" "^0.3.4" 3797 - "@expo/prebuild-config" "^9.0.5" 3797 + "@expo/prebuild-config" "^9.0.6" 3798 3798 "@expo/spawn-async" "^1.7.2" 3799 3799 "@expo/ws-tunnel" "^1.0.1" 3800 3800 "@expo/xcpretty" "^4.3.0" 3801 - "@react-native/dev-middleware" "0.79.2" 3801 + "@react-native/dev-middleware" "0.79.3" 3802 3802 "@urql/core" "^5.0.6" 3803 3803 "@urql/exchange-retry" "^1.3.0" 3804 3804 accepts "^1.3.8" ··· 3813 3813 debug "^4.3.4" 3814 3814 env-editor "^0.4.1" 3815 3815 freeport-async "^2.0.0" 3816 - getenv "^1.0.0" 3816 + getenv "^2.0.0" 3817 3817 glob "^10.4.2" 3818 - lan-network "^0.1.4" 3818 + lan-network "^0.1.6" 3819 3819 minimatch "^9.0.0" 3820 3820 node-forge "^1.3.1" 3821 3821 npm-package-arg "^11.0.0" ··· 3871 3871 xcode "^3.0.1" 3872 3872 xml2js "0.6.0" 3873 3873 3874 - "@expo/config-plugins@~10.0.1", "@expo/config-plugins@~10.0.2": 3874 + "@expo/config-plugins@~10.0.2": 3875 3875 version "10.0.2" 3876 3876 resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-10.0.2.tgz#040867991e9c8c527b4f5c13a47bcf040a7479fe" 3877 3877 integrity sha512-TzUn3pPdpwCS0yYaSlZOClgDmCX8N4I2lfgitX5oStqmvpPtB+vqtdyqsVM02fQ2tlJIAqwBW+NHaHqqy8Jv7g== ··· 3926 3926 resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-53.0.3.tgz#d083d9b095972e89eee96c41d085feb5b92d2749" 3927 3927 integrity sha512-V1e6CiM4TXtGxG/W2Msjp/QOx/vikLo5IUGMvEMjgAglBfGYx3PXfqsUb5aZDt6kqA3bDDwFuZoS5vNm/SYwSg== 3928 3928 3929 + "@expo/config-types@^53.0.4": 3930 + version "53.0.4" 3931 + resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-53.0.4.tgz#fe64fac734531ae883d18529b32586c23ffb1ceb" 3932 + integrity sha512-0s+9vFx83WIToEr0Iwy4CcmiUXa5BgwBmEjylBB2eojX5XAMm9mJvw9KpjAb8m7zq2G0Q6bRbeufkzgbipuNQg== 3933 + 3929 3934 "@expo/config@~10.0.4": 3930 3935 version "10.0.5" 3931 3936 resolved "https://registry.yarnpkg.com/@expo/config/-/config-10.0.5.tgz#2de75e3f5d46a55f9f5140b73e0913265e6a41c6" ··· 3945 3950 slugify "^1.3.4" 3946 3951 sucrase "3.35.0" 3947 3952 3948 - "@expo/config@~11.0.6", "@expo/config@~11.0.7": 3949 - version "11.0.7" 3950 - resolved "https://registry.yarnpkg.com/@expo/config/-/config-11.0.7.tgz#e6a6071942854269825e2450c3a115c963a4fd56" 3951 - integrity sha512-pppH3Cy2IfituiYACMeW7cWYezcjmHKq7lDLfH1gMHT+zZ1QaYNs3EN6Kcc/QAXV//KFFhU0Qq4H/UrLuPp/yg== 3953 + "@expo/config@~11.0.10", "@expo/config@~11.0.9": 3954 + version "11.0.10" 3955 + resolved "https://registry.yarnpkg.com/@expo/config/-/config-11.0.10.tgz#559d9425a4e0de4fab96ccac01ff40f5cebbc04b" 3956 + integrity sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA== 3952 3957 dependencies: 3953 3958 "@babel/code-frame" "~7.10.4" 3954 - "@expo/config-plugins" "~10.0.1" 3955 - "@expo/config-types" "^53.0.3" 3959 + "@expo/config-plugins" "~10.0.2" 3960 + "@expo/config-types" "^53.0.4" 3956 3961 "@expo/json-file" "^9.1.4" 3957 3962 deepmerge "^4.3.1" 3958 3963 getenv "^1.0.0" ··· 4005 4010 dotenv-expand "~11.0.6" 4006 4011 getenv "^1.0.0" 4007 4012 4008 - "@expo/fingerprint@0.12.4": 4009 - version "0.12.4" 4010 - resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.12.4.tgz#d4cc4de50e7b6d4e03b0d38850d1e4a136b74c8c" 4011 - integrity sha512-HOJVvjiQYVHIouCOfFf4JRrQvBDIV/12GVG2iwbw1iGwmpQVkPgEXa9lN0f2yuS4J3QXHs73wr9jvuCjMmJlfw== 4013 + "@expo/fingerprint@0.13.0": 4014 + version "0.13.0" 4015 + resolved "https://registry.yarnpkg.com/@expo/fingerprint/-/fingerprint-0.13.0.tgz#5f5600122940ac381ed697743c10bdbddf6c55c1" 4016 + integrity sha512-3IwpH0p3uO8jrJSLOUNDzJVh7VEBod0emnCBq0hD72sy6ICmzauM6Xf4he+2Tip7fzImCJRd63GaehV+CCtpvA== 4012 4017 dependencies: 4013 4018 "@expo/spawn-async" "^1.7.2" 4014 4019 arg "^5.0.2" 4015 4020 chalk "^4.1.2" 4016 4021 debug "^4.3.4" 4017 4022 find-up "^5.0.0" 4018 - getenv "^1.0.0" 4023 + getenv "^2.0.0" 4024 + ignore "^5.3.1" 4019 4025 minimatch "^9.0.0" 4020 4026 p-limit "^3.1.0" 4021 4027 resolve-from "^5.0.0" 4022 4028 semver "^7.6.0" 4023 4029 4024 - "@expo/html-elements@^0.12.4": 4030 + "@expo/html-elements@^0.12.5": 4025 4031 version "0.12.5" 4026 4032 resolved "https://registry.yarnpkg.com/@expo/html-elements/-/html-elements-0.12.5.tgz#be7e7af9f2be6d3f1aa3ec2e7ae1c121c91a9aa1" 4027 4033 integrity sha512-28KWO88YKykKU7ke5sEQs5TivFRMs1Aktz13xxgqAf5rTgb+lka0VKVt3W2fG7ksbUQ407rtUqz7SEAq298NvQ== ··· 4068 4074 json5 "^2.2.3" 4069 4075 write-file-atomic "^2.3.0" 4070 4076 4071 - "@expo/metro-config@0.20.12", "@expo/metro-config@~0.20.12": 4072 - version "0.20.12" 4073 - resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.20.12.tgz#f6e2c33a305cb0ab8b0aa0dadafd6adf09058b9c" 4074 - integrity sha512-O9zaAF3gH76EXkwuQCpXLKC5dBy344/pqoszWmtOloKo4gJy74aNPUy2LRS57pDHyjZe1HjrxVkMcr7lZCIsag== 4077 + "@expo/metro-config@0.20.14", "@expo/metro-config@~0.20.14": 4078 + version "0.20.14" 4079 + resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.20.14.tgz#5abf8cd6454fe7f75c1f8529cf79619da32af82d" 4080 + integrity sha512-tYDDubuZycK+NX00XN7BMu73kBur/evOPcKfxc+UBeFfgN2EifOITtdwSUDdRsbtJ2OnXwMY1HfRUG3Lq3l4cw== 4075 4081 dependencies: 4076 4082 "@babel/core" "^7.20.0" 4077 4083 "@babel/generator" "^7.20.5" 4078 4084 "@babel/parser" "^7.20.0" 4079 4085 "@babel/types" "^7.20.0" 4080 - "@expo/config" "~11.0.7" 4086 + "@expo/config" "~11.0.9" 4081 4087 "@expo/env" "~1.0.5" 4082 4088 "@expo/json-file" "~9.1.4" 4083 4089 "@expo/spawn-async" "^1.7.2" ··· 4140 4146 base64-js "^1.2.3" 4141 4147 xmlbuilder "^15.1.1" 4142 4148 4143 - "@expo/prebuild-config@^9.0.5": 4144 - version "9.0.5" 4145 - resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-9.0.5.tgz#b8b864b5e19489a1f66442ae30d5d7295f658297" 4146 - integrity sha512-oiSVU5ePu9lsOvn5p4xplqjzPlcZHzKYwzuonTa9GCH1GxcOEIBsvMVQiHBXHtqvgV2dztjm34kdXV//+9jtCA== 4149 + "@expo/prebuild-config@^9.0.6": 4150 + version "9.0.6" 4151 + resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-9.0.6.tgz#f634e7b8f9ebebeaf2e7d2f2be46926c23834d2b" 4152 + integrity sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q== 4147 4153 dependencies: 4148 - "@expo/config" "~11.0.7" 4154 + "@expo/config" "~11.0.9" 4149 4155 "@expo/config-plugins" "~10.0.2" 4150 - "@expo/config-types" "^53.0.3" 4156 + "@expo/config-types" "^53.0.4" 4151 4157 "@expo/image-utils" "^0.7.4" 4152 4158 "@expo/json-file" "^9.1.4" 4153 4159 "@react-native/normalize-colors" "0.79.2" ··· 4416 4422 protobufjs "^7.2.5" 4417 4423 yargs "^17.7.2" 4418 4424 4419 - "@haileyok/bluesky-video@0.2.6": 4420 - version "0.2.6" 4421 - resolved "https://registry.yarnpkg.com/@haileyok/bluesky-video/-/bluesky-video-0.2.6.tgz#61bb4ff908498558fd2320f06ba0f74ea03598b4" 4422 - integrity sha512-IlzrTATD7ci/a+ehSA7pIhOvxxNTe35zdzBYt8EmVvKKafyeFhxGfDuuP5qxfQmHurcQMIL+3HeZgnAXwQQNmQ== 4425 + "@haileyok/bluesky-video@0.3.1": 4426 + version "0.3.1" 4427 + resolved "https://registry.yarnpkg.com/@haileyok/bluesky-video/-/bluesky-video-0.3.1.tgz#c996d8433e8f1988f2e9644adf39366fb4305d00" 4428 + integrity sha512-TU5c0RCV1yWF/HEZA22E0qXjxNzu0SOuMZpvdo+QVrO4tQcja9k8nHBbKRmyj60Odke4HQMoTOfNDNq/xo2Grw== 4423 4429 4424 4430 "@hapi/accept@^6.0.3": 4425 4431 version "6.0.3" ··· 5119 5125 "@babel/runtime" "^7.20.13" 5120 5126 "@lingui/core" "4.14.1" 5121 5127 5122 - "@mattermost/react-native-paste-input@^0.7.1": 5123 - version "0.7.1" 5124 - resolved "https://registry.yarnpkg.com/@mattermost/react-native-paste-input/-/react-native-paste-input-0.7.1.tgz#f14585030b992cf7c9bbd0921225eefa501756ba" 5125 - integrity sha512-kY8LKtqRX2T/rtn/HNrzTitijuATvyzd6yl5WNWOsszmyzNcssKStjjCTBup04CyMxfwutUU1CWrYUb3hQO7oA== 5128 + "@mattermost/react-native-paste-input@mattermost/react-native-paste-input": 5129 + version "0.8.1" 5130 + resolved "https://codeload.github.com/mattermost/react-native-paste-input/tar.gz/f260447edc645a817ab1ba7b46d8341d84dba8e9" 5126 5131 dependencies: 5127 - semver "7.6.0" 5132 + semver "7.6.3" 5128 5133 5129 5134 "@messageformat/parser@^5.0.0": 5130 5135 version "5.1.0" ··· 5133 5138 dependencies: 5134 5139 moo "^0.5.1" 5135 5140 5136 - "@miblanchard/react-native-slider@^2.3.1": 5137 - version "2.3.1" 5138 - resolved "https://registry.yarnpkg.com/@miblanchard/react-native-slider/-/react-native-slider-2.3.1.tgz#79e0f1f9b1ce43ef25ee51ee9256c012e5dfa412" 5139 - integrity sha512-J/hZDBWmXq8fJeOnTVHqIUVDHshqMSpJVxJ4WqwuCBKl5Rke9OBYXIdkSlgi75OgtScAr8FKK5KNkDKHUf6JIg== 5141 + "@miblanchard/react-native-slider@^2.6.0": 5142 + version "2.6.0" 5143 + resolved "https://registry.yarnpkg.com/@miblanchard/react-native-slider/-/react-native-slider-2.6.0.tgz#9f78c805d637ffaff0e3e7429932d2995a67edc9" 5144 + integrity sha512-o7hk/f/8vkqh6QNR5L52m+ws846fQeD/qNCC9CCSRdBqjq66KiCgbxzlhRzKM/gbtxcvMYMIEEJ1yes5cr6I3A== 5140 5145 5141 - "@mozzius/expo-dynamic-app-icon@^1.5.0": 5146 + "@mozzius/expo-dynamic-app-icon@1.5.0": 5142 5147 version "1.5.0" 5143 5148 resolved "https://registry.yarnpkg.com/@mozzius/expo-dynamic-app-icon/-/expo-dynamic-app-icon-1.5.0.tgz#c5f88c309965b6d6b89cfd5e2c00faa7bda736af" 5144 5149 integrity sha512-yE2yEPO+HQmOqsX7cECh7/vu/LXnqhHGsVm3UiVi/3gaK8u5hAkPTNzZ0Qu6vnMwjPnY+uFbN6X+6Aj9c9yjMQ== ··· 6141 6146 resolved "https://registry.yarnpkg.com/@react-native-picker/picker/-/picker-2.11.0.tgz#4587fbce6a382adedad74311e96ee10bb2b2d63a" 6142 6147 integrity sha512-QuZU6gbxmOID5zZgd/H90NgBnbJ3VV6qVzp6c7/dDrmWdX8S0X5YFYgDcQFjE3dRen9wB9FWnj2VVdPU64adSg== 6143 6148 6144 - "@react-native/assets-registry@0.79.2": 6145 - version "0.79.2" 6146 - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.2.tgz#731963e664c8543f5b277e56c058bde612b69f50" 6147 - integrity sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg== 6149 + "@react-native/assets-registry@0.79.3": 6150 + version "0.79.3" 6151 + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.3.tgz#022218d55a5d9d221a6d176987ab0b35c10d388b" 6152 + integrity sha512-Vy8DQXCJ21YSAiHxrNBz35VqVlZPpRYm50xRTWRf660JwHuJkFQG8cUkrLzm7AUriqUXxwpkQHcY+b0ibw9ejQ== 6148 6153 6149 - "@react-native/babel-plugin-codegen@0.79.2": 6150 - version "0.79.2" 6151 - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.2.tgz#f3f86766a01487aaaa623ec62514af4c84400953" 6152 - integrity sha512-d+NB7Uosn2ZWd4O4+7ZkB6q1a+0z2opD/4+Bzhk/Tv6fc5FrSftK2Noqxvo3/bhbdGFVPxf0yvLE8et4W17x/Q== 6154 + "@react-native/babel-plugin-codegen@0.79.3": 6155 + version "0.79.3" 6156 + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.3.tgz#acad4acaead398a8c8bcdecbe44040aa0c2dc2d7" 6157 + integrity sha512-Zb8F4bSEKKZfms5n1MQ0o5mudDcpAINkKiFuFTU0PErYGjY3kZ+JeIP+gS6KCXsckxCfMEKQwqKicP/4DWgsZQ== 6153 6158 dependencies: 6154 6159 "@babel/traverse" "^7.25.3" 6155 - "@react-native/codegen" "0.79.2" 6160 + "@react-native/codegen" "0.79.3" 6156 6161 6157 - "@react-native/babel-preset@0.79.2": 6158 - version "0.79.2" 6159 - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.79.2.tgz#5a683a6efeea357a326f70c84a881be2bafbeae3" 6160 - integrity sha512-/HNu869oUq4FUXizpiNWrIhucsYZqu0/0spudJEzk9SEKar0EjVDP7zkg/sKK+KccNypDQGW7nFXT8onzvQ3og== 6162 + "@react-native/babel-preset@0.79.2", "@react-native/babel-preset@0.79.3": 6163 + version "0.79.3" 6164 + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.79.3.tgz#8ad6c149cd488fbc18d62983119bdcbfc15ff651" 6165 + integrity sha512-VHGNP02bDD2Ul1my0pLVwe/0dsEBHxR343ySpgnkCNEEm9C1ANQIL2wvnJrHZPcqfAkWfFQ8Ln3t+6fdm4A/Dg== 6161 6166 dependencies: 6162 6167 "@babel/core" "^7.25.2" 6163 6168 "@babel/plugin-proposal-export-default-from" "^7.24.7" ··· 6200 6205 "@babel/plugin-transform-typescript" "^7.25.2" 6201 6206 "@babel/plugin-transform-unicode-regex" "^7.24.7" 6202 6207 "@babel/template" "^7.25.0" 6203 - "@react-native/babel-plugin-codegen" "0.79.2" 6208 + "@react-native/babel-plugin-codegen" "0.79.3" 6204 6209 babel-plugin-syntax-hermes-parser "0.25.1" 6205 6210 babel-plugin-transform-flow-enums "^0.0.2" 6206 6211 react-refresh "^0.14.0" 6207 6212 6208 - "@react-native/codegen@0.79.2": 6209 - version "0.79.2" 6210 - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.2.tgz#75270d8162e78c02b0272396a3c6942e39e8703d" 6211 - integrity sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg== 6213 + "@react-native/codegen@0.79.3": 6214 + version "0.79.3" 6215 + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.3.tgz#49689132718c81a3b25426769bc6fd8fd2a0469f" 6216 + integrity sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ== 6212 6217 dependencies: 6213 6218 glob "^7.1.1" 6214 6219 hermes-parser "0.25.1" ··· 6216 6221 nullthrows "^1.1.1" 6217 6222 yargs "^17.6.2" 6218 6223 6219 - "@react-native/community-cli-plugin@0.79.2": 6220 - version "0.79.2" 6221 - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz#d3a0efbdfb554cf3a7e9bfb27865a7caeeeaa1b3" 6222 - integrity sha512-E+YEY2dL+68HyR2iahsZdyBKBUi9QyPyaN9vsnda1jNgCjNpSPk2yAF5cXsho+zKK5ZQna3JSeE1Kbi2IfGJbw== 6224 + "@react-native/community-cli-plugin@0.79.3": 6225 + version "0.79.3" 6226 + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.3.tgz#84821d3401074e036ba05b8b6ca1ee122cb43e29" 6227 + integrity sha512-N/+p4HQqN4yK6IRzn7OgMvUIcrmEWkecglk1q5nj+AzNpfIOzB+mqR20SYmnPfeXF+mZzYCzRANb3KiM+WsSDA== 6223 6228 dependencies: 6224 - "@react-native/dev-middleware" "0.79.2" 6229 + "@react-native/dev-middleware" "0.79.3" 6225 6230 chalk "^4.0.0" 6226 6231 debug "^2.2.0" 6227 6232 invariant "^2.2.4" ··· 6230 6235 metro-core "^0.82.0" 6231 6236 semver "^7.1.3" 6232 6237 6233 - "@react-native/debugger-frontend@0.79.2": 6234 - version "0.79.2" 6235 - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz#1377de6d9cabe5455bf332e06408167da5f60c19" 6236 - integrity sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg== 6238 + "@react-native/debugger-frontend@0.79.3": 6239 + version "0.79.3" 6240 + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz#9cb57d8e88c22552194ab5f6f257605b151bc5b3" 6241 + integrity sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A== 6237 6242 6238 - "@react-native/dev-middleware@0.79.2": 6239 - version "0.79.2" 6240 - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz#f09f1a75b4cd0b56dfd82a07bf41157a9c45619c" 6241 - integrity sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw== 6243 + "@react-native/dev-middleware@0.79.3": 6244 + version "0.79.3" 6245 + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.3.tgz#3e315ef7516ebad60a4202b4094d84fedecb4064" 6246 + integrity sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw== 6242 6247 dependencies: 6243 6248 "@isaacs/ttlcache" "^1.4.1" 6244 - "@react-native/debugger-frontend" "0.79.2" 6249 + "@react-native/debugger-frontend" "0.79.3" 6245 6250 chrome-launcher "^0.15.2" 6246 6251 chromium-edge-launcher "^0.2.0" 6247 6252 connect "^3.6.5" ··· 6252 6257 serve-static "^1.16.2" 6253 6258 ws "^6.2.3" 6254 6259 6255 - "@react-native/eslint-config@^0.79.2": 6256 - version "0.79.2" 6257 - resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.79.2.tgz#b42c95fe2399aae84209356b0971dd68c4149e4e" 6258 - integrity sha512-ukb9qGvrFC/3YVlWVy/GGM+auKdGIsbbumCyfOYPfUdhHFWA/twz1zK4bJQmCZ38iINuTENYedRzoE+U57GclA== 6260 + "@react-native/eslint-config@^0.79.3": 6261 + version "0.79.3" 6262 + resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.79.3.tgz#a72352ce98a7d05b5686dc446ba933fee3b944a9" 6263 + integrity sha512-pvPXfXFoVfwqGEItIl7emv6bRTpi0NWv4jmb0ZBwSJ7+zM8bRRw7JwxLA+iwrevh0QAqrF66Nu5xl39ysWcavg== 6259 6264 dependencies: 6260 6265 "@babel/core" "^7.25.2" 6261 6266 "@babel/eslint-parser" "^7.25.1" 6262 - "@react-native/eslint-plugin" "0.79.2" 6267 + "@react-native/eslint-plugin" "0.79.3" 6263 6268 "@typescript-eslint/eslint-plugin" "^7.1.1" 6264 6269 "@typescript-eslint/parser" "^7.1.1" 6265 6270 eslint-config-prettier "^8.5.0" ··· 6270 6275 eslint-plugin-react-hooks "^4.6.0" 6271 6276 eslint-plugin-react-native "^4.0.0" 6272 6277 6273 - "@react-native/eslint-plugin@0.79.2": 6274 - version "0.79.2" 6275 - resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.79.2.tgz#23d18226bb4335404e6db561bf1a47ac7d1380ed" 6276 - integrity sha512-Abu+0OuwTje9E5eQOvYpTUuXvDgGjHeFhnfNVY9BXalBK8OrX20EFlonWvIbFqii136eS5KLEBm2Wjqk2V5XJg== 6278 + "@react-native/eslint-plugin@0.79.3": 6279 + version "0.79.3" 6280 + resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.79.3.tgz#c1ac34d45b92f963b9af66e860c45cd891235741" 6281 + integrity sha512-6QZzCsV+Wc+HdOAMMoMqDea3SSzsvBBktGc/cqaLubKGiztTb22d+vtzZGWqCqUEVkhQKdK7qhWAs0kJPEbiXw== 6277 6282 6278 - "@react-native/gradle-plugin@0.79.2": 6279 - version "0.79.2" 6280 - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.2.tgz#d41d4e2c63baf688a2b47652c6260f2a2f1ec091" 6281 - integrity sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA== 6283 + "@react-native/gradle-plugin@0.79.3": 6284 + version "0.79.3" 6285 + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.3.tgz#69ba47ac406ccdb3b3829f311bd7c27e6fad7ebc" 6286 + integrity sha512-imfpZLhNBc9UFSzb/MOy2tNcIBHqVmexh/qdzw83F75BmUtLb/Gs1L2V5gw+WI1r7RqDILbWk7gXB8zUllwd+g== 6282 6287 6283 - "@react-native/js-polyfills@0.79.2": 6284 - version "0.79.2" 6285 - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.2.tgz#15eb4da0fe9e8d61d2980d08fd06b5f49e133b0f" 6286 - integrity sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw== 6288 + "@react-native/js-polyfills@0.79.3": 6289 + version "0.79.3" 6290 + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.3.tgz#bf5614363f118c6bdf2f773c578e603c88d0425c" 6291 + integrity sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q== 6287 6292 6288 - "@react-native/normalize-colors@0.79.2", "@react-native/normalize-colors@^0.73.0", "@react-native/normalize-colors@^0.74.1": 6289 - version "0.79.2" 6290 - resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz#9ab70ca257c7411e4ab74cf7f91332c27d39cc6f" 6291 - integrity sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w== 6293 + "@react-native/normalize-colors@0.79.2", "@react-native/normalize-colors@0.79.3", "@react-native/normalize-colors@^0.73.0", "@react-native/normalize-colors@^0.74.1": 6294 + version "0.79.3" 6295 + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.3.tgz#e491937436a2c287707e24263308c818a66eb447" 6296 + integrity sha512-T75NIQPRFCj6DFMxtcVMJTZR+3vHXaUMSd15t+CkJpc5LnyX91GVaPxpRSAdjFh7m3Yppl5MpdjV/fntImheYQ== 6292 6297 6293 - "@react-native/typescript-config@^0.79.2": 6294 - version "0.79.2" 6295 - resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.79.2.tgz#02cb07db89ef80159b3c1b3e82e81b0c0d5ce908" 6296 - integrity sha512-krHAkkPRCOEhuqN3iwRUwIyE1rAnUQ9//huzUc1ukcoQ7Y4qFxM6amhNloAmYn4QH1Ay6o5At00VbEh2xoHISA== 6298 + "@react-native/typescript-config@^0.79.3": 6299 + version "0.79.3" 6300 + resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.79.3.tgz#21101b591c67ecef6ae5189f96a448b3bcaf1e9e" 6301 + integrity sha512-dqKAU8D3NkExthnpBOPZjZ/NGU5qqBaqZ12v9IlMqP9sVTWSuY1iswfzomp0AYeJBxo4ZpBNmrdlnQZYQSVWiw== 6297 6302 6298 - "@react-native/virtualized-lists@0.79.2": 6299 - version "0.79.2" 6300 - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz#ed5a419a30b7ddec978b7816ff698a9d85507e15" 6301 - integrity sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw== 6303 + "@react-native/virtualized-lists@0.79.3": 6304 + version "0.79.3" 6305 + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.79.3.tgz#4a2799017cd3795f519422f48b3c0bbc4739a245" 6306 + integrity sha512-/0rRozkn+iIHya2vnnvprDgT7QkfI54FLrACAN3BLP7MRlfOIGOrZsXpRLndnLBVnjNzkcre84i1RecjoXnwIA== 6302 6307 dependencies: 6303 6308 invariant "^2.2.4" 6304 6309 nullthrows "^1.1.1" ··· 6412 6417 resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.2.2.tgz#0c5f26e417b8f524924fa4531b82ad5603216e90" 6413 6418 integrity sha512-D+SKQ266ra/wo87s9+UI/rKQi3qhGPCR8eSCDe0VJudhjHsqyNU+JJ5lnIGCgmZaWFTXgdBP/gdr1Iz1zqGs4Q== 6414 6419 6420 + "@sentry/babel-plugin-component-annotate@3.4.0": 6421 + version "3.4.0" 6422 + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.4.0.tgz#f47a7652e16f84556df82cbc38f0004bca1335d1" 6423 + integrity sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg== 6424 + 6415 6425 "@sentry/browser@8.54.0": 6416 6426 version "8.54.0" 6417 6427 resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.54.0.tgz#5487075908aac564892e689e1b6d233fdb314f5b" ··· 6442 6452 resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.42.2.tgz#a32a4f226e717122b37d9969e8d4d0e14779f720" 6443 6453 integrity sha512-GtJSuxER7Vrp1IpxdUyRZzcckzMnb4N5KTW7sbTwUiwqARRo+wxS+gczYrS8tdgtmXs5XYhzhs+t4d52ITHMIg== 6444 6454 6445 - "@sentry/cli-darwin@2.42.4": 6446 - version "2.42.4" 6447 - resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.42.4.tgz#029521d3052c644e3bac1c926e53d1e658b8cb28" 6448 - integrity sha512-PZV4Y97VDWBR4rIt0HkJfXaBXlebIN2s/FDzC3iHINZE5OG62CDFsnC4/lbGlf2/UZLDaGGIK7mYwSHhTvN+HQ== 6455 + "@sentry/cli-darwin@2.45.0": 6456 + version "2.45.0" 6457 + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.45.0.tgz#e3d6feae4fadcfdf91db9c7b9c4689a66d3d8d19" 6458 + integrity sha512-p4Uxfv/L2fQdP3/wYnKVVz9gzZJf/1Xp9D+6raax/3Bu5y87yHYUqcdt98y/VAXQD4ofp2QgmhGUVPofvQNZmg== 6449 6459 6450 6460 "@sentry/cli-linux-arm64@2.42.2": 6451 6461 version "2.42.2" 6452 6462 resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.2.tgz#1c06c83ff21f51ec23acf5be3b1f8c7553bf86b1" 6453 6463 integrity sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw== 6454 6464 6455 - "@sentry/cli-linux-arm64@2.42.4": 6456 - version "2.42.4" 6457 - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.4.tgz#b5e2d2399764998e3d661f144aae0c3f3495d1f1" 6458 - integrity sha512-Ex8vRnryyzC/9e43daEmEqPS+9uirY/l6Hw2lAvhBblFaL7PTWNx52H+8GnYGd9Zy2H3rWNyBDYfHwnErg38zA== 6465 + "@sentry/cli-linux-arm64@2.45.0": 6466 + version "2.45.0" 6467 + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.45.0.tgz#384c8e17f7e7dc007d164033d0e7c75aa83a2e9b" 6468 + integrity sha512-gUcLoEjzg7AIc4QQGEZwRHri+EHf3Gcms9zAR1VHiNF3/C/jL4WeDPJF2YiWAQt6EtH84tHiyhw1Ab/R8XFClg== 6459 6469 6460 6470 "@sentry/cli-linux-arm@2.42.2": 6461 6471 version "2.42.2" 6462 6472 resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.2.tgz#00cadc359ae3c051efb3e63873c033c61dbd1ca1" 6463 6473 integrity sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg== 6464 6474 6465 - "@sentry/cli-linux-arm@2.42.4": 6466 - version "2.42.4" 6467 - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.4.tgz#286996c3969a553c07a74a2a67c6d3671e2c79b5" 6468 - integrity sha512-lBn0oeeg62h68/4Eo6zbPq99Idz5t0VRV48rEU/WKeM4MtQCvG/iGGQ3lBFW2yNiUBzXZIK9poXLEcgbwmcRVw== 6475 + "@sentry/cli-linux-arm@2.45.0": 6476 + version "2.45.0" 6477 + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.45.0.tgz#b9d6f86f3934b4d9ced5b45a8158ff2ac2bdd25d" 6478 + integrity sha512-6sEskFLlFKJ+e0MOYgIclBTUX5jYMyYhHIxXahEkI/4vx6JO0uvpyRAkUJRpJkRh/lPog0FM+tbP3so+VxB2qQ== 6469 6479 6470 6480 "@sentry/cli-linux-i686@2.42.2": 6471 6481 version "2.42.2" 6472 6482 resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.2.tgz#3b817b715dd806c20dfbffd539725ad8089c310a" 6473 6483 integrity sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ== 6474 6484 6475 - "@sentry/cli-linux-i686@2.42.4": 6476 - version "2.42.4" 6477 - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.4.tgz#03e72598dc37e96a99e4329e20db9e74df277f83" 6478 - integrity sha512-IBJg0aHjsLCL4LvcFa3cXIjA+4t5kPqBT9y+PoDu4goIFxYD8zl7mbUdGJutvJafTk8Akf4ss4JJXQBjg019zA== 6485 + "@sentry/cli-linux-i686@2.45.0": 6486 + version "2.45.0" 6487 + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.45.0.tgz#39e22beb84cfa26e11bdc198364315fdfb4da4d5" 6488 + integrity sha512-VmmOaEAzSW23YdGNdy/+oQjCNAMY+HmOGA77A25/ep/9AV7PQB6FI7xO5Y1PVvlkxZFJ23e373njSsEeg4uDZw== 6479 6489 6480 6490 "@sentry/cli-linux-x64@2.42.2": 6481 6491 version "2.42.2" 6482 6492 resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.2.tgz#ddf906bc3071cc79ce6e633eddcb76bb9068e688" 6483 6493 integrity sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw== 6484 6494 6485 - "@sentry/cli-linux-x64@2.42.4": 6486 - version "2.42.4" 6487 - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.4.tgz#a3bc31a909f61029620e5d2ae0f8d8625ed8982a" 6488 - integrity sha512-gXI5OEiOSNiAEz7VCE6AZcAgHJ47mlgal3+NmbE8XcHmFOnyDws9FNie6PJAy8KZjXi3nqoBP9JVAbnmOix3uA== 6495 + "@sentry/cli-linux-x64@2.45.0": 6496 + version "2.45.0" 6497 + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.45.0.tgz#25cd3699297f9433835fb5edd42dad722c11f041" 6498 + integrity sha512-a0Oj68mrb25a0WjX/ShZ6AAd4PPiuLcgyzQr7bl2+DvYxIOajwkGbR+CZFEhOVZcfhTnixKy/qIXEzApEPHPQg== 6499 + 6500 + "@sentry/cli-win32-arm64@2.45.0": 6501 + version "2.45.0" 6502 + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.45.0.tgz#50c7d29ea2169bdb4d98bbde81c5f7dac0dd3955" 6503 + integrity sha512-vn+CwS4p+52pQSLNPoi20ZOrQmv01ZgAmuMnjkh1oUZfTyBAwWLrAh6Cy4cztcN8DfL5dOWKQBo8DBKURE4ttg== 6489 6504 6490 6505 "@sentry/cli-win32-i686@2.42.2": 6491 6506 version "2.42.2" 6492 6507 resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.2.tgz#9036085c7c6ce455ad45fda411c55ff39c06eb95" 6493 6508 integrity sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw== 6494 6509 6495 - "@sentry/cli-win32-i686@2.42.4": 6496 - version "2.42.4" 6497 - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.4.tgz#0de663fc574f4bce2057e099c5b76b65f99a3bd6" 6498 - integrity sha512-vZuR3UPHKqOMniyrijrrsNwn9usaRysXq78F6WV0cL0ZyPLAmY+KBnTDSFk1Oig2pURnzaTm+RtcZu2fc8mlzg== 6510 + "@sentry/cli-win32-i686@2.45.0": 6511 + version "2.45.0" 6512 + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.45.0.tgz#201075c4aec37a3e797160e0b468641245437f0c" 6513 + integrity sha512-8mMoDdlwxtcdNIMtteMK7dbi7054jak8wKSHJ5yzMw8UmWxC5thc/gXBc1uPduiaI56VjoJV+phWHBKCD+6I4w== 6499 6514 6500 6515 "@sentry/cli-win32-x64@2.42.2": 6501 6516 version "2.42.2" 6502 6517 resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.2.tgz#7d6464b63f32c9f97fff428f246b1f039b402233" 6503 6518 integrity sha512-vPPGHjYoaGmfrU7xhfFxG7qlTBacroz5NdT+0FmDn6692D8IvpNXl1K+eV3Kag44ipJBBeR8g1HRJyx/F/9ACw== 6504 6519 6505 - "@sentry/cli-win32-x64@2.42.4": 6506 - version "2.42.4" 6507 - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.4.tgz#f572a03084f3b1a4f355c1fbeb1339cb56ad91c9" 6508 - integrity sha512-OIBj3uaQ6nAERSm5Dcf8UIhyElEEwMNsZEEppQpN4IKl0mrwb/57AznM23Dvpu6GR8WGbVQUSolt879YZR5E9g== 6520 + "@sentry/cli-win32-x64@2.45.0": 6521 + version "2.45.0" 6522 + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.45.0.tgz#2075e9e1ea3c3609e0fa1a758ca033e94e1c600f" 6523 + integrity sha512-ZvK9cIqFaq7vZ0jkHJ/xh5au6902Dr+AUxSk6L6vCL7JCe2p93KGL/4d8VFB5PD/P7Y9b+105G/e0QIFKzpeOw== 6509 6524 6510 6525 "@sentry/cli@2.42.2": 6511 6526 version "2.42.2" ··· 6526 6541 "@sentry/cli-win32-i686" "2.42.2" 6527 6542 "@sentry/cli-win32-x64" "2.42.2" 6528 6543 6529 - "@sentry/cli@2.42.4": 6530 - version "2.42.4" 6531 - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.42.4.tgz#df6ac3e92a60a715b231873433894ed77e601086" 6532 - integrity sha512-BoSZDAWJiz/40tu6LuMDkSgwk4xTsq6zwqYoUqLU3vKBR/VsaaQGvu6EWxZXORthfZU2/5Agz0+t220cge6VQw== 6544 + "@sentry/cli@2.45.0": 6545 + version "2.45.0" 6546 + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.45.0.tgz#35feed7a2fee54faf25daed73001a2a2a3143396" 6547 + integrity sha512-4sWu7zgzgHAjIxIjXUA/66qgeEf5ZOlloO+/JaGD5qXNSW0G7KMTR6iYjReNKMgdBCTH6bUUt9qiuA+Ex9Masw== 6533 6548 dependencies: 6534 6549 https-proxy-agent "^5.0.0" 6535 6550 node-fetch "^2.6.7" ··· 6537 6552 proxy-from-env "^1.1.0" 6538 6553 which "^2.0.2" 6539 6554 optionalDependencies: 6540 - "@sentry/cli-darwin" "2.42.4" 6541 - "@sentry/cli-linux-arm" "2.42.4" 6542 - "@sentry/cli-linux-arm64" "2.42.4" 6543 - "@sentry/cli-linux-i686" "2.42.4" 6544 - "@sentry/cli-linux-x64" "2.42.4" 6545 - "@sentry/cli-win32-i686" "2.42.4" 6546 - "@sentry/cli-win32-x64" "2.42.4" 6555 + "@sentry/cli-darwin" "2.45.0" 6556 + "@sentry/cli-linux-arm" "2.45.0" 6557 + "@sentry/cli-linux-arm64" "2.45.0" 6558 + "@sentry/cli-linux-i686" "2.45.0" 6559 + "@sentry/cli-linux-x64" "2.45.0" 6560 + "@sentry/cli-win32-arm64" "2.45.0" 6561 + "@sentry/cli-win32-i686" "2.45.0" 6562 + "@sentry/cli-win32-x64" "2.45.0" 6547 6563 6548 6564 "@sentry/core@8.54.0": 6549 6565 version "8.54.0" 6550 6566 resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.54.0.tgz#a2ebec965cadcb6de89e116689feeef79d5862a6" 6551 6567 integrity sha512-03bWf+D1j28unOocY/5FDB6bUHtYlm6m6ollVejhg45ZmK9iPjdtxNWbrLsjT1WRym0Tjzowu+A3p+eebYEv0Q== 6552 6568 6553 - "@sentry/react-native@~6.10.0": 6554 - version "6.10.0" 6555 - resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-6.10.0.tgz#9efafb9b85870bd4c5189763edde30709b9f3213" 6556 - integrity sha512-B56vc+pnFHMiu3cabFb454v4qD0zObW6JVzJ5Gb6fIMdt93AFIJg10ZErzC+ump7xM4BOEROFFRuLiyvadvlPA== 6569 + "@sentry/react-native@~6.14.0": 6570 + version "6.14.0" 6571 + resolved "https://registry.yarnpkg.com/@sentry/react-native/-/react-native-6.14.0.tgz#bc6bdaf03860bb8946f8c30570a9abd82ed6cfc0" 6572 + integrity sha512-BBqixN6oV6tCNp1ABXfzvD531zxj1fUAH0HDPvOR/jX0h9f9pYfxCyI64B+DoQbVZKFsg8nte0QIHkZDhRAW9A== 6557 6573 dependencies: 6558 - "@sentry/babel-plugin-component-annotate" "3.2.2" 6574 + "@sentry/babel-plugin-component-annotate" "3.4.0" 6559 6575 "@sentry/browser" "8.54.0" 6560 - "@sentry/cli" "2.42.4" 6576 + "@sentry/cli" "2.45.0" 6561 6577 "@sentry/core" "8.54.0" 6562 6578 "@sentry/react" "8.54.0" 6563 6579 "@sentry/types" "8.54.0" ··· 8731 8747 react-refresh "^0.14.2" 8732 8748 resolve-from "^5.0.0" 8733 8749 8750 + babel-preset-expo@~13.2.0: 8751 + version "13.2.0" 8752 + resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-13.2.0.tgz#d4540009d07242e3c3d63184b7a34efda95e8e64" 8753 + integrity sha512-oNUeUZPMNRPmx/2jaKJLSQFP/MFI1M91vP+Gp+j8/FPl9p/ps603DNwCaRdcT/Vj3FfREdlIwRio1qDCjY0oAA== 8754 + dependencies: 8755 + "@babel/helper-module-imports" "^7.25.9" 8756 + "@babel/plugin-proposal-decorators" "^7.12.9" 8757 + "@babel/plugin-proposal-export-default-from" "^7.24.7" 8758 + "@babel/plugin-syntax-export-default-from" "^7.24.7" 8759 + "@babel/plugin-transform-export-namespace-from" "^7.25.9" 8760 + "@babel/plugin-transform-flow-strip-types" "^7.25.2" 8761 + "@babel/plugin-transform-modules-commonjs" "^7.24.8" 8762 + "@babel/plugin-transform-object-rest-spread" "^7.24.7" 8763 + "@babel/plugin-transform-parameters" "^7.24.7" 8764 + "@babel/plugin-transform-private-methods" "^7.24.7" 8765 + "@babel/plugin-transform-private-property-in-object" "^7.24.7" 8766 + "@babel/plugin-transform-runtime" "^7.24.7" 8767 + "@babel/preset-react" "^7.22.15" 8768 + "@babel/preset-typescript" "^7.23.0" 8769 + "@react-native/babel-preset" "0.79.3" 8770 + babel-plugin-react-native-web "~0.19.13" 8771 + babel-plugin-syntax-hermes-parser "^0.25.1" 8772 + babel-plugin-transform-flow-enums "^0.0.2" 8773 + debug "^4.3.4" 8774 + react-refresh "^0.14.2" 8775 + resolve-from "^5.0.0" 8776 + 8734 8777 babel-preset-jest@^29.6.3: 8735 8778 version "29.6.3" 8736 8779 resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" ··· 8748 8791 version "1.0.2" 8749 8792 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 8750 8793 integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 8751 - 8752 - base-64@0.1.0: 8753 - version "0.1.0" 8754 - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" 8755 - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== 8756 8794 8757 8795 base64-arraybuffer@^1.0.2: 8758 8796 version "1.0.2" ··· 8960 8998 node-releases "^2.0.18" 8961 8999 update-browserslist-db "^1.1.1" 8962 9000 9001 + browserslist@^4.25.0: 9002 + version "4.25.0" 9003 + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" 9004 + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== 9005 + dependencies: 9006 + caniuse-lite "^1.0.30001718" 9007 + electron-to-chromium "^1.5.160" 9008 + node-releases "^2.0.19" 9009 + update-browserslist-db "^1.1.3" 9010 + 8963 9011 bser@2.1.1: 8964 9012 version "2.1.1" 8965 9013 resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" ··· 9101 9149 version "1.0.30001697" 9102 9150 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001697.tgz" 9103 9151 integrity sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ== 9152 + 9153 + caniuse-lite@^1.0.30001718: 9154 + version "1.0.30001722" 9155 + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001722.tgz#ec25a2b3085b25b9079b623db83c22a70882ce85" 9156 + integrity sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA== 9104 9157 9105 9158 cbor-extract@^2.1.1: 9106 9159 version "2.1.1" ··· 10340 10393 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.777.tgz#f846fbba23fd11b3c6f97848cdda94896fdb8baf" 10341 10394 integrity sha512-n02NCwLJ3wexLfK/yQeqfywCblZqLcXphzmid5e8yVPdtEcida7li0A5WQKghHNG0FeOMCzeFOzEbtAh5riXFw== 10342 10395 10396 + electron-to-chromium@^1.5.160: 10397 + version "1.5.166" 10398 + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz#3fff386ed473cc2169dbe2d3ace9592262601114" 10399 + integrity sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw== 10400 + 10343 10401 electron-to-chromium@^1.5.41: 10344 10402 version "1.5.51" 10345 10403 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.51.tgz#bb99216fed4892d131a8585a8593b00739310163" ··· 11146 11204 resolved "https://registry.yarnpkg.com/expo-application/-/expo-application-6.1.4.tgz#34ee2f7a86e3689f15961b296e82934e0f85afd6" 11147 11205 integrity sha512-jXVZb3llTQ5j4C/I03GxKjujmhKex9Xo5JDZo/pRjScHSr4NoeMjPKWThyWVlWDM1v5YSEcsRJebVfTvq9SR5Q== 11148 11206 11149 - expo-asset@~11.1.4: 11150 - version "11.1.4" 11151 - resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-11.1.4.tgz#0258156f76c306521eb2a0d27e98d26258d12ad9" 11152 - integrity sha512-e3210sF0YHKRTCjVUOVmDAJ0Dk4vepL9RocKe36S7S+VthoCZwsBGLAM2LLvBa1SdmODF92AS0Nrcfi/1/VlbQ== 11207 + expo-asset@~11.1.5: 11208 + version "11.1.5" 11209 + resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-11.1.5.tgz#5cad3d781c9d0edec31b9b3adbba574eb4d5dd3e" 11210 + integrity sha512-GEQDCqC25uDBoXHEnXeBuwpeXvI+3fRGvtzwwt0ZKKzWaN+TgeF8H7c76p3Zi4DfBMFDcduM0CmOvJX+yCCLUQ== 11153 11211 dependencies: 11154 11212 "@expo/image-utils" "^0.7.4" 11155 - expo-constants "~17.1.4" 11213 + expo-constants "~17.1.5" 11156 11214 11157 - expo-blur@~14.1.4: 11158 - version "14.1.4" 11159 - resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.1.4.tgz#d246c0a224ce63321d022edfc0e6a8c5fa2cc865" 11160 - integrity sha512-55P9tK/RjJZEcu2tU7BqX3wmIOrGMOOkmHztJMMws+ZGHzvtjnPmT7dsQxhOU9vPj77oHnKetYHU2sik3iBcCw== 11215 + expo-blur@~14.1.5: 11216 + version "14.1.5" 11217 + resolved "https://registry.yarnpkg.com/expo-blur/-/expo-blur-14.1.5.tgz#910712389e19286ccdc136275bf569f427aa05ef" 11218 + integrity sha512-CCLJHxN4eoAl06ESKT3CbMasJ98WsjF9ZQEJnuxtDb9ffrYbZ+g9ru84fukjNUOTtc8A8yXE5z8NgY1l0OMrmQ== 11161 11219 11162 11220 expo-build-properties@~0.14.6: 11163 11221 version "0.14.6" ··· 11167 11225 ajv "^8.11.0" 11168 11226 semver "^7.6.0" 11169 11227 11170 - expo-camera@~16.1.6: 11171 - version "16.1.6" 11172 - resolved "https://registry.yarnpkg.com/expo-camera/-/expo-camera-16.1.6.tgz#9badbc3b93cab3386e3e70721d4f3c1983ab539c" 11173 - integrity sha512-caVSfoTUaayYhH5gicrXWCgBQIVrotPOH3jUDr4vhN5VQDB/+TWaY+le2nQtNXgQEz14Af+H/TNvYpvvNj5Ktg== 11228 + expo-camera@~16.1.8: 11229 + version "16.1.8" 11230 + resolved "https://registry.yarnpkg.com/expo-camera/-/expo-camera-16.1.8.tgz#6c30dfb5c982795351f1053c36f048a11869e21b" 11231 + integrity sha512-NpBbkUhHG6cs2TNUQBFSEtXb5j1/kTPIhiuqBcHosZG2yb/8MuM/ii4McJaqfe/6pn0YPqkH4k0Uod11DOSLmw== 11174 11232 dependencies: 11175 11233 invariant "^2.2.4" 11176 11234 ··· 11179 11237 resolved "https://registry.yarnpkg.com/expo-clipboard/-/expo-clipboard-7.1.4.tgz#f2cda0d3cbfd2d307aa85dd7ba6843d6bbaf4227" 11180 11238 integrity sha512-NHhfKnrzb4o0PacUKD93ByadU0JmPBoFTFYbbFJZ9OAX6SImpSqG5gfrMUR3vVj4Qx9f1LpMcdAv5lBzv868ow== 11181 11239 11182 - expo-constants@17.0.3, expo-constants@^13.0.2, expo-constants@~17.1.4, expo-constants@~17.1.5: 11240 + expo-constants@17.0.3, expo-constants@^13.0.2, expo-constants@~17.1.5, expo-constants@~17.1.6: 11183 11241 version "17.0.3" 11184 11242 resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-17.0.3.tgz#a05b38e0417d59759ece1642b4d483889e04dbda" 11185 11243 integrity sha512-lnbcX2sAu8SucHXEXxSkhiEpqH+jGrf+TF+MO6sHWIESjwOUVVYlT8qYdjR9xbxWmqFtrI4KV44FkeJf2DaFjQ== ··· 11187 11245 "@expo/config" "~10.0.4" 11188 11246 "@expo/env" "~0.4.0" 11189 11247 11190 - expo-dev-client@~5.1.7: 11191 - version "5.1.7" 11192 - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-5.1.7.tgz#b75d5c4650a2b19e8d5c4666a798a4150a7fbd68" 11193 - integrity sha512-/xcwNIeZIBA/y6Io7jv1ZbEG8XRUuAynIJyIGJvpMxf6hm7eEw8rEzhO9rZNk6H8bMjTjASs0Vf1bqIV6v3j6A== 11248 + expo-dev-client@~5.2.0: 11249 + version "5.2.0" 11250 + resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-5.2.0.tgz#a3d4f8c79fafe747ea8d0bfc6e3918b02011025c" 11251 + integrity sha512-7GgO3BGlFM016Zkp3c9bUbi35pubqKh8Z/iHC1arIvckEjDrLER+92zfUTFr49XLk2o64arItRPJyQL49pA/hg== 11194 11252 dependencies: 11195 - expo-dev-launcher "5.1.10" 11196 - expo-dev-menu "6.1.9" 11253 + expo-dev-launcher "5.1.12" 11254 + expo-dev-menu "6.1.11" 11197 11255 expo-dev-menu-interface "1.10.0" 11198 - expo-manifests "~0.16.4" 11256 + expo-manifests "~0.16.5" 11199 11257 expo-updates-interface "~1.1.0" 11200 11258 11201 - expo-dev-launcher@5.1.10: 11202 - version "5.1.10" 11203 - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-5.1.10.tgz#eaa8a7a4edcab557e6623f176e60d964606651ff" 11204 - integrity sha512-OW4k0efB6cWigYj1GlJGObMuMpg6DIwsAZkECsGqNU3U80zE7pBMPB0sy1xehFuTplO6F+dCTLg0hPPuqkSsTg== 11259 + expo-dev-launcher@5.1.12: 11260 + version "5.1.12" 11261 + resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-5.1.12.tgz#cad239327e258d84c4221a212ecd30a051f9097d" 11262 + integrity sha512-ALedYerjJtSiPa95l41zMAO/m1m1kgS39i2H0io+6Ix4OksYNhILNzMNB1qDht/oWt2yjLBvXfWULfs5+3vnaA== 11205 11263 dependencies: 11206 11264 ajv "8.11.0" 11207 - expo-dev-menu "6.1.8" 11208 - expo-manifests "~0.16.4" 11265 + expo-dev-menu "6.1.11" 11266 + expo-manifests "~0.16.5" 11209 11267 resolve-from "^5.0.0" 11210 11268 11211 11269 expo-dev-menu-interface@1.10.0: ··· 11213 11271 resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.10.0.tgz#04671bda3c163d1d7b9438ce7095c3913a3f53f9" 11214 11272 integrity sha512-NxtM/qot5Rh2cY333iOE87dDg1S8CibW+Wu4WdLua3UMjy81pXYzAGCZGNOeY7k9GpNFqDPNDXWyBSlk9r2pBg== 11215 11273 11216 - expo-dev-menu@6.1.8: 11217 - version "6.1.8" 11218 - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-6.1.8.tgz#cec53379b76f5cb53e2e87a8c62555610a26e6bb" 11219 - integrity sha512-i8DW1OXvj4yxQuPP8p2AMGoYdnyhfTkoqWI/AiDYReh2viZv4kZlRloGAemV2bIQwswMq2GsvZehYrQPEK9QBw== 11220 - dependencies: 11221 - expo-dev-menu-interface "1.10.0" 11222 - 11223 - expo-dev-menu@6.1.9: 11224 - version "6.1.9" 11225 - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-6.1.9.tgz#897dcb4c49aed9c1f871b13e1359079f23981050" 11226 - integrity sha512-Uz02Bsc1xsYzjW4Ld+PxWLRNkbsoJYSbQtw/pZDSrJk5Hj869M4KQSOI8JpZ7WVlKEKkIRA8kBLepjhdFhq+Dg== 11274 + expo-dev-menu@6.1.11: 11275 + version "6.1.11" 11276 + resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-6.1.11.tgz#829118326bcd618aec3941cfbb5b32fd3dd72379" 11277 + integrity sha512-yrlDXGcqlbQX3Pgw/iPLRea7+pHFC17MdtkNaXYQ5K5u64mn9l4KZ2ZYUeQ8cKDG5l8ZdC4F9R9vfCJYFi82AA== 11227 11278 dependencies: 11228 11279 expo-dev-menu-interface "1.10.0" 11229 11280 11230 - expo-device@7.0.1, expo-device@~4.1.1: 11231 - version "7.0.1" 11232 - resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-7.0.1.tgz#3702fe8b4475eac63ed27f9d580ec8a78546e0d1" 11233 - integrity sha512-/3lk0f9wvle+6svHqWSCBC1B5NYFmXp1D7hmIyecJJVYRLwzrwwTDyNs76oG/UDU5Appdu8QyDKycsx2hqv71w== 11234 - dependencies: 11235 - ua-parser-js "^0.7.33" 11236 - 11237 - expo-device@~7.1.4: 11281 + expo-device@7.1.4, expo-device@~4.1.1, expo-device@~7.1.4: 11238 11282 version "7.1.4" 11239 11283 resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-7.1.4.tgz#84ae7c2520cc45f15a9cb0433ae1226c33f7a8ef" 11240 11284 integrity sha512-HS04IiE1Fy0FRjBLurr9e5A6yj3kbmQB+2jCZvbSGpsjBnCLdSk/LCii4f5VFhPIBWJLyYuN5QqJyEAw6BcS4Q== ··· 11246 11290 resolved "https://registry.yarnpkg.com/expo-eas-client/-/expo-eas-client-0.14.3.tgz#3fc22378cc454953ecba88f70c16c20a74e0aa27" 11247 11291 integrity sha512-BW2mSNEjFRFC8/CbkMQ3mfVhBdeZIjZhNfncw7PP80xEptLWhVjGTqwG8Usi0/yPpIu/YNYgop+XGMfhXyh9uA== 11248 11292 11249 - expo-file-system@~18.1.8: 11250 - version "18.1.8" 11251 - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.1.8.tgz#caa0831b9826f568be36deb25aed835978e957b3" 11252 - integrity sha512-1HXpunpRMGnoIw0+f2urjUNaePAvac1X9wIwVRsGJTw7A2WHBFATRuFB7jUOhZac/qK1MDm0GZsggzoRi1oteQ== 11293 + expo-file-system@~18.1.10: 11294 + version "18.1.10" 11295 + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.1.10.tgz#22f3bcc2c9a7edcd6bba5ece3c90a8467fda47be" 11296 + integrity sha512-SyaWg+HitScLuyEeSG9gMSDT0hIxbM9jiZjSBP9l9zMnwZjmQwsusE6+7qGiddxJzdOhTP4YGUfvEzeeS0YL3Q== 11253 11297 11254 - expo-font@~13.3.0: 11255 - version "13.3.0" 11256 - resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-13.3.0.tgz#139e6e1024e414afe1180ffed0add98aa8c8950b" 11257 - integrity sha512-TdbHoxCfLWN9Uvnqsrcak+5EkDCbNIWfgtNWx3JZ6sD9WYB7gvbS+Eu5YlZ85NvCOSJ9Khmw4mFQxEi2LUPZfQ== 11298 + expo-font@~13.3.1: 11299 + version "13.3.1" 11300 + resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-13.3.1.tgz#ed69ae14f263a4c447efb2615b60d9e045372e68" 11301 + integrity sha512-d+xrHYvSM9WB42wj8vP9OOFWyxed5R1evphfDb6zYBmC1dA9Hf89FpT7TNFtj2Bk3clTnpmVqQTCYbbA2P3CLg== 11258 11302 dependencies: 11259 11303 fontfaceobserver "^2.1.0" 11260 11304 ··· 11273 11317 resolved "https://registry.yarnpkg.com/expo-image-loader/-/expo-image-loader-5.1.0.tgz#f7d65f9b9a9714eaaf5d50a406cb34cb25262153" 11274 11318 integrity sha512-sEBx3zDQIODWbB5JwzE7ZL5FJD+DK3LVLWBVJy6VzsqIA6nDEnSFnsnWyCfCTSvbGigMATs1lgkC2nz3Jpve1Q== 11275 11319 11276 - expo-image-manipulator@~13.1.5: 11277 - version "13.1.5" 11278 - resolved "https://registry.yarnpkg.com/expo-image-manipulator/-/expo-image-manipulator-13.1.5.tgz#d657dceeb8ce8da9345a1903f1327b0fedfd08c1" 11279 - integrity sha512-V9cGJp0zVwAvAyL3w9JsLH8UEQjQZfFmwJM1l9/oXjlDrSDynQrPFwJq4VI8dCOJ+/nhYZK37yytFNG14Sqt4Q== 11320 + expo-image-manipulator@~13.1.7: 11321 + version "13.1.7" 11322 + resolved "https://registry.yarnpkg.com/expo-image-manipulator/-/expo-image-manipulator-13.1.7.tgz#e891ce9b49d75962eafdf5b7d670116583379e76" 11323 + integrity sha512-DBy/Xdd0E/yFind14x36XmwfWuUxOHI/oH97/giKjjPaRc2dlyjQ3tuW3x699hX6gAs9Sixj5WEJ1qNf3c8sag== 11280 11324 dependencies: 11281 11325 expo-image-loader "~5.1.0" 11282 11326 ··· 11287 11331 dependencies: 11288 11332 expo-image-loader "~5.1.0" 11289 11333 11290 - expo-image@~2.1.6: 11291 - version "2.1.6" 11292 - resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-2.1.6.tgz#f046fa631768e37326cc14c49de9113ceffa9e8b" 11293 - integrity sha512-AFQxeAI1iTXFZ4dMxUB+SOACGMQxEk+t7PvT3j4mrvffRFoOLfHZ4uJc8SAdDFJak7ByqKhCIPIEhL+1Deq4Sg== 11334 + expo-image@~2.2.1: 11335 + version "2.2.1" 11336 + resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-2.2.1.tgz#b4aa706a25f7e8902ac854a8da249caf4a90cd67" 11337 + integrity sha512-5ZSggMi0X2G9AN0aM+sdkCyyZ6YcWvGs9KYLYrRBVUN3ph6RBiu6mKGpaNN1TAscySRnH1eHbUE1H+Qeq7qm1g== 11294 11338 11295 11339 expo-json-utils@~0.15.0: 11296 11340 version "0.15.0" ··· 11302 11346 resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-14.1.4.tgz#80197728563e0e17523e5a606fbd6fbed9639503" 11303 11347 integrity sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA== 11304 11348 11305 - expo-linear-gradient@~14.1.4: 11306 - version "14.1.4" 11307 - resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-14.1.4.tgz#fcb2b586cfd21dd5f3076de467f92b55d9c47cb2" 11308 - integrity sha512-bImj2qqIjnl+VHYGnIwan9LxmGvb8e4hFqHpxsPzUiK7Ady7uERrXPhJcyTKTxRf4RL2sQRDpoOKzBYNdQDmuw== 11349 + expo-linear-gradient@~14.1.5: 11350 + version "14.1.5" 11351 + resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-14.1.5.tgz#414bf0c8145089087198d4dd5a419eb324af2a02" 11352 + integrity sha512-BSN3MkSGLZoHMduEnAgfhoj3xqcDWaoICgIr4cIYEx1GcHfKMhzA/O4mpZJ/WC27BP1rnAqoKfbclk1eA70ndQ== 11309 11353 11310 - expo-linking@~7.1.4: 11311 - version "7.1.4" 11312 - resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-7.1.4.tgz#7d398d99788d8d95b67d1ae463d24686cbeb1c1b" 11313 - integrity sha512-zLAbUzTB3+KGjqqLeIdhhkXayyN0qulHGjRI24X7W/0Mq/4oPbPZklKtCP0k7XOn/k4553m8OgJ7GPC03PlV9g== 11354 + expo-linking@~7.1.5: 11355 + version "7.1.5" 11356 + resolved "https://registry.yarnpkg.com/expo-linking/-/expo-linking-7.1.5.tgz#99633892712d5442ddb1c6c3857346eb7a67119b" 11357 + integrity sha512-8g20zOpROW78bF+bLI4a3ZWj4ntLgM0rCewKycPL0jk9WGvBrBtFtwwADJgOiV1EurNp3lcquerXGlWS+SOQyA== 11314 11358 dependencies: 11315 - expo-constants "~17.1.4" 11359 + expo-constants "~17.1.6" 11316 11360 invariant "^2.2.4" 11317 11361 11318 11362 expo-localization@~16.1.5: ··· 11322 11366 dependencies: 11323 11367 rtl-detect "^1.0.2" 11324 11368 11325 - expo-manifests@~0.16.4: 11326 - version "0.16.4" 11327 - resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.16.4.tgz#d1a648bab0068a2712cf49009a5f26377a585849" 11328 - integrity sha512-zB6ohgnsNbJDaLI/KRZQXxEHadhMJt+gA4LCqbiZQNa3P4FJq4JFRXPV6QQjgjJ998g9vY7eDCTduxTJYBqUaA== 11369 + expo-manifests@~0.16.5: 11370 + version "0.16.5" 11371 + resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.16.5.tgz#bb57ceff3db4eb74679d4a155b2ca2050375ce10" 11372 + integrity sha512-zLUeJogn2C7qOE75Zz7jcmJorMfIbSRR35ctspN0OK/Hq/+PAAptA8p9jNVC8xp/91uP9uI8f3xPhh+A11eR2A== 11329 11373 dependencies: 11330 - "@expo/config" "~11.0.6" 11374 + "@expo/config" "~11.0.10" 11331 11375 expo-json-utils "~0.15.0" 11332 11376 11333 - expo-media-library@~17.1.6: 11334 - version "17.1.6" 11335 - resolved "https://registry.yarnpkg.com/expo-media-library/-/expo-media-library-17.1.6.tgz#118ada2d28139d540861b338acf1d088bc03d51f" 11336 - integrity sha512-Py8Y9wJlNXBZkhtJYy9acj0oRoUV09WXsZnjcvy6xZjpniPQIq0wkIkgS2DLhlYmMdjBrSux2TGp7Omi2WHp1g== 11377 + expo-media-library@~17.1.7: 11378 + version "17.1.7" 11379 + resolved "https://registry.yarnpkg.com/expo-media-library/-/expo-media-library-17.1.7.tgz#71ed3d2d246d33410d6aecc335098a23519bd890" 11380 + integrity sha512-hLCoMvlhjtt+iYxPe71P1F6t06mYGysuNOfjQzDbbf64PCkglCZJYmywPyUSV1V5Hu9DhRj//gEg+Ki+7VWXog== 11337 11381 11338 - expo-modules-autolinking@2.1.9: 11339 - version "2.1.9" 11340 - resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-2.1.9.tgz#7bf8338d4b7a1b6e8eccab51634de9b339e90c04" 11341 - integrity sha512-54InfnWy1BR54IDZoawqdFAaF2lyLHe9J+2dZ7y91/36jVpBtAval39ZKt2IISFJZ7TVglsojl4P5BDcDGcvjQ== 11382 + expo-modules-autolinking@2.1.11: 11383 + version "2.1.11" 11384 + resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-2.1.11.tgz#efc2e756ccc8b9e0b927596ba074aefe31b5cbe4" 11385 + integrity sha512-KrWQo+cE4gWYNePBBhmHGVzf63gYV19ZLXe9EIH3GHTkViVzIX+Lp618H/7GxfawpN5kbhvilATH1QEKKnUUww== 11342 11386 dependencies: 11343 11387 "@expo/spawn-async" "^1.7.2" 11344 11388 chalk "^4.1.0" ··· 11348 11392 require-from-string "^2.0.2" 11349 11393 resolve-from "^5.0.0" 11350 11394 11351 - expo-modules-core@2.3.12: 11352 - version "2.3.12" 11353 - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-2.3.12.tgz#1c06402564c02b32f192adfe6946e671d8a95e79" 11354 - integrity sha512-bOm83mskw1S7xuDX50DlLdx68u0doQ6BZHSU2qTv8P1/5QYeAae3pCgFLq2hoptUNeMF7W+68ShJFTOHAe68BQ== 11395 + expo-modules-core@2.4.0: 11396 + version "2.4.0" 11397 + resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-2.4.0.tgz#3081d62fadff913090cc5abfe46d9ec6b0e75789" 11398 + integrity sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg== 11355 11399 dependencies: 11356 11400 invariant "^2.2.4" 11357 11401 ··· 11362 11406 dependencies: 11363 11407 invariant "^2.2.4" 11364 11408 11365 - expo-notifications@~0.31.1: 11366 - version "0.31.1" 11367 - resolved "https://registry.yarnpkg.com/expo-notifications/-/expo-notifications-0.31.1.tgz#3be669ab78c6099d82f4fc3607f77f7d9e1805b6" 11368 - integrity sha512-g1CMi+3wUaMuX+tAU+Fhnfs5bJtJ3JVRXihO415aOInQkox+Mh79n38RlT6snLWCHjfSojQIxmydzUHt6ywTIQ== 11409 + expo-notifications@~0.31.3: 11410 + version "0.31.3" 11411 + resolved "https://registry.yarnpkg.com/expo-notifications/-/expo-notifications-0.31.3.tgz#eb82c9975e26dcc4fa694b79970792c897ad8d16" 11412 + integrity sha512-AATxKoav5ZvwcRel2SKYNZc+EvOAKvAjxyBezC8y3J5fMNe/uKIhMzh3FN4fKdOi9ao/UBHkvLiUO2MqVnvBNg== 11369 11413 dependencies: 11370 11414 "@expo/image-utils" "^0.7.4" 11371 11415 "@ide/backoff" "^1.0.0" ··· 11373 11417 assert "^2.0.0" 11374 11418 badgin "^1.1.5" 11375 11419 expo-application "~6.1.4" 11376 - expo-constants "~17.1.4" 11420 + expo-constants "~17.1.6" 11377 11421 11378 11422 expo-pwa@0.0.127: 11379 11423 version "0.0.127" ··· 11385 11429 commander "2.20.0" 11386 11430 update-check "1.5.3" 11387 11431 11388 - expo-screen-orientation@~8.1.5: 11389 - version "8.1.5" 11390 - resolved "https://registry.yarnpkg.com/expo-screen-orientation/-/expo-screen-orientation-8.1.5.tgz#447c19b8ad59d1d2cf0894900ee273836367ca0d" 11391 - integrity sha512-t2ss7a52f1VNrugmIYj1wlnGICUgrkqu2+J3Csew8ixczI8s6r6EXT4E4EeyQ/9WvcEUOOyh8TWC9EbbswPhUw== 11432 + expo-screen-orientation@~8.1.7: 11433 + version "8.1.7" 11434 + resolved "https://registry.yarnpkg.com/expo-screen-orientation/-/expo-screen-orientation-8.1.7.tgz#3751b441f2bfcbde798b1508c0ff9f099f4be911" 11435 + integrity sha512-nYwadYtdU6mMDk0MCHMPPPQtBoeFYJ2FspLRW+J35CMLqzE4nbpwGeiImfXzkvD94fpOCfI4KgLj5vGauC3pfA== 11392 11436 11393 11437 expo-sharing@~13.1.5: 11394 11438 version "13.1.5" 11395 11439 resolved "https://registry.yarnpkg.com/expo-sharing/-/expo-sharing-13.1.5.tgz#73d86cdcc037b46ddc82be224dfd3d6bceec497c" 11396 11440 integrity sha512-X/5sAEiWXL2kdoGE3NO5KmbfcmaCWuWVZXHu8OQef7Yig4ZgHFkGD11HKJ5KqDrDg+SRZe4ISd6MxE7vGUgm4w== 11397 11441 11398 - expo-splash-screen@~0.30.8: 11399 - version "0.30.8" 11400 - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.30.8.tgz#2e960ccff053bc8ace85eb56f7d6745e4ddfc6b6" 11401 - integrity sha512-2eh+uA543brfeG5HILXmtNKA7E2/pfywKzNumzy3Ef6OtDjYy6zJUGNSbhnZRbVEjUZo3/QNRs0JRBfY80okZg== 11442 + expo-splash-screen@~0.30.9: 11443 + version "0.30.9" 11444 + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.30.9.tgz#8f2a86b3b802ea46065fc761ed60e77e81bdb84c" 11445 + integrity sha512-curHUaZxUTZ2dWvz32ao3xPv5mJr1LBqn5V8xm/IULAehB9RGCn8iKiROMN1PYebSG+56vPMuJmBm9P+ayvJpA== 11402 11446 dependencies: 11403 - "@expo/prebuild-config" "^9.0.5" 11447 + "@expo/prebuild-config" "^9.0.6" 11404 11448 11405 11449 expo-structured-headers@~4.1.0: 11406 11450 version "4.1.0" 11407 11451 resolved "https://registry.yarnpkg.com/expo-structured-headers/-/expo-structured-headers-4.1.0.tgz#5475fc3f9559701cc755fd2d50605f8817d42ad0" 11408 11452 integrity sha512-2X+aUNzC/qaw7/WyUhrVHNDB0uQ5rE12XA2H/rJXaAiYQSuOeU90ladaN0IJYV9I2XlhYrjXLktLXWbO7zgbag== 11409 11453 11410 - expo-system-ui@~5.0.7: 11411 - version "5.0.7" 11412 - resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-5.0.7.tgz#ccf047a689ab488d9bcda375afd063419578f494" 11413 - integrity sha512-ijSnSFA4VfuQc84N6WyCUNsKKTIyQb6QuC8q2zGvYC/sBXTMrOtZg0zrisQGzCRW+WhritQTiVqHlp3Ix9xDmQ== 11454 + expo-system-ui@~5.0.8: 11455 + version "5.0.8" 11456 + resolved "https://registry.yarnpkg.com/expo-system-ui/-/expo-system-ui-5.0.8.tgz#1eaaa95cfa8b5e20750e5fb30918635a58276199" 11457 + integrity sha512-2sI7ALq3W8sKKa3FRW7PmuNznk+48cb1VzFy96vYZLZgTDZViz+fEJNdp1RHgLui/mAl3f8md1LneygSJvZ1EQ== 11414 11458 dependencies: 11415 - "@react-native/normalize-colors" "0.79.2" 11459 + "@react-native/normalize-colors" "0.79.3" 11416 11460 debug "^4.3.2" 11417 11461 11418 11462 expo-task-manager@~13.1.5: ··· 11427 11471 resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-1.1.0.tgz#62497d4647b381da9fdb68868ed180203ae737ef" 11428 11472 integrity sha512-DeB+fRe0hUDPZhpJ4X4bFMAItatFBUPjw/TVSbJsaf3Exeami+2qbbJhWkcTMoYHOB73nOIcaYcWXYJnCJXO0w== 11429 11473 11430 - expo-updates@~0.28.12: 11431 - version "0.28.12" 11432 - resolved "https://registry.yarnpkg.com/expo-updates/-/expo-updates-0.28.12.tgz#abf6e0c593837b20af64feee31aa018e1a85b332" 11433 - integrity sha512-GUQNI7apaQa8mVLGyeUQZsSaY75lq3yIp2OO+gX0BZIeD5hr8ADZ0Gw2+9+uRSB70B7AWQklUCMBxvOsA2DVfg== 11474 + expo-updates@~0.28.14: 11475 + version "0.28.14" 11476 + resolved "https://registry.yarnpkg.com/expo-updates/-/expo-updates-0.28.14.tgz#bc75b00c0744fec33ba36f8c96e7c86ed0d3c7f6" 11477 + integrity sha512-kxI428W7LGSdDWmN/ud5cIg8+SjmQ5XSaUrYauZ0DKsHm2qq1Lh+NYSUWLvYmps+Baalafe6mILmAX8ZnNg26Q== 11434 11478 dependencies: 11435 11479 "@expo/code-signing-certificates" "0.0.5" 11436 - "@expo/config" "~11.0.7" 11480 + "@expo/config" "~11.0.10" 11437 11481 "@expo/config-plugins" "~10.0.2" 11438 11482 "@expo/spawn-async" "^1.7.2" 11439 11483 arg "4.1.0" 11440 11484 chalk "^4.1.2" 11441 11485 expo-eas-client "~0.14.3" 11442 - expo-manifests "~0.16.4" 11486 + expo-manifests "~0.16.5" 11443 11487 expo-structured-headers "~4.1.0" 11444 11488 expo-updates-interface "~1.1.0" 11445 11489 glob "^10.4.2" 11446 11490 ignore "^5.3.1" 11447 11491 resolve-from "^5.0.0" 11448 11492 11449 - expo-video@~2.1.8: 11450 - version "2.1.8" 11451 - resolved "https://registry.yarnpkg.com/expo-video/-/expo-video-2.1.8.tgz#507305ae2ea18f435a51ababd6b2dec21291d328" 11452 - integrity sha512-OEToLVEGLvfTq7ypjgOf1DUNGHLGxUiL/1K6WHwdew5tgFxiLBZesGQhKToyrSVPVmWaxMBSP4sQuwtTjWUpHg== 11493 + expo-video@~2.2.1: 11494 + version "2.2.1" 11495 + resolved "https://registry.yarnpkg.com/expo-video/-/expo-video-2.2.1.tgz#d45357ee7a7da5a87c49177587183d1c7feabc57" 11496 + integrity sha512-dw3h0eMLK8WpY1Tnwsgrxx3sFqXiOujmurjGdr+RFG63ZurAze/H9uuKMVl3ps/ZNuK4q/2ifIiJudoFJfwKwA== 11453 11497 11454 11498 expo-web-browser@~14.1.6: 11455 11499 version "14.1.6" 11456 11500 resolved "https://registry.yarnpkg.com/expo-web-browser/-/expo-web-browser-14.1.6.tgz#26d66e641e6e96d155be6fa513e7e667a719a0b0" 11457 11501 integrity sha512-/4P8eWqRyfXIMZna3acg320LXNA+P2cwyEVbjDX8vHnWU+UnOtyRKWy3XaAIyMPQ9hVjBNUQTh4MPvtnPRzakw== 11458 11502 11459 - expo@^53.0.5: 11460 - version "53.0.5" 11461 - resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.5.tgz#f8c30643c4e45d769934415ea9196531612cb657" 11462 - integrity sha512-A9nh7ojGcdsv05TCH39q/7RRQsTfgcQ3qD2CFzlADVW8jIIFNiIg80shE8DQiXHkeCKWT78Iy7iog2yIu4sq3Q== 11503 + expo@53.0.11: 11504 + version "53.0.11" 11505 + resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.11.tgz#66053862520ce2a6700d13346ebaf8210a68f24b" 11506 + integrity sha512-+QtvU+6VPd7/o4vmtwuRE/Li2rAiJtD25I6BOnoQSxphaWWaD0PdRQnIV3VQ0HESuJYRuKJ3DkAHNJ3jI6xwzA== 11463 11507 dependencies: 11464 11508 "@babel/runtime" "^7.20.0" 11465 - "@expo/cli" "0.24.10" 11466 - "@expo/config" "~11.0.7" 11509 + "@expo/cli" "0.24.14" 11510 + "@expo/config" "~11.0.10" 11467 11511 "@expo/config-plugins" "~10.0.2" 11468 - "@expo/fingerprint" "0.12.4" 11469 - "@expo/metro-config" "0.20.12" 11512 + "@expo/fingerprint" "0.13.0" 11513 + "@expo/metro-config" "0.20.14" 11470 11514 "@expo/vector-icons" "^14.0.0" 11471 - babel-preset-expo "~13.1.11" 11472 - expo-asset "~11.1.4" 11473 - expo-constants "~17.1.5" 11474 - expo-file-system "~18.1.8" 11475 - expo-font "~13.3.0" 11515 + babel-preset-expo "~13.2.0" 11516 + expo-asset "~11.1.5" 11517 + expo-constants "~17.1.6" 11518 + expo-file-system "~18.1.10" 11519 + expo-font "~13.3.1" 11476 11520 expo-keep-awake "~14.1.4" 11477 - expo-modules-autolinking "2.1.9" 11478 - expo-modules-core "2.3.12" 11521 + expo-modules-autolinking "2.1.11" 11522 + expo-modules-core "2.4.0" 11479 11523 react-native-edge-to-edge "1.6.0" 11480 11524 whatwg-url-without-unicode "8.0.0-3" 11481 11525 ··· 12055 12099 resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" 12056 12100 integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== 12057 12101 12102 + getenv@^2.0.0: 12103 + version "2.0.0" 12104 + resolved "https://registry.yarnpkg.com/getenv/-/getenv-2.0.0.tgz#b1698c7b0f29588f4577d06c42c73a5b475c69e0" 12105 + integrity sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ== 12106 + 12058 12107 github-from-package@0.0.0: 12059 12108 version "0.0.0" 12060 12109 resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" ··· 12078 12127 version "0.4.1" 12079 12128 resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 12080 12129 integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 12081 - 12082 - glob@7.0.6: 12083 - version "7.0.6" 12084 - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" 12085 - integrity sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q== 12086 - dependencies: 12087 - fs.realpath "^1.0.0" 12088 - inflight "^1.0.4" 12089 - inherits "2" 12090 - minimatch "^3.0.2" 12091 - once "^1.3.0" 12092 - path-is-absolute "^1.0.0" 12093 12130 12094 12131 glob@^10.3.10: 12095 12132 version "10.3.12" ··· 13469 13506 jest-mock "^29.7.0" 13470 13507 jest-util "^29.7.0" 13471 13508 13472 - jest-expo@~53.0.3: 13473 - version "53.0.3" 13474 - resolved "https://registry.yarnpkg.com/jest-expo/-/jest-expo-53.0.3.tgz#094da673d5b7953565c4cc6c41af4337465ddfc9" 13475 - integrity sha512-aOJyy/i0wPAWrQpSVNTTFWjcNTbUE/0eXr2cpdM3WW57K3EB1sueuKj8j2tWlzeKz4bk3+DVRy8K44V/XMoy3Q== 13509 + jest-expo@~53.0.7: 13510 + version "53.0.7" 13511 + resolved "https://registry.yarnpkg.com/jest-expo/-/jest-expo-53.0.7.tgz#ab1c288940dcdf470c25b7b18e2ed99f03d26bc6" 13512 + integrity sha512-Uiu3ES0sWbsxpifQuBzXMI1/N9JygfJfwEby/Qw/OPndIQ1YeeIQqkbP52xn6UhdSM4qYQiteX3EjY8TfrZIoA== 13476 13513 dependencies: 13477 - "@expo/config" "~11.0.7" 13514 + "@expo/config" "~11.0.10" 13478 13515 "@expo/json-file" "^9.1.4" 13479 13516 "@jest/create-cache-key-function" "^29.2.1" 13480 13517 "@jest/globals" "^29.2.1" ··· 14061 14098 resolved "https://registry.yarnpkg.com/kysely/-/kysely-0.23.5.tgz#60c63d94e1c42cc0411be8aaa688a0f27405f514" 14062 14099 integrity sha512-TH+b56pVXQq0tsyooYLeNfV11j6ih7D50dyN8tkM0e7ndiUH28Nziojiog3qRFlmEj9XePYdZUrNJ2079Qjdow== 14063 14100 14064 - lan-network@^0.1.4: 14065 - version "0.1.5" 14066 - resolved "https://registry.yarnpkg.com/lan-network/-/lan-network-0.1.5.tgz#e781889b7bd4dbedd9126fff3ceddd809a83c3ff" 14067 - integrity sha512-CV3k7l8jW0Z1b+G41tB7JInVyJEKQzh/YPl2v9uXpZMusp0aa+rh3OqG77xWuX7+eVBa8PsdTuMznTAssF4qwg== 14101 + lan-network@^0.1.6: 14102 + version "0.1.7" 14103 + resolved "https://registry.yarnpkg.com/lan-network/-/lan-network-0.1.7.tgz#9fcb9967c6d951f10b2f9a9ffabe4a312d63f69d" 14104 + integrity sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ== 14068 14105 14069 14106 lande@^1.0.10: 14070 14107 version "1.0.10" ··· 14846 14883 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 14847 14884 integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== 14848 14885 14849 - minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 14886 + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 14850 14887 version "3.1.2" 14851 14888 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 14852 14889 integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== ··· 15097 15134 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" 15098 15135 integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== 15099 15136 15137 + node-releases@^2.0.19: 15138 + version "2.0.19" 15139 + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" 15140 + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== 15141 + 15100 15142 nodemailer-html-to-text@^3.2.0: 15101 15143 version "3.2.0" 15102 15144 resolved "https://registry.yarnpkg.com/nodemailer-html-to-text/-/nodemailer-html-to-text-3.2.0.tgz#91b959491fef8f7d91796047abb728aa86d4a12b" ··· 15755 15797 resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" 15756 15798 integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== 15757 15799 15758 - picocolors@^1.1.0: 15800 + picocolors@^1.1.0, picocolors@^1.1.1: 15759 15801 version "1.1.1" 15760 15802 resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 15761 15803 integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== ··· 16770 16812 resolved "https://registry.yarnpkg.com/react-keyed-flatten-children/-/react-keyed-flatten-children-5.0.0.tgz#3024fc8819f7b60fc5039b527f133d9ac3a02a82" 16771 16813 integrity sha512-XA5ah02sZAeDrbz4Lusd4acqG5q5BtVwPHWierruVhrgX6CMCldbGcTZZM14cQZ+GWq+tzRzEpsCvnTtLODvjw== 16772 16814 16773 - react-native-compressor@1.11.0: 16815 + react-native-compressor@^1.11.0: 16774 16816 version "1.11.0" 16775 16817 resolved "https://registry.yarnpkg.com/react-native-compressor/-/react-native-compressor-1.11.0.tgz#e297fa650b09cc754392153c38ae2ca510aee024" 16776 16818 integrity sha512-XaI0U2CtlW6ZYjwdQ4jdpnJa3C9CD1pc1a4jiUMtnUxWtCqgT7PNjOiEqlYLLwwGTvorXXNuby5In1yy7Vdmhg== ··· 16787 16829 dependencies: 16788 16830 dotenv "^16.4.5" 16789 16831 16790 - react-native-drawer-layout@^4.1.10: 16832 + react-native-drawer-layout@^4.1.10, react-native-drawer-layout@^4.1.8: 16791 16833 version "4.1.10" 16792 16834 resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.1.10.tgz#9007cb747767ca8e1c9c3337671ad35ed95ad4d9" 16793 16835 integrity sha512-wejQo0F+EffCkOkRh+DP6ENWMB+aWEHkXV8Pd564PmtoySZLUsV/ksYrh/mrufh7T7EuvGT8+fNHz7mMRYftWg== 16794 - dependencies: 16795 - use-latest-callback "^0.2.3" 16796 - 16797 - react-native-drawer-layout@^4.1.6: 16798 - version "4.1.7" 16799 - resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.1.7.tgz#1c741c9bf9c739d6672201692e4ba4839ca0c8ff" 16800 - integrity sha512-KeTGZsNEDbOmgo8ICwr1vBmvWjRrRsvbLc2IAfQnW5h5UtxVZVRxY4QaN84BSBQPXm6tQ6AXfII8TCXCv3c0Ew== 16801 16836 dependencies: 16802 16837 use-latest-callback "^0.2.3" 16803 16838 ··· 16858 16893 resolved "https://registry.yarnpkg.com/react-native-mmkv/-/react-native-mmkv-2.12.2.tgz#4bba0f5f04e2cf222494cce3a9794ba6a4894dee" 16859 16894 integrity sha512-6058Aq0p57chPrUutLGe9fYoiDVDNMU2PKV+lLFUJ3GhoHvUrLdsS1PDSCLr00yqzL4WJQ7TTzH+V8cpyrNcfg== 16860 16895 16861 - react-native-pager-view@6.7.1: 16862 - version "6.7.1" 16863 - resolved "https://registry.yarnpkg.com/react-native-pager-view/-/react-native-pager-view-6.7.1.tgz#60d52dedbcc92ee7037a13287ebeed5f74e49df7" 16864 - integrity sha512-cBSr6xw4g5N7Kd3VGWcf+kmaH7iBWb0DXAf2bVo3bXkzBcBbTOmYSvc0LVLHhUPW8nEq5WjT9LCIYAzgF++EXw== 16896 + react-native-pager-view@^6.7.1: 16897 + version "6.8.1" 16898 + resolved "https://registry.yarnpkg.com/react-native-pager-view/-/react-native-pager-view-6.8.1.tgz#fa0ec09ea7c44190c7c013d75dd09fdc17b96100" 16899 + integrity sha512-XIyVEMhwq7sZqM7GobOJZXxFCfdFgVNq/CFB2rZIRNRSVPJqE1k1fsc8xfQKfdzsp6Rpt6I7VOIvhmP7/YHdVg== 16865 16900 16866 16901 react-native-progress@bluesky-social/react-native-progress: 16867 16902 version "5.0.0" ··· 16895 16930 invariant "^2.2.4" 16896 16931 react-native-is-edge-to-edge "1.1.7" 16897 16932 16898 - react-native-root-siblings@^4.1.1: 16899 - version "4.1.1" 16900 - resolved "https://registry.yarnpkg.com/react-native-root-siblings/-/react-native-root-siblings-4.1.1.tgz#b7742db7634a87f507eb99a5fd699c4f10c46ab0" 16901 - integrity sha512-sdmLElNs5PDWqmZmj4/aNH4anyxreaPm61c4ZkRiR8SO/GzLg6KjAbb0e17RmMdnBdD0AIQbS38h/l55YKN4ZA== 16933 + react-native-root-siblings@^5.0.1: 16934 + version "5.0.1" 16935 + resolved "https://registry.yarnpkg.com/react-native-root-siblings/-/react-native-root-siblings-5.0.1.tgz#97e050e5155228f65810fb1c466ff8e769c5272c" 16936 + integrity sha512-Ay3k/fBj6ReUkWX5WNS+oEAcgPLEGOK8n7K/L7D85mf3xvd8rm/b4spsv26E4HlFzluVx5HKbxEt9cl0wQ1u3g== 16902 16937 16903 16938 react-native-safe-area-context@5.4.0: 16904 16939 version "5.4.0" ··· 16914 16949 react-native-is-edge-to-edge "^1.1.7" 16915 16950 warn-once "^0.1.0" 16916 16951 16917 - react-native-svg@15.11.2: 16918 - version "15.11.2" 16919 - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.11.2.tgz#7540e8e1eabc4dcd3b1e35ada5a1d9f1b96d37c4" 16920 - integrity sha512-+YfF72IbWQUKzCIydlijV1fLuBsQNGMT6Da2kFlo1sh+LE3BIm/2Q7AR1zAAR6L0BFLi1WaQPLfFUC9bNZpOmw== 16952 + react-native-svg@15.12.0: 16953 + version "15.12.0" 16954 + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.12.0.tgz#0e2d476961e8b07f8c549fe4489c99b5130dc150" 16955 + integrity sha512-iE25PxIJ6V0C6krReLquVw6R0QTsRTmEQc4K2Co3P6zsimU/jltcDBKYDy1h/5j9S/fqmMeXnpM+9LEWKJKI6A== 16921 16956 dependencies: 16922 16957 css-select "^5.1.0" 16923 16958 css-tree "^1.1.3" ··· 16968 17003 postcss-value-parser "^4.2.0" 16969 17004 styleq "^0.1.3" 16970 17005 16971 - react-native-webview@13.13.5: 16972 - version "13.13.5" 16973 - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.13.5.tgz#4ef5f9310ddff5747f884a6655228ec9c7d52c73" 16974 - integrity sha512-MfC2B+woL4Hlj2WCzcb1USySKk+SteXnUKmKktOk/H/AQy5+LuVdkPKm8SknJ0/RxaxhZ48WBoTRGaqgR137hw== 17006 + react-native-webview@^13.13.5: 17007 + version "13.15.0" 17008 + resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.15.0.tgz#b6d2f8d8dd65897db76659ddd8198d2c74ec5a79" 17009 + integrity sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ== 16975 17010 dependencies: 16976 17011 escape-string-regexp "^4.0.0" 16977 17012 invariant "2.2.4" 16978 17013 16979 - react-native@0.79.2: 16980 - version "0.79.2" 16981 - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.79.2.tgz#f1a53099701c1736d09e441eb79f97cfc90dd202" 16982 - integrity sha512-AnGzb56JvU5YCL7cAwg10+ewDquzvmgrMddiBM0GAWLwQM/6DJfGd2ZKrMuKKehHerpDDZgG+EY64gk3x3dEkw== 17014 + react-native@^0.79.3: 17015 + version "0.79.3" 17016 + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.79.3.tgz#16580ca202016c75e3c61116fcfe3b30f6d762fc" 17017 + integrity sha512-EzH1+9gzdyEo9zdP6u7Sh3Jtf5EOMwzy+TK65JysdlgAzfEVfq4mNeXcAZ6SmD+CW6M7ARJbvXLyTD0l2S5rpg== 16983 17018 dependencies: 16984 17019 "@jest/create-cache-key-function" "^29.7.0" 16985 - "@react-native/assets-registry" "0.79.2" 16986 - "@react-native/codegen" "0.79.2" 16987 - "@react-native/community-cli-plugin" "0.79.2" 16988 - "@react-native/gradle-plugin" "0.79.2" 16989 - "@react-native/js-polyfills" "0.79.2" 16990 - "@react-native/normalize-colors" "0.79.2" 16991 - "@react-native/virtualized-lists" "0.79.2" 17020 + "@react-native/assets-registry" "0.79.3" 17021 + "@react-native/codegen" "0.79.3" 17022 + "@react-native/community-cli-plugin" "0.79.3" 17023 + "@react-native/gradle-plugin" "0.79.3" 17024 + "@react-native/js-polyfills" "0.79.3" 17025 + "@react-native/normalize-colors" "0.79.3" 17026 + "@react-native/virtualized-lists" "0.79.3" 16992 17027 abort-controller "^3.0.0" 16993 17028 anser "^1.4.9" 16994 17029 ansi-regex "^5.0.0" ··· 17541 17576 dependencies: 17542 17577 glob "^7.1.3" 17543 17578 17544 - rn-fetch-blob@^0.12.0: 17545 - version "0.12.0" 17546 - resolved "https://registry.yarnpkg.com/rn-fetch-blob/-/rn-fetch-blob-0.12.0.tgz#ec610d2f9b3f1065556b58ab9c106eeb256f3cba" 17547 - integrity sha512-+QnR7AsJ14zqpVVUbzbtAjq0iI8c9tCg49tIoKO2ezjzRunN7YL6zFSFSWZm6d+mE/l9r+OeDM3jmb2tBb2WbA== 17548 - dependencies: 17549 - base-64 "0.1.0" 17550 - glob "7.0.6" 17551 - 17552 17579 roarr@^7.0.4: 17553 17580 version "7.15.1" 17554 17581 resolved "https://registry.yarnpkg.com/roarr/-/roarr-7.15.1.tgz#e4d93105c37b5ea7dd1200d96a3500f757ddc39f" ··· 17736 17763 resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" 17737 17764 integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== 17738 17765 17739 - semver@7.6.0: 17740 - version "7.6.0" 17741 - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" 17742 - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== 17743 - dependencies: 17744 - lru-cache "^6.0.0" 17766 + semver@7.6.3, semver@^7.1.3, semver@^7.6.3: 17767 + version "7.6.3" 17768 + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 17769 + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 17745 17770 17746 17771 semver@^5.5.0, semver@^5.6.0: 17747 17772 version "5.7.2" ··· 17752 17777 version "6.3.1" 17753 17778 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 17754 17779 integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 17755 - 17756 - semver@^7.1.3, semver@^7.6.3: 17757 - version "7.6.3" 17758 - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 17759 - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 17760 17780 17761 17781 semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~7.5.4: 17762 17782 version "7.5.4" ··· 19371 19391 dependencies: 19372 19392 escalade "^3.2.0" 19373 19393 picocolors "^1.1.0" 19394 + 19395 + update-browserslist-db@^1.1.3: 19396 + version "1.1.3" 19397 + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" 19398 + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== 19399 + dependencies: 19400 + escalade "^3.2.0" 19401 + picocolors "^1.1.1" 19374 19402 19375 19403 update-check@1.5.3: 19376 19404 version "1.5.3"