mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-26 19:22:51 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d2941157a8 | ||
|
|
870c969fdb | ||
|
|
3b67e20d89 | ||
|
|
4cbbac563d | ||
|
|
20665a18cd | ||
|
|
7225c0fe12 | ||
|
|
f9ac58b181 |
@@ -1,5 +1,20 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.13.2 - 2026-10-26
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed repeated Android animation exceptions for views that have already unmounted ([#7907](https://github.com/getpaseo/paseo/pull/7907))
|
||||||
|
- Fixed the Android animation run loop continuing while the app is in the background ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
- Fixed finished Android chat messages being remeasured during streaming updates ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
- Fixed bottom sheets retaining window-size listeners after closing ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
|
||||||
|
## 0.13.1 - 2026-10-26
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed a startup crash with Show background enabled and eight or more workspaces in a project ([#7896](https://github.com/getpaseo/paseo/pull/7896) by [@budivoogt](https://github.com/budivoogt))
|
||||||
|
|
||||||
## 0.13.0 - 2026-10-24
|
## 0.13.0 - 2026-10-24
|
||||||
|
|
||||||
Foldable phone layouts, agents that delegate work to other machines, plugin file panels, and plugin translations.
|
Foldable phone layouts, agents that delegate work to other machines, plugin file panels, and plugin translations.
|
||||||
|
|||||||
@@ -1,5 +1,20 @@
|
|||||||
# 更新日志
|
# 更新日志
|
||||||
|
|
||||||
|
## 0.13.2 - 2026-10-26
|
||||||
|
|
||||||
|
### 修复
|
||||||
|
|
||||||
|
- 修复 Android 对已卸载视图反复抛出动画异常的问题 ([#7907](https://github.com/getpaseo/paseo/pull/7907))
|
||||||
|
- 修复 Android 应用进入后台后动画运行循环仍持续执行的问题 ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
- 修复 Android 在流式更新时反复测量已完成聊天消息的问题 ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
- 修复底部面板关闭后仍保留窗口尺寸监听器的问题 ([#7914](https://github.com/getpaseo/paseo/pull/7914))
|
||||||
|
|
||||||
|
## 0.13.1 - 2026-10-26
|
||||||
|
|
||||||
|
### 修复
|
||||||
|
|
||||||
|
- 修复开启“显示后台工作区”且项目包含至少八个工作区时的启动崩溃([#7896](https://github.com/getpaseo/paseo/pull/7896),由 [@budivoogt](https://github.com/budivoogt) 贡献)
|
||||||
|
|
||||||
## 0.13.0 - 2026-10-24
|
## 0.13.0 - 2026-10-24
|
||||||
|
|
||||||
折叠屏手机布局、可将工作委派给其他机器的 Agent、插件文件面板,以及插件翻译。
|
折叠屏手机布局、可将工作委派给其他机器的 Agent、插件文件面板,以及插件翻译。
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed a startup crash with Show background enabled and eight or more workspaces in a project
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed a startup crash with Show background enabled and eight or more workspaces in a project
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed a startup crash with Show background enabled and eight or more workspaces in a project
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed a startup crash with Show background enabled and eight or more workspaces in a project
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed repeated Android animation exceptions for views that have already unmounted
|
||||||
|
- Fixed the Android animation run loop continuing while the app is in the background
|
||||||
|
- Fixed finished Android chat messages being remeasured during streaming updates
|
||||||
|
- Fixed bottom sheets retaining window-size listeners after closing
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed repeated Android animation exceptions for views that have already unmounted
|
||||||
|
- Fixed the Android animation run loop continuing while the app is in the background
|
||||||
|
- Fixed finished Android chat messages being remeasured during streaming updates
|
||||||
|
- Fixed bottom sheets retaining window-size listeners after closing
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed repeated Android animation exceptions for views that have already unmounted
|
||||||
|
- Fixed the Android animation run loop continuing while the app is in the background
|
||||||
|
- Fixed finished Android chat messages being remeasured during streaming updates
|
||||||
|
- Fixed bottom sheets retaining window-size listeners after closing
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
Fixed
|
||||||
|
- Fixed repeated Android animation exceptions for views that have already unmounted
|
||||||
|
- Fixed the Android animation run loop continuing while the app is in the background
|
||||||
|
- Fixed finished Android chat messages being remeasured during streaming updates
|
||||||
|
- Fixed bottom sheets retaining window-size listeners after closing
|
||||||
|
|
||||||
|
Full notes: https://paseo.sh/changelog
|
||||||
Generated
+37
-70
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "paseo",
|
"name": "paseo",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "paseo",
|
"name": "paseo",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
@@ -30269,9 +30269,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-native-reanimated": {
|
"node_modules/react-native-reanimated": {
|
||||||
"version": "4.5.1",
|
"version": "4.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.5.5.tgz",
|
||||||
"integrity": "sha512-RnMvtDuR+68ig864gAvZCOdZehqhC5rFmMo0kn+ARfgVSTvFeF6IFLBVgMPUu0KwihaapEyW24WRi6nEyy1kSA==",
|
"integrity": "sha512-xtJXZRZ1vkec1AIUVG02St2sbyZS5jc7227TlDu/HonqUYPeZAfiC4RI2jqL1dVMNBu1+7oBx/c9QkjF2kg6Lg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react-native-is-edge-to-edge": "^1.3.1",
|
"react-native-is-edge-to-edge": "^1.3.1",
|
||||||
@@ -30280,7 +30280,7 @@
|
|||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"react": "*",
|
"react": "*",
|
||||||
"react-native": "0.83 - 0.86",
|
"react-native": "0.83 - 0.86",
|
||||||
"react-native-worklets": "0.10.x"
|
"react-native-worklets": "0.10.x - 0.11.x"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-native-safe-area-context": {
|
"node_modules/react-native-safe-area-context": {
|
||||||
@@ -30406,9 +30406,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/react-native-worklets": {
|
"node_modules/react-native-worklets": {
|
||||||
"version": "0.10.1",
|
"version": "0.10.4",
|
||||||
"resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.10.4.tgz",
|
||||||
"integrity": "sha512-62mRM19bDpfpdI8HLkEErcdOsrAPDtE9lA/sw+5lLRpzBHNhxaoj9QyY2KjXqUmirelxkX4zuPGTC3VdA0feJA==",
|
"integrity": "sha512-gbk0CxMrGywEp3SJAHO+2JVaCWtl4WyAYBIxLZy6Y113+mHHuq3FuT6iV+VcaBuJzuuN34mtdZ4j5JIlBDzmeA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-transform-arrow-functions": "^7.27.1",
|
"@babel/plugin-transform-arrow-functions": "^7.27.1",
|
||||||
@@ -35695,7 +35695,7 @@
|
|||||||
},
|
},
|
||||||
"packages/app": {
|
"packages/app": {
|
||||||
"name": "@getpaseo/app",
|
"name": "@getpaseo/app",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/commands": "6.10.4",
|
"@codemirror/commands": "6.10.4",
|
||||||
"@codemirror/language": "6.12.4",
|
"@codemirror/language": "6.12.4",
|
||||||
@@ -35780,14 +35780,14 @@
|
|||||||
"react-native-gesture-handler": "~2.32.0",
|
"react-native-gesture-handler": "~2.32.0",
|
||||||
"react-native-keyboard-controller": "1.21.12",
|
"react-native-keyboard-controller": "1.21.12",
|
||||||
"react-native-nitro-modules": "0.35.5",
|
"react-native-nitro-modules": "0.35.5",
|
||||||
"react-native-reanimated": "4.5.1",
|
"react-native-reanimated": "4.5.5",
|
||||||
"react-native-safe-area-context": "~5.7.0",
|
"react-native-safe-area-context": "~5.7.0",
|
||||||
"react-native-screens": "~4.26.0",
|
"react-native-screens": "~4.26.0",
|
||||||
"react-native-svg": "15.15.4",
|
"react-native-svg": "15.15.4",
|
||||||
"react-native-unistyles": "^3.2.4",
|
"react-native-unistyles": "^3.2.4",
|
||||||
"react-native-web": "~0.21.0",
|
"react-native-web": "~0.21.0",
|
||||||
"react-native-webview": "13.16.1",
|
"react-native-webview": "13.16.1",
|
||||||
"react-native-worklets": "0.10.1",
|
"react-native-worklets": "0.10.4",
|
||||||
"tiny-invariant": "^1.3.3",
|
"tiny-invariant": "^1.3.3",
|
||||||
"turndown": "^7.2.4",
|
"turndown": "^7.2.4",
|
||||||
"turndown-plugin-gfm": "^1.0.2",
|
"turndown-plugin-gfm": "^1.0.2",
|
||||||
@@ -37961,12 +37961,12 @@
|
|||||||
},
|
},
|
||||||
"packages/cli": {
|
"packages/cli": {
|
||||||
"name": "@getpaseo/cli",
|
"name": "@getpaseo/cli",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@clack/prompts": "^1.0.0",
|
"@clack/prompts": "^1.0.0",
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/server": "0.13.0",
|
"@getpaseo/server": "0.13.2",
|
||||||
"chalk": "^5.3.0",
|
"chalk": "^5.3.0",
|
||||||
"commander": "^12.0.0",
|
"commander": "^12.0.0",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
@@ -38213,10 +38213,10 @@
|
|||||||
},
|
},
|
||||||
"packages/client": {
|
"packages/client": {
|
||||||
"name": "@getpaseo/client",
|
"name": "@getpaseo/client",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/relay": "0.13.0",
|
"@getpaseo/relay": "0.13.2",
|
||||||
"ws": "^8.20.0",
|
"ws": "^8.20.0",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
},
|
},
|
||||||
@@ -38228,7 +38228,7 @@
|
|||||||
},
|
},
|
||||||
"packages/desktop": {
|
"packages/desktop": {
|
||||||
"name": "@getpaseo/desktop",
|
"name": "@getpaseo/desktop",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@getpaseo/cli": "*",
|
"@getpaseo/cli": "*",
|
||||||
@@ -38472,7 +38472,7 @@
|
|||||||
},
|
},
|
||||||
"packages/expo-two-way-audio": {
|
"packages/expo-two-way-audio": {
|
||||||
"name": "@getpaseo/expo-two-way-audio",
|
"name": "@getpaseo/expo-two-way-audio",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.5.14",
|
"@types/jest": "^29.5.14",
|
||||||
@@ -41012,39 +41012,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"packages/expo-two-way-audio/node_modules/expo-module-scripts/node_modules/react-native-worklets": {
|
|
||||||
"version": "0.13.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.13.0.tgz",
|
|
||||||
"integrity": "sha512-1OrhAeAKaZF4XrBa4YbPQbKzNOpjh52HDlId8e6ete1OCHNdAlrQHzG4gznJ225EAj3dgQXHViJvK51M9B52jQ==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"optional": true,
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@babel/generator": "^7.27.1",
|
|
||||||
"@babel/plugin-transform-arrow-functions": "^7.27.1",
|
|
||||||
"@babel/plugin-transform-class-properties": "^7.28.6",
|
|
||||||
"@babel/plugin-transform-classes": "^7.28.6",
|
|
||||||
"@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6",
|
|
||||||
"@babel/plugin-transform-optional-chaining": "^7.28.6",
|
|
||||||
"@babel/plugin-transform-shorthand-properties": "^7.27.1",
|
|
||||||
"@babel/plugin-transform-template-literals": "^7.27.1",
|
|
||||||
"@babel/plugin-transform-unicode-regex": "^7.27.1",
|
|
||||||
"@babel/preset-typescript": "^7.28.5",
|
|
||||||
"@babel/traverse": "^7.27.1",
|
|
||||||
"@babel/types": "^7.27.1",
|
|
||||||
"@jridgewell/remapping": "^2.3.5",
|
|
||||||
"convert-source-map": "^2.0.0",
|
|
||||||
"semver": "^7.7.4",
|
|
||||||
"whatwg-fetch": "^3.6.20"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@babel/core": "*",
|
|
||||||
"@react-native/metro-config": "*",
|
|
||||||
"react": "*",
|
|
||||||
"react-native": "0.86 - 0.88"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"packages/expo-two-way-audio/node_modules/expo-module-scripts/node_modules/react-native/node_modules/pretty-format": {
|
"packages/expo-two-way-audio/node_modules/expo-module-scripts/node_modules/react-native/node_modules/pretty-format": {
|
||||||
"version": "29.7.0",
|
"version": "29.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
|
||||||
@@ -42124,7 +42091,7 @@
|
|||||||
},
|
},
|
||||||
"packages/highlight": {
|
"packages/highlight": {
|
||||||
"name": "@getpaseo/highlight",
|
"name": "@getpaseo/highlight",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@codemirror/language": "6.12.4",
|
"@codemirror/language": "6.12.4",
|
||||||
"@codemirror/legacy-modes": "^6.5.3",
|
"@codemirror/legacy-modes": "^6.5.3",
|
||||||
@@ -42153,15 +42120,15 @@
|
|||||||
},
|
},
|
||||||
"packages/plugin": {
|
"packages/plugin": {
|
||||||
"name": "@getpaseo/plugin",
|
"name": "@getpaseo/plugin",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@agentclientprotocol/sdk": "^1.4.0",
|
"@agentclientprotocol/sdk": "^1.4.0",
|
||||||
"i18next": "^26.3.0",
|
"i18next": "^26.3.0",
|
||||||
"use-sync-external-store": "^1.6.0"
|
"use-sync-external-store": "^1.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@types/node": "^20.9.0",
|
"@types/node": "^20.9.0",
|
||||||
"@types/react": "~19.2.0",
|
"@types/react": "~19.2.0",
|
||||||
"react": "19.2.3",
|
"react": "19.2.3",
|
||||||
@@ -42171,8 +42138,8 @@
|
|||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"react": ">=19.1.0 <20",
|
"react": ">=19.1.0 <20",
|
||||||
"react-native": ">=0.81.5",
|
"react-native": ">=0.81.5",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
@@ -42194,7 +42161,7 @@
|
|||||||
},
|
},
|
||||||
"packages/protocol": {
|
"packages/protocol": {
|
||||||
"name": "@getpaseo/protocol",
|
"name": "@getpaseo/protocol",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"semver": "^7.8.5",
|
"semver": "^7.8.5",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
@@ -42221,7 +42188,7 @@
|
|||||||
},
|
},
|
||||||
"packages/relay": {
|
"packages/relay": {
|
||||||
"name": "@getpaseo/relay",
|
"name": "@getpaseo/relay",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@noble/ciphers": "^2.4.0",
|
"@noble/ciphers": "^2.4.0",
|
||||||
"@noble/curves": "^2.4.0",
|
"@noble/curves": "^2.4.0",
|
||||||
@@ -42442,16 +42409,16 @@
|
|||||||
},
|
},
|
||||||
"packages/server": {
|
"packages/server": {
|
||||||
"name": "@getpaseo/server",
|
"name": "@getpaseo/server",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@agentclientprotocol/sdk": "^0.17.1",
|
"@agentclientprotocol/sdk": "^0.17.1",
|
||||||
"@anthropic-ai/claude-agent-sdk": "0.3.246",
|
"@anthropic-ai/claude-agent-sdk": "0.3.246",
|
||||||
"@anthropic-ai/sdk": "^0.104.2",
|
"@anthropic-ai/sdk": "^0.104.2",
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/highlight": "0.13.0",
|
"@getpaseo/highlight": "0.13.2",
|
||||||
"@getpaseo/plugin": "0.13.0",
|
"@getpaseo/plugin": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/relay": "0.13.0",
|
"@getpaseo/relay": "0.13.2",
|
||||||
"@isaacs/ttlcache": "^2.1.4",
|
"@isaacs/ttlcache": "^2.1.4",
|
||||||
"@modelcontextprotocol/sdk": "1.29.0",
|
"@modelcontextprotocol/sdk": "1.29.0",
|
||||||
"@opencode-ai/sdk": "1.14.46",
|
"@opencode-ai/sdk": "1.14.46",
|
||||||
@@ -43372,7 +43339,7 @@
|
|||||||
},
|
},
|
||||||
"packages/website": {
|
"packages/website": {
|
||||||
"name": "@getpaseo/website",
|
"name": "@getpaseo/website",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cloudflare/vite-plugin": "^1.29.1",
|
"@cloudflare/vite-plugin": "^1.29.1",
|
||||||
"@cloudflare/workers-types": "^4.20260317.1",
|
"@cloudflare/workers-types": "^4.20260317.1",
|
||||||
@@ -44982,7 +44949,7 @@
|
|||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"name": "@getpaseo/builtin-plugins",
|
"name": "@getpaseo/builtin-plugins",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@getpaseo/plugin": "*",
|
"@getpaseo/plugin": "*",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "paseo",
|
"name": "paseo",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Paseo: voice-controlled development environment for local AI coding agents",
|
"description": "Paseo: voice-controlled development environment for local AI coding agents",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"react-dom": "19.2.3",
|
"react-dom": "19.2.3",
|
||||||
"react-native": "0.86.3",
|
"react-native": "0.86.3",
|
||||||
"react-native-gesture-handler": "~2.32.0",
|
"react-native-gesture-handler": "~2.32.0",
|
||||||
"react-native-reanimated": "4.5.1",
|
"react-native-reanimated": "4.5.5",
|
||||||
"react-native-worklets": "0.10.1"
|
"react-native-worklets": "0.10.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/app",
|
"name": "@getpaseo/app",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "index.ts",
|
"main": "index.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -126,14 +126,14 @@
|
|||||||
"react-native-gesture-handler": "~2.32.0",
|
"react-native-gesture-handler": "~2.32.0",
|
||||||
"react-native-keyboard-controller": "1.21.12",
|
"react-native-keyboard-controller": "1.21.12",
|
||||||
"react-native-nitro-modules": "0.35.5",
|
"react-native-nitro-modules": "0.35.5",
|
||||||
"react-native-reanimated": "4.5.1",
|
"react-native-reanimated": "4.5.5",
|
||||||
"react-native-safe-area-context": "~5.7.0",
|
"react-native-safe-area-context": "~5.7.0",
|
||||||
"react-native-screens": "~4.26.0",
|
"react-native-screens": "~4.26.0",
|
||||||
"react-native-svg": "15.15.4",
|
"react-native-svg": "15.15.4",
|
||||||
"react-native-unistyles": "^3.2.4",
|
"react-native-unistyles": "^3.2.4",
|
||||||
"react-native-web": "~0.21.0",
|
"react-native-web": "~0.21.0",
|
||||||
"react-native-webview": "13.16.1",
|
"react-native-webview": "13.16.1",
|
||||||
"react-native-worklets": "0.10.1",
|
"react-native-worklets": "0.10.4",
|
||||||
"tiny-invariant": "^1.3.3",
|
"tiny-invariant": "^1.3.3",
|
||||||
"turndown": "^7.2.4",
|
"turndown": "^7.2.4",
|
||||||
"turndown-plugin-gfm": "^1.0.2",
|
"turndown-plugin-gfm": "^1.0.2",
|
||||||
@@ -198,6 +198,14 @@
|
|||||||
],
|
],
|
||||||
"enableVideo": false
|
"enableVideo": false
|
||||||
},
|
},
|
||||||
|
"expo": {
|
||||||
|
"install": {
|
||||||
|
"exclude": [
|
||||||
|
"react-native-reanimated",
|
||||||
|
"react-native-worklets"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
"reanimated": {
|
"reanimated": {
|
||||||
"staticFeatureFlags": {
|
"staticFeatureFlags": {
|
||||||
"FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS": false
|
"FORCE_REACT_RENDER_FOR_SETTLED_ANIMATIONS": false
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
* @vitest-environment jsdom
|
* @vitest-environment jsdom
|
||||||
*/
|
*/
|
||||||
import { act, renderHook } from "@testing-library/react";
|
import { act, renderHook } from "@testing-library/react";
|
||||||
|
import { createWorkspaceVisibilityPolicy } from "@/components/sidebar/sidebar-group-visibility";
|
||||||
import { useLimitedSidebarGroup } from "@/components/sidebar/use-limited-sidebar-group";
|
import { useLimitedSidebarGroup } from "@/components/sidebar/use-limited-sidebar-group";
|
||||||
import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
|
import type { DaemonClient } from "@getpaseo/client/internal/daemon-client";
|
||||||
import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages";
|
import type { WorkspaceScriptPayload } from "@getpaseo/protocol/messages";
|
||||||
@@ -486,6 +487,20 @@ describe("sidebar group visibility", () => {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
it("treats placements without a hydrated entry as Done", () => {
|
||||||
|
const items = entries([...Array(8).fill("done"), "running", "done"]);
|
||||||
|
const hydrated = new Map(items.slice(0, 9).map((item) => [item.workspaceKey, item]));
|
||||||
|
for (const entriesByKey of [new Map(), hydrated]) {
|
||||||
|
const { result } = renderHook(() =>
|
||||||
|
useLimitedSidebarGroup(items, createWorkspaceVisibilityPolicy(entriesByKey)),
|
||||||
|
);
|
||||||
|
expect(result.current.canToggle).toBe(true);
|
||||||
|
expect(names(result.current.visibleItems)).toEqual(
|
||||||
|
entriesByKey.size === 0 ? names(items.slice(0, 7)) : [...names(items.slice(0, 7)), "row-9"],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it("shows eight active rows once with no redundant toggle", () => {
|
it("shows eight active rows once with no redundant toggle", () => {
|
||||||
const items = entries([
|
const items = entries([
|
||||||
"running",
|
"running",
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ import {
|
|||||||
import { useLongPressDragInteraction } from "@/components/sidebar/use-long-press-drag-interaction";
|
import { useLongPressDragInteraction } from "@/components/sidebar/use-long-press-drag-interaction";
|
||||||
import { SidebarSectionHeader } from "@/components/sidebar/sidebar-section-header";
|
import { SidebarSectionHeader } from "@/components/sidebar/sidebar-section-header";
|
||||||
import { SidebarGroupToggleRow } from "@/components/sidebar/sidebar-group-toggle-row";
|
import { SidebarGroupToggleRow } from "@/components/sidebar/sidebar-group-toggle-row";
|
||||||
|
import { createWorkspaceVisibilityPolicy } from "@/components/sidebar/sidebar-group-visibility";
|
||||||
import { useLimitedSidebarGroup } from "@/components/sidebar/use-limited-sidebar-group";
|
import { useLimitedSidebarGroup } from "@/components/sidebar/use-limited-sidebar-group";
|
||||||
import {
|
import {
|
||||||
SidebarWorkspaceRowFrame,
|
SidebarWorkspaceRowFrame,
|
||||||
@@ -1593,11 +1594,7 @@ function ProjectBlock({
|
|||||||
onToggleWorkspacePin: ToggleSidebarWorkspacePin;
|
onToggleWorkspacePin: ToggleSidebarWorkspacePin;
|
||||||
}) {
|
}) {
|
||||||
const visibilityPolicy = useMemo(
|
const visibilityPolicy = useMemo(
|
||||||
() => ({
|
() => createWorkspaceVisibilityPolicy<SidebarWorkspacePlacement>(workspaceEntriesByKey),
|
||||||
kind: "workspaces" as const,
|
|
||||||
getStatusBucket: (workspace: SidebarWorkspacePlacement) =>
|
|
||||||
workspaceEntriesByKey.get(workspace.workspaceKey)!.statusBucket,
|
|
||||||
}),
|
|
||||||
[workspaceEntriesByKey],
|
[workspaceEntriesByKey],
|
||||||
);
|
);
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -4,6 +4,18 @@ export type SidebarGroupVisibilityPolicy<T> =
|
|||||||
| { kind: "pinned" }
|
| { kind: "pinned" }
|
||||||
| { kind: "workspaces"; getStatusBucket: (item: T) => SidebarStateBucket };
|
| { kind: "workspaces"; getStatusBucket: (item: T) => SidebarStateBucket };
|
||||||
|
|
||||||
|
// A placement can outrun its entry: a retained sidebar that is inactive (compact layout with the
|
||||||
|
// sidebar closed) or still waiting for sessions keeps an empty entry map. A missing entry renders
|
||||||
|
// no row, so it counts as Done and claims no slot past the limit.
|
||||||
|
export function createWorkspaceVisibilityPolicy<T extends { workspaceKey: string }>(
|
||||||
|
entriesByKey: ReadonlyMap<string, { statusBucket: SidebarStateBucket }>,
|
||||||
|
): SidebarGroupVisibilityPolicy<T> {
|
||||||
|
return {
|
||||||
|
kind: "workspaces",
|
||||||
|
getStatusBucket: (item) => entriesByKey.get(item.workspaceKey)?.statusBucket ?? "done",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function selectSidebarGroupVisibility<T>(
|
export function selectSidebarGroupVisibility<T>(
|
||||||
items: readonly T[],
|
items: readonly T[],
|
||||||
expanded: boolean,
|
expanded: boolean,
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ vi.mock("@gorhom/bottom-sheet", async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
import { IsolatedBottomSheetModal, type ContextBridge } from ".";
|
import { IsolatedBottomSheetModal, type ContextBridge } from ".";
|
||||||
|
import { useAnimatedLayout } from "@gorhom/bottom-sheet/src/hooks/useAnimatedLayout";
|
||||||
import { useIsInsideBottomSheet } from "@/components/ui/bottom-sheet-scope";
|
import { useIsInsideBottomSheet } from "@/components/ui/bottom-sheet-scope";
|
||||||
|
|
||||||
/** Renders whatever the portal is currently holding, from its own place in the tree. */
|
/** Renders whatever the portal is currently holding, from its own place in the tree. */
|
||||||
@@ -200,3 +201,35 @@ describe("IsolatedBottomSheetModal context bridging", () => {
|
|||||||
).toEqual(["false", "true"]);
|
).toEqual(["false", "true"]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("bottom sheet layout subscription", () => {
|
||||||
|
it("stops updating a dismissed sheet when the window resizes", () => {
|
||||||
|
const container = document.createElement("div");
|
||||||
|
const root = createRoot(container);
|
||||||
|
let layout: ReturnType<typeof useAnimatedLayout> | undefined;
|
||||||
|
const viewport = document.documentElement;
|
||||||
|
const originalWidth = Object.getOwnPropertyDescriptor(viewport, "clientWidth");
|
||||||
|
function resize(width: number) {
|
||||||
|
Object.defineProperty(viewport, "clientWidth", { configurable: true, value: width });
|
||||||
|
act(() => window.dispatchEvent(new Event("resize")));
|
||||||
|
}
|
||||||
|
function LayoutProbe() {
|
||||||
|
layout = useAnimatedLayout(undefined, 0, 0);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
act(() => root.render(<LayoutProbe />));
|
||||||
|
if (!layout) throw new Error("Sheet layout did not mount");
|
||||||
|
const mountedLayout = layout;
|
||||||
|
resize(640);
|
||||||
|
expect(mountedLayout.get().window.width).toBe(640);
|
||||||
|
act(() => root.render(null));
|
||||||
|
resize(960);
|
||||||
|
expect(mountedLayout.get().window.width).toBe(640);
|
||||||
|
} finally {
|
||||||
|
act(() => root.unmount());
|
||||||
|
if (originalWidth) Object.defineProperty(viewport, "clientWidth", originalWidth);
|
||||||
|
else Reflect.deleteProperty(viewport, "clientWidth");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/cli",
|
"name": "@getpaseo/cli",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo CLI - control your AI coding agents from the command line",
|
"description": "Paseo CLI - control your AI coding agents from the command line",
|
||||||
"bin": {
|
"bin": {
|
||||||
"paseo": "bin/paseo"
|
"paseo": "bin/paseo"
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@clack/prompts": "^1.0.0",
|
"@clack/prompts": "^1.0.0",
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/server": "0.13.0",
|
"@getpaseo/server": "0.13.2",
|
||||||
"chalk": "^5.3.0",
|
"chalk": "^5.3.0",
|
||||||
"commander": "^12.0.0",
|
"commander": "^12.0.0",
|
||||||
"mime-types": "^2.1.35",
|
"mime-types": "^2.1.35",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/client",
|
"name": "@getpaseo/client",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo client SDK package",
|
"description": "Paseo client SDK package",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
@@ -47,8 +47,8 @@
|
|||||||
"test": "vitest run"
|
"test": "vitest run"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/relay": "0.13.0",
|
"@getpaseo/relay": "0.13.2",
|
||||||
"ws": "^8.20.0",
|
"ws": "^8.20.0",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/desktop",
|
"name": "@getpaseo/desktop",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Paseo desktop app (Electron wrapper)",
|
"description": "Paseo desktop app (Electron wrapper)",
|
||||||
"homepage": "https://paseo.sh",
|
"homepage": "https://paseo.sh",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/expo-two-way-audio",
|
"name": "@getpaseo/expo-two-way-audio",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Native module for two way audio streaming",
|
"description": "Native module for two way audio streaming",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"ExpoTwoWayAudio",
|
"ExpoTwoWayAudio",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/highlight",
|
"name": "@getpaseo/highlight",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
"!dist/**/*.map",
|
"!dist/**/*.map",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/plugin",
|
"name": "@getpaseo/plugin",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo plugin SDK package",
|
"description": "Paseo plugin SDK package",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
@@ -72,8 +72,8 @@
|
|||||||
"use-sync-external-store": "^1.6.0"
|
"use-sync-external-store": "^1.6.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@types/node": "^20.9.0",
|
"@types/node": "^20.9.0",
|
||||||
"@types/react": "~19.2.0",
|
"@types/react": "~19.2.0",
|
||||||
"react": "19.2.3",
|
"react": "19.2.3",
|
||||||
@@ -83,8 +83,8 @@
|
|||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"react": ">=19.1.0 <20",
|
"react": ">=19.1.0 <20",
|
||||||
"react-native": ">=0.81.5",
|
"react-native": ">=0.81.5",
|
||||||
"zod": "^4.4.3"
|
"zod": "^4.4.3"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/protocol",
|
"name": "@getpaseo/protocol",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo shared protocol schemas and wire types",
|
"description": "Paseo shared protocol schemas and wire types",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/relay",
|
"name": "@getpaseo/relay",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo relay for bridging daemon and client connections",
|
"description": "Paseo relay for bridging daemon and client connections",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/server",
|
"name": "@getpaseo/server",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"description": "Paseo backend server",
|
"description": "Paseo backend server",
|
||||||
"files": [
|
"files": [
|
||||||
"dist/server",
|
"dist/server",
|
||||||
@@ -107,11 +107,11 @@
|
|||||||
"@agentclientprotocol/sdk": "^0.17.1",
|
"@agentclientprotocol/sdk": "^0.17.1",
|
||||||
"@anthropic-ai/claude-agent-sdk": "0.3.246",
|
"@anthropic-ai/claude-agent-sdk": "0.3.246",
|
||||||
"@anthropic-ai/sdk": "^0.104.2",
|
"@anthropic-ai/sdk": "^0.104.2",
|
||||||
"@getpaseo/client": "0.13.0",
|
"@getpaseo/client": "0.13.2",
|
||||||
"@getpaseo/highlight": "0.13.0",
|
"@getpaseo/highlight": "0.13.2",
|
||||||
"@getpaseo/plugin": "0.13.0",
|
"@getpaseo/plugin": "0.13.2",
|
||||||
"@getpaseo/protocol": "0.13.0",
|
"@getpaseo/protocol": "0.13.2",
|
||||||
"@getpaseo/relay": "0.13.0",
|
"@getpaseo/relay": "0.13.2",
|
||||||
"@isaacs/ttlcache": "^2.1.4",
|
"@isaacs/ttlcache": "^2.1.4",
|
||||||
"@modelcontextprotocol/sdk": "1.29.0",
|
"@modelcontextprotocol/sdk": "1.29.0",
|
||||||
"@opencode-ai/sdk": "1.14.46",
|
"@opencode-ai/sdk": "1.14.46",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/website",
|
"name": "@getpaseo/website",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -13,6 +13,27 @@ index ee51e76..dc1bc17 100644
|
|||||||
if (_providedOnChange) {
|
if (_providedOnChange) {
|
||||||
_providedOnChange(_index, _position, _type);
|
_providedOnChange(_index, _position, _type);
|
||||||
}
|
}
|
||||||
|
diff --git a/node_modules/@gorhom/bottom-sheet/lib/commonjs/hooks/useAnimatedLayout.js b/node_modules/@gorhom/bottom-sheet/lib/commonjs/hooks/useAnimatedLayout.js
|
||||||
|
index 973d05c..b484b5f 100644
|
||||||
|
--- a/node_modules/@gorhom/bottom-sheet/lib/commonjs/hooks/useAnimatedLayout.js
|
||||||
|
+++ b/node_modules/@gorhom/bottom-sheet/lib/commonjs/hooks/useAnimatedLayout.js
|
||||||
|
@@ -86,7 +86,7 @@ function useAnimatedLayout(containerLayoutState, topInset, bottomInset, modal, s
|
||||||
|
});
|
||||||
|
}, [state, verticalInset, modal]);
|
||||||
|
(0, _react.useEffect)(() => {
|
||||||
|
- _reactNative.Dimensions.addEventListener('change', ({
|
||||||
|
+ const subscription = _reactNative.Dimensions.addEventListener('change', ({
|
||||||
|
window
|
||||||
|
}) => {
|
||||||
|
state.modify(_state => {
|
||||||
|
@@ -96,6 +96,7 @@ function useAnimatedLayout(containerLayoutState, topInset, bottomInset, modal, s
|
||||||
|
return _state;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
+ return () => subscription.remove();
|
||||||
|
}, [state]);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
diff --git a/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js b/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js
|
diff --git a/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js b/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js
|
||||||
index e44ad86..96555ef 100644
|
index e44ad86..96555ef 100644
|
||||||
--- a/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js
|
--- a/node_modules/@gorhom/bottom-sheet/lib/commonjs/index.js
|
||||||
@@ -54,6 +75,27 @@ index 94fabdb..60ca66a 100644
|
|||||||
if (_providedOnChange) {
|
if (_providedOnChange) {
|
||||||
_providedOnChange(_index, _position, _type);
|
_providedOnChange(_index, _position, _type);
|
||||||
}
|
}
|
||||||
|
diff --git a/node_modules/@gorhom/bottom-sheet/lib/module/hooks/useAnimatedLayout.js b/node_modules/@gorhom/bottom-sheet/lib/module/hooks/useAnimatedLayout.js
|
||||||
|
index b0eec93..67713a2 100644
|
||||||
|
--- a/node_modules/@gorhom/bottom-sheet/lib/module/hooks/useAnimatedLayout.js
|
||||||
|
+++ b/node_modules/@gorhom/bottom-sheet/lib/module/hooks/useAnimatedLayout.js
|
||||||
|
@@ -82,7 +82,7 @@ export function useAnimatedLayout(containerLayoutState, topInset, bottomInset, m
|
||||||
|
});
|
||||||
|
}, [state, verticalInset, modal]);
|
||||||
|
useEffect(() => {
|
||||||
|
- Dimensions.addEventListener('change', ({
|
||||||
|
+ const subscription = Dimensions.addEventListener('change', ({
|
||||||
|
window
|
||||||
|
}) => {
|
||||||
|
state.modify(_state => {
|
||||||
|
@@ -92,6 +92,7 @@ export function useAnimatedLayout(containerLayoutState, topInset, bottomInset, m
|
||||||
|
return _state;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
+ return () => subscription.remove();
|
||||||
|
}, [state]);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
diff --git a/node_modules/@gorhom/bottom-sheet/lib/module/index.js b/node_modules/@gorhom/bottom-sheet/lib/module/index.js
|
diff --git a/node_modules/@gorhom/bottom-sheet/lib/module/index.js b/node_modules/@gorhom/bottom-sheet/lib/module/index.js
|
||||||
index 8259637..eb057fe 100644
|
index 8259637..eb057fe 100644
|
||||||
--- a/node_modules/@gorhom/bottom-sheet/lib/module/index.js
|
--- a/node_modules/@gorhom/bottom-sheet/lib/module/index.js
|
||||||
@@ -101,6 +143,26 @@ index 2954b3f..7260656 100644
|
|||||||
|
|
||||||
if (_providedOnChange) {
|
if (_providedOnChange) {
|
||||||
_providedOnChange(_index, _position, _type);
|
_providedOnChange(_index, _position, _type);
|
||||||
|
diff --git a/node_modules/@gorhom/bottom-sheet/src/hooks/useAnimatedLayout.ts b/node_modules/@gorhom/bottom-sheet/src/hooks/useAnimatedLayout.ts
|
||||||
|
index 68c674d..564833c 100644
|
||||||
|
--- a/node_modules/@gorhom/bottom-sheet/src/hooks/useAnimatedLayout.ts
|
||||||
|
+++ b/node_modules/@gorhom/bottom-sheet/src/hooks/useAnimatedLayout.ts
|
||||||
|
@@ -106,13 +106,14 @@ export function useAnimatedLayout(
|
||||||
|
[state, verticalInset, modal]
|
||||||
|
);
|
||||||
|
useEffect(() => {
|
||||||
|
- Dimensions.addEventListener('change', ({ window }) => {
|
||||||
|
+ const subscription = Dimensions.addEventListener('change', ({ window }) => {
|
||||||
|
state.modify(_state => {
|
||||||
|
'worklet';
|
||||||
|
_state.window = window;
|
||||||
|
return _state;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
+ return () => subscription.remove();
|
||||||
|
}, [state]);
|
||||||
|
//#endregion
|
||||||
|
|
||||||
diff --git a/node_modules/@gorhom/bottom-sheet/src/index.ts b/node_modules/@gorhom/bottom-sheet/src/index.ts
|
diff --git a/node_modules/@gorhom/bottom-sheet/src/index.ts b/node_modules/@gorhom/bottom-sheet/src/index.ts
|
||||||
index 7aaea57..6a5f5a4 100644
|
index 7aaea57..6a5f5a4 100644
|
||||||
--- a/node_modules/@gorhom/bottom-sheet/src/index.ts
|
--- a/node_modules/@gorhom/bottom-sheet/src/index.ts
|
||||||
|
|||||||
@@ -40,9 +40,10 @@ index 0a1c6c2..5935112 100644
|
|||||||
|
|
||||||
struct OnLinkLongPress {
|
struct OnLinkLongPress {
|
||||||
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt b/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt b/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
||||||
|
index c12937c..8105833 100644
|
||||||
--- a/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
--- a/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
||||||
+++ b/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
+++ b/node_modules/react-native-enriched-markdown/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt
|
||||||
@@ -95,7 +95,7 @@
|
@@ -95,7 +95,7 @@ class EnrichedMarkdown(
|
||||||
private var accessibilityLabels = AccessibilityLabels()
|
private var accessibilityLabels = AccessibilityLabels()
|
||||||
private var textBreakStrategy: String = BreakStrategyUtils.DEFAULT_STRATEGY
|
private var textBreakStrategy: String = BreakStrategyUtils.DEFAULT_STRATEGY
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/c
|
|||||||
private var onLinkLongPressCallback: ((String) -> Unit)? = null
|
private var onLinkLongPressCallback: ((String) -> Unit)? = null
|
||||||
private var onTaskListItemPressCallback: ((Int, Boolean, String) -> Unit)? = null
|
private var onTaskListItemPressCallback: ((Int, Boolean, String) -> Unit)? = null
|
||||||
private var onLatexErrorCallback: LatexErrorReporter? = null
|
private var onLatexErrorCallback: LatexErrorReporter? = null
|
||||||
@@ -296,7 +296,7 @@
|
@@ -296,7 +296,7 @@ class EnrichedMarkdown(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/c
|
|||||||
onLinkPressCallback = callback
|
onLinkPressCallback = callback
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,7 +405,7 @@
|
@@ -405,7 +405,7 @@ class EnrichedMarkdown(
|
||||||
val codeLinkRegex = inlineCodeLinkRegex
|
val codeLinkRegex = inlineCodeLinkRegex
|
||||||
val renderId = ++currentRenderId
|
val renderId = ++currentRenderId
|
||||||
|
|
||||||
@@ -69,7 +70,7 @@ diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/c
|
|||||||
try {
|
try {
|
||||||
val filtered =
|
val filtered =
|
||||||
if (isStreaming) {
|
if (isStreaming) {
|
||||||
@@ -418,13 +418,13 @@
|
@@ -418,13 +418,13 @@ class EnrichedMarkdown(
|
||||||
|
|
||||||
if (renderableMarkdown.isEmpty()) {
|
if (renderableMarkdown.isEmpty()) {
|
||||||
postToMain(renderId) { applyRenderedSegments(emptyList(), false) }
|
postToMain(renderId) { applyRenderedSegments(emptyList(), false) }
|
||||||
@@ -85,7 +86,19 @@ diff --git a/node_modules/react-native-enriched-markdown/android/src/main/java/c
|
|||||||
}
|
}
|
||||||
|
|
||||||
val segments = splitASTIntoSegments(ast)
|
val segments = splitASTIntoSegments(ast)
|
||||||
@@ -646,8 +646,12 @@
|
@@ -478,6 +478,11 @@ class EnrichedMarkdown(
|
||||||
|
if (forceHeight || topologyChanged || heightBefore != heightAfter) {
|
||||||
|
MeasurementStore.invalidate(id)
|
||||||
|
requestLayout()
|
||||||
|
+ stateWrapper?.let {
|
||||||
|
+ val state = Arguments.createMap()
|
||||||
|
+ state.putInt("forceHeightRecalculationCounter", ++forceHeightRecalculationCounter)
|
||||||
|
+ it.updateState(state)
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -646,8 +651,12 @@ class EnrichedMarkdown(
|
||||||
renderId: Long,
|
renderId: Long,
|
||||||
action: () -> Unit,
|
action: () -> Unit,
|
||||||
) {
|
) {
|
||||||
@@ -3138,3 +3151,89 @@ new file mode 100644
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
|
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp
|
||||||
|
index a430d1a..b30a017 100644
|
||||||
|
--- a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp
|
||||||
|
+++ b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp
|
||||||
|
@@ -22,6 +22,14 @@ void MarkdownContainerShadowNode::dirtyLayoutIfNeeded() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+// Only new props change the rendered markdown. When a parent is cloned, React Native's adoptYogaChild
|
||||||
|
+// re-clones its children without new props, and dirtying those clones re-measures every settled message
|
||||||
|
+// whenever the list above grows.
|
||||||
|
+bool MarkdownContainerShadowNode::shouldNewRevisionDirtyMeasurement(const ShadowNode & /*sourceShadowNode*/,
|
||||||
|
+ const ShadowNodeFragment &fragment) const {
|
||||||
|
+ return fragment.props != nullptr;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
Size MarkdownContainerShadowNode::measureContent(const LayoutContext &layoutContext,
|
||||||
|
const LayoutConstraints &layoutConstraints) const {
|
||||||
|
return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
|
||||||
|
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h
|
||||||
|
index dea8bb2..6c4bd20 100644
|
||||||
|
--- a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h
|
||||||
|
+++ b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h
|
||||||
|
@@ -19,6 +19,8 @@ public:
|
||||||
|
|
||||||
|
MarkdownContainerShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
|
||||||
|
: ConcreteViewShadowNode(sourceShadowNode, fragment) {
|
||||||
|
+ forceHeightRecalculationCounter_ =
|
||||||
|
+ static_cast<const MarkdownContainerShadowNode &>(sourceShadowNode).forceHeightRecalculationCounter_;
|
||||||
|
dirtyLayoutIfNeeded();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -35,6 +37,10 @@ public:
|
||||||
|
|
||||||
|
Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
|
||||||
|
|
||||||
|
+protected:
|
||||||
|
+ bool shouldNewRevisionDirtyMeasurement(const ShadowNode &sourceShadowNode,
|
||||||
|
+ const ShadowNodeFragment &fragment) const override;
|
||||||
|
+
|
||||||
|
private:
|
||||||
|
int forceHeightRecalculationCounter_{0};
|
||||||
|
std::shared_ptr<MarkdownContainerMeasurementManager> measurementsManager_;
|
||||||
|
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp
|
||||||
|
index 3ca259b..ab51055 100644
|
||||||
|
--- a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp
|
||||||
|
+++ b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp
|
||||||
|
@@ -22,6 +22,14 @@ void MarkdownTextShadowNode::dirtyLayoutIfNeeded() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+// Only new props change the rendered markdown. When a parent is cloned, React Native's adoptYogaChild
|
||||||
|
+// re-clones its children without new props, and dirtying those clones re-measures every settled message
|
||||||
|
+// whenever the list above grows.
|
||||||
|
+bool MarkdownTextShadowNode::shouldNewRevisionDirtyMeasurement(const ShadowNode & /*sourceShadowNode*/,
|
||||||
|
+ const ShadowNodeFragment &fragment) const {
|
||||||
|
+ return fragment.props != nullptr;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
Size MarkdownTextShadowNode::measureContent(const LayoutContext &layoutContext,
|
||||||
|
const LayoutConstraints &layoutConstraints) const {
|
||||||
|
return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
|
||||||
|
diff --git a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h
|
||||||
|
index eaa3279..05a02eb 100644
|
||||||
|
--- a/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h
|
||||||
|
+++ b/node_modules/react-native-enriched-markdown/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h
|
||||||
|
@@ -22,6 +22,8 @@ public:
|
||||||
|
|
||||||
|
MarkdownTextShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
|
||||||
|
: ConcreteViewShadowNode(sourceShadowNode, fragment) {
|
||||||
|
+ forceHeightRecalculationCounter_ =
|
||||||
|
+ static_cast<const MarkdownTextShadowNode &>(sourceShadowNode).forceHeightRecalculationCounter_;
|
||||||
|
dirtyLayoutIfNeeded();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -39,6 +41,10 @@ public:
|
||||||
|
|
||||||
|
Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
|
||||||
|
|
||||||
|
+protected:
|
||||||
|
+ bool shouldNewRevisionDirtyMeasurement(const ShadowNode &sourceShadowNode,
|
||||||
|
+ const ShadowNodeFragment &fragment) const override;
|
||||||
|
+
|
||||||
|
private:
|
||||||
|
int forceHeightRecalculationCounter_{0};
|
||||||
|
std::shared_ptr<MarkdownTextMeasurementManager> measurementsManager_;
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
diff --git a/node_modules/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NativeProxy.kt b/node_modules/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NativeProxy.kt
|
||||||
|
index 48e3771..0fba1af 100644
|
||||||
|
--- a/node_modules/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NativeProxy.kt
|
||||||
|
+++ b/node_modules/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/NativeProxy.kt
|
||||||
|
@@ -245,6 +245,15 @@ open class NativeProxy {
|
||||||
|
}.apply { isAccessible = true }
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Backport of https://github.com/software-mansion/react-native-reanimated/pull/10435
|
||||||
|
+ // (shipped in Reanimated 4.7.1). The reflective updatePropsSynchronously path skips RN's
|
||||||
|
+ // view-existence guard, so a tag that unmounted with buffered updates throws
|
||||||
|
+ // RetryableMountingLayerException on every event dispatch and Log.w printed the full stack
|
||||||
|
+ // on the UI thread inside the draw pass. Remove once the installed Reanimated includes the fix.
|
||||||
|
+ private val getViewExistsMethod by lazy {
|
||||||
|
+ runCatching { mountingManager.javaClass.getMethod("getViewExists", Int::class.javaPrimitiveType) }.getOrNull()
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
@DoNotStrip
|
||||||
|
fun synchronouslyUpdateUIProps(
|
||||||
|
intBuffer: IntArray,
|
||||||
|
@@ -253,9 +262,13 @@ open class NativeProxy {
|
||||||
|
SynchronousPropsBufferParser.parse(intBuffer, doubleBuffer) { viewTag, props ->
|
||||||
|
if (BuildConfig.IS_REACT_NATIVE_86_OR_NEWER) {
|
||||||
|
try {
|
||||||
|
+ // The props stay in the registry, and the commit hook applies them to the shadow tree.
|
||||||
|
+ if (getViewExistsMethod?.invoke(mountingManager, viewTag) == false) {
|
||||||
|
+ return@parse
|
||||||
|
+ }
|
||||||
|
updatePropsSynchronouslyMethod.invoke(mountingManager, viewTag, props)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
- Log.w("Reanimated", "synchronouslyUpdateUIProps failed for tag $viewTag", e)
|
||||||
|
+ Log.w("Reanimated", "synchronouslyUpdateUIProps failed for tag $viewTag: ${e.cause ?: e}")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mFabricUIManager.synchronouslyUpdateViewOnUIThread(viewTag, props)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@getpaseo/builtin-plugins",
|
"name": "@getpaseo/builtin-plugins",
|
||||||
"version": "0.13.0",
|
"version": "0.13.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ const patchedPackages = [
|
|||||||
nodeModulesPath: "node_modules/expo-modules-core",
|
nodeModulesPath: "node_modules/expo-modules-core",
|
||||||
patchPrefix: "expo-modules-core+",
|
patchPrefix: "expo-modules-core+",
|
||||||
},
|
},
|
||||||
|
// Backport https://github.com/software-mansion/enriched-markdown/pull/924: preserve settled
|
||||||
|
// Android measurements across parent clones. Remove those hunks when upgrading past
|
||||||
|
// 1.2.0-nightly-20261019-926ef06f0; reconcile the other local patch hunks separately.
|
||||||
{
|
{
|
||||||
nodeModulesPath: "packages/app/node_modules/react-native-enriched-markdown",
|
nodeModulesPath: "packages/app/node_modules/react-native-enriched-markdown",
|
||||||
patchPrefix: "react-native-enriched-markdown+",
|
patchPrefix: "react-native-enriched-markdown+",
|
||||||
@@ -25,6 +28,14 @@ const patchedPackages = [
|
|||||||
nodeModulesPath: "node_modules/react-native-unistyles",
|
nodeModulesPath: "node_modules/react-native-unistyles",
|
||||||
patchPrefix: "react-native-unistyles+",
|
patchPrefix: "react-native-unistyles+",
|
||||||
},
|
},
|
||||||
|
// Backport of https://github.com/software-mansion/react-native-reanimated/pull/10435
|
||||||
|
// (Reanimated 4.7.1): skip synchronous Android prop updates for unmounted view tags
|
||||||
|
// instead of throwing and printing a full stack trace on the UI thread per tag per event.
|
||||||
|
// Remove when the installed Reanimated is >= 4.7.1.
|
||||||
|
{
|
||||||
|
nodeModulesPath: "node_modules/react-native-reanimated",
|
||||||
|
patchPrefix: "react-native-reanimated+",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
nodeModulesPath: "node_modules/react-native-draggable-flatlist",
|
nodeModulesPath: "node_modules/react-native-draggable-flatlist",
|
||||||
patchPrefix: "react-native-draggable-flatlist+",
|
patchPrefix: "react-native-draggable-flatlist+",
|
||||||
@@ -37,6 +48,9 @@ const patchedPackages = [
|
|||||||
// modal stack (see packages/app/src/components/ui/isolated-bottom-sheet-modal/host-scope.tsx), and
|
// modal stack (see packages/app/src/components/ui/isolated-bottom-sheet-modal/host-scope.tsx), and
|
||||||
// keeps a dismissing modal's status through its final onChange(-1), so a modal with
|
// keeps a dismissing modal's status through its final onChange(-1), so a modal with
|
||||||
// enableDismissOnClose=false that unmounts while presented still leaves the portal.
|
// enableDismissOnClose=false that unmounts while presented still leaves the portal.
|
||||||
|
// Dimensions subscription cleanup: https://github.com/gorhom/react-native-bottom-sheet/issues/2734
|
||||||
|
// and https://github.com/gorhom/react-native-bottom-sheet/pull/2751. Remove the useAnimatedLayout
|
||||||
|
// hunks once an installed release includes the cleanup; retain the other local hunks.
|
||||||
{
|
{
|
||||||
nodeModulesPath: "node_modules/@gorhom/bottom-sheet",
|
nodeModulesPath: "node_modules/@gorhom/bottom-sheet",
|
||||||
patchPrefix: "@gorhom+bottom-sheet+",
|
patchPrefix: "@gorhom+bottom-sheet+",
|
||||||
|
|||||||
Reference in New Issue
Block a user