feat(diary) API methods added

This commit is contained in:
2024-02-19 14:27:39 +03:00
parent 0091e00060
commit 7d0de42488
4 changed files with 166 additions and 90 deletions

View File

@@ -27,17 +27,16 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
on<RemovePortionEvent>(
_removePortion); // пользователь нажимает на крестик около продукта
on<UploadImages>(_uploadImages); //пользователь нажимает "Добавить фото"
on<AddComment>(_addComment); //пользователь нажимает "Добавить комментарий"
}
Future<void> _onInitialize(
DiaryEditInitialEvent event,
Emitter<DiaryEditState> emit,
) async {
/*try {
/*final box = await Hive.openBox('token');
final token = box.get('token');*/
try {
final token =
"1|laravel_sanctum_JBjDvwoEpmFc7CmzBaktFtZPGfSpXcEVA5YgBQ380d322d92";
"1|laravel_sanctum_8qeVUwDzs440SoG1pJFdSFtYWjJhZfEQXqStVkFPea8d4092";
final response = await http.get(
Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/index'),
headers: {
@@ -47,42 +46,67 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
// Проверка наличия ключевых полей в JSON
if (data is Map<String, dynamic> && data.containsKey('id')) {
// Все ключевые поля присутствуют, продолжаем обработку*/
if (state is DiaryEditLoadedState) {
// Если текущее состояние уже загружено, обновляем его
var currentState = state as DiaryEditLoadedState;
// Обновляем значения контроллеров только если они уже были созданы
emit((currentState).copyWith(
wakeupExpanded: currentState.wakeupExpanded,
moodExpanded: currentState.moodExpanded,
wakeupController: currentState.wakeupController,
retireController: currentState.retireController,
commentController: currentState.commentController,
mealTimeController: currentState.mealTimeController,
mealNameController: currentState.mealNameController,
productNameController: currentState.productNameController,
selectedSatiety: currentState.selectedSatiety,
selectedMood: currentState.selectedMood,
productQuantityController: currentState.productQuantityController));
} else {
// Если текущее состояние - начальное, создаем новое загруженное состояние
emit(DiaryEditLoadedState(
wakeupExpanded: true,
moodExpanded: true,
wakeupController: TimeOfDay.now(),
retireController: TimeOfDay.now(),
mealTimeController: TimeOfDay.now(),
selectedSatiety: 3,
selectedMood: 3,
mealNameController: TextEditingController(),
commentController: TextEditingController(),
productNameController: TextEditingController(),
productQuantityController: TextEditingController(),
));
}
/*} else {
final int diaryId = data['id'];
try {
final response = await http.get(
Uri.parse(dotenv.env['SERVER_ROOT']! + '/diary/show/$diaryId'),
headers: {
'Authorization': 'Bearer $token',
},
);
final diary = jsonDecode(response.body);
if (diary is Map<String, dynamic>) {
final String diaryDate =
diary['diary']['date'] ?? DateTime.now().toString();
// Продолжайте обработку данных дневника
if (state is DiaryEditLoadedState) {
// Если текущее состояние уже загружено, обновляем его
var currentState = state as DiaryEditLoadedState;
emit((currentState).copyWith(
wakeupExpanded: currentState.wakeupExpanded,
moodExpanded: currentState.moodExpanded,
wakeupController: currentState.wakeupController,
retireController: currentState.retireController,
commentController: currentState.commentController,
mealTimeController: currentState.mealTimeController,
mealNameController: currentState.mealNameController,
productNameController: currentState.productNameController,
selectedSatiety: currentState.selectedSatiety,
selectedMood: currentState.selectedMood,
diaryDate: currentState.diaryDate,
productQuantityController:
currentState.productQuantityController,
));
} else {
// Если текущее состояние - начальное, создаем новое загруженное состояние
emit(DiaryEditLoadedState(
wakeupExpanded: true,
moodExpanded: true,
wakeupController: TimeOfDay.now(),
retireController: TimeOfDay.now(),
mealTimeController: TimeOfDay.now(),
selectedSatiety: 3,
selectedMood: 3,
mealNameController: TextEditingController(),
commentController: TextEditingController(),
productNameController: TextEditingController(),
productQuantityController: TextEditingController(),
diaryId: diaryId,
diaryDate: diaryDate,
));
}
} else {
// Ошибка при декодировании JSON
emit(DiaryEditErrorState(
'Ошибка при декодировании данных дневника'));
}
} catch (e) {
// Ошибка при получении данных дневника
emit(DiaryEditErrorState(
'Ошибка при получении данных дневника: $e'));
}
} else {
// Один или несколько ключевых полей отсутствуют, обрабатываем ошибку
emit(
DiaryEditErrorState('Некоторые необходимые данные отсутствуют.'));
@@ -92,9 +116,9 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(DiaryEditErrorState('Ошибка сервера: ${response.statusCode}'));
}
} catch (e) {
// Ошибка при декодировании JSON или другая ошибка выполнения
emit(DiaryEditErrorState('Ошибка при получении данных профиля: $e'));
}*/
// Ошибка при получении данных дневника
emit(DiaryEditErrorState('Ошибка при получении данных дневника: $e'));
}
}
Future<void> _changeSatiety(
@@ -130,8 +154,6 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(currentState.copyWith(moodExpanded: !currentState.moodExpanded));
currentState.moodExpanded = !currentState.moodExpanded;
print(currentState.moodExpanded);
}
}
@@ -142,7 +164,6 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(currentState.copyWith(wakeupExpanded: !currentState.wakeupExpanded));
currentState.wakeupExpanded = !currentState.wakeupExpanded;
print(currentState.wakeupExpanded);
}
}
@@ -153,7 +174,6 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(currentState.copyWith(wakeupController: event.selectedTime));
currentState.wakeupController = event.selectedTime;
print(currentState.wakeupExpanded);
}
}
@@ -164,7 +184,6 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
emit(currentState.copyWith(retireController: event.selectedTime));
currentState.retireController = event.selectedTime;
print(currentState.retireController);
}
}
@@ -177,8 +196,9 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
Future<FutureOr<void>> _uploadImages(
UploadImages event, Emitter<DiaryEditState> emit) async {
String imageUrl = await uploadImageToServer(event.image.path);
print(imageUrl);
}
FutureOr<void> _addComment(AddComment event, Emitter<DiaryEditState> emit) {}
}
Future<String> uploadImageToServer(String imagePath) async {

View File

@@ -16,35 +16,48 @@ class DiaryEditInitialEvent extends DiaryEditEvent {
}
class ChangeSatiety extends DiaryEditEvent {
ChangeSatiety(this.selectedElement);
ChangeSatiety(this.mealId, this.selectedElement);
final int selectedElement;
final int mealId;
@override
List<Object> get props => [selectedElement];
List<Object> get props => [selectedElement, mealId];
}
class ChangeMood extends DiaryEditEvent {
ChangeMood(this.selectedElement);
ChangeMood(this.diaryId, this.selectedElement);
final int selectedElement;
final int diaryId;
@override
List<Object> get props => [selectedElement];
List<Object> get props => [selectedElement, diaryId];
}
class AddComment extends DiaryEditEvent {
AddComment(this.diaryId, this.comment);
final String comment;
final int diaryId;
@override
List<Object> get props => [comment, diaryId];
}
class WakeupEvent extends DiaryEditEvent {
WakeupEvent(this.selectedTime);
WakeupEvent(this.diaryId, this.selectedTime);
final TimeOfDay selectedTime;
final int diaryId;
@override
List<Object> get props => [selectedTime];
List<Object> get props => [selectedTime, diaryId];
}
class RetireEvent extends DiaryEditEvent {
RetireEvent(this.selectedTime);
RetireEvent(this.selectedTime, this.diaryId);
final TimeOfDay selectedTime;
final int diaryId;
@override
List<Object> get props => [selectedTime];
List<Object> get props => [selectedTime, diaryId];
}
class ToggleMoodExpandedEvent extends DiaryEditEvent {
@@ -64,7 +77,7 @@ class AddPortionEvent extends DiaryEditEvent {
final int quantity;
final String portion;
@override
List<Object> get props => [mealId, productId, quantity];
List<Object> get props => [mealId, productId, quantity, portion];
}
class RemovePortionEvent extends DiaryEditEvent {

View File

@@ -20,6 +20,7 @@ class DiaryEditInitialState extends DiaryEditState {
class DiaryEditLoadedState extends DiaryEditState {
DiaryEditLoadedState(
{this.diaryEditModelObj,
this.diaryDate,
this.wakeupController,
this.retireController,
this.commentController,
@@ -28,12 +29,14 @@ class DiaryEditLoadedState extends DiaryEditState {
this.productNameController,
this.productQuantityController,
this.selectedMood,
required this.diaryId,
required this.selectedSatiety,
required this.wakeupExpanded,
required this.moodExpanded})
: super(diaryEditModelObj: null);
DiaryEditModel? diaryEditModelObj;
String? diaryDate;
TimeOfDay? wakeupController;
TimeOfDay? retireController;
TimeOfDay? mealTimeController;
@@ -43,11 +46,13 @@ class DiaryEditLoadedState extends DiaryEditState {
TextEditingController? productQuantityController;
int? selectedMood;
int selectedSatiety;
int diaryId;
bool wakeupExpanded;
bool moodExpanded;
@override
List<Object?> get props => [
diaryEditModelObj,
diaryDate,
wakeupController,
retireController,
mealNameController,
@@ -57,11 +62,13 @@ class DiaryEditLoadedState extends DiaryEditState {
productQuantityController,
selectedMood,
selectedSatiety,
diaryId,
wakeupExpanded,
moodExpanded
];
DiaryEditLoadedState copyWith({
DiaryEditModel? diaryEditModelObj,
String? diaryDate,
TimeOfDay? wakeupController,
TimeOfDay? retireController,
TimeOfDay? mealTimeController,
@@ -71,11 +78,13 @@ class DiaryEditLoadedState extends DiaryEditState {
TextEditingController? productQuantityController,
int? selectedMood,
int? selectedSatiety,
int? diaryId,
bool? wakeupExpanded,
bool? moodExpanded,
}) {
return DiaryEditLoadedState(
diaryEditModelObj: diaryEditModelObj ?? this.diaryEditModelObj,
diaryDate: diaryDate ?? this.diaryDate,
wakeupController: wakeupController ?? this.wakeupController,
retireController: retireController ?? this.retireController,
mealTimeController: mealTimeController ?? this.mealTimeController,
@@ -87,6 +96,7 @@ class DiaryEditLoadedState extends DiaryEditState {
productQuantityController ?? this.productQuantityController,
selectedMood: selectedMood ?? this.selectedMood,
selectedSatiety: selectedSatiety ?? this.selectedSatiety,
diaryId: diaryId ?? this.diaryId,
wakeupExpanded: wakeupExpanded ?? this.wakeupExpanded,
moodExpanded: moodExpanded ?? this.moodExpanded);
}

View File

@@ -75,7 +75,7 @@ class DiaryEditScreen extends StatelessWidget {
padding: EdgeInsets.only(bottom: 5.v),
child: Column(
children: [
_buildHeaderRow(context),
_buildHeaderRow(context, state),
SizedBox(height: 30.v),
_buildWakupRetire(context, state),
SizedBox(height: 30.v),
@@ -101,7 +101,7 @@ class DiaryEditScreen extends StatelessWidget {
}
/// Section Widget
Widget _buildHeaderRow(BuildContext context) {
Widget _buildHeaderRow(BuildContext context, DiaryEditLoadedState state) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 16.h, vertical: 16.h),
padding: EdgeInsets.symmetric(
@@ -141,7 +141,7 @@ class DiaryEditScreen extends StatelessWidget {
),
SizedBox(height: 2.v),
Text(
"03-08-2023",
state.diaryDate.toString(),
style: CustomTextStyles.bodyMediumBluegray800,
),
],
@@ -244,12 +244,18 @@ class DiaryEditScreen extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 10.h),
child: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width - 247,
maxWidth: MediaQuery.of(context).size.width - 260,
),
child: FormBuilderDateTimePicker(
name: 'mealTime',
inputType: InputType.time,
decoration: InputDecoration(),
child: GestureDetector(
onTap: () => _selectTime(context, state),
child: AbsorbPointer(
child: CustomTextFormField(
hintText: state.mealTimeController
?.format(context)
.toString(),
autofocus: false,
),
),
),
),
),
@@ -323,42 +329,54 @@ class DiaryEditScreen extends StatelessWidget {
color: Colors.red,
isSelected: state.selectedSatiety == 0,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(0));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(0, state.diaryId));
},
),
ScaleElement(
color: Colors.orange,
isSelected: state.selectedSatiety == 1,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(1));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(1, state.diaryId));
},
),
ScaleElement(
color: Colors.yellow,
isSelected: state.selectedSatiety == 2,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(2));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(2, state.diaryId));
},
),
ScaleElement(
color: Colors.lime,
isSelected: state.selectedSatiety == 3,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(3));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(3, state.diaryId));
},
),
ScaleElement(
color: Colors.lightGreen,
isSelected: state.selectedSatiety == 4,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(4));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(4, state.diaryId));
},
),
ScaleElement(
color: Colors.green,
isSelected: state.selectedSatiety == 5,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeSatiety(5));
context
.read<DiaryEditBloc>()
.add(ChangeSatiety(5, state.diaryId));
},
),
Text("😊"),
@@ -761,30 +779,33 @@ class DiaryEditScreen extends StatelessWidget {
padding: const EdgeInsets.only(left: 16.0),
child: Column(
children: [
SizedBox(height: 20.v),
GestureDetector(
onTap: () => _selectTime(context, state),
child: AbsorbPointer(
child: TextFormField(
decoration: InputDecoration(
labelText: 'Во сколько вы просунились?',
prefixIcon: Icon(Icons.sunny),
),
initialValue: state.wakeupController.toString(),
child: CustomTextFormField(
hintText: state.wakeupController
?.format(context)
.toString(),
prefix: Icon(Icons.sunny),
autofocus: false,
),
),
),
SizedBox(height: 20.v),
GestureDetector(
onTap: () => _selectTime(context, state),
child: AbsorbPointer(
child: TextFormField(
decoration: InputDecoration(
labelText: 'Во сколько вы легли спать?',
prefixIcon: Icon(Icons.bed),
),
initialValue: state.retireController.toString(),
child: CustomTextFormField(
hintText: state.retireController
?.format(context)
.toString(),
prefix: Icon(Icons.bed),
autofocus: false,
),
),
)
),
SizedBox(height: 20.v),
],
),
),
@@ -857,42 +878,54 @@ class DiaryEditScreen extends StatelessWidget {
color: Colors.red,
isSelected: state.selectedMood == 0,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(0));
context
.read<DiaryEditBloc>()
.add(ChangeMood(0, state.diaryId));
},
),
ScaleElement(
color: Colors.orange,
isSelected: state.selectedMood == 1,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(1));
context
.read<DiaryEditBloc>()
.add(ChangeMood(1, state.diaryId));
},
),
ScaleElement(
color: Colors.yellow,
isSelected: state.selectedMood == 2,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(2));
context
.read<DiaryEditBloc>()
.add(ChangeMood(2, state.diaryId));
},
),
ScaleElement(
color: Colors.lime,
isSelected: state.selectedMood == 3,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(3));
context
.read<DiaryEditBloc>()
.add(ChangeMood(3, state.diaryId));
},
),
ScaleElement(
color: Colors.lightGreen,
isSelected: state.selectedMood == 4,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(4));
context
.read<DiaryEditBloc>()
.add(ChangeMood(4, state.diaryId));
},
),
ScaleElement(
color: Colors.green,
isSelected: state.selectedMood == 5,
onTap: () {
context.read<DiaryEditBloc>().add(ChangeMood(5));
context
.read<DiaryEditBloc>()
.add(ChangeMood(5, state.diaryId));
},
),
Text("😊"),