From b52cf77ef271f89a7b1a53cbc10471e2ce59f46d Mon Sep 17 00:00:00 2001
From: dkd <1585765832@qq.com>
Date: Fri, 7 Jun 2024 09:59:58 +0800
Subject: [PATCH 001/966] =?UTF-8?q?docs:=20[Issues:=20#I9VQPS]=20=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9Ereacr-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 360 +++++++++++++++++++++++++++++++++
 1 file changed, 360 insertions(+)
 create mode 100644 zh-cn/react-native-modalbox.md
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
new file mode 100644
index 00000000..a8f3834d
--- /dev/null
+++ b/zh-cn/react-native-modalbox.md
@@ -0,0 +1,360 @@
+> 模板版本:v0.2.1
+
+
+  
 react-native-modalbox  
+
+
+    
+         
+        
+         
+
+
+> [!tip] [Github 地址](https://github.com/maxs15/react-native-modalbox)
+
+## 安装与使用
+
+请到三方库的 Releases 发布地址查看配套的版本信息:[@react-native-oh-tpl/react-native-modalbox Releases](https://github.com/react-native-oh-library/react-native-modalbox/releases),并下载适用版本的 tgz 包。
+
+进入到工程目录并输入以下命令:
+
+> [!TIP] # 处替换为 tgz 包的路径
+
+
+
+#### **npm**
+
+```bash
+npm install @react-native-oh-tpl/react-native-modalbox@file:#
+```
+
+#### **yarn**
+
+```bash
+yarn add @react-native-oh-tpl/react-native-modalbox@file:#
+```
+
+
+
+下面的代码展示了这个库的基本使用场景:
+
+> [!WARNING] 使用时 import 的库名不变。
+
+```js
+
+import React from 'react';
+import Modal from 'react-native-modalbox';
+
+import { TestSuite, Tester, TestCase } from '@rnoh/testerino';
+import {
+  Text,
+  Button,
+  StyleSheet,
+  ScrollView,
+  View,
+  Dimensions,
+  Easing,
+  TextInput
+} from 'react-native';
+
+var screen = Dimensions.get('window');
+
+export default class ModalBoxExample extends React.Component {
+
+  constructor(props:any) {
+    super(props);
+    this.state = {
+      isOpen: false,
+      isDisabled: false,
+      swipeToClose: true,
+      sliderValue: 0.3
+    };
+  }
+
+
+  onClose() {
+    console.log('Modal just closed');
+  }
+  animalEase(){
+    Easing.elastic(8)
+  }
+
+  onOpen() {
+    console.log('Modal just opened');
+  }
+
+  onClosingState(state:any) {
+    console.log('the open/close of the swipeToClose just changed');
+  }
+
+  renderList() {
+    var list = [];
+
+    for (var i=0;i<50;i++) {
+      list.push(Elem {i} );
+    }
+
+    return list;
+  }
+
+  render() {
+    var BContent = (
+      
+         this.setState({isOpen: false})}/>
+        
+    );
+
+    return (
+      
+        
+          
+            this.refs.modal1.open()} />
+            
+                Basic modal 
+                 this.setState({swipeToClose: !this.state.swipeToClose})} />
+              
+            
+          
+            this.refs.modal2.open()} />
+            
+              Modal on top 
+             
+            
+          
+            this.refs.modal3.open()} />
+            
+              Modal centered 
+               this.setState({isDisabled: !this.state.isDisabled})} />
+              
+            
+          
+             this.refs.modal4.open()} />
+            
+              Modal on bottom with backdrop 
+             
+            
+          
+             this.setState({isOpen: true})} />
+             this.setState({isOpen: false})} style={[styles.modal, styles.modal4]} position={"center"} backdropPressToClose={false} backdropContent={BContent} backdropColor={'red'} backdropOpacity={0.2}>
+              Modal with backdrop content 
+             
+            
+          
+             this.refs.modal6.open()} />
+            
+              
+                
+                  {this.renderList()}
+                 
+               
+             
+            
+          
+             this.refs.modal7.open()} />
+            
+              
+                 
+             
+            
+          
+             this.refs.modal8.open()} />
+            
+              Modal entry from top 
+             
+            
+         
+       
+    );
+  }
+
+}
+
+const styles = StyleSheet.create({
+
+  wrapper: {
+    paddingTop: 50,
+    flex: 1
+  },
+
+  modal: {
+    justifyContent: 'center',
+    alignItems: 'center'
+  },
+
+  modal2: {
+    height: 230,
+    backgroundColor: "#3B5998"
+  },
+
+  modal3: {
+    height: 300,
+    width: 300
+  },
+
+  modal4: {
+    height: 300
+  },
+
+  btn: {
+    margin: 20,
+    backgroundColor: "#3B5998",
+    color: "white",
+    padding: 10
+  },
+
+  btnModal: {
+    position: "absolute",
+    top: 0,
+    right: 0,
+    width: 50,
+    height: 50,
+    backgroundColor: "transparent"
+  },
+
+  text: {
+    color: "black",
+    fontSize: 22
+  }
+
+});
+```
+
+## Link
+
+目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。
+
+首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony`
+
+### 引入原生端代码
+
+目前有两种方法:
+
+1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法);
+2. 直接链接源码。
+
+方法一:通过 har 包引入(推荐)
+
+> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。
+
+打开 `entry/oh-package.json5`,添加以下依赖
+
+```json
+"dependencies": {
+    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
+    "@react-native-oh-tpl/react-native-modalbox": "file:../../node_modules/@react-native-oh-tpl/react-native-modalbox/harmony/modalbox.har"
+  }
+```
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+方法二:直接链接源码
+
+> [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](/zh-cn/link-source-code.md)
+
+打开终端,执行:
+
+```bash
+cd entry
+ohpm install --no-link
+```
+
+
+### 运行
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+然后编译、运行即可。
+
+## 约束与限制
+
+### 兼容性
+要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机ROM。
+
+本文档内容基于以下版本验证通过:
+
+RNOH:0.72.23; SDK:HarmonyOS NEXT Developer Beta1; IDE:DevEco Studio 5.0.3.200; ROM:3.0.0.19
+
+### 权限要求
+
+
+```
+无
+```
+
+## 属性
+
+> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
+
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+
+| Prop  | Default  | Type | Description |
+| :------------ |:---------------:| :---------------:| :-----|
+| isOpen | false | `bool` | Open/close the modal, optional, you can use the open/close methods instead  |
+| isDisabled | false | `bool` | Disable any action on the modal (open, close, swipe)  |
+| backdropPressToClose | true | `bool` | Close the the modal by pressing on the backdrop |
+| swipeToClose | true | `bool` | Set to `true` to enable the swipe down to close feature |
+| swipeThreshold | 50 | `number` | The threshold to reach in pixels to close the modal |
+| swipeArea | - | `number` | The height in pixels of the swipeable area, window height by default |
+| position | center | `string` | Control the modal position using `top` or `center` or `bottom` |
+| entry | bottom | `string` | Control the modal entry position `top` or `bottom` |
+| backdrop | true | `bool` | Display a backdrop behind the modal |
+| backdropOpacity | 0.5| `number` | Opacity of the backdrop |
+| backdropColor | black| `string` | backgroundColor of the backdrop |
+| backdropContent | null| `ReactElement` | Add an element in the backdrop (a close button for example) |
+| animationDuration | 400| `number` | Duration of the animation |
+| easing | Easing.elastic(0.8) | `function` | Easing function applied to opening modal animation |
+| backButtonClose | false | `bool` | (Android only) Close modal when receiving back button event |
+| startOpen | false | `bool` | Allow modal to appear open without animation upon first mount |
+| coverScreen | false | `bool` | Will use RN `Modal` component to cover the entire screen wherever the modal is mounted in the component hierarchy |
+| keyboardTopOffset | ios:22, android:0 | `number` | This property prevent the modal to cover the ios status bar when the modal is scrolling up because the keyboard is opening |
+| useNativeDriver | true | `bool` | Enables the hardware acceleration to animate the modal. Please note that enabling this can cause some flashes in a weird way when animating |
+
+## 事件
+| Prop  | Params  | Description |
+| :------------ |:---------------:| :---------------:|
+| onClosed | - | When the modal is close and the animation is done |
+| onOpened | - | When the modal is open and the animation is done |
+| onClosingState | state `bool` | When the state of the swipe to close feature has changed (usefull to change the content of the modal, display a message for example) |
+
+## 方法
+hese methods are optional, you can use the isOpen property instead   
+
+| Prop  | Params  | Description |
+| :------------ |:---------------:| :---------------:|
+| open | - | Open the modal |
+| close | - | Close the modal |
+
+
+## 遗留问题
+- 无
+
+## 其他
+
+## 开源协议
+
+本项目基于 [The MIT License (MIT)](https://github.com/maxs15/react-native-modalbox/blob/master/License.txt) ,请自由地享受和参与开源。
\ No newline at end of file
From b14d247040bf6ad5ccafee6f6af946c9619f03a6 Mon Sep 17 00:00:00 2001
From: anghuang 
Date: Fri, 7 Jun 2024 11:21:41 +0800
Subject: [PATCH 002/966] =?UTF-8?q?fix:=20[Issues:=20#I9VQPS]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9reacr-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 68 +++-------------------------------
 1 file changed, 5 insertions(+), 63 deletions(-)
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
index a8f3834d..49583049 100644
--- a/zh-cn/react-native-modalbox.md
+++ b/zh-cn/react-native-modalbox.md
@@ -16,7 +16,7 @@
 
 ## 安装与使用
 
-请到三方库的 Releases 发布地址查看配套的版本信息:[@react-native-oh-tpl/react-native-modalbox Releases](https://github.com/react-native-oh-library/react-native-modalbox/releases),并下载适用版本的 tgz 包。
+请到github上的发布地址查看配套的版本信息:(https://github.com/maxs15/react-native-modalbox master),并下载适用版本的 tgz 包。
 
 进入到工程目录并输入以下命令:
 
@@ -27,13 +27,13 @@
 #### **npm**
 
 ```bash
-npm install @react-native-oh-tpl/react-native-modalbox@file:#
+npm install react-native-modalbox@latest --save
 ```
 
 #### **yarn**
 
 ```bash
-yarn add @react-native-oh-tpl/react-native-modalbox@file:#
+yarn add react-native-modalbox@latest --save
 ```
 
 
@@ -236,59 +236,7 @@ const styles = StyleSheet.create({
 
 首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony`
 
-### 引入原生端代码
 
-目前有两种方法:
-
-1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法);
-2. 直接链接源码。
-
-方法一:通过 har 包引入(推荐)
-
-> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。
-
-打开 `entry/oh-package.json5`,添加以下依赖
-
-```json
-"dependencies": {
-    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
-    "@react-native-oh-tpl/react-native-modalbox": "file:../../node_modules/@react-native-oh-tpl/react-native-modalbox/harmony/modalbox.har"
-  }
-```
-
-点击右上角的 `sync` 按钮
-
-或者在终端执行:
-
-```bash
-cd entry
-ohpm install
-```
-
-方法二:直接链接源码
-
-> [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](/zh-cn/link-source-code.md)
-
-打开终端,执行:
-
-```bash
-cd entry
-ohpm install --no-link
-```
-
-
-### 运行
-
-点击右上角的 `sync` 按钮
-
-或者在终端执行:
-
-```bash
-cd entry
-ohpm install
-```
-
-然后编译、运行即可。
 
 ## 约束与限制
 
@@ -299,13 +247,8 @@ ohpm install
 
 RNOH:0.72.23; SDK:HarmonyOS NEXT Developer Beta1; IDE:DevEco Studio 5.0.3.200; ROM:3.0.0.19
 
-### 权限要求
 
 
-```
-无
-```
-
 ## 属性
 
 > [!tip] "Platform"列表示该属性在原三方库上支持的平台。
@@ -350,11 +293,10 @@ hese methods are optional, you can use the isOpen property instead
 | close | - | Close the modal |
 
 
-## 遗留问题
-- 无
+
 
 ## 其他
 
 ## 开源协议
 
-本项目基于 [The MIT License (MIT)](https://github.com/maxs15/react-native-modalbox/blob/master/License.txt) ,请自由地享受和参与开源。
\ No newline at end of file
+本项目基于 [The MIT License (MIT)](https://github.com/wmcmahan/react-native-calendar-events/blob/master/LICENSE.md) ,请自由地享受和参与开源。
\ No newline at end of file
From 2ec140bad9eaaa1386346ddabe7349cc42c51918 Mon Sep 17 00:00:00 2001
From: anghuang 
Date: Fri, 7 Jun 2024 15:16:45 +0800
Subject: [PATCH 003/966] =?UTF-8?q?fix:=20[Issues:=20#I9VQPS]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9reacr-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 72 ++++++++++++++++------------------
 1 file changed, 33 insertions(+), 39 deletions(-)
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
index 49583049..0cf80b47 100644
--- a/zh-cn/react-native-modalbox.md
+++ b/zh-cn/react-native-modalbox.md
@@ -27,13 +27,13 @@
 #### **npm**
 
 ```bash
-npm install react-native-modalbox@latest --save
+npm install react-native-modalbox@2.0.2 --save
 ```
 
 #### **yarn**
 
 ```bash
-yarn add react-native-modalbox@latest --save
+yarn add react-native-modalbox@2.0.2 --save
 ```
 
 
@@ -230,11 +230,6 @@ const styles = StyleSheet.create({
 });
 ```
 
-## Link
-
-目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。
-
-首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony`
 
 
 
@@ -250,47 +245,46 @@ RNOH:0.72.23; SDK:HarmonyOS NEXT Developer Beta1; IDE:DevEco Studio 5.0.3.
 
 
 ## 属性
-
 > [!tip] "Platform"列表示该属性在原三方库上支持的平台。
-
 > [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
 
-| Prop  | Default  | Type | Description |
-| :------------ |:---------------:| :---------------:| :-----|
-| isOpen | false | `bool` | Open/close the modal, optional, you can use the open/close methods instead  |
-| isDisabled | false | `bool` | Disable any action on the modal (open, close, swipe)  |
-| backdropPressToClose | true | `bool` | Close the the modal by pressing on the backdrop |
-| swipeToClose | true | `bool` | Set to `true` to enable the swipe down to close feature |
-| swipeThreshold | 50 | `number` | The threshold to reach in pixels to close the modal |
-| swipeArea | - | `number` | The height in pixels of the swipeable area, window height by default |
-| position | center | `string` | Control the modal position using `top` or `center` or `bottom` |
-| entry | bottom | `string` | Control the modal entry position `top` or `bottom` |
-| backdrop | true | `bool` | Display a backdrop behind the modal |
-| backdropOpacity | 0.5| `number` | Opacity of the backdrop |
-| backdropColor | black| `string` | backgroundColor of the backdrop |
-| backdropContent | null| `ReactElement` | Add an element in the backdrop (a close button for example) |
-| animationDuration | 400| `number` | Duration of the animation |
-| easing | Easing.elastic(0.8) | `function` | Easing function applied to opening modal animation |
-| backButtonClose | false | `bool` | (Android only) Close modal when receiving back button event |
-| startOpen | false | `bool` | Allow modal to appear open without animation upon first mount |
-| coverScreen | false | `bool` | Will use RN `Modal` component to cover the entire screen wherever the modal is mounted in the component hierarchy |
-| keyboardTopOffset | ios:22, android:0 | `number` | This property prevent the modal to cover the ios status bar when the modal is scrolling up because the keyboard is opening |
-| useNativeDriver | true | `bool` | Enables the hardware acceleration to animate the modal. Please note that enabling this can cause some flashes in a weird way when animating |
+| Name  | Description  | Type | Required  |Platform|HarmonyOS Support |
+| :------------ |:---------------:| :---------------:|:---------------:|:---------------:|:---------------:|
+| isOpen  | Open/close the modal, optional, you can use the open/close methods instead  | `bool`  | no  | IOS/Android  | yes  |
+| isDisabled  | Disable any action on the modal (open, close, swipe)  | `bool`  | no  | IOS/Android  | yes  |
+| backdropPressToClose  | Close the the modal by pressing on the backdrop  | `bool`  | no  | IOS/Android  | yes  |
+| swipeToClose  | Set to true to enable the swipe down to close feature | `bool`  | no  | IOS/Android  | yes  |
+| swipeThreshold  | The threshold to reach in pixels to close the modal | `number`  | no  | IOS/Android  | yes  |
+| swipeArea  | The height in pixels of the swipeable area, window height by default | `number`  | no  | IOS/Android  | yes  |
+| position  | Control the modal position using top or center or bottom | `string`  | no  | IOS/Android  | yes  |
+| entry  | Control the modal entry position top or bottom | `string`  | no  | IOS/Android  | yes  |
+| backdrop  | Display a backdrop behind the modal | `bool`  | no  | IOS/Android  | yes  |
+| backdropOpacity  | Opacity of the backdrop | `number`  | no  | IOS/Android  | yes  |
+| backdropColor  | backgroundColor of the backdrop | `string`  | no  | IOS/Android  | yes  |
+| backdropContent  | Add an element in the backdrop (a close button for example) | `ReactElement`  | no  | IOS/Android  | yes  |
+| animationDuration  | Duration of the animation | `number`  | no  | IOS/Android  | yes  |
+| easing  | Easing function applied to opening modal animation | `function`  | no  | IOS/Android  | yes  |
+| backButtonClose  | (Android only) Close modal when receiving back button event | `bool`  | no  | Android  | yes  |
+| startOpen  | Allow modal to appear open without animation upon first mount| `bool`  | no  | IOS/Android  | yes  |
+| coverScreen  | Will use RN Modal component to cover the entire screen wherever the modal is mounted in the component hierarchy| `bool`  | no  | IOS/Android  | yes  |
+| keyboardTopOffset  | This property prevent the modal to cover the ios status bar when the modal is scrolling up because the keyboard is opening| `number`  | no  | IOS/Android  | yes  |
+| useNativeDriver  | Enables the hardware acceleration to animate the modal. Please note that enabling this can cause some flashes in a weird way when animating| `bool`  | no  | IOS/Android  | yes  |
 
 ## 事件
-| Prop  | Params  | Description |
-| :------------ |:---------------:| :---------------:|
-| onClosed | - | When the modal is close and the animation is done |
-| onOpened | - | When the modal is open and the animation is done |
-| onClosingState | state `bool` | When the state of the swipe to close feature has changed (usefull to change the content of the modal, display a message for example) |
+| Name  | Description  | Type | Required  |Platform|HarmonyOS Support |
+| :------------ |:---------------:| :---------------:|:---------------:|:---------------:|:---------------:|
+| onClosed  | When the modal is close and the animation is done  | `function`  | no  | IOS/Android  | yes  |
+| onOpened  | When the modal is open and the animation is done | `function`  | no  | IOS/Android  | yes  |
+| onClosingState  | When the state of the swipe to close feature has changed (usefull to change the content of the modal, display a message for example)  | `function`  | no  | IOS/Android  | yes  |
 
 ## 方法
 hese methods are optional, you can use the isOpen property instead   
 
-| Prop  | Params  | Description |
-| :------------ |:---------------:| :---------------:|
-| open | - | Open the modal |
-| close | - | Close the modal |
+
+| Name  | Description  | Type | Required  |Platform|HarmonyOS Support |
+| :------------ |:---------------:| :---------------:|:---------------:|:---------------:|:---------------:|
+| open  | Open the modal  | `function`  | no  | IOS/Android  | yes  |
+| close  | Close the modal | `function`  | no  | IOS/Android  | yes  |
 
 
 
From bf75e12f0722e41ad8377b000cba3eb356efdeae Mon Sep 17 00:00:00 2001
From: anghuang 
Date: Fri, 7 Jun 2024 15:28:23 +0800
Subject: [PATCH 004/966] =?UTF-8?q?fix:=20[Issues:=20#I9VQPS]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9reacr-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
index 0cf80b47..08d1ecb3 100644
--- a/zh-cn/react-native-modalbox.md
+++ b/zh-cn/react-native-modalbox.md
@@ -16,7 +16,7 @@
 
 ## 安装与使用
 
-请到github上的发布地址查看配套的版本信息:(https://github.com/maxs15/react-native-modalbox master),并下载适用版本的 tgz 包。
+请到github上的发布地址查看配套的版本信息:(https://github.com/maxs15/react-native-modalbox),并下载适用版本的 tgz 包。
 
 进入到工程目录并输入以下命令:
 
@@ -27,13 +27,13 @@
 #### **npm**
 
 ```bash
-npm install react-native-modalbox@2.0.2 --save
+npm install react-native-modalbox@2.0.2
 ```
 
 #### **yarn**
 
 ```bash
-yarn add react-native-modalbox@2.0.2 --save
+yarn add react-native-modalbox@2.0.2
 ```
 
 
From 605dd6a3e5d4c1eddb6721f003b6267e7c508e61 Mon Sep 17 00:00:00 2001
From: anghuang 
Date: Fri, 7 Jun 2024 15:41:37 +0800
Subject: [PATCH 005/966] =?UTF-8?q?fix:=20[Issues:=20#I9VQPS]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9reacr-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 5 -----
 1 file changed, 5 deletions(-)
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
index 08d1ecb3..299d6276 100644
--- a/zh-cn/react-native-modalbox.md
+++ b/zh-cn/react-native-modalbox.md
@@ -16,11 +16,6 @@
 
 ## 安装与使用
 
-请到github上的发布地址查看配套的版本信息:(https://github.com/maxs15/react-native-modalbox),并下载适用版本的 tgz 包。
-
-进入到工程目录并输入以下命令:
-
-> [!TIP] # 处替换为 tgz 包的路径
 
 
 
From 1d163f46b1799dec8a2b4725b62e82236740a8e6 Mon Sep 17 00:00:00 2001
From: kongchuiyu 
Date: Tue, 18 Jun 2024 14:31:47 +0800
Subject: [PATCH 006/966] =?UTF-8?q?docs:=20[Issues:=20#I9TNRW]=20=E6=B7=BB?=
 =?UTF-8?q?=E5=8A=A0=20react-native-zoomable-view=20=E6=8C=87=E5=AF=BC?=
 =?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-zoom-able-view.md | 188 +++++++++++++++++++++++++++
 1 file changed, 188 insertions(+)
 create mode 100644 zh-cn/react-native-zoom-able-view.md
diff --git a/zh-cn/react-native-zoom-able-view.md b/zh-cn/react-native-zoom-able-view.md
new file mode 100644
index 00000000..d3ce57bf
--- /dev/null
+++ b/zh-cn/react-native-zoom-able-view.md
@@ -0,0 +1,188 @@
+> 模板版本:v0.2.2
+
+
+  
 react-native-zoomable-view  
+
+
+    
+         
+    
+         
+
+
+> [!TIP] [Github 地址](https://github.com/openspacelabs/react-native-zoomable-view)
+
+## 安装与使用
+
+进入到工程目录并输入以下命令:
+
+
+
+#### **npm**
+
+```bash
+npm install @openspacelabs/react-native-zoomable-view@2.1.6
+```
+
+#### **yarn**
+
+```bash
+yarn add @openspacelabs/react-native-zoomable-view@2.1.6
+```
+
+
+
+下面的代码展示了这个库的基本使用场景:
+
+> [!WARNING] 使用时 import 的库名不变。
+
+```js
+import { View, StyleSheet, Image, Animated } from "react-native";
+import React from "react";
+import { ReactNativeZoomableView } from "@openspacelabs/react-native-zoomable-view";
+
+export function ReactNativeZoomableViewExample() {
+  const zoomAnimatedValue = React.useRef(new Animated.Value(1)).current;
+  const scale = Animated.divide(1, zoomAnimatedValue);
+  return (
+    
+      
+        
+          
+             
+         
+       
+     
+  );
+}
+
+const styles = StyleSheet.create({
+  container: {
+    flex: 1,
+    alignItems: "center",
+    justifyContent: "center",
+    padding: 20,
+  },
+  contents: {
+    flex: 1,
+    alignSelf: "stretch",
+  },
+  box: {
+    borderWidth: 5,
+    flexShrink: 1,
+    height: 500,
+    width: 310,
+  },
+  img: {
+    width: "100%",
+    height: "100%",
+    resizeMode: "contain",
+  },
+  marker: {
+    position: "absolute",
+    top: "50%",
+    left: "50%",
+    width: 20,
+    height: 20,
+    marginLeft: -10,
+    marginTop: -10,
+    borderRadius: 10,
+    backgroundColor: "white",
+    borderWidth: 2,
+  },
+});
+```
+
+## 约束与限制
+
+### 兼容性
+
+本文档内容基于以下版本验证通过:
+
+1. RNOH: 0.72.26; SDK:HarmonyOS NEXT Developer Beta1; IDE:DevEco Studio 5.0.3.300; ROM:3.0.0.25;
+
+## 属性
+
+> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
+
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+
+| Name                       | Type     | Description                                                      | Required | Platform | HarmonyOS Support |
+| -------------------------- | -------- | ---------------------------------------------------------------- | -------- | -------- | ----------------- |
+| zoomEnabled                | boolean  | Can be used to enable or disable the zooming dynamically                                                                                                                                                                                                                                                                             | no       | All      | yes               |
+| panEnabled                 | boolean  | Can be used to enable or disable the panning dynamically                                                                                                                                                                                                                                                                             | no       | All      | yes               |
+| initialZoom                | number   | Initial zoom level on startup                                                                                                                                                                                                                                                                                                        | no       | All      | yes               |
+| maxZoom                    | number   | Maximum possible zoom level (zoom in). Can be set to`null` to allow unlimited zooming                                                                                                                                                                                                                                                | no       | All      | yes               |
+| minZoom                    | number   | Minimum possible zoom level (zoom out)                                                                                                                                                                                                                                                                                               | no       | All      | yes               |
+| disablePanOnInitialZoom    | boolean  | If true, panning is disabled when zoom level is equal to the initial zoom level                                                                                                                                                                                                                                                      | no       | All      | yes               |
+| doubleTapDelay             | number   | How much delay will still be recognized as double press (ms)                                                                                                                                                                                                                                                                         | no       | All      | yes               |
+| doubleTapZoomToCenter      | boolean  | If true, double tapping will always zoom to center of View instead of the direction it was double tapped in                                                                                                                                                                                                                          | no       | All      | yes               |
+| bindToBorders              | boolean  | If true, it makes sure the object stays within box borders                                                                                                                                                                                                                                                                           | no       | All      | yes               |
+| zoomStep                   | number   | How much zoom should be applied on double tap                                                                                                                                                                                                                                                                                        | no       | All      | yes               |
+| pinchToZoomInSensitivity   | number   | the level of resistance (sensitivity) to zoom in (0 - 10) - higher is less sensitive                                                                                                                                                                                                                                                 | no       | All      | yes               |
+| pinchToZoomOutSensitivity  | number   | the level of resistance (sensitivity) to zoom out (0 - 10) - higher is less sensitive                                                                                                                                                                                                                                                | no       | All      | yes               |
+| movementSensibility        | number   | how resistant should shifting the view around be? (0.5 - 5) - higher is less sensitive                                                                                                                                                                                                                                               | no       | All      | yes               |
+| initialOffsetX             | number   | The horizontal offset the image should start at                                                                                                                                                                                                                                                                                      | no       | All      | yes               |
+| initialOffsetY             | number   | The vertical offset the image should start at                                                                                                                                                                                                                                                                                        | no       | All      | yes               |
+| contentHeight              | number   | Specify if you want to treat the height of the**centered** content inside the zoom subject as the zoom subject's height                                                                                                                                                                                                              | no       | All      | yes               |
+| contentWidth               | number   | Specify if you want to treat the width of the**centered** content inside the zoom subject as the zoom subject's width                                                                                                                                                                                                                | no       | All      | yes               |
+| panBoundaryPadding         | number   | At certain scales, the edge of the content is bounded too close to the edge of the container, making it difficult to pan to and interact with the edge of the content. To fix this, we'd wanna allow the content to pan just a little further away from the container's edge. Hence, the "pan boundary padding", measured in pixels. | no       | All      | yes               |
+| longPressDuration          | number   | Duration in ms until a press is considered a long press                                                                                                                                                                                                                                                                              | no       | All      | yes               |
+| visualTouchFeedbackEnabled | boolean  | Whether to show a touch feedback circle on touch                                                                                                                                                                                                                                                                                     | no       | All      | yes               |
+| onTransform                | function | Will be called when the transformation configuration (zoom level and offset) changes                                                                                                                                                                                                                                                 | no       | All      | yes               |
+| onDoubleTapBefore          | function | Will be called, at the start of a double tap                                                                                                                                                                                                                                                                                         | no       | All      | yes               |
+| onDoubleTapAfter           | function | Will be called at the end of a double tap                                                                                                                                                                                                                                                                                            | no       | All      | yes               |
+| onShiftingBefore           | function | Will be called, when user taps and moves the view, but before our view movement work kicks in (so this is the place to interrupt movement, if you need to)                                                                                                                                                                           | no       | All      | yes               |
+| onShiftingAfter            | function | Will be called, when user taps and moves the view, but after the values have changed already                                                                                                                                                                                                                                         | no       | All      | yes               |
+| onShiftingEnd              | function | Will be called, when user stops a tap and move gesture                                                                                                                                                                                                                                                                               | no       | All      | yes               |
+| onZoomBefore               | function | Will be called, while the user pinches the screen, but before our zoom work kicks in (so this is the place to interrupt zooming, if you need to)                                                                                                                                                                                     | no       | All      | yes               |
+| onZoomAfter                | function | Will be called, while the user pinches the screen, but after the values have changed already                                                                                                                                                                                                                                         | no       | All      | yes               |
+| onZoomEnd                  | function | Will be called after pinchzooming has ended                                                                                                                                                                                                                                                                                          | no       | All      | yes               |
+| onLongPress                | function | Will be called after the user pressed on the image for a while                                                                                                                                                                                                                                                                       | no       | All      | yes               |
+| onStartShouldSetPanResponder                     | function |     Determines whether the view group responds to touch events when a finger is pressed.      | no       | All      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onPanResponderGrant                     | function |     The gesture has started      | no       | All      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onPanResponderEnd                     | function |    Will be called when gesture ends (more accurately, on pan responder "release")       | no       | All      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onPanResponderTerminate                     | function |    Will be called when the gesture is force-interrupted by another handler       | no       | All      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onPanResponderTerminationRequest                     | function |    Callback asking whether the gesture should be interrupted by another handler       | no       | IOSs      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onPanResponderMove                     | function |    Will be called when user moves while touching       | no       | All      | yes               |                                                                                                                                                                                                                                                                | no       | All      | yes               |
+| onShouldBlockNativeResponder                     | function |   Returns whether this component should block native components from becoming the JS responder   | no       | All      | yes               |
+
+| zoomTo                     | function | Changes the zoom level to a specific number                                                                                                                                                                                                                                                                                          | no       | All      | yes               |
+| zoomBy                     | function | Changes the zoom level relative to the current level (use positive numbers to zoom in, negative numbers to zoom out)                                                                                                                                                                                                                 | no       | All      | yes               |
+| moveTo                     | function | Shifts the zoomed part to a specific point (in px relative to x: 0, y: 0)                                                                                                                                                                                                                                                            | no       | All      | yes               |
+| moveBy                     | function | Shifts the zoomed part by a specific pixel number                                                                                                                                                                                                                                                                                    | no       | All      | yes               |
+
+## 遗留问题
+
+## 其他
+
+## 开源协议
+
+本项目基于 [The MIT License (MIT)](https://github.com/openspacelabs/react-native-zoomable-view/blob/master/LICENSE) ,请自由地享受和参与开源。
From e0eee02419a9d1abd8c39c98192e6acfec4af5f0 Mon Sep 17 00:00:00 2001
From: qinlianao 
Date: Tue, 18 Jun 2024 15:39:19 +0800
Subject: [PATCH 007/966] =?UTF-8?q?docs:=20[issues:=20#IA60F2]=20=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9Ereact-native-dynamic=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-dynamic.md | 206 ++++++++++++++++++++++++++++++++++
 1 file changed, 206 insertions(+)
 create mode 100644 zh-cn/react-native-dynamic.md
diff --git a/zh-cn/react-native-dynamic.md b/zh-cn/react-native-dynamic.md
new file mode 100644
index 00000000..2f3c81a4
--- /dev/null
+++ b/zh-cn/react-native-dynamic.md
@@ -0,0 +1,206 @@
+> 模板版本:v0.2.2
+
+
+  
 react-native-dynamic  
+
+
+    
+         
+    
+         
+
+
+> [!TIP] [Github 地址](https://github.com/codemotionapps/react-native-dynamic)
+
+
+## 安装与使用
+
+进入到工程目录并输入以下命令:
+
+
+
+#### **npm**
+
+```bash
+npm install react-native-dynamic@1.0.0
+```
+
+#### **yarn**
+
+```bash
+yarn add react-native-dynamic@1.0.0
+```
+
+
+
+下面的代码展示了这个库的基本使用场景:
+
+>[!WARNING] 使用时 import 的库名不变。
+
+```js
+import React, { useState } from 'react';
+import {
+    View,
+    Text, 
+    Image, 
+    Button
+} from 'react-native';
+import {
+    useDarkMode,
+	useDarkModeContext,
+	DynamicValue,
+	DynamicStyleSheet,
+	DarkModeProvider,
+	useDynamicValue,
+	ColorSchemeProvider,
+	useColorSchemeContext,
+	useDynamicStyleSheet
+} from 'react-native-dynamic'
+import { Tester, TestSuite, TestCase } from '@rnoh/testerino';
+
+export default function Extra() {
+	const mode = useDarkModeContext()
+	const styles = useDynamicStyleSheet(dynamicStyleSheet)
+	return (
+		
+			Forced mode: {mode} 
+		 
+	)
+}
+
+const dynamicStyleSheet = new DynamicStyleSheet({
+	container: {
+		borderColor: 'red',
+		borderWidth: 1,
+		backgroundColor: new DynamicValue('white', 'black'),
+		width: 150,
+		height: 50,
+		justifyContent: 'center',
+		alignItems: 'center',
+	},
+	text: {
+		textAlign: 'center',
+		color: new DynamicValue('black', 'white'),
+	},
+})
+
+function Counter() {
+	const [counter, setCounter] = useState(0)
+	return  setCounter((i) => i + 1)} />
+}
+
+const backgroundColors = {
+	light: 'white',
+	dark: 'black',
+}
+
+function Components() {
+	const styles = useDynamicValue(dynamicStyles)
+
+	return (
+		
+			My text 
+		 
+	)
+}
+
+export function ReactNativeDynamic() {
+	const mode = useDarkModeContext()
+	const mode2 = useColorSchemeContext()
+	const backgroundColor = backgroundColors[mode2]
+    const isDarkMode = useDarkMode()
+	const styles = useDynamicValue(dynamicStyles)
+	return (
+		
+			
+        		
+					
+						
+							 
+						
+							 
+					 	
+        		 
+      		 
+			Current mode: {mode} 
+			Is dark mode: {isDarkMode ? 'black' : 'white'} 
+
+			
+				 
+
+			
+				 
+
+			 
+	)
+}
+
+const dynamicStyles = new DynamicStyleSheet({
+	container: {
+		flex: 1,
+		justifyContent: 'center',
+		alignItems: 'center',
+		backgroundColor: new DynamicValue('#FFFFFF', '#000000'),
+	},
+	initialStyle: {
+		fontSize: 20,
+		textAlign: 'center',
+		margin: 10,
+		color: new DynamicValue('#000000', '#FFFFFF'),
+	},
+	image: {
+		borderWidth: 1,
+		borderColor: new DynamicValue('#000000', '#FFFFFF'),
+		width: 80,
+		height: 80,
+	},
+	meme: {
+		width: '100%',
+		height: 200,
+		marginBottom: 20,
+	},
+	text: {
+		color: new DynamicValue('black', 'white'),
+		textAlign: 'center',
+	},
+})
+
+```
+## 约束与限制
+
+### 兼容性
+
+本文档内容基于以下版本验证通过:
+
+1. RNOH:0.72.26; SDK:HarmonyOS NEXT Developer Beta1;IDE:DevEco Studio 5.0.3.300; ROM:3.0.0.24;
+
+## 属性
+
+> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
+
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+
+| Prop   | Description   | Type       | Required | Platform | HarmonyOS Support |
+| ----- | ----- | -------- | -------- | -------- | -------- |
+| `useDarkMode`  | Returns a boolean. true when dark mode is on. |  function | no     | All  | yes      |
+| `DynamicValue`  | A helper class meant to be used with DynamicStyleSheet and useDynamicValue. The first argument is the value to be used with a light color scheme, the second argument is the value to be used with a dark color scheme. | function  |  no     | All   | yes      |
+| `DynamicStyleSheet`  | Just like StyleSheet but with support for dynamic values.| function  |  no     | All   | yes      |
+| `ColorSchemeProvider`  | Allows you to set a specific mode for children.| function  |  no     | All   | yes      |
+| `useDynamicValue`  | Returns the appropriate value depending on the theme. You can either pass a DynamicValue, an object containing dark and light properties, or just two arguments.| function  |  no     | All   | yes      |
+| `useColorSchemeContext`  | Returns dark or light but reads value from context.| function  |  no     | All   | yes      |
+
+
+## 遗留问题
+
+## 其他
+
+## 开源协议
+本项目基于 [The MIT License (MIT)](https://github.com/codemotionapps/react-native-dynamic/blob/master/LICENSE) ,请自由地享受和参与开源。
\ No newline at end of file
From 0796c5bd446544fc5863cfb8d62a21611ee263af Mon Sep 17 00:00:00 2001
From: dong 
Date: Tue, 18 Jun 2024 18:14:22 +0800
Subject: [PATCH 008/966] =?UTF-8?q?docs:=20[Issues:=20#IA50OS]=20=E6=B7=BB?=
 =?UTF-8?q?=E5=8A=A0react-native-qr-decode-image-camera=E6=8C=87=E5=AF=BC?=
 =?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-qr-decode-image-camera.md | 336 +++++++++++++++++++
 1 file changed, 336 insertions(+)
 create mode 100644 zh-cn/react-native-qr-decode-image-camera.md
diff --git a/zh-cn/react-native-qr-decode-image-camera.md b/zh-cn/react-native-qr-decode-image-camera.md
new file mode 100644
index 00000000..eff206cb
--- /dev/null
+++ b/zh-cn/react-native-qr-decode-image-camera.md
@@ -0,0 +1,336 @@
+> 模板版本:v0.2.2
+
+
+  
 react-native-qr-decode-image-camera  
+
+
+    
+         
+    
+         
+
+
+> [!TIP] [Github 地址](https://github.com/react-native-oh-library/react-native-qr-decode-image-camera)
+
+## 安装与使用
+
+请到三方库的 Releases 发布地址查看配套的版本信息:[@react-native-oh-tpl/react-native-qr-decode-image-camera](https://github.com/react-native-oh-library/react-native-qr-decode-image-camera/releases),并下载适用版本的 tgz 包。
+
+进入到工程目录并输入以下命令:
+
+> [!TIP] # 处替换为 tgz 包的路径
+
+
+
+#### **npm**
+
+```bash
+npm install @react-native-oh-tpl/react-native-qr-decode-image-camera@file:#
+```
+
+#### **yarn**
+
+```bash
+yarn add @react-native-oh-tpl/react-native-qr-decode-image-camera@file:#
+```
+
+
+
+下面的代码展示了这个库的基本使用场景:
+
+> [!WARNING] 使用时 import 的库名不变。
+
+```js
+import React, {useState} from 'react';
+import {View, Text, Button} from 'react-native';
+import {QRreader, QRscanner} from 'react-native-qr-decode-image-camera';
+import {TestSuite, TestCase, Tester} from '@rnoh/testerino';
+
+export const QRreaderExp = () => {
+  const [reader, setReader] = useState('');
+  const [scanned, setScanned] = useState(false);
+  const [flashMode, setFlashMode] = useState(null); //初始值必须为null;
+  const [textInfo, setTextInfo] = useState('');
+
+  return (
+    
+      
+         {
+            return (
+              
+                 {
+                    QRreader()
+                      .then(res => {
+                        console.log(JSON.stringify(res), 'click');
+                        setReader(res?.[0]?.originalValue);
+                        setState(res?.[0]?.originalValue);
+                      })
+                      .catch(error => {
+                        console.log(error);
+                      });
+                  }}
+                  title="点击选择二维码照片 "
+                />
+                {reader} 
+                
+            );
+          }}
+          assert={async ({expect, state}) => {
+            expect(state).to.be.eq(reader);
+          }}
+        />
+        
+
+       {
+          return (
+            
+               {
+                  setTextInfo('');
+                  setScanned(true); // 开启摄像头
+                }}
+                title="点击扫码 "
+              />
+              {scanned && (
+                 {
+                    console.log(e?.nativeEvent?.result, 'click onRead');
+                    setTextInfo(e?.nativeEvent?.result);
+                    setState(e?.nativeEvent?.result);
+                    setScanned(false);
+                  }}
+                  flashMode={flashMode} //闪光灯
+                  renderTopView={() => (
+                    
+                      
+                        将二维码放入框内,即可自动扫描
+                       
+                     
+                  )}
+                  renderBottomView={() => (
+                    
+                       {
+                          setFlashMode(!flashMode);
+                          console.log('click 点击开启/关闭闪光灯');
+                        }}>
+                        点击开启/关闭闪光灯
+                       
+                     
+                  )}
+                />
+              )}
+              {textInfo} 
+               
+          );
+        }}
+        assert={async ({expect, state}) => {
+          expect(state).to.be.eq(textInfo);
+        }}
+      />
+      
+  );
+};
+```
+## 使用 Codegen
+
+本库已经适配了 `Codegen` ,在使用前需要主动执行生成三方库桥接代码,详细请参考[ Codegen 使用文档](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/codegen.md)。
+
+## Link
+
+目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。
+
+首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony`
+
+### 引入原生端代码
+
+目前有两种方法:
+
+1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法);
+2. 直接链接源码。
+
+方法一:通过 har 包引入
+
+> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。
+
+打开 `entry/oh-package.json5`,添加以下依赖
+
+```json
+"dependencies": {
+    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
+    "@react-native-oh-tpl/react-native-qr-decode-image-camera": "file:../../node_modules/@react-native-oh-tpl/qr_decode_image_camera/harmony/qr_decode_image_camera.har"
+  }
+```
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+方法二:直接链接源码
+
+> [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](/zh-cn/link-source-code.md)
+
+### 在 ArkTs 侧引入 RNQrDecodeImageCameraPackage
+
+打开 `entry/src/main/ets/RNPackagesFactory.ts`,添加:
+
+```diff
+...
++ import { RNQrDecodeImageCameraPackage } from "@react-native-oh-tpl/react-native-qr-decode-image-camera/ts";
+
+export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
+  return [
+    new SamplePackage(ctx),
++   new RNQrDecodeImageCameraPackage(ctx)
+  ];
+}
+```
+### 在 ArkTs 侧引入 Fabric 组件
+找到 function buildCustomRNComponent(),一般位于 entry/src/main/ets/pages/index.ets 或 entry/src/main/ets/rn/LoadBundle.ets,添加:
+
+```diff
+...
++ import { NativeScan } from "@react-native-oh-tpl/react-native-qr-decode-image-camera/ts"
+
+@Builder
+export function buildCustomRNComponent(ctx: ComponentBuilderContext) {
+...
++ if (ctx.componentName === NativeScan.NAME) {
++   NativeScan({
++     ctx: ctx.rnComponentContext,
++     tag: ctx.tag   
++   })
++ }
+...
+}
+...
+```
+### 运行
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+然后编译、运行即可。
+
+## 约束与限制
+
+### 兼容性
+要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机 ROM。
+
+请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[@react-native-oh-tpl/react-native-qr-decode-image-camera](https://github.com/react-native-oh-library/react-native-qr-decode-image-camera/releases)
+
+
+### 权限要求
+在 entry 目录下的module.json5中添加相机权限
+
+打开 entry/src/main/module.json5,添加:
+
+```diff
+...
+"requestPermissions": [
++  {
++    "name": "ohos.permission.CAMERA",
++    "reason": "$string:Qr_decode_image_cameraAbility_desc",
++    "usedScene": {
++      "abilities": [
++        "NativeScan"
++      ],
++      "when":"inuse"
++    }
++  }
+]
+```
+
+## 静态方法
+
+> [!TIP] "Platform"列表示该属性在原三方库上支持的平台。
+>
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+>
+详情请查看[react-native-qr-decode-image-camera官方文档](https://github.com/deepanrajkumar/react-native-qr-decode-image-camera)
+ | Name                          | Description                                          | Type    | Required | Platform    | HarmonyOS Support |
+ | ----------------------------- | ---------------------------------------------------- | ------- | -------- | ----------- | ----------------- |
+ | QRreader | 调用此方法,调起图库,选择选择二维码图片进行图片解码,异步返回结果 | funtion | no       | IOS/Android | yes               |
+## 属性
+### QRscanner 
+
+> [!TIP] "Platform"列表示该属性在原三方库上支持的平台。
+>
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+>
+
+| Name                          | Description                                          | Type    | Required | Platform    | HarmonyOS Support |
+| ----------------------------- | ---------------------------------------------------- | ------- | -------- | ----------- | ----------------- |
+| isRepeatScan | whether to allow repeated scanning | boolean | no       | IOS/Android | no               |
+| zoom | Camera focal length range 0-1 | number | no       | IOS/Android | yes               |
+| flashMode |Turn on the flashlight |boolean | no       | IOS/Android | yes               |
+| onRead |scan callback |funtion | yes       | IOS/Android | yes|
+| maskColor |mask layer color |string | no       | IOS/Android | yes|
+| borderColor |border color |string | no       | IOS/Android | yes|
+| cornerColor |Color of corner of scan frame |string | no       | IOS/Android | yes|
+| borderWidth |border width of scan frame |number | no       | IOS/Android | yes|
+| cornerBorderWidth |border width of scan frame corner |number | no       | IOS/Android | yes|
+| cornerBorderLength |	width and height of the corner of the scan frame |number | no       | IOS/Android | yes|
+| rectHeight |	Scan frame height |number | no       | IOS/Android | yes|
+| rectWidth |	Scan Frame Width |number | no       | IOS/Android | yes|
+| finderX |scan frame X axis offset |number | no       | IOS/Android | yes|
+| finderY |scan frame Y axis offset |number | no       | IOS/Android | yes|
+| isCornerOffset |whether the corners are offset |boolean | no       | IOS/Android | yes|
+| cornerOffsetSize |offset |number | no       | IOS/Android | yes|
+| bottomHeight |Reserved height at the bottom |number | no       | IOS/Android | yes|
+| scanBarAnimateTime |scan line time |number | no       | IOS/Android | yes|
+| scanBarColor |scan line color |string | no       | IOS/Android | yes|
+| scanBarImage |scan line image |any | no       | IOS/Android | yes|
+| scanBarHeight |scan line height |number | no       | IOS/Android | yes|
+| scanBarMargin |scanline left and right margin |number | no       | IOS/Android | yes|
+| hintText |hintText |string | no       | IOS/Android | yes|
+| hintTextStyle |hint string style |object | no       | IOS/Android | yes|
+| hintTextPosition |hintTextPosition |number | no       | IOS/Android | yes|
+| renderTopView |render top View |funtion | no       | IOS/Android | yes|
+| renderBottomView |render bottom View|funtion | no       | IOS/Android | yes|
+| isShowScanBar |whether to show scan lines|boolean | no       | IOS/Android | yes|
+| topViewStyle |render top container style|object | no       | IOS/Android | yes|
+| bottomViewStyle |render bottom container style|object | no       | IOS/Android | yes|
+## 遗留问题
+
+## 其他
+
+## 开源协议
+
+本项目基于 [The MIT License (MIT)](https://github.com/deepanrajkumar/react-native-qr-decode-image-camera/blob/master/LICENSE) ,请自由地享受和参与开源。
From 3d8da0556a96b0798163b160971df6ff41fdbea8 Mon Sep 17 00:00:00 2001
From: wushuwang 
Date: Tue, 18 Jun 2024 19:26:16 +0800
Subject: [PATCH 009/966] =?UTF-8?q?docs:=20[Issues:=20#I9OQKZ]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9react-native-touch-id=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-touch-id.md | 85 +++++++++++++++++-----------------
 1 file changed, 43 insertions(+), 42 deletions(-)
diff --git a/zh-cn/react-native-touch-id.md b/zh-cn/react-native-touch-id.md
index 7d9f537e..06397acc 100644
--- a/zh-cn/react-native-touch-id.md
+++ b/zh-cn/react-native-touch-id.md
@@ -1,4 +1,4 @@
-> 模板版本:v0.2.0
+> 模板版本:v0.2.2
 
 
   
 react-native-touch-id  
@@ -44,34 +44,30 @@ yarn add @react-native-oh-tpl/react-native-touch-id@file:#
 > [!WARNING] 使用时 import 的库名不变。
 
 ```js
-import React from "react";
-import {
-  Alert,
-  Text,
-  View,
-  Button
-} from 'react-native';
+import React, { Component, useState } from 'react';
+import { Alert, View, Button, Text } from 'react-native';
 import TouchID from 'react-native-touch-id';
 
 const App = () => {
+  const [result, setResult] = useState('')
   return (
-    
+     
+      {result} 
        {
           TouchID.isSupported({ unifiedErrors: false }).then((res: any) => {
-            Alert.alert(res)
+            setResult(res)
           }).catch((err: any) => {
-            Alert.alert(JSON.stringify(err.message))
+            setResult(err.message)
           })
         }}
       > 
-
        {
-          TouchID.authenticate().then((res:boolean)=>{
-            Alert.alert("认证成功")
-          }).catch((err:any)=>{
-            Alert.alert(err.message)
+          TouchID.authenticate().then((res: boolean) => {
+            setResult('认证成功')
+          }).catch((err: any) => {
+            setResult(err.message)
           })
         }}
       > 
@@ -82,7 +78,9 @@ const App = () => {
 export default App;
 
 ```
+## 使用 Codegen
 
+本库已经适配了 `Codegen` ,在使用前需要主动执行生成三方库桥接代码,详细请参考[ Codegen 使用文档](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/codegen.md)。
 ## Link
 
 目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。
@@ -131,37 +129,21 @@ ohpm install
 
 方法二:直接链接源码
 
-> [!TIP] 源码位于三方库安装路径的 `harmony` 文件夹下。
-
-打开 `entry/oh-package.json5`,添加以下依赖
-
-```json
-"dependencies": {
-    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
-    "@react-native-oh-tpl/react-native-touch-id": "file:../../node_modules/@react-native-oh-tpl/react-native-touch-id/harmony/touch_id"
-  }
-```
-
-打开终端,执行:
-
-```bash
-cd entry
-ohpm install --no-link
-```
+> [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](/zh-cn/link-source-code.md)
 
 
-### 在 ArkTs 侧引入 CalculatorPackage
+### 在 ArkTs 侧引入 TouchIdPackage
 
 打开 `entry/src/main/ets/RNPackagesFactory.ts`,添加:
 
 ```diff
 ...
-+ import { CalculatorPackage } from "@react-native-oh-tpl/react-native-touch-id/ts";
++ import { TouchIdPackage } from "@react-native-oh-tpl/react-native-touch-id/ts";
 
 export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
   return [
     new SamplePackage(ctx),
-+   new CalculatorPackage(ctx)
++   new TouchIdPackage(ctx)
   ];
 }
 ```
@@ -189,10 +171,6 @@ ohpm install
 请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[@react-native-oh-tpl/react-native-touch-id Releases](https://github.com/react-native-oh-library/react-native-touch-id/releases)
 
 
-本文档内容基于以下版本验证通过:
-
-1. RNOH:0.72.20; SDK:HarmonyOS NEXT Developer Beta1; IDE:DevEco Studio 5.0.3.200; ROM:3.0.0.18
-
 ### 权限要求
 
 (填入相关权限配置)
@@ -217,9 +195,32 @@ In your `module.json5`
 
 | Name | Description | Type | Required | Platform | HarmonyOS Support  |
 | ---- | ----------- | ---- | -------- | -------- | ------------------ |
-| isSupported  | 是否支持指纹         | function  | yes | ios/andriod      | yes |
-| authenticate  | 验证指纹         | function  | yes | ios/andriod      | yes |
+| isSupported  | Whether touchid is supported | function  | yes | ios/andriod      | yes |
+| authenticate  | Verify touchid | function  | yes | ios/andriod      | yes |
+## 属性
+
+> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
+
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
 
+### Errors
+
+| Name | Description | Type | Required | Platform | HarmonyOS Support  |
+| ---- | ----------- | ---- | -------- | -------- | ------------------ |
+| Touch ID Error  | Permission verification failed | string  | no | harmonry      | yes |
+| Touch ID Error  | Incorrect parameters | string  | no | harmonry      | yes |
+| Touch ID Error  | Authentication failed  | string  | no | harmonry  | yes |
+| Touch ID Error  | The operation is canceled   | string  | no | harmonry  | yes |
+| Touch ID Error  | The operation is time-out | string  | no | harmonry  | yes |
+| Touch ID Error  | The authentication type is not supported   | string | no | harmonry  | yes |
+| Touch ID Error  | The authentication trust level is not supported | string  | no | harmonry      | yes |
+| Touch ID Error  | The authentication task is busy | string  | no | harmonry      | yes |
+| Touch ID Error  | The authenticator is locked  | string  | no | harmonry  | yes |
+| Touch ID Error  | General operation error   | string  | no | harmonry  | no |
+| Touch ID Error  | The authentication type is not supported | string  | no | harmonry  | yes |
+| Touch ID Error  | The type of credential has not been enrolled   | string | no | harmonry  | yes |
+| Touch ID Error  | The authentication is canceled from widget's navigation button   | string | no | harmonry  | yes |
+| Touch ID Error  | Indicates that current authentication failed because of PIN expired   | string | no | harmonry  | yes |
 ## 遗留问题
 
 ## 其他
From 5cbbf0aa084133d1be02536779a24a9a77cfb3d1 Mon Sep 17 00:00:00 2001
From: qianyu 
Date: Tue, 18 Jun 2024 19:48:01 +0800
Subject: [PATCH 010/966] =?UTF-8?q?docs:=20=20[Issues:=20#IA4XW6]=20?=
 =?UTF-8?q?=E4=BF=AE=E6=94=B9react-native-ble-manager=E6=8C=87=E5=AF=BC?=
 =?UTF-8?q?=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-ble-manager.md | 592 ++++++++++++++++++++++++++++++
 1 file changed, 592 insertions(+)
 create mode 100644 zh-cn/react-native-ble-manager.md
diff --git a/zh-cn/react-native-ble-manager.md b/zh-cn/react-native-ble-manager.md
new file mode 100644
index 00000000..db889662
--- /dev/null
+++ b/zh-cn/react-native-ble-manager.md
@@ -0,0 +1,592 @@
+> 模板版本:v0.2.2
+
+
+  
 react-native-ble-manager  
+
+
+    
+         
+    
+         
+
+
+
+> [!TIP] [Github 地址](https://github.com/react-native-oh-library/react-native-ble-manager)
+
+## 安装与使用
+
+请到三方库的 Releases 发布地址查看配套的版本信息:[@react-native-oh-tpl/react-native-ble-manager Releases](https://github.com/react-native-oh-library/react-native-ble-manager/releases),并下载适用版本的 tgz 包。
+
+进入到工程目录并输入以下命令:
+
+> [!TIP] # 处替换为 tgz 包的路径
+
+
+
+#### **npm**
+
+```bash
+npm install @react-native-oh-tpl/react-native-ble-manager@file:#
+```
+
+#### **yarn**
+
+```bash
+yarn add @react-native-oh-tpl/react-native-ble-manager@file:#
+```
+
+
+
+下面的代码展示了这个库的基本使用场景:
+
+> [!WARNING] 使用时 import 的库名不变。
+
+```js
+import React, { useState, useEffect } from 'react';
+import { ScrollView, StyleSheet, Button, View, Text, NativeEventEmitter, NativeModules, TouchableHighlight, FlatList, Alert } from 'react-native';
+import ReactNativeBleManager from 'react-native-ble-manager';
+import { Peripheral } from 'react-native-ble-manager';
+import { Colors } from 'react-native/Libraries/NewAppScreen';
+
+
+declare module '@react-native-oh-tpl/react-native-ble-manager' {
+    interface Peripheral {
+        connected?: boolean;
+        connecting?: boolean;
+    }
+}
+
+export enum BleState {
+    Unknown = "unknown",
+    Resetting = "resetting",
+    Unsupported = "unsupported",
+    Unauthorized = "unauthorized",
+    On = "on",
+    Off = "off",
+    TurningOn = "turning_on",
+    TurningOff = "turning_off",
+}
+
+export enum BleScanMatchMode {
+    Aggressive = 1,
+    Sticky = 2,
+}
+
+export enum BleScanMode {
+    Opportunistic = -1,
+    LowPower = 0,
+    Balanced = 1,
+    LowLatency = 2,
+}
+
+const BleManagerModule = NativeModules.BleManager;
+const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);
+
+export default function BleManagerDemo() {
+    useEffect(() => {
+        listeners
+    })
+
+    const [result, setResult] = useState('');
+    const [deviceId, setDeviceId] = useState('')
+
+
+    const [peripherals, setPeripherals] = useState(
+        new Map(),
+    );
+
+
+    const handleDiscoverPeripheral = (peripheral: Peripheral) => {
+        setResult(JSON.stringify(peripheral))
+        setDeviceId(peripheral.id);
+        if (!peripheral.name) {
+            peripheral.name = 'NO NAME';
+        }
+        setPeripherals(map => {
+            return new Map(map.set(peripheral.id, peripheral));
+        });
+    };
+
+    const listeners = [
+        bleManagerEmitter.addListener('BleManagerDiscoverPeripheral', handleDiscoverPeripheral),
+    ];
+
+    const renderItem = ({ item }: { item: Peripheral }) => {
+        return (
+            
+                
+                    
+                        {item.name} - {item?.advertising?.localName}
+                        {item.connecting && ' - Connecting...'}
+                     
+                    RSSI: {item.rssi} 
+                    {item.id} 
+                    {`${item.advertising.isConnectable}`} 
+                    
+                         {
+                            ReactNativeBleManager.connect(item.id)
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.createBond(item.id)
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.retrieveServices(item.id, ['00001888-0000-1000-8000-00805F9B34FB'])
+                        }}> 
+                     
+                    
+                         {
+                            const list = await ReactNativeBleManager.getBondedPeripherals()
+                            console.log('返回已绑定的设备' + JSON.stringify(list))
+                        }}> 
+                     
+                    
+                         {
+                            const list = await ReactNativeBleManager.getConnectedPeripherals()
+                            Alert.alert(JSON.stringify(list))
+                        }}> 
+                     
+
+                    
+                         {
+                            const list = await ReactNativeBleManager.getDiscoveredPeripherals()
+                            Alert.alert(JSON.stringify(list))
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.write(item.id, '00001888-0000-1000-8000-00805F9B34FB', '00001820-0000-1000-8000-00805F9B34FB', [1])
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.writeDescriptor(item.id, '00001888-0000-1000-8000-00805F9B34FB', '00001820-0000-1000-8000-00805F9B34FB', '00002902-0000-1000-8000-00805F9B34FB', [1])
+
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.read(item.id, '00001888-0000-1000-8000-00805F9B34FB', '00001820-0000-1000-8000-00805F9B34FB').then((res)=>{
+                                Alert.alert(JSON.stringify(res))
+                            })
+
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.readDescriptor(item.id, '00001888-0000-1000-8000-00805F9B34FB', '00001820-0000-1000-8000-00805F9B34FB', '00002902-0000-1000-8000-00805F9B34FB')
+
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.readRSSI(item.id).then((data) => {
+                                Alert.alert(data + "")
+                            })
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.requestMTU(item.id, 10).then((res)=>{
+                                Alert.alert(res + "")
+                            })
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.checkState().then((res)=>{
+                                Alert.alert(JSON.stringify(res))
+                            })
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.startNotification(item.id,'00001888-0000-1000-8000-00805F9B34FB', '00001820-0000-1000-8000-00805F9B34FB')
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.stopScan()
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.disconnect(item.id, true)
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.removeBond(item.id).then(() => {
+                                Alert.alert('此接口为系统接口,三方库无法调用')
+                            })
+                        }}> 
+                     
+                 
+             
+        );
+    };
+
+    return (
+        
+            
+                BleManager 
+             
+           
+            
+            
+                         {
+                            ReactNativeBleManager.enableBluetooth()
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.start()
+                        }}> 
+                     
+                    
+                         {
+                            ReactNativeBleManager.scan(['00001888-0000-1000-8000-00805F9B34FB'], 0, true, {
+                                companion: true,
+                                matchMode: BleScanMatchMode,
+                                scanMode: BleScanMode,
+                                reportDelay: 1,
+                                exactAdvertisingName: ''
+                            })
+                        }}> 
+                     
+             
+              item.id}
+                style={{ width: '100%' }}
+            />
+          
+    )
+}
+
+const boxShadow = {
+    shadowColor: '#000',
+    shadowOffset: {
+        width: 0,
+        height: 2,
+    },
+    shadowOpacity: 0.25,
+    shadowRadius: 3.84,
+    elevation: 5,
+};
+
+const styles = StyleSheet.create({
+    container: {
+        width: '100%',
+        height: '100%',
+        flexDirection: 'column',
+        alignItems: 'center',
+        backgroundColor: '#F1F3F5',
+    },
+    baseText: {
+        width: '100%',
+        height: '100%',
+        fontWeight: 'bold',
+        textAlign: 'center',
+        fontSize: 16,
+        ellipsizeMode: 'tail',
+        numberOfLines: 2
+    },
+    titleArea: {
+        width: '90%',
+        height: '8%',
+        alignItems: 'center',
+        flexDirection: 'row',
+    },
+    title: {
+        width: '90%',
+        color: '#000000',
+        textAlign: "center",
+        fontSize: 30,
+        border:5,
+    },
+    scrollView: {
+        width: '90%',
+        marginHorizontal: 10,
+    },
+
+    inputArea: {
+        width: '90%',
+        height: '10%',
+        borderWidth: 2,
+        borderColor: '#000000',
+        marginTop: 8,
+        justifyContent: 'center',
+        alignItems: 'center',
+    },
+    baseArea: {
+        width: '100%',
+        height: 60,
+        borderRadius: 4,
+        borderColor: '#000000',
+        marginTop: 6,
+        backgroundColor: '#FFFFFF',
+        flexDirection: 'row',
+        alignItems: 'center',
+        paddingLeft: 8,
+        paddingRight: 8
+    },
+    engine: {
+        position: 'absolute',
+        right: 10,
+        bottom: 0,
+        color: Colors.black,
+    },
+    buttonGroup: {
+        flexDirection: 'row',
+        width: '100%'
+    },
+    scanButton: {
+        alignItems: 'center',
+        justifyContent: 'center',
+        paddingVertical: 16,
+        paddingHorizontal: 16,
+        backgroundColor: '#0a398a',
+        margin: 10,
+        borderRadius: 12,
+        flex: 1,
+        ...boxShadow,
+    },
+    scanButtonText: {
+        fontSize: 16,
+        letterSpacing: 0.25,
+        color: Colors.white,
+    },
+    body: {
+        backgroundColor: '#0082FC',
+        flex: 1,
+    },
+    sectionContainer: {
+        marginTop: 32,
+        paddingHorizontal: 24,
+    },
+    sectionTitle: {
+        fontSize: 24,
+        fontWeight: '600',
+        color: Colors.black,
+    },
+    sectionDescription: {
+        marginTop: 8,
+        fontSize: 18,
+        fontWeight: '400',
+        color: Colors.dark,
+    },
+    highlight: {
+        fontWeight: '700',
+    },
+    footer: {
+        color: Colors.dark,
+        fontSize: 12,
+        fontWeight: '600',
+        padding: 4,
+        paddingRight: 12,
+        textAlign: 'right',
+    },
+    peripheralName: {
+        fontSize: 16,
+        textAlign: 'center',
+        padding: 10,
+    },
+    rssi: {
+        fontSize: 12,
+        textAlign: 'center',
+        padding: 2,
+    },
+    peripheralId: {
+        fontSize: 12,
+        textAlign: 'center',
+        padding: 2,
+        paddingBottom: 20,
+    },
+    row: {
+        marginLeft: 10,
+        marginRight: 10,
+        borderRadius: 20,
+        ...boxShadow,
+        alignItems: 'center'
+    },
+    noPeripherals: {
+        margin: 10,
+        textAlign: 'center',
+        color: Colors.white,
+    },
+});
+```
+
+## 使用 Codegen
+
+本库已经适配了 `Codegen` ,在使用前需要主动执行生成三方库桥接代码,详细请参考[ Codegen 使用文档](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/codegen.md)。
+
+## Link
+
+目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。
+
+首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony`
+
+### 在工程根目录的 `oh-package.json` 添加 overrides 字段
+
+```json
+{
+  ...
+  "overrides": {
+    "@rnoh/react-native-openharmony" : "./react_native_openharmony"
+  }
+}
+```
+
+### 引入原生端代码
+
+目前有两种方法:
+
+1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法);
+2. 直接链接源码。
+
+方法一:通过 har 包引入(推荐)
+
+> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。
+
+打开 `entry/oh-package.json5`,添加以下依赖
+
+```json
+"dependencies": {
+    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
+    "@react-native-oh-tpl/react-native-ble-manager": "file:../../node_modules/@react-native-oh-tpl/react-native-ble-manager/harmony/ble_manager.har"
+  }
+```
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+方法二:直接链接源码
+
+> [!TIP] 如需使用直接链接源码,请参考[直接链接源码说明](/zh-cn/link-source-code.md)
+
+### 在 ArkTs 侧引入 BlePackage
+
+打开 `entry/src/main/ets/RNPackagesFactory.ts`,添加:
+
+```diff
+...
++ import { BlePackage } from '@react-native-oh-tpl/react-native-ble-manager/ts';
+
+
+export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
+  return [
+    new SamplePackage(ctx),
++    new BlePackage(ctx)
+  ];
+}
+```
+
+### 运行
+
+点击右上角的 `sync` 按钮
+
+或者在终端执行:
+
+```bash
+cd entry
+ohpm install
+```
+
+然后编译、运行即可。
+
+## 约束与限制
+
+### 兼容性
+
+要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机 ROM。
+
+请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[@react-native-oh-tpl/react-native-ble-manager Releases](https://github.com/react-native-oh-library/react-native-ble-manager/releases)
+
+### 权限要求
+
+- 由于此库涉及蓝牙系统控制功能,使用对应接口时则需要配置对应的权限,权限需配置在entry/src/main目录下module.json5文件中。其中部分权限需弹窗向用户申请授权。具体权限配置见文档:[程序访问控制](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/Readme-CN.md#/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/app-permission-mgmt-overview.md)。
+
+- 此库部分功能与接口需要normal权限:ohos.permission.ACCESS_BLUETOOTH。
+
+## API
+
+> [!tip] "Platform"列表示该属性在原三方库上支持的平台。
+
+> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
+
+| Name                                         | Description                                                  | Required | Platform    | HarmonyOS Support |
+| -------------------------------------------- | ------------------------------------------------------------ | -------- | ----------- | ----------------- |
+| start                                        | Init the module. Returns a `Promise` object. Don’t call this multiple times. | No       | IOS/Android | Yes               |
+| scan                                         | Scan for available peripherals                               | No       | IOS/Android | Yes               |
+| stopScan                                     | Stop the scanning                                            | No       | IOS/Android | yes               |
+| connect                                      | Attempts to connect to a peripheral. In many case if you can’t connect you have to scan for the peripheral before | No       | IOS/Android | Yes               |
+| disconnect                                   | Disconnect from a peripheral                                 | No       | IOS/Android | Yes               |
+| enableBluetooth                              | Create the ACTION_REQUEST_ENABLE to ask the user to activate the bluetooth | No       | Android     | Yes               |
+| checkState                                   | Force the module to check the state of the native BLE manager and trigger a BleManagerDidUpdateState event | No       | IOS/Android | Yes               |
+| readRSSI                                     | Read the current value of the RSSI                           | No       | IOS/Android | Yes               |
+| createBond                                   | Start the bonding (pairing) process with the remote device   | No       | Android     | Yes               |
+| retrieveServices                             | Retrieve the peripheral’s services and characteristics       | No       | IOS/Android | Yes               |
+| startNotification                            | Start the notification on the specified characteristic, you need to call `retrieveServices` method before | No       | IOS/Android | Yes               |
+| read                                         | Read the current value of the specified characteristic, you need to call `retrieveServices` method before | No       | IOS/Android | Yes               |
+| write                                        | Write with response to the specified characteristic, you need to call `retrieveServices` method before | No       | IOS/Android | Yes               |
+| readDescriptor                               | Read the current value of the specified descriptor, you need to call `retrieveServices` method before | No       | IOS/Android | Yes               |
+| writeDescriptor                              | Write a value to the specified descriptor, you need to call `retrieveServices` method before | No       | IOS/Android | Yes               |
+| requestMTU                                   | Request an MTU size used for a given connection              | No       | Android     | Yes               |
+| getConnectedPeripherals                      | Return the connected peripherals                             | No       | IOS/Android | Yes               |
+| getBondedPeripherals                         | Return the bonded peripherals                                | No       | IOS/Android | Yes               |
+| getDiscoveredPeripherals                     | Return the discovered peripherals after a scan               | No       | IOS/Android | Yes               |
+| removeBond                                   | Remove a paired device                                       | No       | Android     | No                |
+| refreshCache                                 | refreshes the peripheral’s services and characteristics cache Returns a `Promise` object. | No       | Android     | No                |
+| requestConnectionPriority                    | Request a connection parameter update                        | No       | Android     | No                |
+| startNotificationUseBuffer                   | Start the notification on the specified characteristic, you need to call `retrieveServices` method before | No       | Android     | No                |
+| removePeripheral                             | Removes a disconnected peripheral from the cached list       | No       | Android     | Yes               |
+| CompanionScan                                | Scan for companion devices                                   | No       | Android     | No                |
+| getAssociatedPeripherals                     | Retrive associated peripherals (from companion manager)      | No       | Android     | No                |
+| removeAssociatedPeripheral                   | Remove a associated peripheral                               | No       | Android     | No                |
+| setName                                      | Create the request to set the name of the bluetooth adapter  | No       | Android     | No                |
+| isScanning                                   | Checks whether the scan is in progress and return `true` or `false` | No       | IOS/Android | Yes               |
+| writeWithoutResponse                         | Write without response to the specified characteristic, you need to call `retrieveServices` method before | No       | IOS/Android | No                |
+| getMaximumWriteValueLengthForWithoutResponse | Return the maximum value length for WriteWithoutResponse     | No       | IOS         | No                |
+| getMaximumWriteValueLengthForWithResponse    | Return the maximum value length for WriteWithResponse        | No       | IOS         | No                |
+| isPeripheralConnected                        | Check whether a specific peripheral is connected and return `true` or `false` | No       | IOS         | Yes               |
+| supportsCompanion                            | Check if current device supports companion device manager    | No       | Android     | No                |
+| stopNotification                             | Stop the notification on the specified characteristic        | No       | IOS/Android | No                |
+
+## 遗留问题
+
+- [ ] refreshCache 用于清理和刷新蓝牙设备缓存的一部分 [issue#3](https://github.com/react-native-oh-library/react-native-ble-manager/issues/3)
+- [ ] requestConnectionPriority 用于请求蓝牙连接优先级 [issue#4](https://github.com/react-native-oh-library/react-native-ble-manager/issues/4)
+- [ ] startNotificationUseBuffer 用来启动一个带缓冲区的通知服务 [issue#6](https://github.com/react-native-oh-library/react-native-ble-manager/issues/6)
+- [ ] CompanionScan 扫描配套设备[issue#5](https://github.com/react-native-oh-library/react-native-ble-manager/issues/5)
+- [ ] getAssociatedPeripherals 检索相关外围设备(从配套管理器) [issue#7](https://github.com/react-native-oh-library/react-native-ble-manager/issues/7)
+- [ ] removeAssociatedPeripheral 移除相关外围设备  [issue#8](https://github.com/react-native-oh-library/react-native-ble-manager/issues/8)
+- [ ] setName 创建设置蓝牙适配器名称  [issue#9](https://github.com/react-native-oh-library/react-native-ble-manager/issues/9)
+- [ ] supportsCompanion 检查当前设备是否支持配套设备管理器 [issue#10](https://github.com/react-native-oh-library/react-native-ble-manager/issues/10)
+- [ ] stopNotification 停止指定特征的通知 [issue#11](https://github.com/react-native-oh-library/react-native-ble-manager/issues/11)
+- [ ] writeWithoutResponse 写入不响应指定特性 [issue#12](https://github.com/react-native-oh-library/react-native-ble-manager/issues/12)
+- [ ] removeBond 删除已配对的设备 [issue#13](https://github.com/react-native-oh-library/react-native-ble-manager/issues/13)
+- [ ] getMaximumWriteValueLengthForWithoutResponse 用于获取在不带响应的情况下可以写入的最大数据长度 [issue#14](https://github.com/react-native-oh-library/react-native-ble-manager/issues/14)
+- [ ] getMaximumWriteValueLengthForWithResponse 它用于获取在带有响应的情况下可以写入的最大数据长度  [issue#15](https://github.com/react-native-oh-library/react-native-ble-manager/issues/15)
+
+## 其他
+
+## 开源协议
+
+本项目基于[The MIT License (MIT)](https://github.com/innoveit/react-native-ble-manager/blob/master/LICENSE) ,请自由地享受和参与开源。
+
From c22e69004e1186eff29b93abc25d5ed52e1febc5 Mon Sep 17 00:00:00 2001
From: wjy <18071094885@163.com>
Date: Wed, 19 Jun 2024 09:47:39 +0800
Subject: [PATCH 011/966] =?UTF-8?q?fix:=20[Issues:=20#I9VQPS]=20=E4=BF=AE?=
 =?UTF-8?q?=E6=94=B9react-native-modalbox=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 zh-cn/react-native-modalbox.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/zh-cn/react-native-modalbox.md b/zh-cn/react-native-modalbox.md
index 299d6276..ad0def3f 100644
--- a/zh-cn/react-native-modalbox.md
+++ b/zh-cn/react-native-modalbox.md
@@ -1,4 +1,4 @@
-> 模板版本:v0.2.1
+> 模板版本:v0.2.2
 
 
   
 react-native-modalbox  
@@ -278,7 +278,7 @@ hese methods are optional, you can use the isOpen property instead
 
 | Name  | Description  | Type | Required  |Platform|HarmonyOS Support |
 | :------------ |:---------------:| :---------------:|:---------------:|:---------------:|:---------------:|
-| open  | Open the modal  | `function`  | no  | IOS/Android  | yes  |
+| open  | Open the modal | `function`  | no  | IOS/Android  | yes  |
 | close  | Close the modal | `function`  | no  | IOS/Android  | yes  |
 
 
From 3f6ce9f0a4423b33f9475576d96b899e89ede463 Mon Sep 17 00:00:00 2001
From: "amiz21@qq.com" 
Date: Wed, 19 Jun 2024 11:10:42 +0800
Subject: [PATCH 012/966] =?UTF-8?q?docs:=20[Issues:=20#IA6F3D]=20=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9Ereact-native-image-base64=E6=8C=87=E5=AF=BC=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 Menu.xlsx                          | Bin 29570 -> 29880 bytes
 README.md                          |   1 +
 _sidebar.md                        |   1 +
 zh-cn/README.md                    |   2 +-
 zh-cn/react-native-image-base64.md | 221 +++++++++++++++++++++++++++++
 5 files changed, 224 insertions(+), 1 deletion(-)
 create mode 100644 zh-cn/react-native-image-base64.md
diff --git a/Menu.xlsx b/Menu.xlsx
index 9b2dfcc974d085ba7415483a131cc218da325f77..2699e6d4967bb39b3e3bd9019067003428d39373 100644
GIT binary patch
delta 24305
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