@ledvance/ui-biz-bundle 1.1.62 → 1.1.64
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.
- package/package.json +1 -1
- package/src/modules/timer/TimerPage.tsx +1 -1
- package/src/newModules/fixedTime/FixedTimeActions.ts +50 -44
- package/src/newModules/fixedTime/FixedTimeDetailPage.tsx +40 -35
- package/src/newModules/fixedTime/FixedTimePage.tsx +158 -85
- package/src/newModules/powerOnBehavior/Router.ts +13 -2
- package/src/newModules/randomTime/RandomTimeActions.ts +57 -49
- package/src/newModules/randomTime/RandomTimeDetailPage.tsx +33 -29
- package/src/newModules/randomTime/RandomTimePage.tsx +152 -84
- package/src/newModules/timeSchedule/Interface.ts +34 -4
- package/src/newModules/timeSchedule/TimeScheduleDetailPage.tsx +118 -133
- package/src/newModules/timeSchedule/TimeSchedulePage.tsx +79 -49
- package/src/newModules/timeSchedule/components/ManuaSettings.tsx +209 -9
- package/src/newModules/timeSchedule/components/ScheduleCard.tsx +28 -15
package/package.json
CHANGED
|
@@ -235,7 +235,7 @@ const TimerPage = (props: {theme?: any}) => {
|
|
|
235
235
|
<Text style={styles.itemTitle}>{I18n.getLang('timeschedule_add_schedule_subheadline_text')}</Text>
|
|
236
236
|
<View
|
|
237
237
|
style={{
|
|
238
|
-
backgroundColor: props.theme.card.
|
|
238
|
+
backgroundColor: props.theme.card.board,
|
|
239
239
|
borderRadius: 4,
|
|
240
240
|
minHeight: cx(50),
|
|
241
241
|
flex: 1,
|
|
@@ -7,13 +7,13 @@ import { padStart } from "lodash";
|
|
|
7
7
|
import I18n from "@ledvance/base/src/i18n";
|
|
8
8
|
import { hex2Int, spliceByStep } from "@ledvance/base/src/utils/common";
|
|
9
9
|
import { parseJSON } from "@tuya/tuya-panel-lamp-sdk/lib/utils";
|
|
10
|
-
import { Buffer } from
|
|
11
|
-
import { useUpdateEffect } from "ahooks";
|
|
10
|
+
import { Buffer } from 'buffer'
|
|
12
11
|
|
|
13
12
|
const { to16 } = Utils
|
|
14
13
|
|
|
15
14
|
const fixedFeatureId = 'cycle_timing'
|
|
16
15
|
const plug_fixedFeatureId = 'cycle_time'
|
|
16
|
+
|
|
17
17
|
export interface FixedTimerData {
|
|
18
18
|
version: number
|
|
19
19
|
length: number
|
|
@@ -22,6 +22,7 @@ export interface FixedTimerData {
|
|
|
22
22
|
|
|
23
23
|
export interface FixedTimer {
|
|
24
24
|
enable: boolean;
|
|
25
|
+
channel?: number;
|
|
25
26
|
weeks: number[];
|
|
26
27
|
startTime: number;
|
|
27
28
|
endTime: number;
|
|
@@ -52,9 +53,9 @@ export interface PlugFixedTimer {
|
|
|
52
53
|
closeTime: number;
|
|
53
54
|
}
|
|
54
55
|
let fixedTimer
|
|
55
|
-
type UseFixedTimeType = (dpKey: string, isPlug?: boolean) => [FixedTimerUiItem[], (fixedTimeList: FixedTimerUiItem[]) => Promise<{ success: boolean }>]
|
|
56
|
+
type UseFixedTimeType = (dpKey: string, isPlug?: boolean, disableFeature?: boolean) => [FixedTimerUiItem[], (fixedTimeList: FixedTimerUiItem[], manualEdit?: boolean) => Promise<{ success: boolean }>]
|
|
56
57
|
|
|
57
|
-
export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
|
|
58
|
+
export const useFixedTime: UseFixedTimeType = (dpKey, isPlug, disableFeature) => {
|
|
58
59
|
const deviceId = useDeviceId()
|
|
59
60
|
const [fixedTimeDp, setFixedTimeDp]: [string, (v: string) => Promise<Result<any>>] = useDp(dpKey)
|
|
60
61
|
const [fixedTimeUiList, setFixedTimeUiList] = useState<FixedTimerUiItem[]>([])
|
|
@@ -66,54 +67,54 @@ export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
|
|
|
66
67
|
name: `${I18n.getLang('fixedTimeCycle_socket_headline')} ${idx + 1}`
|
|
67
68
|
}))
|
|
68
69
|
}, [fixedTimeList])
|
|
69
|
-
|
|
70
70
|
// 获取云端数据
|
|
71
71
|
useEffect(() => {
|
|
72
|
+
// 不获取名称
|
|
73
|
+
if(disableFeature) {
|
|
74
|
+
setFixedTimeUiList(formatterFn())
|
|
75
|
+
return
|
|
76
|
+
}
|
|
72
77
|
fixedTimer = setTimeout(() => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}, 100)
|
|
82
|
-
return () => clearTimeout(fixedTimer)
|
|
83
|
-
}, [fixedTimeDp])
|
|
84
|
-
|
|
85
|
-
const getFeatureFn = () =>{
|
|
86
|
-
getFeature(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId).then(res => {
|
|
87
|
-
if (res?.result) {
|
|
88
|
-
// 首次进入同步云端数据 (云端无数据)
|
|
89
|
-
if (!res.data) {
|
|
90
|
-
const cloudData = formatterFn()
|
|
91
|
-
setFixedTimeFn(cloudData).then()
|
|
92
|
-
} else {
|
|
93
|
-
const featureData = parseJSON(res.data)
|
|
78
|
+
getFeature(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId).then(res => {
|
|
79
|
+
if (res?.result) {
|
|
80
|
+
// 首次进入同步云端数据 (云端无数据)
|
|
81
|
+
if (!res.data) {
|
|
82
|
+
const cloudData = formatterFn()
|
|
83
|
+
setFixedTimeFn(cloudData).then()
|
|
84
|
+
} else {
|
|
85
|
+
const featureData = parseJSON(res.data)
|
|
94
86
|
if (fixedTimeList.length) {
|
|
95
87
|
const uiPlan = fixedTimeList?.map((item, idx: number) => {
|
|
96
|
-
const
|
|
88
|
+
const dp = fixedTimeToHex(item, isPlug, true)
|
|
89
|
+
const fixed = featureData[idx]
|
|
90
|
+
const featureItem = fixed?.v && (isPlug ? parseJSON(fixed?.v)?.dp : fixed?.v)?.includes(dp) ? (isPlug ? parseJSON(fixed) : fixed) : featureData.find(feature => (isPlug ? parseJSON(feature?.v)?.dp : feature?.v).includes(dp))
|
|
97
91
|
return {
|
|
98
92
|
...item,
|
|
99
93
|
index: idx,
|
|
100
|
-
name: featureItem ? featureItem?.n : `${I18n.getLang('
|
|
94
|
+
name: featureItem ? featureItem?.n : `${I18n.getLang('randomtimecycle_sockets_headline_text')} ${idx + 1}`
|
|
101
95
|
}
|
|
102
96
|
})
|
|
103
97
|
setFixedTimeUiList(uiPlan)
|
|
104
98
|
} else {
|
|
105
99
|
setFixedTimeUiList([])
|
|
106
100
|
}
|
|
101
|
+
}
|
|
107
102
|
}
|
|
108
|
-
}
|
|
109
|
-
})
|
|
110
|
-
|
|
103
|
+
})
|
|
104
|
+
}, 250)
|
|
105
|
+
|
|
106
|
+
return () => clearTimeout(fixedTimer)
|
|
107
|
+
}, [fixedTimeDp])
|
|
108
|
+
|
|
111
109
|
|
|
112
110
|
const setFixedTimeFn = async (fixedTimeList: FixedTimerUiItem[]) => {
|
|
113
|
-
const fixedData = fixedTimeList.map(item =>
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
const fixedData = fixedTimeList.map(item => {
|
|
112
|
+
const fixedHex = fixedTimeToHex(item, isPlug)
|
|
113
|
+
return {
|
|
114
|
+
n: item?.name || '',
|
|
115
|
+
v: isPlug ? JSON.stringify({dp: fixedHex}) : fixedHex
|
|
116
|
+
}
|
|
117
|
+
})
|
|
117
118
|
const cloudStatus = await putFeatureFn(deviceId, isPlug ? plug_fixedFeatureId : fixedFeatureId, JSON.stringify(fixedData))
|
|
118
119
|
if (cloudStatus) {
|
|
119
120
|
const fixedTimerData = {
|
|
@@ -121,8 +122,7 @@ export const useFixedTime: UseFixedTimeType = (dpKey, isPlug) => {
|
|
|
121
122
|
length: isPlug ? 10 : 16,
|
|
122
123
|
nodes: fixedTimeList
|
|
123
124
|
}
|
|
124
|
-
|
|
125
|
-
if(isPlug) hex = Buffer.from(hex, 'hex').toString('base64')
|
|
125
|
+
const hex = fixedTimeObj2Dp(fixedTimerData, isPlug)
|
|
126
126
|
const res = await setFixedTimeDp(hex)
|
|
127
127
|
if (res.success) {
|
|
128
128
|
return {
|
|
@@ -156,7 +156,7 @@ const putFeatureFn = async (devId, featureId, data) => {
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
|
|
159
|
-
if (fixedDp?.length <=
|
|
159
|
+
if (!fixedDp || fixedDp?.length <= 8) return
|
|
160
160
|
if(isPlug){
|
|
161
161
|
fixedDp = Buffer.from(fixedDp, 'base64').toString('hex')
|
|
162
162
|
}
|
|
@@ -165,7 +165,11 @@ const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
|
|
|
165
165
|
const s = isPlug ? 0 : 4
|
|
166
166
|
const n = isPlug ? 20 : 32
|
|
167
167
|
const nodes = spliceByStep(fixedDp.slice(s), n).map(plan => {
|
|
168
|
-
const
|
|
168
|
+
const powerInfo = padStart(parseInt(`${plan.slice(0, 2)}`, 16).toString(2), 8, '0');
|
|
169
|
+
const powerBits = powerInfo.split('');
|
|
170
|
+
const enable = !!Number(powerBits[powerBits.length - 1]);
|
|
171
|
+
// 通道号
|
|
172
|
+
const channel = parseInt(powerBits.slice(1, powerBits.length - 1).join(''), 2);
|
|
169
173
|
const weeks = parseInt(plan.slice(2, 4), 16).toString(2).padStart(8, '0')
|
|
170
174
|
.split('')
|
|
171
175
|
.reverse()
|
|
@@ -175,7 +179,7 @@ const fixedTimeDp2Obj = (fixedDp: string, isPlug?: boolean) => {
|
|
|
175
179
|
const openTime = hex2Int(plan.slice(12, 16))
|
|
176
180
|
const closeTime = hex2Int(plan.slice(16, 20))
|
|
177
181
|
const common = {
|
|
178
|
-
enable, weeks, startTime, endTime, openTime, closeTime
|
|
182
|
+
enable, channel, weeks, startTime, endTime, openTime, closeTime
|
|
179
183
|
}
|
|
180
184
|
if (isPlug) {
|
|
181
185
|
return common
|
|
@@ -211,9 +215,11 @@ const fixedTimeObj2Dp = (randomTimerData: FixedTimerData, isPlug?: boolean) => {
|
|
|
211
215
|
}
|
|
212
216
|
|
|
213
217
|
|
|
214
|
-
const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean) => {
|
|
215
|
-
const { weeks, startTime, endTime, openTime, closeTime, enable } = fixedTime
|
|
216
|
-
const
|
|
218
|
+
const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean, isFeatureData?: boolean) => {
|
|
219
|
+
const { weeks, startTime, endTime, openTime, closeTime, channel, enable } = fixedTime
|
|
220
|
+
const channelStr = padStart((channel ?? 0).toString(2), 7, '0');
|
|
221
|
+
const powerChannel = parseInt(`${channelStr}${enable ? 1 : 0}`, 2);
|
|
222
|
+
const powerChannelStr = to16(powerChannel, 2);
|
|
217
223
|
const weeksValue: string = padStart([...weeks].reverse().join(''), 8, '0');
|
|
218
224
|
const weeksStr = to16(parseInt(weeksValue, 2), 2);
|
|
219
225
|
const startTimeStr = to16(startTime, 4);
|
|
@@ -230,5 +236,5 @@ const fixedTimeToHex = (fixedTime: FixedTimer, isPlug?: boolean) => {
|
|
|
230
236
|
const temperatureStr = to16(temperature);
|
|
231
237
|
colorHex = hueStr + saturationStr + valueStr + brightnessStr + temperatureStr
|
|
232
238
|
}
|
|
233
|
-
return
|
|
239
|
+
return (isFeatureData ? '' : powerChannelStr) + weeksStr + startTimeStr + endTimeStr + openTimeStr + closeTimeStr + colorHex
|
|
234
240
|
}
|
|
@@ -2,7 +2,7 @@ import React, { useEffect, useMemo } from "react";
|
|
|
2
2
|
import { ScrollView, StyleSheet, View, Text, Image, TouchableOpacity } from "react-native";
|
|
3
3
|
import { useReactive, useUpdateEffect } from "ahooks";
|
|
4
4
|
import Page from "@ledvance/base/src/components/Page";
|
|
5
|
-
import { useNavigation
|
|
5
|
+
import { useNavigation } from '@react-navigation/core'
|
|
6
6
|
import I18n from "@ledvance/base/src/i18n";
|
|
7
7
|
import res from "@ledvance/base/src/res";
|
|
8
8
|
import TextField from "@ledvance/base/src/components/TextField";
|
|
@@ -21,6 +21,7 @@ import Summary from "../randomTime/Summary";
|
|
|
21
21
|
import { FixedTimePageParams } from "./FixedTimePage";
|
|
22
22
|
import { Result } from "@ledvance/base/src/models/modules/Result";
|
|
23
23
|
import { useSystemTimeFormate } from "@ledvance/base/src/models/modules/NativePropsSlice";
|
|
24
|
+
import { useParams } from "@ledvance/base/src/hooks/Hooks";
|
|
24
25
|
|
|
25
26
|
const { convertX: cx } = Utils.RatioUtils;
|
|
26
27
|
const { toFixedString } = Utils.NumberUtils;
|
|
@@ -33,13 +34,11 @@ export interface FixedTimeDetailPageParams extends FixedTimePageParams {
|
|
|
33
34
|
|
|
34
35
|
const FixedTimeDetailPage = () => {
|
|
35
36
|
const navigation = useNavigation()
|
|
36
|
-
const params =
|
|
37
|
+
const params = useParams<FixedTimeDetailPageParams>()
|
|
37
38
|
const is24Hour = useSystemTimeFormate()
|
|
38
39
|
const state = useReactive({
|
|
39
40
|
loading: false,
|
|
40
41
|
isColorMode: false,
|
|
41
|
-
selectedSkill: params.applyDps.length === 1 ? params.applyDps : [],
|
|
42
|
-
skillList: params.applyDps.length === 1 ? [] : params.applyDps,
|
|
43
42
|
fixedTime: cloneDeep(params.scheduleItem)
|
|
44
43
|
})
|
|
45
44
|
|
|
@@ -56,30 +55,30 @@ const FixedTimeDetailPage = () => {
|
|
|
56
55
|
if (state.fixedTime.closeTime === 0) state.fixedTime.closeTime = 1
|
|
57
56
|
}, [state.fixedTime.openTime, state.fixedTime.closeTime])
|
|
58
57
|
|
|
59
|
-
const showClearIcon = useMemo(() => (
|
|
60
|
-
false
|
|
61
|
-
), [state.skillList])
|
|
62
|
-
|
|
63
58
|
const inRangeTime = useMemo(() => {
|
|
64
59
|
const { startTime, endTime, closeTime, openTime } = state.fixedTime
|
|
65
60
|
const poweredTime = openTime + closeTime
|
|
66
|
-
if (startTime
|
|
61
|
+
if (startTime < endTime) {
|
|
67
62
|
return (endTime - startTime) >= poweredTime
|
|
68
63
|
} else {
|
|
69
|
-
return (1440 - endTime
|
|
64
|
+
return (1440 - endTime - startTime) >= poweredTime
|
|
70
65
|
}
|
|
71
66
|
}, [JSON.stringify(state.fixedTime)])
|
|
72
67
|
|
|
68
|
+
const checkItemChanged = useMemo(() =>{
|
|
69
|
+
return isEqual(state.fixedTime, params.scheduleItem)
|
|
70
|
+
}, [params.scheduleItem, JSON.stringify(state.fixedTime)])
|
|
71
|
+
|
|
73
72
|
const canSubmit = useMemo(() => {
|
|
74
|
-
return state.fixedTime.name?.length > 0 && state.fixedTime.name?.length < 33 && !
|
|
75
|
-
}, [JSON.stringify(state.fixedTime), inRangeTime])
|
|
73
|
+
return state.fixedTime.name?.length > 0 && state.fixedTime.name?.length < 33 && !checkItemChanged && inRangeTime && state.fixedTime.channel !== undefined
|
|
74
|
+
}, [JSON.stringify(state.fixedTime), checkItemChanged, inRangeTime])
|
|
76
75
|
|
|
77
76
|
return (
|
|
78
77
|
<Page
|
|
79
78
|
backText={I18n.getLang('fixedTimeCycle_socket_headline')}
|
|
80
79
|
rightButtonIcon={canSubmit ? res.ic_check : res.ic_uncheck}
|
|
81
80
|
loading={state.loading}
|
|
82
|
-
showBackDialog={
|
|
81
|
+
showBackDialog={!checkItemChanged}
|
|
83
82
|
backDialogTitle={I18n.getLang('cancel_dialog_leave_unsaved_titel')}
|
|
84
83
|
backDialogContent={I18n.getLang('cancel_dialog_leave_unsaved_fixedtimecycle_note')}
|
|
85
84
|
headlineText={I18n.getLang(params.mode === 'add' ? 'add_fixedtimecycle_headline_text' : 'edit_fixedtimecycle_headline_text')}
|
|
@@ -143,25 +142,31 @@ const FixedTimeDetailPage = () => {
|
|
|
143
142
|
<View style={styles.cardContainer}>
|
|
144
143
|
<Text style={styles.itemTitle}>{I18n.getLang('timeschedule_add_schedule_subheadline_text')}</Text>
|
|
145
144
|
<Spacer height={cx(10)} />
|
|
146
|
-
<View style={styles.applyContent}>
|
|
147
|
-
{state.
|
|
145
|
+
<View style={[styles.applyContent, { paddingTop: state.fixedTime.channel === undefined ? 0 : cx(10) }]}>
|
|
146
|
+
{state.fixedTime.channel === undefined ?
|
|
148
147
|
<Text>{I18n.getLang('timer_ceiling_fan_selectionfield_no_components_text')}</Text> :
|
|
149
|
-
|
|
150
|
-
<
|
|
151
|
-
|
|
152
|
-
{
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
</
|
|
158
|
-
|
|
148
|
+
<View style={[styles.applyItem, { marginBottom: cx(10), borderRadius: 4 }]}>
|
|
149
|
+
<Text style={{ color: '#000' }}>{params.applyForList[state.fixedTime.channel]?.key}</Text>
|
|
150
|
+
{params.applyForList.length > 1 && <TouchableOpacity
|
|
151
|
+
onPress={() => {
|
|
152
|
+
state.fixedTime.channel = undefined
|
|
153
|
+
}}
|
|
154
|
+
style={{ paddingHorizontal: cx(5) }}>
|
|
155
|
+
<Image style={{ width: cx(16), height: cx(16) }} source={res.ic_arrows_nav_clear} />
|
|
156
|
+
</TouchableOpacity>}
|
|
157
|
+
</View>
|
|
159
158
|
}
|
|
160
159
|
</View>
|
|
161
|
-
{
|
|
160
|
+
{params.applyForList.map((item, index) => {
|
|
161
|
+
if (state.fixedTime.channel === index) return null
|
|
162
162
|
return (
|
|
163
|
-
<TouchableOpacity
|
|
164
|
-
|
|
163
|
+
<TouchableOpacity
|
|
164
|
+
style={styles.applyItem}
|
|
165
|
+
key={item.key}
|
|
166
|
+
onPress={() => {
|
|
167
|
+
state.fixedTime.channel = index
|
|
168
|
+
}}>
|
|
169
|
+
<Text style={{ color: '#000' }}>{item.key}</Text>
|
|
165
170
|
<Image style={{ width: cx(16), height: cx(16) }} source={res.device_panel_timer_add} />
|
|
166
171
|
</TouchableOpacity>
|
|
167
172
|
)
|
|
@@ -182,9 +187,9 @@ const FixedTimeDetailPage = () => {
|
|
|
182
187
|
showSwitch={false}
|
|
183
188
|
/>
|
|
184
189
|
<LampAdjustView
|
|
185
|
-
isSupportColor={params.isSupportColor}
|
|
186
|
-
isSupportBrightness={params.isSupportBrightness}
|
|
187
|
-
isSupportTemperature={params.isSupportTemperature}
|
|
190
|
+
isSupportColor={!!params.isSupportColor}
|
|
191
|
+
isSupportBrightness={!!params.isSupportBrightness}
|
|
192
|
+
isSupportTemperature={!!params.isSupportTemperature}
|
|
188
193
|
isColorMode={state.isColorMode}
|
|
189
194
|
reserveSV={true}
|
|
190
195
|
setIsColorMode={(v) => state.isColorMode = v}
|
|
@@ -263,12 +268,12 @@ const FixedTimeDetailPage = () => {
|
|
|
263
268
|
<View style={{ flexDirection: 'column' }}>
|
|
264
269
|
<Text style={{ color: '#000' }}>{I18n.formatValue('feature_summary_action_txt_4', `${Math.trunc(state.fixedTime.openTime / 60)}`, `${state.fixedTime.openTime % 60}`)}</Text>
|
|
265
270
|
<View style={styles.summaryTag}>
|
|
266
|
-
<Text style={{ color: '#000' }}>{
|
|
271
|
+
<Text style={{ color: '#000' }}>{I18n.getLang('timeschedule_add_schedule_nightlight_plug_selectionfield_text2')}</Text>
|
|
267
272
|
</View>
|
|
268
273
|
<Spacer height={cx(5)} />
|
|
269
274
|
<Text style={{ color: '#000' }}>{I18n.formatValue('feature_summary_action_txt_6', `${Math.trunc(state.fixedTime.closeTime / 60)}`, `${state.fixedTime.closeTime % 60}`)}</Text>
|
|
270
275
|
<View style={styles.summaryTag}>
|
|
271
|
-
<Text style={{ color: '#000' }}>{
|
|
276
|
+
<Text style={{ color: '#000' }}>{I18n.getLang('timeschedule_add_schedule_nightlight_plug_selectionfield_text2')}</Text>
|
|
272
277
|
</View>
|
|
273
278
|
</View>
|
|
274
279
|
)}
|
|
@@ -284,8 +289,8 @@ const FixedTimeDetailPage = () => {
|
|
|
284
289
|
title: I18n.getLang('cancel_dialog_delete_item_fixedtimecycle_titel'),
|
|
285
290
|
subTitle: I18n.getLang('cancel_dialog_delete_item_fixedtimecycle_description'),
|
|
286
291
|
onConfirm: async (_, { close }) => {
|
|
287
|
-
state.loading = true
|
|
288
292
|
close()
|
|
293
|
+
state.loading = true
|
|
289
294
|
const res = await params.onPost('del', state.fixedTime)
|
|
290
295
|
state.loading = false
|
|
291
296
|
if (res.success) {
|
|
@@ -338,4 +343,4 @@ const styles = StyleSheet.create({
|
|
|
338
343
|
}
|
|
339
344
|
})
|
|
340
345
|
|
|
341
|
-
export default FixedTimeDetailPage
|
|
346
|
+
export default FixedTimeDetailPage
|