@miot-rn/car-component 1.0.4 → 1.0.6

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 (127) hide show
  1. package/dist/assets/i18n/ar.json +33 -0
  2. package/dist/assets/i18n/bo.json +33 -0
  3. package/dist/assets/i18n/cs.json +33 -0
  4. package/dist/assets/i18n/de.json +33 -0
  5. package/dist/assets/i18n/el.json +33 -0
  6. package/dist/assets/i18n/en.json +33 -0
  7. package/dist/assets/i18n/es.json +33 -0
  8. package/dist/assets/i18n/es_us.json +33 -0
  9. package/dist/assets/i18n/fi.json +33 -0
  10. package/dist/assets/i18n/fr.json +33 -0
  11. package/dist/assets/i18n/he.json +33 -0
  12. package/dist/assets/i18n/hu.json +33 -0
  13. package/dist/assets/i18n/id.json +33 -0
  14. package/dist/assets/i18n/it.json +33 -0
  15. package/dist/assets/i18n/ja.json +33 -0
  16. package/dist/assets/i18n/ko.json +33 -0
  17. package/dist/assets/i18n/nb.json +33 -0
  18. package/dist/assets/i18n/nl.json +33 -0
  19. package/dist/assets/i18n/pl.json +33 -0
  20. package/dist/assets/i18n/pt.json +33 -0
  21. package/dist/assets/i18n/pt_pt.json +33 -0
  22. package/dist/assets/i18n/ro.json +33 -0
  23. package/dist/assets/i18n/ru.json +33 -0
  24. package/dist/assets/i18n/sk.json +33 -0
  25. package/dist/assets/i18n/sv.json +33 -0
  26. package/dist/assets/i18n/th.json +33 -0
  27. package/dist/assets/i18n/tr.json +33 -0
  28. package/dist/assets/i18n/uk.json +33 -0
  29. package/dist/assets/i18n/vi.json +33 -0
  30. package/dist/assets/i18n/zh.json +33 -0
  31. package/dist/assets/i18n/zh_hk.json +33 -0
  32. package/dist/assets/i18n/zh_tw.json +33 -0
  33. package/dist/components/carInfoHeader/dualRangeIndicator.js +12 -7
  34. package/dist/components/carInfoHeader/index.d.ts +1 -0
  35. package/dist/components/carInfoHeader/index.js +1 -0
  36. package/dist/components/carInfoHeader/singleRangeIndicator.d.ts +2 -1
  37. package/dist/components/carInfoHeader/singleRangeIndicator.js +2 -2
  38. package/dist/components/otherSettingCard/index.js +59 -3
  39. package/dist/config/seatI18nKeys.d.ts +3 -0
  40. package/dist/config/seatI18nKeys.js +4 -1
  41. package/dist/hooks/useDualRangeData.d.ts +3 -1
  42. package/dist/hooks/useDualRangeData.js +21 -2
  43. package/dist/hooks/useSeatControlData.d.ts +9 -0
  44. package/dist/hooks/useSeatControlData.js +30 -3
  45. package/dist/hooks/useSingleRangeData.d.ts +1 -0
  46. package/dist/hooks/useSingleRangeData.js +11 -4
  47. package/dist/hooks/useSteeringWheelData.d.ts +30 -1
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.js +1 -0
  50. package/dist/modules/airconditionModule/index.js +62 -4
  51. package/dist/modules/carInfoModule/index.d.ts +3 -1
  52. package/dist/modules/carInfoModule/index.js +5 -3
  53. package/dist/modules/seatModule/index.js +153 -2
  54. package/dist/modules/steeringWheelModule/index.js +34 -2
  55. package/dist/resources/i18n.d.ts +100 -772
  56. package/dist/resources/i18n.js +39 -55
  57. package/dist/spec/index.d.ts +11 -273
  58. package/dist/spec/index.js +64 -469
  59. package/dist/track/config.d.ts +33 -0
  60. package/dist/track/config.js +52 -0
  61. package/dist/track/index.d.ts +1 -0
  62. package/dist/track/index.js +7 -0
  63. package/package.json +4 -3
  64. package/dist/assets/i18n/ar.d.ts +0 -55
  65. package/dist/assets/i18n/ar.js +0 -55
  66. package/dist/assets/i18n/bo.d.ts +0 -55
  67. package/dist/assets/i18n/bo.js +0 -55
  68. package/dist/assets/i18n/cs.d.ts +0 -55
  69. package/dist/assets/i18n/cs.js +0 -55
  70. package/dist/assets/i18n/de.d.ts +0 -55
  71. package/dist/assets/i18n/de.js +0 -55
  72. package/dist/assets/i18n/el.d.ts +0 -55
  73. package/dist/assets/i18n/el.js +0 -55
  74. package/dist/assets/i18n/en.d.ts +0 -55
  75. package/dist/assets/i18n/en.js +0 -55
  76. package/dist/assets/i18n/es.d.ts +0 -55
  77. package/dist/assets/i18n/es.js +0 -55
  78. package/dist/assets/i18n/es_us.d.ts +0 -55
  79. package/dist/assets/i18n/es_us.js +0 -55
  80. package/dist/assets/i18n/fi.d.ts +0 -55
  81. package/dist/assets/i18n/fi.js +0 -55
  82. package/dist/assets/i18n/fr.d.ts +0 -55
  83. package/dist/assets/i18n/fr.js +0 -55
  84. package/dist/assets/i18n/he.d.ts +0 -55
  85. package/dist/assets/i18n/he.js +0 -55
  86. package/dist/assets/i18n/hu.d.ts +0 -55
  87. package/dist/assets/i18n/hu.js +0 -55
  88. package/dist/assets/i18n/id.d.ts +0 -55
  89. package/dist/assets/i18n/id.js +0 -55
  90. package/dist/assets/i18n/it.d.ts +0 -55
  91. package/dist/assets/i18n/it.js +0 -55
  92. package/dist/assets/i18n/ja.d.ts +0 -55
  93. package/dist/assets/i18n/ja.js +0 -55
  94. package/dist/assets/i18n/ko.d.ts +0 -55
  95. package/dist/assets/i18n/ko.js +0 -55
  96. package/dist/assets/i18n/nb.d.ts +0 -55
  97. package/dist/assets/i18n/nb.js +0 -55
  98. package/dist/assets/i18n/nl.d.ts +0 -55
  99. package/dist/assets/i18n/nl.js +0 -55
  100. package/dist/assets/i18n/pl.d.ts +0 -55
  101. package/dist/assets/i18n/pl.js +0 -55
  102. package/dist/assets/i18n/pt.d.ts +0 -55
  103. package/dist/assets/i18n/pt.js +0 -55
  104. package/dist/assets/i18n/pt_pt.d.ts +0 -55
  105. package/dist/assets/i18n/pt_pt.js +0 -55
  106. package/dist/assets/i18n/ro.d.ts +0 -55
  107. package/dist/assets/i18n/ro.js +0 -55
  108. package/dist/assets/i18n/ru.d.ts +0 -55
  109. package/dist/assets/i18n/ru.js +0 -55
  110. package/dist/assets/i18n/sk.d.ts +0 -55
  111. package/dist/assets/i18n/sk.js +0 -55
  112. package/dist/assets/i18n/sv.d.ts +0 -55
  113. package/dist/assets/i18n/sv.js +0 -55
  114. package/dist/assets/i18n/th.d.ts +0 -55
  115. package/dist/assets/i18n/th.js +0 -55
  116. package/dist/assets/i18n/tr.d.ts +0 -55
  117. package/dist/assets/i18n/tr.js +0 -55
  118. package/dist/assets/i18n/uk.d.ts +0 -55
  119. package/dist/assets/i18n/uk.js +0 -55
  120. package/dist/assets/i18n/vi.d.ts +0 -55
  121. package/dist/assets/i18n/vi.js +0 -55
  122. package/dist/assets/i18n/zh.d.ts +0 -55
  123. package/dist/assets/i18n/zh.js +0 -55
  124. package/dist/assets/i18n/zh_hk.d.ts +0 -55
  125. package/dist/assets/i18n/zh_hk.js +0 -55
  126. package/dist/assets/i18n/zh_tw.d.ts +0 -55
  127. package/dist/assets/i18n/zh_tw.js +0 -55
@@ -1,10 +1,45 @@
1
- import React, { useContext, useCallback, memo } from 'react';
1
+ import React, { useContext, useCallback, useEffect, memo } from 'react';
2
2
  import { LargeListEntrance, ConfigContext } from 'miot/ui/hyperOSUI';
3
3
  import { Host, Device } from 'miot';
4
+ import SmartScene from 'miot/ui/smartScene';
4
5
  import { CarInUsed, DeviceManage } from "../../icons";
5
6
  import { CardContainer } from "../cardContainer";
6
7
  import { GroupContainer } from "../groupContainer";
7
8
  import { useFeatureEnabled } from "../../utils/featureGate";
9
+ import { useTrack, getCommonParams } from '@miot-rn/common-component/dist/service/track';
10
+ import { CAR_ITEM, CAR_CARD_ID, CAR_PAGE_REF, CAR_SUB_REF } from "../../track/config";
11
+ // 车端自动化模板类型固定为 'car'(见《2025版标准化模板接口文档》device_types)
12
+ const SMART_SCENE_DEVICE_TYPE = 'car';
13
+
14
+ /**
15
+ * 智能场景的埋点参数。
16
+ *
17
+ * SmartScene 自带上报通道(IftttTemplateUtils.report → reportEventRefChannel),不经过我们的
18
+ * reportTrack,因此公参与点位标识都得由调用方拼进 trackParams。三件事必须注意:
19
+ *
20
+ * 1. `trackParams` 是**整体替换**而非合并(SmartScene.js:31-33 是默认参数),所以 card_id /
21
+ * item_type / item_name 必须自己带回,否则点位标识直接丢。
22
+ * 2. SDK 两个平台分支都把 plugin_form 硬编码成 0(utils.js:150,165),而本插件其余事件用 '1'。
23
+ * 两处分支都是 `...rest` 最后展开,故公参里的 plugin_form 能覆盖掉,双通道取值得以一致。
24
+ * 3. iOS 分支只带 did/device_model/plugin_form/user_type/belong_tag,不带 package_* / plugin_*
25
+ * (utils.js:162-169),公参在这里补齐后两端载荷才对齐。
26
+ *
27
+ * ref 用字面量而非从 TrackService 的当前 ref 派生:trackParams 在 render 期构造,而父页
28
+ * usePageTrack 的 setPageRef 在 useLayoutEffect 里跑,子组件 effect 又早于父组件 effect,
29
+ * 所以本组件首次 render 时当前 ref 还是空串;加上本组件被 memo 包住、SmartScene 异步取到权限后
30
+ * 触发 expose 时不会重渲染,那份空 ref 会一直留着。
31
+ */
32
+ function getSmartSceneTrackParams() {
33
+ return {
34
+ // 公参放最前:点位标识不会被将来新增的公参字段覆盖
35
+ ...getCommonParams(),
36
+ card_id: CAR_CARD_ID.SMART_SCENE,
37
+ item_type: 'button',
38
+ item_name: CAR_ITEM.AUTOMATION,
39
+ ref: CAR_PAGE_REF.HOME,
40
+ sub_ref: CAR_SUB_REF.HOME
41
+ };
42
+ }
8
43
  export const OtherSettingCard = /*#__PURE__*/memo(props => {
9
44
  const {
10
45
  usedInCarTip,
@@ -14,14 +49,32 @@ export const OtherSettingCard = /*#__PURE__*/memo(props => {
14
49
  const {
15
50
  colorToken
16
51
  } = useContext(ConfigContext);
52
+ const {
53
+ click,
54
+ expose
55
+ } = useTrack();
17
56
  const toUsedInCar = useCallback(() => {
57
+ click(CAR_ITEM.CAR_COMMON, {
58
+ item_type: 'item'
59
+ });
18
60
  Host.ui.openCarMiHomeManager(Device.deviceID);
19
61
  }, []);
20
62
  const toDeviceManage = useCallback(() => {
63
+ click(CAR_ITEM.DEVICE_ROAMING, {
64
+ item_type: 'item'
65
+ });
21
66
  Host.ui.openDeviceRoamingManager(Device.deviceID);
22
67
  }, []);
23
68
  const isMiCar = !!Device.model.startsWith('micar.car.');
24
- const showDeviceRoaming = isMiCar && useFeatureEnabled('deviceRoaming');
69
+ const deviceRoamingEnabled = useFeatureEnabled('deviceRoaming');
70
+ const showDeviceRoaming = isMiCar && deviceRoamingEnabled;
71
+ useEffect(() => {
72
+ expose(CAR_ITEM.CAR_COMMON, 'item');
73
+ if (showDeviceRoaming) {
74
+ expose(CAR_ITEM.DEVICE_ROAMING, 'item');
75
+ }
76
+ // eslint-disable-next-line react-hooks/exhaustive-deps
77
+ }, [showDeviceRoaming]);
25
78
  return /*#__PURE__*/React.createElement(GroupContainer, {
26
79
  title: othersTip
27
80
  }, /*#__PURE__*/React.createElement(CardContainer, null, /*#__PURE__*/React.createElement(LargeListEntrance, {
@@ -36,5 +89,8 @@ export const OtherSettingCard = /*#__PURE__*/memo(props => {
36
89
  }),
37
90
  title: deviceManageTip,
38
91
  onPress: toDeviceManage
39
- })));
92
+ })), /*#__PURE__*/React.createElement(SmartScene, {
93
+ device_type: SMART_SCENE_DEVICE_TYPE,
94
+ trackParams: getSmartSceneTrackParams()
95
+ }));
40
96
  });
@@ -5,5 +5,8 @@ export declare const SeatI18nKeys: {
5
5
  readonly RearLeft: "car_seat_rear_left";
6
6
  readonly RearCenter: "car_seat_rear_center";
7
7
  readonly RearRight: "car_seat_rear_right";
8
+ readonly ThirdLeft: "car_seat_third_left";
9
+ readonly ThirdCenter: "car_seat_third_center";
10
+ readonly ThirdRight: "car_seat_third_right";
8
11
  };
9
12
  export type SeatI18nKey = (typeof SeatI18nKeys)[keyof typeof SeatI18nKeys];
@@ -5,5 +5,8 @@ export const SeatI18nKeys = {
5
5
  FrontRight: 'car_seat_front_right',
6
6
  RearLeft: 'car_seat_rear_left',
7
7
  RearCenter: 'car_seat_rear_center',
8
- RearRight: 'car_seat_rear_right'
8
+ RearRight: 'car_seat_rear_right',
9
+ ThirdLeft: 'car_seat_third_left',
10
+ ThirdCenter: 'car_seat_third_center',
11
+ ThirdRight: 'car_seat_third_right'
9
12
  };
@@ -14,5 +14,7 @@ export interface UseDualRangeDataProps {
14
14
  specPowerRangePropertiesCltcFuelEndurance: Spec;
15
15
  specPowerRangePropertiesWltcPureEleCruisingEndurance: Spec;
16
16
  specPowerRangePropertiesWltcFuelEndurance: Spec;
17
+ specPowerRangePropertiesRemoteEvRange?: Spec;
18
+ specPowerRangePropertiesRemoteFuelRange?: Spec;
17
19
  }
18
- export declare const useDualRangeData: ({ specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, }: UseDualRangeDataProps) => DualRangeDisplayData;
20
+ export declare const useDualRangeData: ({ specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, specPowerRangePropertiesRemoteEvRange, specPowerRangePropertiesRemoteFuelRange, }: UseDualRangeDataProps) => DualRangeDisplayData;
@@ -15,7 +15,9 @@ export const useDualRangeData = ({
15
15
  specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange,
16
16
  specPowerRangePropertiesCltcFuelEndurance,
17
17
  specPowerRangePropertiesWltcPureEleCruisingEndurance,
18
- specPowerRangePropertiesWltcFuelEndurance
18
+ specPowerRangePropertiesWltcFuelEndurance,
19
+ specPowerRangePropertiesRemoteEvRange,
20
+ specPowerRangePropertiesRemoteFuelRange
19
21
  }) => {
20
22
  const {
21
23
  colorToken
@@ -25,6 +27,8 @@ export const useDualRangeData = ({
25
27
  const cltcFuelEnduranceValue = useSpecState(specPowerRangePropertiesCltcFuelEndurance);
26
28
  const wltcPureEleCruisingEnduranceValue = useSpecState(specPowerRangePropertiesWltcPureEleCruisingEndurance);
27
29
  const wltcFuelEnduranceValue = useSpecState(specPowerRangePropertiesWltcFuelEndurance);
30
+ const remoteEvRangeValue = useSpecState(specPowerRangePropertiesRemoteEvRange);
31
+ const remoteFuelRangeValue = useSpecState(specPowerRangePropertiesRemoteFuelRange);
28
32
  const distanceUnit = useMemo(() => {
29
33
  const text = getLocalI18n('car_distance_value_km');
30
34
  if (typeof text === 'string') {
@@ -43,6 +47,8 @@ export const useDualRangeData = ({
43
47
  const cltcFuelEndurance = toNumberOrNull(cltcFuelEnduranceValue);
44
48
  const wltcPureEleCruisingEndurance = toNumberOrNull(wltcPureEleCruisingEnduranceValue);
45
49
  const wltcFuelEndurance = toNumberOrNull(wltcFuelEnduranceValue);
50
+ const remoteEvRange = toNumberOrNull(remoteEvRangeValue);
51
+ const remoteFuelRange = toNumberOrNull(remoteFuelRangeValue);
46
52
  if (isNil(dcdType)) {
47
53
  return {
48
54
  currentElectricRange: null,
@@ -55,6 +61,19 @@ export const useDualRangeData = ({
55
61
  };
56
62
  }
57
63
 
64
+ // 0. RealRange (动态续航) - 混动: 剩余电=remote-ev, 剩余油=remote-fuel
65
+ if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'RealRange') === dcdType) {
66
+ return {
67
+ currentElectricRange: remoteEvRange,
68
+ electricRange: specPowerRangePropertiesRemoteEvRange?.prop?.['value-range']?.[1] || 100,
69
+ unit: distanceUnit,
70
+ currentFuelRange: remoteFuelRange,
71
+ fuelRange: specPowerRangePropertiesRemoteFuelRange?.prop?.['value-range']?.[1] || 100,
72
+ electricColor,
73
+ fuelColor
74
+ };
75
+ }
76
+
58
77
  // 1. WLTC Range (Extended Range)
59
78
  if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'WLTCRange') === dcdType) {
60
79
  return {
@@ -78,6 +97,6 @@ export const useDualRangeData = ({
78
97
  electricColor,
79
98
  fuelColor
80
99
  };
81
- }, [dcdRangeSOCTypeDisplayValue, cltcEstimatedExtendEangeValue, cltcFuelEnduranceValue, wltcPureEleCruisingEnduranceValue, wltcFuelEnduranceValue, specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, distanceUnit, colorToken]);
100
+ }, [dcdRangeSOCTypeDisplayValue, cltcEstimatedExtendEangeValue, cltcFuelEnduranceValue, wltcPureEleCruisingEnduranceValue, wltcFuelEnduranceValue, remoteEvRangeValue, remoteFuelRangeValue, specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specPowerRangePropertiesCltcFuelEndurance, specPowerRangePropertiesWltcPureEleCruisingEndurance, specPowerRangePropertiesWltcFuelEndurance, specPowerRangePropertiesRemoteEvRange, specPowerRangePropertiesRemoteFuelRange, distanceUnit, colorToken]);
82
101
  return useMemo(() => getDualRangeDisplayData(), [getDualRangeDisplayData]);
83
102
  };
@@ -11,6 +11,9 @@ export interface SeatSpecs {
11
11
  specSeatRow2MiddlePropertiesSeatVentilation?: Spec;
12
12
  specSeatRow2RightPropertiesHeating?: Spec;
13
13
  specSeatRow2RightPropertiesSeatVentilation?: Spec;
14
+ specSeatRow3LeftPropertiesHeating?: Spec;
15
+ specSeatRow3MiddlePropertiesHeating?: Spec;
16
+ specSeatRow3RightPropertiesHeating?: Spec;
14
17
  }
15
18
  export interface SeatControlDataProps {
16
19
  specs: SeatSpecs;
@@ -73,6 +76,9 @@ export declare const SEAT_TITLES: {
73
76
  rearLeft: string | Record<string, string>;
74
77
  rearCenter: string | Record<string, string>;
75
78
  rearRight: string | Record<string, string>;
79
+ thirdLeft: string | Record<string, string>;
80
+ thirdCenter: string | Record<string, string>;
81
+ thirdRight: string | Record<string, string>;
76
82
  };
77
83
  export declare const useSeatControlData: ({ specs, disabled, onSeatChange }: SeatControlDataProps) => {
78
84
  seatRows: {
@@ -88,6 +94,9 @@ export declare const useSeatControlData: ({ specs, disabled, onSeatChange }: Sea
88
94
  rearLeft: string | Record<string, string>;
89
95
  rearCenter: string | Record<string, string>;
90
96
  rearRight: string | Record<string, string>;
97
+ thirdLeft: string | Record<string, string>;
98
+ thirdCenter: string | Record<string, string>;
99
+ thirdRight: string | Record<string, string>;
91
100
  };
92
101
  handleSeatChange: ({ propType, spec, previousValue, currentValue }: OnButtonPressParams) => void;
93
102
  hasSeats: boolean;
@@ -87,7 +87,10 @@ export const SEAT_TITLES = {
87
87
  frontRight: typeof getLocalI18n(SeatI18nKeys.FrontRight) === 'string' ? getLocalI18n(SeatI18nKeys.FrontRight) : '',
88
88
  rearLeft: typeof getLocalI18n(SeatI18nKeys.RearLeft) === 'string' ? getLocalI18n(SeatI18nKeys.RearLeft) : '',
89
89
  rearCenter: typeof getLocalI18n(SeatI18nKeys.RearCenter) === 'string' ? getLocalI18n(SeatI18nKeys.RearCenter) : '',
90
- rearRight: typeof getLocalI18n(SeatI18nKeys.RearRight) === 'string' ? getLocalI18n(SeatI18nKeys.RearRight) : ''
90
+ rearRight: typeof getLocalI18n(SeatI18nKeys.RearRight) === 'string' ? getLocalI18n(SeatI18nKeys.RearRight) : '',
91
+ thirdLeft: typeof getLocalI18n(SeatI18nKeys.ThirdLeft) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdLeft) : '',
92
+ thirdCenter: typeof getLocalI18n(SeatI18nKeys.ThirdCenter) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdCenter) : '',
93
+ thirdRight: typeof getLocalI18n(SeatI18nKeys.ThirdRight) === 'string' ? getLocalI18n(SeatI18nKeys.ThirdRight) : ''
91
94
  };
92
95
  export const useSeatControlData = ({
93
96
  specs,
@@ -107,7 +110,10 @@ export const useSeatControlData = ({
107
110
  specSeatRow2MiddlePropertiesHeating,
108
111
  specSeatRow2MiddlePropertiesSeatVentilation,
109
112
  specSeatRow2RightPropertiesHeating,
110
- specSeatRow2RightPropertiesSeatVentilation
113
+ specSeatRow2RightPropertiesSeatVentilation,
114
+ specSeatRow3LeftPropertiesHeating,
115
+ specSeatRow3MiddlePropertiesHeating,
116
+ specSeatRow3RightPropertiesHeating
111
117
  } = specs;
112
118
 
113
119
  // 实时值
@@ -121,6 +127,9 @@ export const useSeatControlData = ({
121
127
  const seatRow2MiddleVentilationValue = useSpecState(specSeatRow2MiddlePropertiesSeatVentilation);
122
128
  const seatRow2RightHeatingValue = useSpecState(specSeatRow2RightPropertiesHeating);
123
129
  const seatRow2RightVentilationValue = useSpecState(specSeatRow2RightPropertiesSeatVentilation);
130
+ const seatRow3LeftHeatingValue = useSpecState(specSeatRow3LeftPropertiesHeating);
131
+ const seatRow3MiddleHeatingValue = useSpecState(specSeatRow3MiddlePropertiesHeating);
132
+ const seatRow3RightHeatingValue = useSpecState(specSeatRow3RightPropertiesHeating);
124
133
  const levelIcons = useMemo(() => LEVEL_ICONS(colorToken), [colorToken]);
125
134
  const typeConfig = useMemo(() => TYPE_CONFIG(colorToken, levelIcons), [colorToken, levelIcons]);
126
135
 
@@ -204,6 +213,24 @@ export const useSeatControlData = ({
204
213
  heatingValue: Number(seatRow2RightHeatingValue ?? 0),
205
214
  ventilationValue: Number(seatRow2RightVentilationValue ?? 0),
206
215
  title: SEAT_TITLES.rearRight
216
+ }], [{
217
+ heating: specSeatRow3LeftPropertiesHeating,
218
+ ventilation: undefined,
219
+ heatingValue: Number(seatRow3LeftHeatingValue ?? 0),
220
+ ventilationValue: 0,
221
+ title: SEAT_TITLES.thirdLeft
222
+ }, {
223
+ heating: specSeatRow3MiddlePropertiesHeating,
224
+ ventilation: undefined,
225
+ heatingValue: Number(seatRow3MiddleHeatingValue ?? 0),
226
+ ventilationValue: 0,
227
+ title: SEAT_TITLES.thirdCenter
228
+ }, {
229
+ heating: specSeatRow3RightPropertiesHeating,
230
+ ventilation: undefined,
231
+ heatingValue: Number(seatRow3RightHeatingValue ?? 0),
232
+ ventilationValue: 0,
233
+ title: SEAT_TITLES.thirdRight
207
234
  }]];
208
235
  return rows.map(row => row.map(({
209
236
  heating,
@@ -221,7 +248,7 @@ export const useSeatControlData = ({
221
248
  buttons: buildButtons(heating, ventilation, heatingValue, ventilationValue, disabled)
222
249
  };
223
250
  }).filter(seat => seat !== null)).filter(rowSeats => rowSeats.length > 0);
224
- }, [buildButtons, specSeatRow1LeftPropertiesHeating, specSeatRow1LeftPropertiesSeatVentilation, specSeatRow1RightPropertiesHeating, specSeatRow1RightPropertiesSeatVentilation, specSeatRow2LeftPropertiesHeating, specSeatRow2LeftPropertiesSeatVentilation, specSeatRow2MiddlePropertiesHeating, specSeatRow2MiddlePropertiesSeatVentilation, specSeatRow2RightPropertiesHeating, specSeatRow2RightPropertiesSeatVentilation, seatRow1LeftHeatingValue, seatRow1LeftVentilationValue, seatRow1RightHeatingValue, seatRow1RightVentilationValue, seatRow2LeftHeatingValue, seatRow2LeftVentilationValue, seatRow2MiddleHeatingValue, seatRow2MiddleVentilationValue, seatRow2RightHeatingValue, seatRow2RightVentilationValue, disabled]);
251
+ }, [buildButtons, specSeatRow1LeftPropertiesHeating, specSeatRow1LeftPropertiesSeatVentilation, specSeatRow1RightPropertiesHeating, specSeatRow1RightPropertiesSeatVentilation, specSeatRow2LeftPropertiesHeating, specSeatRow2LeftPropertiesSeatVentilation, specSeatRow2MiddlePropertiesHeating, specSeatRow2MiddlePropertiesSeatVentilation, specSeatRow2RightPropertiesHeating, specSeatRow2RightPropertiesSeatVentilation, specSeatRow3LeftPropertiesHeating, specSeatRow3MiddlePropertiesHeating, specSeatRow3RightPropertiesHeating, seatRow1LeftHeatingValue, seatRow1LeftVentilationValue, seatRow1RightHeatingValue, seatRow1RightVentilationValue, seatRow2LeftHeatingValue, seatRow2LeftVentilationValue, seatRow2MiddleHeatingValue, seatRow2MiddleVentilationValue, seatRow2RightHeatingValue, seatRow2RightVentilationValue, seatRow3LeftHeatingValue, seatRow3MiddleHeatingValue, seatRow3RightHeatingValue, disabled]);
225
252
  const handleSeatChange = useCallback(({
226
253
  propType,
227
254
  spec,
@@ -2,6 +2,7 @@ import { Spec } from '../types';
2
2
  export interface RangeDisplayData {
3
3
  currentRange: number | string | null;
4
4
  totalRange: number;
5
+ currentSoc: number;
5
6
  unit: string;
6
7
  color: string;
7
8
  }
@@ -40,6 +40,7 @@ export const useSingleRangeData = ({
40
40
  return {
41
41
  currentRange: null,
42
42
  totalRange: 100,
43
+ currentSoc: 0,
43
44
  unit: '%',
44
45
  color: colorToken.accentGreenContent
45
46
  };
@@ -57,12 +58,15 @@ export const useSingleRangeData = ({
57
58
  } else if (getValueBySpecDescription(specPowerBatteryPropertiesLowSocWarning, 'Level1 Warning') === lowSocWarning) {
58
59
  color = colorToken.accentYellowFill;
59
60
  }
61
+ const totalRange = specPowerBatteryPropertiesBatterySoCDisplay?.prop?.['value-range']?.[1] || 100;
62
+ const currentSoc = batterySoCDisplay || 0;
60
63
 
61
64
  // 1. Battery SOC percentage
62
65
  if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'SOC') === dcdType) {
63
66
  return {
64
67
  currentRange: batterySoCDisplay,
65
- totalRange: specPowerBatteryPropertiesBatterySoCDisplay?.prop?.['value-range']?.[1] || 100,
68
+ totalRange,
69
+ currentSoc,
66
70
  unit: '%',
67
71
  color
68
72
  };
@@ -72,7 +76,8 @@ export const useSingleRangeData = ({
72
76
  if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'CLTCRange') === dcdType) {
73
77
  return {
74
78
  currentRange: cltcEstimatedRange,
75
- totalRange: specPowerBatteryPropertiesCLTCEstimatedRange?.prop?.['value-range']?.[1] || 100,
79
+ totalRange,
80
+ currentSoc,
76
81
  unit: distanceUnit,
77
82
  color
78
83
  };
@@ -82,14 +87,16 @@ export const useSingleRangeData = ({
82
87
  if (getValueBySpecDescription(specPowerBatteryPropertiesDCDRangeSOCTypeDisplay, 'MiRange') === dcdType) {
83
88
  return {
84
89
  currentRange: batteryEstimatedMileage,
85
- totalRange: specPowerBatteryPropertiesBatteryEstimatedMileage?.prop?.['value-range']?.[1] || 100,
90
+ totalRange,
91
+ currentSoc,
86
92
  unit: distanceUnit,
87
93
  color
88
94
  };
89
95
  }
90
96
  return {
91
97
  currentRange: null,
92
- totalRange: 100,
98
+ totalRange,
99
+ currentSoc,
93
100
  unit: '%',
94
101
  color: colorToken.accentGreenContent
95
102
  };
@@ -6,6 +6,35 @@ export declare const useSteeringWheelData: ({ specBodySteeringWheelPropertiesSte
6
6
  steeringWheelTitle: string | Record<string, string>;
7
7
  steeringWheelHeatState: any;
8
8
  onSteeringWheelHotChange: (val: any) => void;
9
- steeringWheelOptions: any;
9
+ steeringWheelOptions: {
10
+ label: any;
11
+ colorType: string | undefined;
12
+ siid: number;
13
+ piid?: number | undefined;
14
+ eiid?: number | undefined;
15
+ aiid?: number | undefined;
16
+ miid?: number | undefined;
17
+ did?: string | undefined;
18
+ value?: unknown;
19
+ in?: unknown[] | undefined;
20
+ out?: unknown[] | undefined;
21
+ description?: string | undefined;
22
+ dataSource?: number | undefined;
23
+ viid?: number | undefined;
24
+ skey?: string | undefined;
25
+ pkey?: string | undefined;
26
+ akey?: string | undefined;
27
+ ekey?: string | undefined;
28
+ service?: unknown;
29
+ prop?: import("../types").SpecPropertyRaw | undefined;
30
+ action?: import("../types").SpecActionRaw | undefined;
31
+ event?: import("../types").SpecEventRaw | undefined;
32
+ source?: unknown;
33
+ sDescription?: string | undefined;
34
+ mkey?: string | undefined;
35
+ mDescription?: string | undefined;
36
+ reiids?: number[] | undefined;
37
+ reIndexs?: number[] | undefined;
38
+ }[];
10
39
  };
11
40
  export {};
package/dist/index.d.ts CHANGED
@@ -20,4 +20,5 @@ export { useParkingStatusData, type ParkingStatusInfo, type UseParkingStatusData
20
20
  export { useSeatControlData, type SeatControlDataProps, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES, } from './hooks/useSeatControlData';
21
21
  export * from './config';
22
22
  export * from './modules';
23
+ export * from './track';
23
24
  export { isOverseas, isFeatureEnabled, useFeatureEnabled, type FeatureKey } from './utils/featureGate';
package/dist/index.js CHANGED
@@ -19,4 +19,5 @@ export { useParkingStatusData } from "./hooks/useParkingStatusData";
19
19
  export { useSeatControlData, SeatSpecs, LEVEL_ICONS, TYPE_CONFIG, SEAT_TITLES } from "./hooks/useSeatControlData";
20
20
  export * from "./config";
21
21
  export * from "./modules";
22
+ export * from "./track";
22
23
  export { isOverseas, isFeatureEnabled, useFeatureEnabled } from "./utils/featureGate";
@@ -1,7 +1,9 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef } from 'react';
2
2
  import { AirConditioningCard } from "../../components/airConditioningCard";
3
3
  import { useAirConditionData } from "../../hooks/useAirConditionData";
4
4
  import { ConnectStatus } from "../../hooks";
5
+ import { useCardTrack } from '@miot-rn/common-component/dist/service/track';
6
+ import { CAR_CARD, CAR_ITEM } from "../../track/config";
5
7
  export const AirconditionModule = ({
6
8
  specs,
7
9
  connectStatus,
@@ -15,6 +17,14 @@ export const AirconditionModule = ({
15
17
  specHVACTemperaturePropertiesHvacTargetTemperature
16
18
  } = specs;
17
19
  const {
20
+ trackClick,
21
+ trackExpose
22
+ } = useCardTrack({
23
+ cardName: CAR_CARD.AC
24
+ });
25
+ const {
26
+ hvacStatus,
27
+ hvacDefrosterStatus,
18
28
  transformHvacStatus,
19
29
  transformHvacDefrosterStatus,
20
30
  targetTemperature,
@@ -38,15 +48,63 @@ export const AirconditionModule = ({
38
48
  specHVACTemperaturePropertiesOutsideTemperature: specHVACTemperaturePropertiesOutsideTemperature,
39
49
  specHVACTemperaturePropertiesHvacTargetTemperature: specHVACTemperaturePropertiesHvacTargetTemperature
40
50
  });
51
+
52
+ // TEMP_ADJUST 不依赖 spec 值,mount 同步触发
53
+ useEffect(() => {
54
+ if (specHVACTemperaturePropertiesHvacTargetTemperature) {
55
+ trackExpose(CAR_ITEM.TEMP_ADJUST);
56
+ }
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, []);
59
+
60
+ // AC/DEFROST 开关 expose 必须等 spec 值就绪后再发,否则 transform 在 undefined 时永远是 false
61
+ const acExposedRef = useRef(false);
62
+ useEffect(() => {
63
+ if (acExposedRef.current) return;
64
+ if (specHVACStatePropertiesHvacStatus && hvacStatus !== undefined) {
65
+ trackExpose(CAR_ITEM.AC_SWITCH, {
66
+ item_content: String(transformHvacStatus)
67
+ });
68
+ acExposedRef.current = true;
69
+ }
70
+ }, [hvacStatus, transformHvacStatus, specHVACStatePropertiesHvacStatus, trackExpose]);
71
+ const defrostExposedRef = useRef(false);
72
+ useEffect(() => {
73
+ if (defrostExposedRef.current) return;
74
+ if (specHVACStatePropertiesHvacDefrosterStatus && hvacDefrosterStatus !== undefined) {
75
+ trackExpose(CAR_ITEM.DEFROST_SWITCH, {
76
+ item_content: String(transformHvacDefrosterStatus)
77
+ });
78
+ defrostExposedRef.current = true;
79
+ }
80
+ }, [hvacDefrosterStatus, transformHvacDefrosterStatus, specHVACStatePropertiesHvacDefrosterStatus, trackExpose]);
81
+ const handleHvacStatusChange = val => {
82
+ trackClick(CAR_ITEM.AC_SWITCH, {
83
+ item_content: String(val)
84
+ });
85
+ onHvacStatusChange(val);
86
+ };
87
+ const handleDefrosterChange = val => {
88
+ trackClick(CAR_ITEM.DEFROST_SWITCH, {
89
+ item_content: String(val)
90
+ });
91
+ onHvacDefrosterChange(val);
92
+ };
93
+ const handleTemperatureChange = val => {
94
+ // 设计表(第 36-40 行):温度调节 +/- 仅定义 item_name,不含 item_content。
95
+ // 若后续需要采集目标温度值,先补设计表再补上报字段。
96
+ trackClick(CAR_ITEM.TEMP_ADJUST);
97
+ onHvacTemperatureChange(val);
98
+ };
41
99
  return /*#__PURE__*/React.createElement(AirConditioningCard, {
42
100
  showAirc: !!specHVACStatePropertiesHvacStatus,
43
101
  showTargetTemperature: !!specHVACTemperaturePropertiesHvacTargetTemperature,
44
102
  hvacStatus: transformHvacStatus,
45
103
  hvacDefrosterStatus: transformHvacDefrosterStatus,
46
104
  targetTemperature: targetTemperature,
47
- onHvacStatusChange: onHvacStatusChange,
48
- onHvacDefrosterChange: onHvacDefrosterChange,
49
- onHvacTemperatureChange: onHvacTemperatureChange,
105
+ onHvacStatusChange: handleHvacStatusChange,
106
+ onHvacDefrosterChange: handleDefrosterChange,
107
+ onHvacTemperatureChange: handleTemperatureChange,
50
108
  hvacTitle: hvacTitle,
51
109
  hvacDefrosterTitle: hvacDefrosterTitle,
52
110
  hvacDefrosterSubtitle: airConditionTip,
@@ -12,6 +12,8 @@ export interface CarInfoSpecs {
12
12
  specPowerRangePropertiesCltcFuelEndurance?: Spec;
13
13
  specPowerRangePropertiesWltcPureEleCruisingEndurance?: Spec;
14
14
  specPowerRangePropertiesWltcFuelEndurance?: Spec;
15
+ specPowerRangePropertiesRemoteEvRange?: Spec;
16
+ specPowerRangePropertiesRemoteFuelRange?: Spec;
15
17
  specBodyGearPropertiesGearStatus?: Spec;
16
18
  specBodyPowerModePropertiesPowerModeState?: Spec;
17
19
  specDoorCentralLockPropertiesCentralLockState?: Spec;
@@ -22,5 +24,5 @@ export interface CarInfoModuleProps {
22
24
  connectStatus?: ConnectStatusValue;
23
25
  containerStyle?: StyleProp<ViewStyle>;
24
26
  }
25
- export declare const CarInfoModule: ({ specs, connectStatus, containerStyle }: CarInfoModuleProps) => React.JSX.Element;
27
+ export declare const CarInfoModule: ({ specs, connectStatus, containerStyle, }: CarInfoModuleProps) => React.JSX.Element;
26
28
  export default CarInfoModule;
@@ -9,8 +9,8 @@ export const CarInfoModule = ({
9
9
  }) => {
10
10
  // 判断 rangeType 类型
11
11
  const rangeType = useMemo(() => {
12
- return specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange || specs.specPowerRangePropertiesWltcFuelEndurance || specs.specPowerRangePropertiesWltcPureEleCruisingEndurance || specs.specPowerRangePropertiesCltcFuelEndurance ? 'dual' : 'single';
13
- }, [specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specs.specPowerRangePropertiesWltcFuelEndurance, specs.specPowerRangePropertiesWltcPureEleCruisingEndurance, specs.specPowerRangePropertiesCltcFuelEndurance]);
12
+ return specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange || specs.specPowerRangePropertiesWltcFuelEndurance || specs.specPowerRangePropertiesWltcPureEleCruisingEndurance || specs.specPowerRangePropertiesCltcFuelEndurance || specs.specPowerRangePropertiesRemoteEvRange || specs.specPowerRangePropertiesRemoteFuelRange ? 'dual' : 'single';
13
+ }, [specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange, specs.specPowerRangePropertiesWltcFuelEndurance, specs.specPowerRangePropertiesWltcPureEleCruisingEndurance, specs.specPowerRangePropertiesCltcFuelEndurance, specs.specPowerRangePropertiesRemoteEvRange, specs.specPowerRangePropertiesRemoteFuelRange]);
14
14
 
15
15
  // 单续航数据
16
16
  const singleRangeData = useSingleRangeData({
@@ -27,7 +27,9 @@ export const CarInfoModule = ({
27
27
  specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange: specs.specPowerBatteryLifeEffectivenessPropertiesCltcEstimatedExtendEange,
28
28
  specPowerRangePropertiesCltcFuelEndurance: specs.specPowerRangePropertiesCltcFuelEndurance,
29
29
  specPowerRangePropertiesWltcPureEleCruisingEndurance: specs.specPowerRangePropertiesWltcPureEleCruisingEndurance,
30
- specPowerRangePropertiesWltcFuelEndurance: specs.specPowerRangePropertiesWltcFuelEndurance
30
+ specPowerRangePropertiesWltcFuelEndurance: specs.specPowerRangePropertiesWltcFuelEndurance,
31
+ specPowerRangePropertiesRemoteEvRange: specs.specPowerRangePropertiesRemoteEvRange,
32
+ specPowerRangePropertiesRemoteFuelRange: specs.specPowerRangePropertiesRemoteFuelRange
31
33
  });
32
34
 
33
35
  // 驻车状态数据