diff --git a/lib/domain/calendar/calendar_page_store.dart b/lib/domain/calendar/calendar_page_store.dart index be1cf898d8..f3607b4812 100644 --- a/lib/domain/calendar/calendar_page_store.dart +++ b/lib/domain/calendar/calendar_page_store.dart @@ -3,6 +3,8 @@ import 'dart:async'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:pilll/domain/calendar/calendar_card_state.dart'; import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_card.dart'; +import 'package:pilll/entity/pill_sheet_modified_history.dart'; +import 'package:pilll/entity/pill_sheet_modified_history_value.dart'; import 'package:pilll/service/diary.dart'; import 'package:pilll/service/menstruation.dart'; import 'package:pilll/service/pill_sheet_group.dart'; @@ -148,4 +150,19 @@ class CalendarPageStateStore extends StateNotifier { } CalendarCardState cardState(DateTime date) => CalendarCardState(date); + + Future editTakenValue( + DateTime actualTakenDate, + PillSheetModifiedHistory history, + PillSheetModifiedHistoryValue value, + TakenPillValue takenPillValue, + ) { + return updateForEditTakenValue( + service: _pillSheetModifiedHistoryService, + actualTakenDate: actualTakenDate, + history: history, + value: value, + takenPillValue: takenPillValue, + ); + } } diff --git a/lib/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_taken_pill_action.dart b/lib/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_taken_pill_action.dart index 9f9cac9691..6e631b5759 100644 --- a/lib/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_taken_pill_action.dart +++ b/lib/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_taken_pill_action.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:pilll/analytics.dart'; import 'package:pilll/components/atoms/font.dart'; @@ -7,9 +6,16 @@ import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/com import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/components/taken_pill_action_o_list.dart'; import 'package:pilll/entity/pill_sheet.dart'; import 'package:pilll/entity/pill_sheet_modified_history_value.dart'; +import 'package:pilll/error/error_alert.dart'; import 'package:pilll/util/formatter/date_time_formatter.dart'; +import 'package:pilll/util/toolbar/date_and_time_picker.dart'; class PillSheetModifiedHistoryTakenPillAction extends StatelessWidget { + final Future Function( + DateTime actualTakenDate, + TakenPillValue value, + )? onEdit; + final DateTime estimatedEventCausingDate; final TakenPillValue? value; final PillSheet? beforePillSheet; @@ -17,6 +23,7 @@ class PillSheetModifiedHistoryTakenPillAction extends StatelessWidget { const PillSheetModifiedHistoryTakenPillAction({ Key? key, + required this.onEdit, required this.estimatedEventCausingDate, required this.value, required this.beforePillSheet, @@ -31,10 +38,48 @@ class PillSheetModifiedHistoryTakenPillAction extends StatelessWidget { if (value == null || afterPillSheet == null || beforePillSheet == null) { return Container(); } + final time = DateTimeFormatter.hourAndMinute(estimatedEventCausingDate); return GestureDetector( onTap: () { analytics.logEvent(name: "tapped_history_taken_action"); + + final onEdit = this.onEdit; + if (onEdit != null) { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return DateAndTimePicker( + initialDateTime: estimatedEventCausingDate, + done: (dateTime) async { + analytics.logEvent( + name: "selected_date_taken_history", + parameters: { + "hour": dateTime.hour, + "minute": dateTime.minute + }); + + try { + await onEdit(dateTime, value); + final date = + DateTimeFormatter.slashYearAndMonthAndDayAndTime( + dateTime); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + duration: Duration(seconds: 2), + content: Text("$dateに変更しました"), + ), + ); + Navigator.pop(context); + } catch (error) { + showErrorAlert(context, + message: '更新に失敗しました。通信環境をお確かめの上、再度変更してください'); + } + }, + ); + }, + ); + } }, child: Container( child: Padding( @@ -59,6 +104,7 @@ class PillSheetModifiedHistoryTakenPillAction extends StatelessWidget { child: Text( time, style: TextStyle( + decoration: TextDecoration.underline, letterSpacing: 1.5, color: TextColor.main, fontSize: 15, diff --git a/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_card.dart b/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_card.dart index d7f72f7b67..5957134a11 100644 --- a/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_card.dart +++ b/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_card.dart @@ -99,6 +99,7 @@ class CalendarPillSheetModifiedHistoryCard extends StatelessWidget { scrollPhysics: NeverScrollableScrollPhysics(), pillSheetModifiedHistories: state.pillSheetModifiedHistories, + onEditTakenPillAction: store.editTakenValue, ), ), if (state.moreButtonIsShown) @@ -115,6 +116,7 @@ class CalendarPillSheetModifiedHistoryCard extends StatelessWidget { scrollPhysics: NeverScrollableScrollPhysics(), pillSheetModifiedHistories: state.pillSheetModifiedHistories, + onEditTakenPillAction: null, ), ), Positioned.fill( diff --git a/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_list.dart b/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_list.dart index ce1d0287a2..55a0d30a6f 100644 --- a/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_list.dart +++ b/lib/domain/calendar/components/pill_sheet_modified_history/pill_sheet_modified_history_list.dart @@ -11,6 +11,7 @@ import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/com import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_revert_taken_pill_action.dart'; import 'package:pilll/domain/calendar/components/pill_sheet_modified_history/components/pill_sheet_modified_history_taken_pill_action.dart'; import 'package:pilll/entity/pill_sheet_modified_history.dart'; +import 'package:pilll/entity/pill_sheet_modified_history_value.dart'; import 'package:pilll/util/datetime/date_compare.dart'; class CalendarPillSheetModifiedHistoryListModel { @@ -27,11 +28,19 @@ class CalendarPillSheetModifiedHistoryList extends StatelessWidget { final ScrollPhysics scrollPhysics; final List pillSheetModifiedHistories; + final Future Function( + DateTime actualTakenDate, + PillSheetModifiedHistory history, + PillSheetModifiedHistoryValue value, + TakenPillValue takenPillValue, + )? onEditTakenPillAction; + const CalendarPillSheetModifiedHistoryList({ Key? key, required this.padding, required this.scrollPhysics, required this.pillSheetModifiedHistories, + required this.onEditTakenPillAction, }) : super(key: key); List get models { @@ -116,6 +125,12 @@ class CalendarPillSheetModifiedHistoryList extends StatelessWidget { ); case PillSheetModifiedActionType.takenPill: return PillSheetModifiedHistoryTakenPillAction( + onEdit: onEditTakenPillAction == null + ? null + : (actualDateTime, takenPillValue) { + return onEditTakenPillAction!(actualDateTime, + history, history.value, takenPillValue); + }, estimatedEventCausingDate: history.estimatedEventCausingDate, value: history.value.takenPill, diff --git a/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_page.dart b/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_page.dart index 9415ec2026..f1778afdca 100644 --- a/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_page.dart +++ b/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_page.dart @@ -55,6 +55,7 @@ class PillSheetModifiedHistoriesPage extends HookConsumerWidget { scrollPhysics: AlwaysScrollableScrollPhysics(), pillSheetModifiedHistories: state.pillSheetModifiedHistories, + onEditTakenPillAction: store.editTakenValue, ), ), ], diff --git a/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_store.dart b/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_store.dart index be553ece9d..48c907269f 100644 --- a/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_store.dart +++ b/lib/domain/pill_sheet_modified_history/pill_sheet_modified_history_store.dart @@ -2,10 +2,13 @@ import 'dart:async'; import 'dart:math'; import 'package:pilll/domain/pill_sheet_modified_history/pill_sheet_modified_history_state.dart'; +import 'package:pilll/entity/pill_sheet_modified_history.dart'; +import 'package:pilll/entity/pill_sheet_modified_history_value.dart'; import 'package:pilll/service/pill_sheet_modified_history.dart'; import 'package:riverpod/riverpod.dart'; -final pillSheetModifiedHistoryStoreProvider = StateNotifierProvider.autoDispose( +final pillSheetModifiedHistoryStoreProvider = StateNotifierProvider.autoDispose< + PillSheetModifiedHistoryStateStore, PillSheetModifiedHistoryState>( (ref) => PillSheetModifiedHistoryStateStore( ref.watch(pillSheetModifiedHistoryServiceProvider), ), @@ -65,4 +68,19 @@ class PillSheetModifiedHistoryStateStore isLoading: false); _subscribe(); } + + Future editTakenValue( + DateTime actualTakenDate, + PillSheetModifiedHistory history, + PillSheetModifiedHistoryValue value, + TakenPillValue takenPillValue, + ) { + return updateForEditTakenValue( + service: _pillSheetModifiedHistoryService, + actualTakenDate: actualTakenDate, + history: history, + value: value, + takenPillValue: takenPillValue, + ); + } } diff --git a/lib/domain/premium_introduction/premium_introduction_state.freezed.dart b/lib/domain/premium_introduction/premium_introduction_state.freezed.dart index db654532df..e8f2af913b 100644 --- a/lib/domain/premium_introduction/premium_introduction_state.freezed.dart +++ b/lib/domain/premium_introduction/premium_introduction_state.freezed.dart @@ -1,5 +1,6 @@ // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target part of 'premium_introduction_state.dart'; diff --git a/lib/entity/pill_sheet_modified_history.dart b/lib/entity/pill_sheet_modified_history.dart index b2475a42c5..1f3142cbc1 100644 --- a/lib/entity/pill_sheet_modified_history.dart +++ b/lib/entity/pill_sheet_modified_history.dart @@ -9,7 +9,7 @@ part 'pill_sheet_modified_history.g.dart'; part 'pill_sheet_modified_history.freezed.dart'; class PillSheetModifiedHistoryFirestoreKeys { - static final createdAt = "createdAt"; + static final estimatedEventCausingDate = "estimatedEventCausingDate"; } enum PillSheetModifiedActionType { diff --git a/lib/entity/pill_sheet_modified_history_value.dart b/lib/entity/pill_sheet_modified_history_value.dart index 7f15ad7ece..1eb1a9c175 100644 --- a/lib/entity/pill_sheet_modified_history_value.dart +++ b/lib/entity/pill_sheet_modified_history_value.dart @@ -107,12 +107,40 @@ class TakenPillValue with _$TakenPillValue { required DateTime afterLastTakenDate, required int beforeLastTakenPillNumber, required int afterLastTakenPillNumber, + TakenPillEditedValue? edited, }) = _TakenPillValue; factory TakenPillValue.fromJson(Map json) => _$TakenPillValueFromJson(json); } +@freezed +class TakenPillEditedValue with _$TakenPillEditedValue { + @JsonSerializable(explicitToJson: true) + const factory TakenPillEditedValue({ + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp, + ) + required DateTime createdDate, + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp, + ) + required DateTime actualTakenDate, + // + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp, + ) + required DateTime historyRecordedDate, + }) = _TakenPillEditedValue; + const TakenPillEditedValue._(); + + factory TakenPillEditedValue.fromJson(Map json) => + _$TakenPillEditedValueFromJson(json); +} + @freezed class RevertTakenPillValue with _$RevertTakenPillValue { const RevertTakenPillValue._(); diff --git a/lib/entity/pill_sheet_modified_history_value.freezed.dart b/lib/entity/pill_sheet_modified_history_value.freezed.dart index fabb58d2ff..e300e773c2 100644 --- a/lib/entity/pill_sheet_modified_history_value.freezed.dart +++ b/lib/entity/pill_sheet_modified_history_value.freezed.dart @@ -1251,12 +1251,14 @@ class _$TakenPillValueTearOff { @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) required DateTime afterLastTakenDate, required int beforeLastTakenPillNumber, - required int afterLastTakenPillNumber}) { + required int afterLastTakenPillNumber, + TakenPillEditedValue? edited}) { return _TakenPillValue( beforeLastTakenDate: beforeLastTakenDate, afterLastTakenDate: afterLastTakenDate, beforeLastTakenPillNumber: beforeLastTakenPillNumber, afterLastTakenPillNumber: afterLastTakenPillNumber, + edited: edited, ); } @@ -1280,6 +1282,7 @@ mixin _$TakenPillValue { DateTime get afterLastTakenDate => throw _privateConstructorUsedError; int get beforeLastTakenPillNumber => throw _privateConstructorUsedError; int get afterLastTakenPillNumber => throw _privateConstructorUsedError; + TakenPillEditedValue? get edited => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -1298,7 +1301,10 @@ abstract class $TakenPillValueCopyWith<$Res> { @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) DateTime afterLastTakenDate, int beforeLastTakenPillNumber, - int afterLastTakenPillNumber}); + int afterLastTakenPillNumber, + TakenPillEditedValue? edited}); + + $TakenPillEditedValueCopyWith<$Res>? get edited; } /// @nodoc @@ -1316,6 +1322,7 @@ class _$TakenPillValueCopyWithImpl<$Res> Object? afterLastTakenDate = freezed, Object? beforeLastTakenPillNumber = freezed, Object? afterLastTakenPillNumber = freezed, + Object? edited = freezed, }) { return _then(_value.copyWith( beforeLastTakenDate: beforeLastTakenDate == freezed @@ -1334,8 +1341,23 @@ class _$TakenPillValueCopyWithImpl<$Res> ? _value.afterLastTakenPillNumber : afterLastTakenPillNumber // ignore: cast_nullable_to_non_nullable as int, + edited: edited == freezed + ? _value.edited + : edited // ignore: cast_nullable_to_non_nullable + as TakenPillEditedValue?, )); } + + @override + $TakenPillEditedValueCopyWith<$Res>? get edited { + if (_value.edited == null) { + return null; + } + + return $TakenPillEditedValueCopyWith<$Res>(_value.edited!, (value) { + return _then(_value.copyWith(edited: value)); + }); + } } /// @nodoc @@ -1351,7 +1373,11 @@ abstract class _$TakenPillValueCopyWith<$Res> @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) DateTime afterLastTakenDate, int beforeLastTakenPillNumber, - int afterLastTakenPillNumber}); + int afterLastTakenPillNumber, + TakenPillEditedValue? edited}); + + @override + $TakenPillEditedValueCopyWith<$Res>? get edited; } /// @nodoc @@ -1371,6 +1397,7 @@ class __$TakenPillValueCopyWithImpl<$Res> Object? afterLastTakenDate = freezed, Object? beforeLastTakenPillNumber = freezed, Object? afterLastTakenPillNumber = freezed, + Object? edited = freezed, }) { return _then(_TakenPillValue( beforeLastTakenDate: beforeLastTakenDate == freezed @@ -1389,6 +1416,10 @@ class __$TakenPillValueCopyWithImpl<$Res> ? _value.afterLastTakenPillNumber : afterLastTakenPillNumber // ignore: cast_nullable_to_non_nullable as int, + edited: edited == freezed + ? _value.edited + : edited // ignore: cast_nullable_to_non_nullable + as TakenPillEditedValue?, )); } } @@ -1403,7 +1434,8 @@ class _$_TakenPillValue extends _TakenPillValue { @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) required this.afterLastTakenDate, required this.beforeLastTakenPillNumber, - required this.afterLastTakenPillNumber}) + required this.afterLastTakenPillNumber, + this.edited}) : super._(); factory _$_TakenPillValue.fromJson(Map json) => @@ -1423,10 +1455,12 @@ class _$_TakenPillValue extends _TakenPillValue { final int beforeLastTakenPillNumber; @override final int afterLastTakenPillNumber; + @override + final TakenPillEditedValue? edited; @override String toString() { - return 'TakenPillValue(beforeLastTakenDate: $beforeLastTakenDate, afterLastTakenDate: $afterLastTakenDate, beforeLastTakenPillNumber: $beforeLastTakenPillNumber, afterLastTakenPillNumber: $afterLastTakenPillNumber)'; + return 'TakenPillValue(beforeLastTakenDate: $beforeLastTakenDate, afterLastTakenDate: $afterLastTakenDate, beforeLastTakenPillNumber: $beforeLastTakenPillNumber, afterLastTakenPillNumber: $afterLastTakenPillNumber, edited: $edited)'; } @override @@ -1441,7 +1475,8 @@ class _$_TakenPillValue extends _TakenPillValue { const DeepCollectionEquality().equals( other.beforeLastTakenPillNumber, beforeLastTakenPillNumber) && const DeepCollectionEquality().equals( - other.afterLastTakenPillNumber, afterLastTakenPillNumber)); + other.afterLastTakenPillNumber, afterLastTakenPillNumber) && + const DeepCollectionEquality().equals(other.edited, edited)); } @override @@ -1450,7 +1485,8 @@ class _$_TakenPillValue extends _TakenPillValue { const DeepCollectionEquality().hash(beforeLastTakenDate), const DeepCollectionEquality().hash(afterLastTakenDate), const DeepCollectionEquality().hash(beforeLastTakenPillNumber), - const DeepCollectionEquality().hash(afterLastTakenPillNumber)); + const DeepCollectionEquality().hash(afterLastTakenPillNumber), + const DeepCollectionEquality().hash(edited)); @JsonKey(ignore: true) @override @@ -1470,7 +1506,8 @@ abstract class _TakenPillValue extends TakenPillValue { @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) required DateTime afterLastTakenDate, required int beforeLastTakenPillNumber, - required int afterLastTakenPillNumber}) = _$_TakenPillValue; + required int afterLastTakenPillNumber, + TakenPillEditedValue? edited}) = _$_TakenPillValue; const _TakenPillValue._() : super._(); factory _TakenPillValue.fromJson(Map json) = @@ -1491,11 +1528,263 @@ abstract class _TakenPillValue extends TakenPillValue { @override int get afterLastTakenPillNumber; @override + TakenPillEditedValue? get edited; + @override @JsonKey(ignore: true) _$TakenPillValueCopyWith<_TakenPillValue> get copyWith => throw _privateConstructorUsedError; } +TakenPillEditedValue _$TakenPillEditedValueFromJson(Map json) { + return _TakenPillEditedValue.fromJson(json); +} + +/// @nodoc +class _$TakenPillEditedValueTearOff { + const _$TakenPillEditedValueTearOff(); + + _TakenPillEditedValue call( + {@JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime createdDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime actualTakenDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime historyRecordedDate}) { + return _TakenPillEditedValue( + createdDate: createdDate, + actualTakenDate: actualTakenDate, + historyRecordedDate: historyRecordedDate, + ); + } + + TakenPillEditedValue fromJson(Map json) { + return TakenPillEditedValue.fromJson(json); + } +} + +/// @nodoc +const $TakenPillEditedValue = _$TakenPillEditedValueTearOff(); + +/// @nodoc +mixin _$TakenPillEditedValue { + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get createdDate => throw _privateConstructorUsedError; + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get actualTakenDate => throw _privateConstructorUsedError; // + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get historyRecordedDate => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $TakenPillEditedValueCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $TakenPillEditedValueCopyWith<$Res> { + factory $TakenPillEditedValueCopyWith(TakenPillEditedValue value, + $Res Function(TakenPillEditedValue) then) = + _$TakenPillEditedValueCopyWithImpl<$Res>; + $Res call( + {@JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime createdDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime actualTakenDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime historyRecordedDate}); +} + +/// @nodoc +class _$TakenPillEditedValueCopyWithImpl<$Res> + implements $TakenPillEditedValueCopyWith<$Res> { + _$TakenPillEditedValueCopyWithImpl(this._value, this._then); + + final TakenPillEditedValue _value; + // ignore: unused_field + final $Res Function(TakenPillEditedValue) _then; + + @override + $Res call({ + Object? createdDate = freezed, + Object? actualTakenDate = freezed, + Object? historyRecordedDate = freezed, + }) { + return _then(_value.copyWith( + createdDate: createdDate == freezed + ? _value.createdDate + : createdDate // ignore: cast_nullable_to_non_nullable + as DateTime, + actualTakenDate: actualTakenDate == freezed + ? _value.actualTakenDate + : actualTakenDate // ignore: cast_nullable_to_non_nullable + as DateTime, + historyRecordedDate: historyRecordedDate == freezed + ? _value.historyRecordedDate + : historyRecordedDate // ignore: cast_nullable_to_non_nullable + as DateTime, + )); + } +} + +/// @nodoc +abstract class _$TakenPillEditedValueCopyWith<$Res> + implements $TakenPillEditedValueCopyWith<$Res> { + factory _$TakenPillEditedValueCopyWith(_TakenPillEditedValue value, + $Res Function(_TakenPillEditedValue) then) = + __$TakenPillEditedValueCopyWithImpl<$Res>; + @override + $Res call( + {@JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime createdDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime actualTakenDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime historyRecordedDate}); +} + +/// @nodoc +class __$TakenPillEditedValueCopyWithImpl<$Res> + extends _$TakenPillEditedValueCopyWithImpl<$Res> + implements _$TakenPillEditedValueCopyWith<$Res> { + __$TakenPillEditedValueCopyWithImpl( + _TakenPillEditedValue _value, $Res Function(_TakenPillEditedValue) _then) + : super(_value, (v) => _then(v as _TakenPillEditedValue)); + + @override + _TakenPillEditedValue get _value => super._value as _TakenPillEditedValue; + + @override + $Res call({ + Object? createdDate = freezed, + Object? actualTakenDate = freezed, + Object? historyRecordedDate = freezed, + }) { + return _then(_TakenPillEditedValue( + createdDate: createdDate == freezed + ? _value.createdDate + : createdDate // ignore: cast_nullable_to_non_nullable + as DateTime, + actualTakenDate: actualTakenDate == freezed + ? _value.actualTakenDate + : actualTakenDate // ignore: cast_nullable_to_non_nullable + as DateTime, + historyRecordedDate: historyRecordedDate == freezed + ? _value.historyRecordedDate + : historyRecordedDate // ignore: cast_nullable_to_non_nullable + as DateTime, + )); + } +} + +/// @nodoc + +@JsonSerializable(explicitToJson: true) +class _$_TakenPillEditedValue extends _TakenPillEditedValue { + const _$_TakenPillEditedValue( + {@JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required this.createdDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required this.actualTakenDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required this.historyRecordedDate}) + : super._(); + + factory _$_TakenPillEditedValue.fromJson(Map json) => + _$$_TakenPillEditedValueFromJson(json); + + @override + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + final DateTime createdDate; + @override + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + final DateTime actualTakenDate; + @override // + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + final DateTime historyRecordedDate; + + @override + String toString() { + return 'TakenPillEditedValue(createdDate: $createdDate, actualTakenDate: $actualTakenDate, historyRecordedDate: $historyRecordedDate)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _TakenPillEditedValue && + const DeepCollectionEquality() + .equals(other.createdDate, createdDate) && + const DeepCollectionEquality() + .equals(other.actualTakenDate, actualTakenDate) && + const DeepCollectionEquality() + .equals(other.historyRecordedDate, historyRecordedDate)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + const DeepCollectionEquality().hash(createdDate), + const DeepCollectionEquality().hash(actualTakenDate), + const DeepCollectionEquality().hash(historyRecordedDate)); + + @JsonKey(ignore: true) + @override + _$TakenPillEditedValueCopyWith<_TakenPillEditedValue> get copyWith => + __$TakenPillEditedValueCopyWithImpl<_TakenPillEditedValue>( + this, _$identity); + + @override + Map toJson() { + return _$$_TakenPillEditedValueToJson(this); + } +} + +abstract class _TakenPillEditedValue extends TakenPillEditedValue { + const factory _TakenPillEditedValue( + {@JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime createdDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime actualTakenDate, + @JsonKey(fromJson: NonNullTimestampConverter.timestampToDateTime, toJson: NonNullTimestampConverter.dateTimeToTimestamp) + required DateTime historyRecordedDate}) = _$_TakenPillEditedValue; + const _TakenPillEditedValue._() : super._(); + + factory _TakenPillEditedValue.fromJson(Map json) = + _$_TakenPillEditedValue.fromJson; + + @override + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get createdDate; + @override + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get actualTakenDate; + @override // + @JsonKey( + fromJson: NonNullTimestampConverter.timestampToDateTime, + toJson: NonNullTimestampConverter.dateTimeToTimestamp) + DateTime get historyRecordedDate; + @override + @JsonKey(ignore: true) + _$TakenPillEditedValueCopyWith<_TakenPillEditedValue> get copyWith => + throw _privateConstructorUsedError; +} + RevertTakenPillValue _$RevertTakenPillValueFromJson(Map json) { return _RevertTakenPillValue.fromJson(json); } diff --git a/lib/entity/pill_sheet_modified_history_value.g.dart b/lib/entity/pill_sheet_modified_history_value.g.dart index 1a7193521f..7907c9ddc2 100644 --- a/lib/entity/pill_sheet_modified_history_value.g.dart +++ b/lib/entity/pill_sheet_modified_history_value.g.dart @@ -136,6 +136,10 @@ _$_TakenPillValue _$$_TakenPillValueFromJson(Map json) => json['afterLastTakenDate'] as Timestamp), beforeLastTakenPillNumber: json['beforeLastTakenPillNumber'] as int, afterLastTakenPillNumber: json['afterLastTakenPillNumber'] as int, + edited: json['edited'] == null + ? null + : TakenPillEditedValue.fromJson( + json['edited'] as Map), ); Map _$$_TakenPillValueToJson(_$_TakenPillValue instance) => @@ -146,6 +150,29 @@ Map _$$_TakenPillValueToJson(_$_TakenPillValue instance) => instance.afterLastTakenDate), 'beforeLastTakenPillNumber': instance.beforeLastTakenPillNumber, 'afterLastTakenPillNumber': instance.afterLastTakenPillNumber, + 'edited': instance.edited?.toJson(), + }; + +_$_TakenPillEditedValue _$$_TakenPillEditedValueFromJson( + Map json) => + _$_TakenPillEditedValue( + createdDate: NonNullTimestampConverter.timestampToDateTime( + json['createdDate'] as Timestamp), + actualTakenDate: NonNullTimestampConverter.timestampToDateTime( + json['actualTakenDate'] as Timestamp), + historyRecordedDate: NonNullTimestampConverter.timestampToDateTime( + json['historyRecordedDate'] as Timestamp), + ); + +Map _$$_TakenPillEditedValueToJson( + _$_TakenPillEditedValue instance) => + { + 'createdDate': + NonNullTimestampConverter.dateTimeToTimestamp(instance.createdDate), + 'actualTakenDate': NonNullTimestampConverter.dateTimeToTimestamp( + instance.actualTakenDate), + 'historyRecordedDate': NonNullTimestampConverter.dateTimeToTimestamp( + instance.historyRecordedDate), }; _$_RevertTakenPillValue _$$_RevertTakenPillValueFromJson( diff --git a/lib/service/pill_sheet_modified_history.dart b/lib/service/pill_sheet_modified_history.dart index 1a88be61da..452c365f14 100644 --- a/lib/service/pill_sheet_modified_history.dart +++ b/lib/service/pill_sheet_modified_history.dart @@ -18,7 +18,8 @@ class PillSheetModifiedHistoryService { Future> fetchList(DateTime? after, int limit) { return _database .pillSheetModifiedHistoriesReference() - .orderBy(PillSheetModifiedHistoryFirestoreKeys.createdAt, + .orderBy( + PillSheetModifiedHistoryFirestoreKeys.estimatedEventCausingDate, descending: true) .startAfter([after]) .limit(limit) @@ -47,14 +48,14 @@ class PillSheetModifiedHistoryService { await _database .pillSheetModifiedHistoriesReference() .doc(pillSheetModifiedHistory.id) - .set(pillSheetModifiedHistory, SetOptions(merge: true)); - return; + .set(pillSheetModifiedHistory.toJson(), SetOptions(merge: true)); } Stream> stream(int limit) { return _database .pillSheetModifiedHistoriesReference() - .orderBy(PillSheetModifiedHistoryFirestoreKeys.createdAt, + .orderBy( + PillSheetModifiedHistoryFirestoreKeys.estimatedEventCausingDate, descending: true) .limit(limit) .snapshots() @@ -290,3 +291,27 @@ extension PillSheetModifiedHistoryServiceActionFactory ); } } + +Future updateForEditTakenValue({ + required PillSheetModifiedHistoryService service, + required DateTime actualTakenDate, + required PillSheetModifiedHistory history, + required PillSheetModifiedHistoryValue value, + required TakenPillValue takenPillValue, +}) { + final editedTakenPillValue = takenPillValue.copyWith( + edited: TakenPillEditedValue( + createdDate: DateTime.now(), + actualTakenDate: actualTakenDate, + historyRecordedDate: history.estimatedEventCausingDate, + ), + ); + final editedHistory = history.copyWith( + estimatedEventCausingDate: actualTakenDate, + value: value.copyWith( + takenPill: editedTakenPillValue, + ), + ); + + return service.update(editedHistory); +} diff --git a/lib/util/formatter/date_time_formatter.dart b/lib/util/formatter/date_time_formatter.dart index 0e23b46cac..82780d2852 100644 --- a/lib/util/formatter/date_time_formatter.dart +++ b/lib/util/formatter/date_time_formatter.dart @@ -33,10 +33,19 @@ class DateTimeFormatter { return DateFormat(DateFormat.ABBR_WEEKDAY, "ja_JP").format(dateTime); } + // 2022/01/08 static String slashYearAndMonthAndDay(DateTime dateTime) { return DateFormat("yyyy/MM/dd", "ja_JP").format(dateTime); } + // 2022/01/08 12:20 + static String slashYearAndMonthAndDayAndTime(DateTime dateTime) { + final date = slashYearAndMonthAndDay(dateTime); + final time = hourAndMinute(dateTime); + return "$date $time"; + } + + // 2022/01 static String slashYearAndMonth(DateTime dateTime) { return DateFormat("yyyy/MM", "ja_JP").format(dateTime); } @@ -45,11 +54,13 @@ class DateTimeFormatter { return DateFormat("yyyyMMdd", "ja_JP").format(dateTime); } + // 12:20 static String hourAndMinute(DateTime dateTime) { final format = NumberFormat("00"); return format.format(dateTime.hour) + ":" + format.format(dateTime.minute); } + // 12:20:30 static String clock(int hour, minute, second) { final format = NumberFormat("00"); return format.format(hour) +