@miot-rn/car-component 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +325 -0
  2. package/dist/assets/i18n/ar.d.ts +55 -0
  3. package/dist/assets/i18n/ar.js +55 -0
  4. package/dist/assets/i18n/bo.d.ts +55 -0
  5. package/dist/assets/i18n/bo.js +55 -0
  6. package/dist/assets/i18n/cs.d.ts +55 -0
  7. package/dist/assets/i18n/cs.js +55 -0
  8. package/dist/assets/i18n/de.d.ts +55 -0
  9. package/dist/assets/i18n/de.js +55 -0
  10. package/dist/assets/i18n/el.d.ts +55 -0
  11. package/dist/assets/i18n/el.js +55 -0
  12. package/dist/assets/i18n/en.d.ts +55 -0
  13. package/dist/assets/i18n/en.js +55 -0
  14. package/dist/assets/i18n/es.d.ts +55 -0
  15. package/dist/assets/i18n/es.js +55 -0
  16. package/dist/assets/i18n/es_us.d.ts +55 -0
  17. package/dist/assets/i18n/es_us.js +55 -0
  18. package/dist/assets/i18n/fi.d.ts +55 -0
  19. package/dist/assets/i18n/fi.js +55 -0
  20. package/dist/assets/i18n/fr.d.ts +55 -0
  21. package/dist/assets/i18n/fr.js +55 -0
  22. package/dist/assets/i18n/he.d.ts +55 -0
  23. package/dist/assets/i18n/he.js +55 -0
  24. package/dist/assets/i18n/hu.d.ts +55 -0
  25. package/dist/assets/i18n/hu.js +55 -0
  26. package/dist/assets/i18n/id.d.ts +55 -0
  27. package/dist/assets/i18n/id.js +55 -0
  28. package/dist/assets/i18n/it.d.ts +55 -0
  29. package/dist/assets/i18n/it.js +55 -0
  30. package/dist/assets/i18n/ja.d.ts +55 -0
  31. package/dist/assets/i18n/ja.js +55 -0
  32. package/dist/assets/i18n/ko.d.ts +55 -0
  33. package/dist/assets/i18n/ko.js +55 -0
  34. package/dist/assets/i18n/nb.d.ts +55 -0
  35. package/dist/assets/i18n/nb.js +55 -0
  36. package/dist/assets/i18n/nl.d.ts +55 -0
  37. package/dist/assets/i18n/nl.js +55 -0
  38. package/dist/assets/i18n/pl.d.ts +55 -0
  39. package/dist/assets/i18n/pl.js +55 -0
  40. package/dist/assets/i18n/pt.d.ts +55 -0
  41. package/dist/assets/i18n/pt.js +55 -0
  42. package/dist/assets/i18n/pt_pt.d.ts +55 -0
  43. package/dist/assets/i18n/pt_pt.js +55 -0
  44. package/dist/assets/i18n/ro.d.ts +55 -0
  45. package/dist/assets/i18n/ro.js +55 -0
  46. package/dist/assets/i18n/ru.d.ts +55 -0
  47. package/dist/assets/i18n/ru.js +55 -0
  48. package/dist/assets/i18n/sk.d.ts +55 -0
  49. package/dist/assets/i18n/sk.js +55 -0
  50. package/dist/assets/i18n/sv.d.ts +55 -0
  51. package/dist/assets/i18n/sv.js +55 -0
  52. package/dist/assets/i18n/th.d.ts +55 -0
  53. package/dist/assets/i18n/th.js +55 -0
  54. package/dist/assets/i18n/tr.d.ts +55 -0
  55. package/dist/assets/i18n/tr.js +55 -0
  56. package/dist/assets/i18n/uk.d.ts +55 -0
  57. package/dist/assets/i18n/uk.js +55 -0
  58. package/dist/assets/i18n/vi.d.ts +55 -0
  59. package/dist/assets/i18n/vi.js +55 -0
  60. package/dist/assets/i18n/zh.d.ts +55 -0
  61. package/dist/assets/i18n/zh.js +55 -0
  62. package/dist/assets/i18n/zh_hk.d.ts +55 -0
  63. package/dist/assets/i18n/zh_hk.js +55 -0
  64. package/dist/assets/i18n/zh_tw.d.ts +55 -0
  65. package/dist/assets/i18n/zh_tw.js +55 -0
  66. package/dist/assets/image/dark/car_background_dark.png +0 -0
  67. package/dist/assets/image/default/car_background.png +0 -0
  68. package/dist/components/airConditioningCard/index.d.ts +24 -0
  69. package/dist/components/airConditioningCard/index.js +103 -0
  70. package/dist/components/carInfoHeader/carImage.d.ts +8 -0
  71. package/dist/components/carInfoHeader/carImage.js +42 -0
  72. package/dist/components/carInfoHeader/dualRangeIndicator.d.ts +15 -0
  73. package/dist/components/carInfoHeader/dualRangeIndicator.js +124 -0
  74. package/dist/components/carInfoHeader/index.d.ts +37 -0
  75. package/dist/components/carInfoHeader/index.js +118 -0
  76. package/dist/components/carInfoHeader/parkingStatus.d.ts +12 -0
  77. package/dist/components/carInfoHeader/parkingStatus.js +100 -0
  78. package/dist/components/carInfoHeader/rangeProgressBar.d.ts +14 -0
  79. package/dist/components/carInfoHeader/rangeProgressBar.js +77 -0
  80. package/dist/components/carInfoHeader/singleRangeIndicator.d.ts +11 -0
  81. package/dist/components/carInfoHeader/singleRangeIndicator.js +58 -0
  82. package/dist/components/cardContainer/index.d.ts +8 -0
  83. package/dist/components/cardContainer/index.js +22 -0
  84. package/dist/components/containerWithGap/gapWrap.d.ts +8 -0
  85. package/dist/components/containerWithGap/gapWrap.js +31 -0
  86. package/dist/components/containerWithGap/index.d.ts +12 -0
  87. package/dist/components/containerWithGap/index.js +43 -0
  88. package/dist/components/flatSelect/FlatOption.d.ts +18 -0
  89. package/dist/components/flatSelect/FlatOption.js +117 -0
  90. package/dist/components/flatSelect/FlatSelect.d.ts +14 -0
  91. package/dist/components/flatSelect/FlatSelect.js +112 -0
  92. package/dist/components/flatSelect/index.d.ts +2 -0
  93. package/dist/components/flatSelect/index.js +2 -0
  94. package/dist/components/flatSelect/index.zh-CN.md +89 -0
  95. package/dist/components/groupContainer/index.d.ts +9 -0
  96. package/dist/components/groupContainer/index.js +48 -0
  97. package/dist/components/otherSettingCard/index.d.ts +8 -0
  98. package/dist/components/otherSettingCard/index.js +40 -0
  99. package/dist/components/pageBackground/index.d.ts +7 -0
  100. package/dist/components/pageBackground/index.js +22 -0
  101. package/dist/components/seatControl/index.d.ts +34 -0
  102. package/dist/components/seatControl/index.js +98 -0
  103. package/dist/components/seatControl/seatCard.d.ts +11 -0
  104. package/dist/components/seatControl/seatCard.js +24 -0
  105. package/dist/components/seatControl/seatCardRow.d.ts +29 -0
  106. package/dist/components/seatControl/seatCardRow.js +48 -0
  107. package/dist/components/seatControlGroup/index.d.ts +40 -0
  108. package/dist/components/seatControlGroup/index.js +51 -0
  109. package/dist/components/steeringWheelHotCard/index.d.ts +17 -0
  110. package/dist/components/steeringWheelHotCard/index.js +66 -0
  111. package/dist/components/titleContainer/TitleContainer.d.ts +4 -0
  112. package/dist/components/titleContainer/TitleContainer.js +148 -0
  113. package/dist/components/titleContainer/TitleContainer.zh-CN.md +62 -0
  114. package/dist/components/titleContainer/index.d.ts +1 -0
  115. package/dist/components/titleContainer/index.js +1 -0
  116. package/dist/components/titleContainer/interface.d.ts +48 -0
  117. package/dist/components/titleContainer/interface.js +21 -0
  118. package/dist/components/warningForRunningCard/index.d.ts +6 -0
  119. package/dist/components/warningForRunningCard/index.js +20 -0
  120. package/dist/config/ConnectStatus.d.ts +7 -0
  121. package/dist/config/ConnectStatus.js +8 -0
  122. package/dist/config/index.d.ts +16 -0
  123. package/dist/config/index.js +16 -0
  124. package/dist/config/seatFunctionType.d.ts +7 -0
  125. package/dist/config/seatFunctionType.js +24 -0
  126. package/dist/config/seatGearLevel.d.ts +21 -0
  127. package/dist/config/seatGearLevel.js +19 -0
  128. package/dist/config/seatI18nKeys.d.ts +9 -0
  129. package/dist/config/seatI18nKeys.js +9 -0
  130. package/dist/config/seatPosition.d.ts +8 -0
  131. package/dist/config/seatPosition.js +8 -0
  132. package/dist/config/seatRowConfig.d.ts +6 -0
  133. package/dist/config/seatRowConfig.js +6 -0
  134. package/dist/global.d.js +0 -0
  135. package/dist/hooks/CONNECT_STATUS.d.ts +6 -0
  136. package/dist/hooks/CONNECT_STATUS.js +5 -0
  137. package/dist/hooks/index.d.ts +6 -0
  138. package/dist/hooks/index.js +7 -0
  139. package/dist/hooks/useAirConditionData.d.ts +29 -0
  140. package/dist/hooks/useAirConditionData.js +89 -0
  141. package/dist/hooks/useDualRangeData.d.ts +18 -0
  142. package/dist/hooks/useDualRangeData.js +82 -0
  143. package/dist/hooks/useParkingStatusData.d.ts +19 -0
  144. package/dist/hooks/useParkingStatusData.js +100 -0
  145. package/dist/hooks/useSeatControlData.d.ts +94 -0
  146. package/dist/hooks/useSeatControlData.js +251 -0
  147. package/dist/hooks/useSingleRangeData.d.ts +15 -0
  148. package/dist/hooks/useSingleRangeData.js +97 -0
  149. package/dist/hooks/useSteeringWheelData.d.ts +11 -0
  150. package/dist/hooks/useSteeringWheelData.js +56 -0
  151. package/dist/icons/CarInUsed.d.ts +4 -0
  152. package/dist/icons/CarInUsed.js +13 -0
  153. package/dist/icons/DeviceManage.d.ts +4 -0
  154. package/dist/icons/DeviceManage.js +13 -0
  155. package/dist/icons/ElectricPower.d.ts +4 -0
  156. package/dist/icons/ElectricPower.js +13 -0
  157. package/dist/icons/ErrorStatus.d.ts +4 -0
  158. package/dist/icons/ErrorStatus.js +13 -0
  159. package/dist/icons/FuelPower.d.ts +4 -0
  160. package/dist/icons/FuelPower.js +18 -0
  161. package/dist/icons/Loading.d.ts +4 -0
  162. package/dist/icons/Loading.js +16 -0
  163. package/dist/icons/MijiaLogo.d.ts +4 -0
  164. package/dist/icons/MijiaLogo.js +16 -0
  165. package/dist/icons/Minus.d.ts +4 -0
  166. package/dist/icons/Minus.js +15 -0
  167. package/dist/icons/ParkingStatus.d.ts +4 -0
  168. package/dist/icons/ParkingStatus.js +15 -0
  169. package/dist/icons/SeatGearHeatingLevelOne.d.ts +4 -0
  170. package/dist/icons/SeatGearHeatingLevelOne.js +22 -0
  171. package/dist/icons/SeatGearHeatingLevelThree.d.ts +4 -0
  172. package/dist/icons/SeatGearHeatingLevelThree.js +18 -0
  173. package/dist/icons/SeatGearHeatingLevelTwo.d.ts +4 -0
  174. package/dist/icons/SeatGearHeatingLevelTwo.js +22 -0
  175. package/dist/icons/SeatGearHeatingOff.d.ts +4 -0
  176. package/dist/icons/SeatGearHeatingOff.js +18 -0
  177. package/dist/icons/SeatGearVentilationLevelOne.d.ts +4 -0
  178. package/dist/icons/SeatGearVentilationLevelOne.js +17 -0
  179. package/dist/icons/SeatGearVentilationLevelThree.d.ts +4 -0
  180. package/dist/icons/SeatGearVentilationLevelThree.js +13 -0
  181. package/dist/icons/SeatGearVentilationLevelTwo.d.ts +4 -0
  182. package/dist/icons/SeatGearVentilationLevelTwo.js +17 -0
  183. package/dist/icons/SeatGearVentilationOff.d.ts +4 -0
  184. package/dist/icons/SeatGearVentilationOff.js +16 -0
  185. package/dist/icons/SentryMode.d.ts +4 -0
  186. package/dist/icons/SentryMode.js +13 -0
  187. package/dist/icons/SmartScene.d.ts +4 -0
  188. package/dist/icons/SmartScene.js +13 -0
  189. package/dist/icons/SteeringWheelFirstGear.d.ts +4 -0
  190. package/dist/icons/SteeringWheelFirstGear.js +13 -0
  191. package/dist/icons/SteeringWheelHot.d.ts +4 -0
  192. package/dist/icons/SteeringWheelHot.js +13 -0
  193. package/dist/icons/SteeringWheelSecondGear.d.ts +4 -0
  194. package/dist/icons/SteeringWheelSecondGear.js +13 -0
  195. package/dist/icons/SteeringWheelThirdGear.d.ts +4 -0
  196. package/dist/icons/SteeringWheelThirdGear.js +13 -0
  197. package/dist/icons/Warning.d.ts +4 -0
  198. package/dist/icons/Warning.js +13 -0
  199. package/dist/icons/index.d.ts +24 -0
  200. package/dist/icons/index.js +27 -0
  201. package/dist/index.d.ts +21 -0
  202. package/dist/index.js +20 -0
  203. package/dist/modules/MODULES.md +245 -0
  204. package/dist/modules/airconditionModule/README.md +262 -0
  205. package/dist/modules/airconditionModule/index.d.ts +17 -0
  206. package/dist/modules/airconditionModule/index.js +63 -0
  207. package/dist/modules/carInfoModule/README.md +418 -0
  208. package/dist/modules/carInfoModule/index.d.ts +26 -0
  209. package/dist/modules/carInfoModule/index.js +67 -0
  210. package/dist/modules/index.d.ts +2 -0
  211. package/dist/modules/index.js +2 -0
  212. package/dist/modules/seatModule/README.md +345 -0
  213. package/dist/modules/seatModule/index.d.ts +15 -0
  214. package/dist/modules/seatModule/index.js +40 -0
  215. package/dist/modules/steeringWheelModule/README.md +216 -0
  216. package/dist/modules/steeringWheelModule/index.d.ts +13 -0
  217. package/dist/modules/steeringWheelModule/index.js +31 -0
  218. package/dist/resources/i18n.d.ts +1730 -0
  219. package/dist/resources/i18n.js +84 -0
  220. package/dist/resources/images.d.ts +1 -0
  221. package/dist/resources/images.js +45 -0
  222. package/dist/spec/index.d.ts +494 -0
  223. package/dist/spec/index.js +911 -0
  224. package/dist/types.d.ts +63 -0
  225. package/dist/types.js +1 -0
  226. package/dist/utils/checkSameValue.d.ts +1 -0
  227. package/dist/utils/checkSameValue.js +11 -0
  228. package/dist/utils/fns.d.ts +5 -0
  229. package/dist/utils/fns.js +167 -0
  230. package/dist/utils/get-value-or-default.d.ts +1 -0
  231. package/dist/utils/get-value-or-default.js +4 -0
  232. package/dist/utils/getLocalI18n.d.ts +1 -0
  233. package/dist/utils/getLocalI18n.js +9 -0
  234. package/dist/utils/i18n.d.ts +1 -0
  235. package/dist/utils/i18n.js +141 -0
  236. package/dist/utils/objects.d.ts +2 -0
  237. package/dist/utils/objects.js +222 -0
  238. package/dist/utils/spec.d.ts +8 -0
  239. package/dist/utils/spec.js +171 -0
  240. package/dist/utils/types.d.ts +3 -0
  241. package/dist/utils/types.js +25 -0
  242. package/package.json +27 -0
@@ -0,0 +1,21 @@
1
+ export { AirConditioningCard } from './components/airConditioningCard';
2
+ export { CardContainer } from './components/cardContainer';
3
+ export { default as ContainerWithGap } from './components/containerWithGap';
4
+ export { FlatSelect, FlatOption } from './components/flatSelect';
5
+ export { GroupContainer } from './components/groupContainer';
6
+ export { OtherSettingCard } from './components/otherSettingCard';
7
+ export { SteeringWheelHotCard } from './components/steeringWheelHotCard';
8
+ export { TitleContainer } from './components/titleContainer';
9
+ export { WarningForRunningCard } from './components/warningForRunningCard';
10
+ export { CarInfoHeader } from './components/carInfoHeader';
11
+ export type { SingleRangeData, DualRangeData, ParkingStatusData, CarInfoHeaderProps, } from './components/carInfoHeader';
12
+ export { SeatControl, type SeatControlProps, type ControlButtonConfig, type OnButtonPressParams } from './components/seatControl';
13
+ export { SeatCard, type SeatCardProps } from './components/seatControl/seatCard';
14
+ export { PageBackground, type PageBackgroundProps } from './components/pageBackground';
15
+ export { SeatControlGroup, type SeatControlGroupProps, type SeatConfig } from './components/seatControlGroup';
16
+ export { useSingleRangeData, type RangeDisplayData, type UseSingleRangeDataProps } from './hooks/useSingleRangeData';
17
+ export { useDualRangeData, type DualRangeDisplayData, type UseDualRangeDataProps } from './hooks/useDualRangeData';
18
+ export { useParkingStatusData, type ParkingStatusInfo, type UseParkingStatusDataProps } from './hooks/useParkingStatusData';
19
+ export { useSeatControlData, type SeatControlDataProps, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES } from './hooks/useSeatControlData';
20
+ export * from './config';
21
+ export * from './modules';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export { AirConditioningCard } from "./components/airConditioningCard";
2
+ export { CardContainer } from "./components/cardContainer";
3
+ export { default as ContainerWithGap } from "./components/containerWithGap";
4
+ export { FlatSelect, FlatOption } from "./components/flatSelect";
5
+ export { GroupContainer } from "./components/groupContainer";
6
+ export { OtherSettingCard } from "./components/otherSettingCard";
7
+ export { SteeringWheelHotCard } from "./components/steeringWheelHotCard";
8
+ export { TitleContainer } from "./components/titleContainer";
9
+ export { WarningForRunningCard } from "./components/warningForRunningCard";
10
+ export { CarInfoHeader } from "./components/carInfoHeader";
11
+ export { SeatControl } from "./components/seatControl";
12
+ export { SeatCard } from "./components/seatControl/seatCard";
13
+ export { PageBackground } from "./components/pageBackground";
14
+ export { SeatControlGroup } from "./components/seatControlGroup";
15
+ export { useSingleRangeData } from "./hooks/useSingleRangeData";
16
+ export { useDualRangeData } from "./hooks/useDualRangeData";
17
+ export { useParkingStatusData } from "./hooks/useParkingStatusData";
18
+ export { useSeatControlData, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES } from "./hooks/useSeatControlData";
19
+ export * from "./config";
20
+ export * from "./modules";
@@ -0,0 +1,245 @@
1
+ # Modules 技术文档
2
+
3
+ ## 概述
4
+
5
+ `modules/` 是 `@miot-rn/car-component` 的业务模块层,遵循 **Module = Component + Hook** 的组合模式。每个 Module 封装了 spec 数据获取(通过 hook)和 UI 渲染(通过 component),对外暴露简洁的 `specs` + 配置项 Props 接口。
6
+
7
+ ## 架构
8
+
9
+ ```
10
+ Module (业务模块)
11
+ ├── 接收 specs + 配置 props
12
+ ├── 调用 hook → 获取/转换 spec 数据
13
+ └── 渲染 component → 传入转换后的 props
14
+ ```
15
+
16
+ ```
17
+ 消费方 → Module(specs, config)
18
+ ├── hook(specs) → 数据转换、状态管理、事件处理
19
+ └── Component(transformedProps) → UI 渲染
20
+ ```
21
+
22
+ ## 模块清单
23
+
24
+ ### 1. CarInfoModule — 车辆信息模块
25
+
26
+ | 项目 | 说明 |
27
+ |------|------|
28
+ | 文件 | `carInfoModule/index.tsx` |
29
+ | 组件 | `CarInfoHeader` |
30
+ | Hooks | `useSingleRangeData`, `useDualRangeData`, `useParkingStatusData` |
31
+ | 导出 | ✅ 已从 `modules/index.ts` 导出 |
32
+
33
+ **Props 接口:`CarInfoModuleProps`**
34
+
35
+ ```typescript
36
+ interface CarInfoModuleProps {
37
+ specs: CarInfoSpecs;
38
+ connectStatus?: ConnectStatusValue; // 默认 ConnectStatus.CONNECTING
39
+ containerStyle?: StyleProp<ViewStyle>;
40
+ }
41
+ ```
42
+
43
+ **Specs 定义:`CarInfoSpecs`**
44
+
45
+ | Spec 字段 | 用途 |
46
+ |-----------|------|
47
+ | `specPowerBatteryPropertiesBatterySoCDisplay` | 电池 SOC 显示 |
48
+ | `specPowerBatteryPropertiesLowSocWarning` | 低电量警告 |
49
+ | `specPowerBatteryPropertiesBatteryEstimatedMileage` | 电池预估里程 |
50
+ | `specPowerBatteryPropertiesDCDRangeSOCTypeDisplay` | 续航 SOC 类型显示 |
51
+ | `specPowerBatteryPropertiesCLTCEstimatedRange` | CLTC 预估续航 |
52
+ | `specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange` | CLTC 增程续航 |
53
+ | `specPowerRangePropertiesCltcFuelEndurance` | CLTC 燃油续航 |
54
+ | `specPowerRangePropertiesWltcPureEleCruisingEndurance` | WLTC 纯电续航 |
55
+ | `specPowerRangePropertiesWltcFuelEndurance` | WLTC 燃油续航 |
56
+ | `specBodyGearPropertiesGearStatus` | 档位状态 |
57
+ | `specBodyPowerModePropertiesPowerModeState` | 电源模式 |
58
+ | `specDoorCentralLockPropertiesCentralLockState` | 中控锁状态 |
59
+ | `specSentryInfoPropertiesSentryWorkMode` | 哨兵模式 |
60
+
61
+ **核心逻辑:**
62
+ - 根据是否传入双续航相关 spec 自动判断 `rangeType`(`'single'` | `'dual'`)
63
+ - 单续航 → `useSingleRangeData` → 电量百分比 + 预估里程
64
+ - 双续航 → `useDualRangeData` → 纯电续航 + 燃油续航
65
+ - 驻车状态 → `useParkingStatusData` → 档位/锁车/哨兵模式状态图标
66
+
67
+ ---
68
+
69
+ ### 2. SeatModule — 座椅控制模块
70
+
71
+ | 项目 | 说明 |
72
+ |------|------|
73
+ | 文件 | `seatModule/index.tsx` |
74
+ | 组件 | `SeatControlGroup` |
75
+ | Hook | `useSeatControlData` |
76
+ | 导出 | ✅ 已从 `modules/index.ts` 导出 |
77
+
78
+ **Props 接口:`SeatModuleProps`**
79
+
80
+ ```typescript
81
+ interface SeatModuleProps {
82
+ specs: SeatSpecs;
83
+ disabled?: boolean; // 默认 false
84
+ onSeatChange?: (params: {
85
+ propType: string;
86
+ previousValue: number;
87
+ currentValue: number;
88
+ }) => void;
89
+ style?: StyleProp<ViewStyle>;
90
+ }
91
+ ```
92
+
93
+ **Specs 定义:`SeatSpecs`**
94
+
95
+ | Spec 字段 | 用途 |
96
+ |-----------|------|
97
+ | `specSeatRow1LeftPropertiesHeating` | 第一排左座加热 |
98
+ | `specSeatRow1LeftPropertiesSeatVentilation` | 第一排左座通风 |
99
+ | `specSeatRow1RightPropertiesHeating` | 第一排右座加热 |
100
+ | `specSeatRow1RightPropertiesSeatVentilation` | 第一排右座通风 |
101
+ | `specSeatRow2LeftPropertiesHeating` | 第二排左座加热 |
102
+ | `specSeatRow2LeftPropertiesSeatVentilation` | 第二排左座通风 |
103
+ | `specSeatRow2MiddlePropertiesHeating` | 第二排中座加热 |
104
+ | `specSeatRow2MiddlePropertiesSeatVentilation` | 第二排中座通风 |
105
+ | `specSeatRow2RightPropertiesHeating` | 第二排右座加热 |
106
+ | `specSeatRow2RightPropertiesSeatVentilation` | 第二排右座通风 |
107
+
108
+ **核心逻辑:**
109
+ - `useSeatControlData` 根据传入的 specs 动态生成座椅行列数据(`seatRows`)和标题(`seatTitles`)
110
+ - `hasSeats` 为 false 时不渲染(无座椅 spec 则隐藏模块)
111
+ - 支持加热/通风档位切换回调 `onSeatChange`
112
+
113
+ ---
114
+
115
+ ### 3. AirconditionModule — 空调控制模块
116
+
117
+ | 项目 | 说明 |
118
+ |------|------|
119
+ | 文件 | `airconditionModule/index.tsx` |
120
+ | 组件 | `AirConditioningCard` |
121
+ | Hook | `useAirConditionData` |
122
+ | 导出 | ❌ 未从 `modules/index.ts` 导出 |
123
+
124
+ **Props 接口:`AirconditionModuleProps`**
125
+
126
+ ```typescript
127
+ interface AirconditionModuleProps {
128
+ specs: AirconditionSpecs;
129
+ connectStatus?: ConnectStatusValue;
130
+ isCarRunning: boolean;
131
+ }
132
+ ```
133
+
134
+ **Specs 定义:`AirconditionSpecs`**
135
+
136
+ | Spec 字段 | 用途 |
137
+ |-----------|------|
138
+ | `specHVACStatePropertiesHvacStatus` | 空调开关状态 |
139
+ | `specHVACStatePropertiesHvacDefrosterStatus` | 除霜状态 |
140
+ | `specHVACTemperaturePropertiesInsideTemperature` | 车内温度 |
141
+ | `specHVACTemperaturePropertiesOutsideTemperature` | 车外温度 |
142
+ | `specHVACTemperaturePropertiesHvacTargetTemperature` | 目标温度 |
143
+
144
+ **核心逻辑:**
145
+ - 禁用条件:`connectStatus !== CONNECTED || isCarRunning`
146
+ - 根据是否传入 `specHVACTemperaturePropertiesHvacTargetTemperature` 决定是否显示目标温度控制
147
+ - 根据是否传入 `specHVACStatePropertiesHvacDefrosterStatus` 决定是否显示除霜控制
148
+ - hook 返回温度步进、最大/最小温度、i18n 标题等
149
+
150
+ ---
151
+
152
+ ### 4. SteeringWheelModule — 方向盘加热模块
153
+
154
+ | 项目 | 说明 |
155
+ |------|------|
156
+ | 文件 | `steeringWheelModule/index.tsx` |
157
+ | 组件 | `SteeringWheelHotCard` |
158
+ | Hook | `useSteeringWheelData` |
159
+ | 导出 | ❌ 未从 `modules/index.ts` 导出 |
160
+
161
+ **Props 接口:`SteeringWheelModuleProps`**
162
+
163
+ ```typescript
164
+ interface SteeringWheelModuleProps {
165
+ specs: SteeringWheelSpecs;
166
+ connectStatus?: ConnectStatusValue;
167
+ isCarRunning: boolean;
168
+ }
169
+ ```
170
+
171
+ **Specs 定义:`SteeringWheelSpecs`**
172
+
173
+ | Spec 字段 | 用途 |
174
+ |-----------|------|
175
+ | `specBodySteeringWheelPropertiesSteeringWheelHeating` | 方向盘加热档位 |
176
+
177
+ **核心逻辑:**
178
+ - 禁用条件:`connectStatus !== CONNECTED || isCarRunning`
179
+ - hook 返回加热档位选项(`steeringWheelOptions`)和当前状态
180
+ - 使用 `FlatSelect` 风格的档位选择 UI
181
+
182
+ ---
183
+
184
+ ## 依赖关系图
185
+
186
+ ```
187
+ modules/index.ts
188
+ ├── export CarInfoModule
189
+ └── export SeatModule
190
+
191
+ CarInfoModule
192
+ ├── hooks: useSingleRangeData, useDualRangeData, useParkingStatusData
193
+ └── components: CarInfoHeader
194
+
195
+ SeatModule
196
+ ├── hooks: useSeatControlData
197
+ └── components: SeatControlGroup
198
+
199
+ AirconditionModule (未导出)
200
+ ├── hooks: useAirConditionData
201
+ └── components: AirConditioningCard
202
+
203
+ SteeringWheelModule (未导出)
204
+ ├── hooks: useSteeringWheelData
205
+ └── components: SteeringWheelHotCard
206
+ ```
207
+
208
+ ## 三层引用模式
209
+
210
+ 每个模块支持三种引用粒度,开发者可按需选择:
211
+
212
+ ```
213
+ ┌──────────────────────────────────────────────────────┐
214
+ │ Module(完整模块)= Hook + Component │
215
+ │ 开箱即用,适合标准业务场景 │
216
+ ├──────────────────────────────────────────────────────┤
217
+ │ Hook(数据层) Component(UI 层) │
218
+ │ 自定义 UI 时复用数据逻辑 已有数据源时仅渲染 UI │
219
+ └──────────────────────────────────────────────────────┘
220
+ ```
221
+
222
+ | 模块 | Hook | Component |
223
+ |------|------|-----------|
224
+ | `CarInfoModule` | `useSingleRangeData` / `useDualRangeData` / `useParkingStatusData` | `CarInfoHeader` |
225
+ | `SeatModule` | `useSeatControlData` | `SeatControlGroup` |
226
+ | `AirconditionModule` | `useAirConditionData` | `AirConditioningCard` |
227
+ | `SteeringWheelModule` | `useSteeringWheelData` | `SteeringWheelHotCard` |
228
+
229
+ 详细用法请参考各模块目录下的 `README.md`。
230
+
231
+ ## 设计模式
232
+
233
+ 1. **Specs 注入模式**:所有模块通过 `specs` prop 接收设备 spec 定义,不在模块内部硬编码 spec 引用,实现不同车型的灵活适配。
234
+
235
+ 2. **条件渲染**:模块根据传入的 specs 是否存在自动决定功能可见性(如 SeatModule 的 `hasSeats`、CarInfoModule 的 `rangeType` 判断)。
236
+
237
+ 3. **统一禁用策略**:空调和方向盘模块共享 `connectStatus !== CONNECTED || isCarRunning` 的禁用逻辑,确保行驶中或断连时不可操作。
238
+
239
+ 4. **Hook 封装数据转换**:所有 spec 原始值到 UI 展示值的转换(i18n、档位映射、温度格式化等)均在 hook 层完成,Module 和 Component 不处理原始 spec 数据。
240
+
241
+ ## 注意事项
242
+
243
+ - `AirconditionModule` 和 `SteeringWheelModule` 当前未从 `modules/index.ts` 导出,消费方需直接引用子路径或等待后续导出。
244
+ - `SeatModule` 中存在 `as any` 类型断言,可能需要后续类型完善。
245
+ - `SteeringWheelModule` 中存在 `@ts-ignore` 注释,`steeringWheelOptions` 的类型与 `SteeringWheelHotCard` 的 `options` prop 类型可能不完全匹配。
@@ -0,0 +1,262 @@
1
+ # AirconditionModule — 空调控制模块
2
+
3
+ ## 概述
4
+
5
+ 车载空调控制模块,提供空调开关、除霜开关和目标温度调节功能。支持车内/车外温度显示。
6
+
7
+ > ⚠️ 当前未从 `modules/index.ts` 导出,需直接引用子路径。
8
+
9
+ ## 引用方式
10
+
11
+ 本模块支持三种引用粒度,开发者可根据需要选择:
12
+
13
+ | 引用方式 | 说明 | 适用场景 |
14
+ |---------|------|---------|
15
+ | **Module(推荐)** | 完整模块,内含数据层 + UI 层 | 标准业务场景,开箱即用 |
16
+ | **Hook** | 仅数据层(`useAirConditionData`) | 需要自定义 UI,复用数据逻辑 |
17
+ | **Component** | 仅 UI 层(`AirConditioningCard`) | 已有数据源,仅需渲染 UI |
18
+
19
+ ## 文件
20
+
21
+ ```
22
+ airconditionModule/
23
+ └── index.tsx
24
+ ```
25
+
26
+ ---
27
+
28
+ ## 1. Module 用法(完整模块)
29
+
30
+ ### Props
31
+
32
+ ```typescript
33
+ interface AirconditionModuleProps {
34
+ specs: AirconditionSpecs;
35
+ connectStatus?: ConnectStatusValue;
36
+ isCarRunning: boolean; // 车辆是否行驶中
37
+ }
38
+
39
+ interface AirconditionSpecs {
40
+ specHVACStatePropertiesHvacStatus?: Spec;
41
+ specHVACStatePropertiesHvacDefrosterStatus?: Spec;
42
+ specHVACTemperaturePropertiesInsideTemperature?: Spec;
43
+ specHVACTemperaturePropertiesOutsideTemperature?: Spec;
44
+ specHVACTemperaturePropertiesHvacTargetTemperature?: Spec;
45
+ }
46
+ ```
47
+
48
+ ### Specs 定义
49
+
50
+ | Spec | 用途 | 必填 |
51
+ |------|------|------|
52
+ | `specHVACStatePropertiesHvacStatus` | 空调开关状态(On/Off) | 否 |
53
+ | `specHVACStatePropertiesHvacDefrosterStatus` | 除霜状态(Off/Max Defrost) | 否 |
54
+ | `specHVACTemperaturePropertiesInsideTemperature` | 车内温度(只读) | 否 |
55
+ | `specHVACTemperaturePropertiesOutsideTemperature` | 车外温度(只读) | 否 |
56
+ | `specHVACTemperaturePropertiesHvacTargetTemperature` | 目标温度(可调节) | 否 |
57
+
58
+ ### 禁用条件
59
+
60
+ ```
61
+ disabled = connectStatus !== ConnectStatus.CONNECTED || isCarRunning
62
+ ```
63
+
64
+ ### 条件渲染
65
+
66
+ | 条件 | 效果 |
67
+ |------|------|
68
+ | `specHVACTemperaturePropertiesHvacTargetTemperature` 存在 | 显示目标温度 Stepper |
69
+ | `specHVACStatePropertiesHvacDefrosterStatus` 存在 | 显示除霜开关 |
70
+
71
+ ### 示例
72
+
73
+ ```tsx
74
+ import { AirconditionModule } from '@miot-rn/car-component/dist/modules/airconditionModule';
75
+ import { ConnectStatus } from '@miot-rn/car-component/dist/config';
76
+
77
+ <AirconditionModule
78
+ specs={{
79
+ specHVACStatePropertiesHvacStatus: hvacStatusSpec,
80
+ specHVACStatePropertiesHvacDefrosterStatus: defrosterSpec,
81
+ specHVACTemperaturePropertiesInsideTemperature: insideTempSpec,
82
+ specHVACTemperaturePropertiesOutsideTemperature: outsideTempSpec,
83
+ specHVACTemperaturePropertiesHvacTargetTemperature: targetTempSpec,
84
+ }}
85
+ connectStatus={ConnectStatus.CONNECTED}
86
+ isCarRunning={false}
87
+ />
88
+ ```
89
+
90
+ ---
91
+
92
+ ## 2. Hook 用法(`useAirConditionData`)
93
+
94
+ 适用于需要**自定义 UI** 但复用空调数据逻辑的场景。
95
+
96
+ ### 引入
97
+
98
+ ```typescript
99
+ import { useAirConditionData } from '@miot-rn/car-component/dist/hooks/useAirConditionData';
100
+ ```
101
+
102
+ ### 入参
103
+
104
+ ```typescript
105
+ interface UseAirConditionDataProps {
106
+ specHVACStatePropertiesHvacStatus: Spec;
107
+ specHVACStatePropertiesHvacDefrosterStatus: Spec;
108
+ specHVACTemperaturePropertiesInsideTemperature: Spec;
109
+ specHVACTemperaturePropertiesOutsideTemperature: Spec;
110
+ specHVACTemperaturePropertiesHvacTargetTemperature: Spec;
111
+ }
112
+ ```
113
+
114
+ ### 返回值
115
+
116
+ | 字段 | 类型 | 说明 |
117
+ |------|------|------|
118
+ | `hvacStatus` | `any` | 空调开关 spec 原始值 |
119
+ | `hvacDefrosterStatus` | `any` | 除霜开关 spec 原始值 |
120
+ | `transformHvacStatus` | `boolean` | 空调是否开启(`true` = On) |
121
+ | `transformHvacDefrosterStatus` | `boolean` | 除霜是否开启(`true` = 非 Off) |
122
+ | `targetTemperature` | `any` | 目标温度 spec 原始值 |
123
+ | `onHvacStatusChange` | `(val: boolean) => void` | 空调开关切换,写入 On/Off |
124
+ | `onHvacDefrosterChange` | `(val: boolean) => void` | 除霜开关切换,写入 Max Defrost/Off |
125
+ | `onHvacTemperatureChange` | `(val: number) => void` | 温度调节,写入数值 |
126
+ | `hvacTitle` | `string` | 空调标题(i18n `car_air_condition_name`) |
127
+ | `hvacDefrosterTitle` | `string` | 除霜标题(i18n `car_air_condition_defog`) |
128
+ | `airConditionTip` | `string` | 除霜副标题(i18n `car_air_condition_tip`) |
129
+ | `insideCarTip` | `string` | 车内温度文案,含温度值插值 |
130
+ | `outsideCarTip` | `string` | 车外温度文案,含温度值插值 |
131
+ | `insideTemperature` | `any` | 车内温度 spec 原始值 |
132
+ | `outsideTemperature` | `any` | 车外温度 spec 原始值 |
133
+ | `temperatureStep` | `number` | 温度调节步进 |
134
+ | `maxTemperature` | `number` | 最高可调温度 |
135
+ | `minTemperature` | `number` | 最低可调温度 |
136
+
137
+ ### 示例
138
+
139
+ ```tsx
140
+ import { useAirConditionData } from '@miot-rn/car-component/dist/hooks/useAirConditionData';
141
+
142
+ const MyCustomAirCondition = ({ specs }) => {
143
+ const {
144
+ transformHvacStatus,
145
+ onHvacStatusChange,
146
+ transformHvacDefrosterStatus,
147
+ onHvacDefrosterChange,
148
+ targetTemperature,
149
+ onHvacTemperatureChange,
150
+ hvacTitle,
151
+ insideCarTip,
152
+ outsideCarTip,
153
+ minTemperature,
154
+ maxTemperature,
155
+ temperatureStep,
156
+ } = useAirConditionData(specs);
157
+
158
+ return (
159
+ <View>
160
+ <Text>{hvacTitle}</Text>
161
+ <Switch value={transformHvacStatus} onValueChange={onHvacStatusChange} />
162
+ <Text>{insideCarTip}</Text>
163
+ <Text>{outsideCarTip}</Text>
164
+ <Slider
165
+ value={Number(targetTemperature)}
166
+ minimumValue={minTemperature}
167
+ maximumValue={maxTemperature}
168
+ step={temperatureStep}
169
+ onValueChange={onHvacTemperatureChange}
170
+ />
171
+ </View>
172
+ );
173
+ };
174
+ ```
175
+
176
+ ---
177
+
178
+ ## 3. Component 用法(`AirConditioningCard`)
179
+
180
+ 适用于已有数据源,仅需渲染空调控制 UI 的场景。
181
+
182
+ ### 引入
183
+
184
+ ```typescript
185
+ import { AirConditioningCard } from '@miot-rn/car-component/dist/components/airConditioningCard';
186
+ ```
187
+
188
+ ### Props
189
+
190
+ ```typescript
191
+ interface AirConditioningCardProps {
192
+ hvacStatus: boolean; // 空调开关状态
193
+ hvacDefrosterStatus: boolean; // 除霜开关状态
194
+ onHvacStatusChange: (value: boolean) => void; // 空调开关回调
195
+ onHvacDefrosterChange: (value: boolean) => void; // 除霜开关回调
196
+ targetTemperature: number | string; // 目标温度
197
+ onHvacTemperatureChange: (value: number) => void; // 温度调节回调
198
+ hvacTitle: string; // 空调标题
199
+ hvacDefrosterTitle: string; // 除霜标题
200
+ hvacDefrosterSubtitle?: string; // 除霜副标题,默认 ''
201
+ insideTip?: string; // 车内温度提示,默认 ''
202
+ outsideTip?: string; // 车外温度提示,默认 ''
203
+ temperatureStep: number; // 温度步进
204
+ maxTemperature: number; // 最高温度
205
+ minTemperature: number; // 最低温度
206
+ insideTemperature?: number | string; // 车内温度值(控制是否显示)
207
+ outsideTemperature?: number | string; // 车外温度值(控制是否显示)
208
+ showHvacDefroster?: boolean; // 是否显示除霜,默认 false
209
+ disabled?: boolean; // 禁用状态,默认 false
210
+ showTargetTemperature?: boolean; // 是否显示温度调节,默认 false
211
+ }
212
+ ```
213
+
214
+ ### 渲染结构
215
+
216
+ ```
217
+ CardContainer
218
+ ├── TitleContainer (标题 + 空调 Switch)
219
+ │ └── subtitle: 车内/车外温度文案
220
+ ├── Stepper (目标温度调节,showTargetTemperature=true 时显示)
221
+ │ └── 空调关闭或 disabled 时 Stepper 禁用
222
+ └── LargeVariantSwitch (除霜开关,showHvacDefroster=true 时显示)
223
+ ```
224
+
225
+ ### 示例
226
+
227
+ ```tsx
228
+ import { AirConditioningCard } from '@miot-rn/car-component/dist/components/airConditioningCard';
229
+
230
+ <AirConditioningCard
231
+ hvacStatus={true}
232
+ hvacDefrosterStatus={false}
233
+ onHvacStatusChange={(val) => console.log('空调:', val)}
234
+ onHvacDefrosterChange={(val) => console.log('除霜:', val)}
235
+ targetTemperature={24}
236
+ onHvacTemperatureChange={(val) => console.log('温度:', val)}
237
+ hvacTitle="空调"
238
+ hvacDefrosterTitle="前挡除霜"
239
+ insideTip="车内 25°C"
240
+ outsideTip="车外 10°C"
241
+ insideTemperature={25}
242
+ outsideTemperature={10}
243
+ temperatureStep={0.5}
244
+ maxTemperature={32}
245
+ minTemperature={16}
246
+ showTargetTemperature={true}
247
+ showHvacDefroster={true}
248
+ disabled={false}
249
+ />
250
+ ```
251
+
252
+ ---
253
+
254
+ ## i18n 文案
255
+
256
+ | Key | 用途 |
257
+ |-----|------|
258
+ | `car_air_condition_name` | 空调标题 |
259
+ | `car_air_condition_defog` | 除霜标题 |
260
+ | `car_air_condition_tip` | 除霜副标题 |
261
+ | `car_inside_car_tip` | 车内温度文案(含温度值插值) |
262
+ | `car_outside_car_tip` | 车外温度文案(含温度值插值) |
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { type ConnectStatusValue } from '../../config/ConnectStatus';
3
+ import { Spec } from '../../types';
4
+ export interface AirconditionSpecs {
5
+ specHVACStatePropertiesHvacStatus?: Spec;
6
+ specHVACStatePropertiesHvacDefrosterStatus?: Spec;
7
+ specHVACTemperaturePropertiesInsideTemperature?: Spec;
8
+ specHVACTemperaturePropertiesOutsideTemperature?: Spec;
9
+ specHVACTemperaturePropertiesHvacTargetTemperature?: Spec;
10
+ }
11
+ export interface AirconditionModuleProps {
12
+ specs: AirconditionSpecs;
13
+ connectStatus?: ConnectStatusValue;
14
+ isCarRunning: boolean;
15
+ }
16
+ export declare const AirconditionModule: ({ specs, connectStatus, isCarRunning }: AirconditionModuleProps) => React.JSX.Element;
17
+ export default AirconditionModule;
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import { AirConditioningCard } from "../../components/airConditioningCard";
3
+ import { useAirConditionData } from "../../hooks/useAirConditionData";
4
+ import { ConnectStatus } from "../../hooks";
5
+ export const AirconditionModule = ({
6
+ specs,
7
+ connectStatus,
8
+ isCarRunning
9
+ }) => {
10
+ const {
11
+ specHVACStatePropertiesHvacStatus,
12
+ specHVACStatePropertiesHvacDefrosterStatus,
13
+ specHVACTemperaturePropertiesInsideTemperature,
14
+ specHVACTemperaturePropertiesOutsideTemperature,
15
+ specHVACTemperaturePropertiesHvacTargetTemperature
16
+ } = specs;
17
+ const {
18
+ transformHvacStatus,
19
+ transformHvacDefrosterStatus,
20
+ targetTemperature,
21
+ onHvacStatusChange,
22
+ onHvacDefrosterChange,
23
+ onHvacTemperatureChange,
24
+ hvacTitle,
25
+ hvacDefrosterTitle,
26
+ airConditionTip,
27
+ insideCarTip,
28
+ outsideCarTip,
29
+ insideTemperature,
30
+ outsideTemperature,
31
+ temperatureStep,
32
+ maxTemperature,
33
+ minTemperature
34
+ } = useAirConditionData({
35
+ specHVACStatePropertiesHvacStatus: specHVACStatePropertiesHvacStatus,
36
+ specHVACStatePropertiesHvacDefrosterStatus: specHVACStatePropertiesHvacDefrosterStatus,
37
+ specHVACTemperaturePropertiesInsideTemperature: specHVACTemperaturePropertiesInsideTemperature,
38
+ specHVACTemperaturePropertiesOutsideTemperature: specHVACTemperaturePropertiesOutsideTemperature,
39
+ specHVACTemperaturePropertiesHvacTargetTemperature: specHVACTemperaturePropertiesHvacTargetTemperature
40
+ });
41
+ return /*#__PURE__*/React.createElement(AirConditioningCard, {
42
+ showTargetTemperature: !!specHVACTemperaturePropertiesHvacTargetTemperature,
43
+ hvacStatus: transformHvacStatus,
44
+ hvacDefrosterStatus: transformHvacDefrosterStatus,
45
+ targetTemperature: targetTemperature,
46
+ onHvacStatusChange: onHvacStatusChange,
47
+ onHvacDefrosterChange: onHvacDefrosterChange,
48
+ onHvacTemperatureChange: onHvacTemperatureChange,
49
+ hvacTitle: hvacTitle,
50
+ hvacDefrosterTitle: hvacDefrosterTitle,
51
+ hvacDefrosterSubtitle: airConditionTip,
52
+ insideTip: insideCarTip,
53
+ outsideTip: outsideCarTip,
54
+ insideTemperature: insideTemperature,
55
+ outsideTemperature: outsideTemperature,
56
+ temperatureStep: temperatureStep,
57
+ maxTemperature: maxTemperature,
58
+ minTemperature: minTemperature,
59
+ disabled: connectStatus !== ConnectStatus.CONNECTED || isCarRunning,
60
+ showHvacDefroster: !!specHVACStatePropertiesHvacDefrosterStatus
61
+ });
62
+ };
63
+ export default AirconditionModule;