mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-11-26 17:44:55 +00:00
Compare commits
1 Commits
There-are-
...
Cancel-but
| Author | SHA1 | Date | |
|---|---|---|---|
| c6e98fa245 |
@ -83,12 +83,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
emit(currentState.copyWith(
|
||||
scheduleMode: event.scheduleMode,
|
||||
countdownRemaining: Duration.zero,
|
||||
countdownHours: 0,
|
||||
countdownMinutes: 0,
|
||||
inchingHours: 0,
|
||||
inchingMinutes: 0,
|
||||
isCountdownActive: false,
|
||||
isInchingActive: false,
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -100,7 +94,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
if (state is ScheduleLoaded) {
|
||||
final currentState = state as ScheduleLoaded;
|
||||
emit(currentState.copyWith(
|
||||
countdownSeconds: event.seconds,
|
||||
countdownHours: event.hours,
|
||||
countdownMinutes: event.minutes,
|
||||
inchingHours: 0,
|
||||
@ -120,7 +113,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
inchingHours: event.hours,
|
||||
inchingMinutes: event.minutes,
|
||||
countdownRemaining: Duration.zero,
|
||||
inchingSeconds: 0, // Add this
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -432,7 +424,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
countdownMinutes: countdownDuration.inMinutes % 60,
|
||||
countdownRemaining: countdownDuration,
|
||||
isCountdownActive: true,
|
||||
countdownSeconds: countdownDuration.inSeconds,
|
||||
),
|
||||
);
|
||||
|
||||
@ -446,7 +437,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
countdownMinutes: 0,
|
||||
countdownRemaining: Duration.zero,
|
||||
isCountdownActive: false,
|
||||
countdownSeconds: 0,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -458,7 +448,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
inchingMinutes: inchingDuration.inMinutes % 60,
|
||||
isInchingActive: true,
|
||||
countdownRemaining: inchingDuration,
|
||||
countdownSeconds: inchingDuration.inSeconds,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -585,7 +574,8 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
}
|
||||
|
||||
String extractTime(String isoDateTime) {
|
||||
return isoDateTime.split('T')[1].split('.')[0];
|
||||
// Example input: "2025-06-19T15:45:00.000"
|
||||
return isoDateTime.split('T')[1].split('.')[0]; // gives "15:45:00"
|
||||
}
|
||||
|
||||
int? getTimeStampWithoutSeconds(DateTime? dateTime) {
|
||||
|
||||
@ -146,16 +146,14 @@ class UpdateScheduleModeEvent extends ScheduleEvent {
|
||||
class UpdateCountdownTimeEvent extends ScheduleEvent {
|
||||
final int hours;
|
||||
final int minutes;
|
||||
final int seconds;
|
||||
|
||||
const UpdateCountdownTimeEvent({
|
||||
required this.hours,
|
||||
required this.minutes,
|
||||
required this.seconds,
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object> get props => [hours, minutes, seconds];
|
||||
List<Object> get props => [hours, minutes];
|
||||
}
|
||||
|
||||
class UpdateInchingTimeEvent extends ScheduleEvent {
|
||||
|
||||
@ -26,15 +26,11 @@ class ScheduleLoaded extends ScheduleState {
|
||||
final bool isCountdownActive;
|
||||
final int inchingHours;
|
||||
final int inchingMinutes;
|
||||
final int inchingSeconds;
|
||||
final bool isInchingActive;
|
||||
final ScheduleModes scheduleMode;
|
||||
final Duration? countdownRemaining;
|
||||
final int? countdownSeconds;
|
||||
|
||||
const ScheduleLoaded({
|
||||
this.countdownSeconds = 0,
|
||||
this.inchingSeconds = 0,
|
||||
required this.schedules,
|
||||
this.selectedTime,
|
||||
required this.selectedDays,
|
||||
@ -65,9 +61,6 @@ class ScheduleLoaded extends ScheduleState {
|
||||
bool? isInchingActive,
|
||||
ScheduleModes? scheduleMode,
|
||||
Duration? countdownRemaining,
|
||||
String? deviceId,
|
||||
int? countdownSeconds,
|
||||
int? inchingSeconds,
|
||||
}) {
|
||||
return ScheduleLoaded(
|
||||
schedules: schedules ?? this.schedules,
|
||||
@ -75,7 +68,7 @@ class ScheduleLoaded extends ScheduleState {
|
||||
selectedDays: selectedDays ?? this.selectedDays,
|
||||
functionOn: functionOn ?? this.functionOn,
|
||||
isEditing: isEditing ?? this.isEditing,
|
||||
deviceId: deviceId ?? this.deviceId,
|
||||
deviceId: deviceId,
|
||||
countdownHours: countdownHours ?? this.countdownHours,
|
||||
countdownMinutes: countdownMinutes ?? this.countdownMinutes,
|
||||
isCountdownActive: isCountdownActive ?? this.isCountdownActive,
|
||||
@ -84,8 +77,6 @@ class ScheduleLoaded extends ScheduleState {
|
||||
isInchingActive: isInchingActive ?? this.isInchingActive,
|
||||
scheduleMode: scheduleMode ?? this.scheduleMode,
|
||||
countdownRemaining: countdownRemaining ?? this.countdownRemaining,
|
||||
countdownSeconds: countdownSeconds ?? this.countdownSeconds,
|
||||
inchingSeconds: inchingSeconds ?? this.inchingSeconds,
|
||||
);
|
||||
}
|
||||
|
||||
@ -105,8 +96,6 @@ class ScheduleLoaded extends ScheduleState {
|
||||
isInchingActive,
|
||||
scheduleMode,
|
||||
countdownRemaining,
|
||||
countdownSeconds,
|
||||
inchingSeconds,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -6,8 +6,7 @@ import 'package:syncrow_web/utils/color_manager.dart';
|
||||
import 'package:syncrow_web/utils/extension/build_context_x.dart';
|
||||
|
||||
class CountdownInchingView extends StatefulWidget {
|
||||
final String deviceId;
|
||||
const CountdownInchingView({super.key, required this.deviceId});
|
||||
const CountdownInchingView({super.key});
|
||||
|
||||
@override
|
||||
State<CountdownInchingView> createState() => _CountdownInchingViewState();
|
||||
@ -16,30 +15,25 @@ class CountdownInchingView extends StatefulWidget {
|
||||
class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
late FixedExtentScrollController _hoursController;
|
||||
late FixedExtentScrollController _minutesController;
|
||||
late FixedExtentScrollController _secondsController;
|
||||
|
||||
int _lastHours = -1;
|
||||
int _lastMinutes = -1;
|
||||
int _lastSeconds = -1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_hoursController = FixedExtentScrollController();
|
||||
_minutesController = FixedExtentScrollController();
|
||||
_secondsController = FixedExtentScrollController();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_hoursController.dispose();
|
||||
_minutesController.dispose();
|
||||
_secondsController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _updateControllers(
|
||||
int displayHours, int displayMinutes, int displaySeconds) {
|
||||
void _updateControllers(int displayHours, int displayMinutes) {
|
||||
if (_lastHours != displayHours) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_hoursController.hasClients) {
|
||||
@ -56,15 +50,6 @@ class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
});
|
||||
_lastMinutes = displayMinutes;
|
||||
}
|
||||
// Update seconds controller
|
||||
if (_lastSeconds != displaySeconds) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_secondsController.hasClients) {
|
||||
_secondsController.jumpToItem(displaySeconds);
|
||||
}
|
||||
});
|
||||
_lastSeconds = displaySeconds;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@ -72,6 +57,7 @@ class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
return BlocBuilder<ScheduleBloc, ScheduleState>(
|
||||
builder: (context, state) {
|
||||
if (state is! ScheduleLoaded) return const SizedBox.shrink();
|
||||
|
||||
final isCountDown = state.scheduleMode == ScheduleModes.countdown;
|
||||
final isActive =
|
||||
isCountDown ? state.isCountdownActive : state.isInchingActive;
|
||||
@ -81,21 +67,8 @@ class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
final displayMinutes = isActive && state.countdownRemaining != null
|
||||
? state.countdownRemaining!.inMinutes.remainder(60)
|
||||
: (isCountDown ? state.countdownMinutes : state.inchingMinutes);
|
||||
final displaySeconds = isActive && state.countdownRemaining != null
|
||||
? state.countdownRemaining!.inSeconds.remainder(60)
|
||||
: (isCountDown ? state.countdownSeconds : state.inchingSeconds);
|
||||
|
||||
_updateControllers(displayHours, displayMinutes, displaySeconds!);
|
||||
|
||||
if (displayHours == 0 && displayMinutes == 0 && displaySeconds == 0) {
|
||||
context.read<ScheduleBloc>().add(
|
||||
StopScheduleEvent(
|
||||
mode: ScheduleModes.countdown,
|
||||
deviceId: widget.deviceId,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
_updateControllers(displayHours, displayMinutes);
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@ -127,10 +100,7 @@ class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
(value) {
|
||||
if (!isActive) {
|
||||
context.read<ScheduleBloc>().add(UpdateCountdownTimeEvent(
|
||||
hours: value,
|
||||
minutes: displayMinutes,
|
||||
seconds: displaySeconds,
|
||||
));
|
||||
hours: value, minutes: displayMinutes));
|
||||
}
|
||||
},
|
||||
isActive: isActive,
|
||||
@ -145,35 +115,11 @@ class _CountdownInchingViewState extends State<CountdownInchingView> {
|
||||
(value) {
|
||||
if (!isActive) {
|
||||
context.read<ScheduleBloc>().add(UpdateCountdownTimeEvent(
|
||||
hours: displayHours,
|
||||
minutes: value,
|
||||
seconds: displaySeconds,
|
||||
));
|
||||
hours: displayHours, minutes: value));
|
||||
}
|
||||
},
|
||||
isActive: isActive,
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
if (isActive)
|
||||
_buildPickerColumn(
|
||||
context,
|
||||
's',
|
||||
displaySeconds,
|
||||
60,
|
||||
_secondsController,
|
||||
(value) {
|
||||
if (!isActive) {
|
||||
context
|
||||
.read<ScheduleBloc>()
|
||||
.add(UpdateCountdownTimeEvent(
|
||||
hours: displayHours,
|
||||
minutes: displayMinutes,
|
||||
seconds: value,
|
||||
));
|
||||
}
|
||||
},
|
||||
isActive: isActive,
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
||||
@ -74,9 +74,7 @@ class BuildScheduleView extends StatelessWidget {
|
||||
),
|
||||
if (state.scheduleMode == ScheduleModes.countdown ||
|
||||
state.scheduleMode == ScheduleModes.inching)
|
||||
CountdownInchingView(
|
||||
deviceId: deviceUuid,
|
||||
),
|
||||
const CountdownInchingView(),
|
||||
const SizedBox(height: 20),
|
||||
if (state.scheduleMode == ScheduleModes.countdown)
|
||||
CountdownModeButtons(
|
||||
|
||||
@ -102,7 +102,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
||||
],
|
||||
))
|
||||
.then((v) {
|
||||
Navigator.of(context).pop(true);
|
||||
Navigator.of(context).pop(v);
|
||||
});
|
||||
} else if (state is FailedState) {
|
||||
visitorBloc.stateDialog(
|
||||
@ -476,7 +476,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
||||
child: DefaultButton(
|
||||
borderRadius: 8,
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop(true);
|
||||
Navigator.of(context).pop(null);
|
||||
},
|
||||
backgroundColor: Colors.white,
|
||||
child: Text(
|
||||
@ -651,7 +651,7 @@ class VisitorPasswordDialog extends StatelessWidget {
|
||||
child: DefaultButton(
|
||||
borderRadius: 8,
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
Navigator.of(context).pop(null);
|
||||
},
|
||||
backgroundColor: Colors.white,
|
||||
child: Text(
|
||||
|
||||
Reference in New Issue
Block a user