+14
-37
__tests__/lib/images.test.ts
+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
+1
-1
app.config.js
+2
-7
jest/jestSetup.js
+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
+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
-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
+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/@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-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
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-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
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-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
patches/expo-updates+0.28.14.patch
patches/expo-updates+0.28.12.patch.md
patches/expo-updates+0.28.14.patch.md
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
+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+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
patches/react-native-svg+15.11.2.patch
patches/react-native-svg+15.12.0.patch
+7
-7
src/components/forms/TextField.tsx
+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
-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
+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
+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
+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
+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
+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
+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
+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
-1
src/view/com/util/Toast.web.tsx
+14
-8
src/view/com/util/images/AutoSizedImage.tsx
+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
+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
+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
-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
+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"