Rumahjo-Android-APP/lib/data/cubits/slider_cubit.dart
2024-09-07 07:58:50 +07:00

182 lines
5.2 KiB
Dart

// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert';
import 'package:ebroker/utils/api.dart';
import 'package:flutter/material.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import '../../settings.dart';
import '../../utils/Network/networkAvailability.dart';
import '../helper/custom_exception.dart';
import '../model/home_slider.dart';
abstract class SliderState {}
class SliderInitial extends SliderState {}
class SliderFetchInProgress extends SliderState {}
class SliderFetchInInternalProgress extends SliderState {}
class SliderFetchSuccess extends SliderState {
List<HomeSlider> sliderlist = [];
SliderFetchSuccess(this.sliderlist);
Map<String, dynamic> toMap() {
return <String, dynamic>{
'sliderlist': sliderlist.map((x) => x.toMap()).toList(),
};
}
factory SliderFetchSuccess.fromMap(Map<String, dynamic> map) {
return SliderFetchSuccess(
List<HomeSlider>.from(
(map['sliderlist']).map<HomeSlider>(
(x) => HomeSlider.fromMap(x as Map<String, dynamic>),
),
),
);
}
String toJson() => json.encode(toMap());
factory SliderFetchSuccess.fromJson(String source) =>
SliderFetchSuccess.fromMap(json.decode(source) as Map<String, dynamic>);
}
class SliderFetchFailure extends SliderState {
final String errorMessage;
final bool isUserDeactivated;
SliderFetchFailure(
this.errorMessage, this.isUserDeactivated); //, this.isUserDeactivated
}
class SliderCubit extends Cubit<SliderState> with HydratedMixin {
SliderCubit() : super(SliderInitial());
void fetchSlider(BuildContext context,
{bool? forceRefresh, bool? loadWithoutDelay}) async {
if (forceRefresh != true) {
if (state is SliderFetchSuccess) {
await Future.delayed(Duration(
seconds: loadWithoutDelay == true
? 0
: AppSettings.hiddenAPIProcessDelay));
} else {
emit(SliderFetchInProgress());
}
} else {
emit(SliderFetchInProgress());
}
if (forceRefresh == true) {
fetchSliderFromDb(context, sendCityName: true)
.then((value) => emit(SliderFetchSuccess(value)))
.catchError((e) {
if (isClosed) return;
bool isUserActive = true;
if (e.toString() ==
"your account has been deactivate! please contact admin") {
//message from API
isUserActive = false;
} else {
isUserActive = true;
}
emit(SliderFetchFailure(e.toString(), isUserActive)); //, isUserActive
});
} else {
if (state is! SliderFetchSuccess) {
fetchSliderFromDb(context, sendCityName: true)
.then((value) => emit(SliderFetchSuccess(value)))
.catchError((e) {
if (isClosed) return;
bool isUserActive = true;
if (e.toString() ==
"your account has been deactivate! please contact admin") {
//message from API
isUserActive = false;
} else {
isUserActive = true;
}
emit(SliderFetchFailure(e.toString(), isUserActive)); //, isUserActive
});
} else {
await CheckInternet.check(
onInternet: () async {
fetchSliderFromDb(context, sendCityName: true)
.then((value) => emit(SliderFetchSuccess(value)))
.catchError((e) {
if (isClosed) return;
bool isUserActive = true;
if (e.toString() ==
"your account has been deactivate! please contact admin") {
//message from API
isUserActive = false;
} else {
isUserActive = true;
}
emit(SliderFetchFailure(
e.toString(), isUserActive)); //, isUserActive
});
},
onNoInternet: () {
emit(SliderFetchSuccess((state as SliderFetchSuccess).sliderlist));
},
);
}
}
Future.delayed(
Duration.zero,
() {},
);
}
Future<List<HomeSlider>> fetchSliderFromDb(BuildContext context,
{required bool sendCityName}) async {
List<HomeSlider> sliderlist = [];
Map<String, String> body = {};
if (sendCityName) {
// if (HiveUtils.getCityName() != null) {
// body['city'] = HiveUtils.getCityName();
// }
}
var response = await Api.get(url: Api.apiGetSlider, queryParameters: body);
if (!response[Api.error]) {
List list = response['data'];
sliderlist = list.map((model) => HomeSlider.fromJson(model)).toList();
} else {
throw CustomException(response[Api.message]);
}
return sliderlist;
}
@override
SliderState? fromJson(Map<String, dynamic> json) {
try {
var state = json['cubit_state'];
if (state == "SliderFetchSuccess") {
return SliderFetchSuccess.fromMap(json);
}
} catch (e) {}
return null;
}
@override
Map<String, dynamic>? toJson(SliderState state) {
if (state is SliderFetchSuccess) {
Map<String, dynamic> map = state.toMap();
map['cubit_state'] = "SliderFetchSuccess";
return map;
}
return null;
}
}