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

241 lines
7.7 KiB
Dart

import 'dart:developer';
import 'package:ebroker/data/Repositories/personalized_feed_repository.dart';
import 'package:ebroker/data/model/property_model.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import '../../../Ui/screens/proprties/viewAll.dart';
import '../../../settings.dart';
import '../../../utils/Network/networkAvailability.dart';
import '../../model/data_output.dart';
abstract class FetchPersonalizedPropertyListState {}
class FetchPersonalizedPropertyInitial
extends FetchPersonalizedPropertyListState {}
class FetchPersonalizedPropertyInProgress
extends FetchPersonalizedPropertyListState {}
class FetchPersonalizedPropertySuccess
extends FetchPersonalizedPropertyListState
implements PropertySuccessStateWireframe {
@override
final bool isLoadingMore;
final bool loadingMoreError;
@override
final List<PropertyModel> properties;
final int offset;
final int total;
FetchPersonalizedPropertySuccess(
{required this.isLoadingMore,
required this.loadingMoreError,
required this.properties,
required this.offset,
required this.total});
@override
set isLoadingMore(bool _isLoadingMore) {}
@override
set properties(List<PropertyModel> _properties) {}
FetchPersonalizedPropertySuccess copyWith({
bool? isLoadingMore,
bool? loadingMoreError,
List<PropertyModel>? properties,
int? offset,
int? total,
String? cityName,
}) {
return FetchPersonalizedPropertySuccess(
isLoadingMore: isLoadingMore ?? this.isLoadingMore,
loadingMoreError: loadingMoreError ?? this.loadingMoreError,
properties: properties ?? this.properties,
offset: offset ?? this.offset,
total: total ?? this.total);
}
Map<String, dynamic> toMap() {
return {
'isLoadingMore': this.isLoadingMore,
'loadingMoreError': this.loadingMoreError,
'properties': properties.map((e) => e.toMap()).toList(),
'offset': this.offset,
'total': this.total,
};
}
factory FetchPersonalizedPropertySuccess.fromMap(Map<String, dynamic> map) {
return FetchPersonalizedPropertySuccess(
isLoadingMore: map['isLoadingMore'] as bool,
loadingMoreError: map['loadingMoreError'] as bool,
properties: (map['properties'] as List)
.map((e) => PropertyModel.fromMap(e))
.toList(),
offset: map['offset'] as int,
total: map['total'] as int,
);
}
}
class FetchPersonalizedPropertyFail extends FetchPersonalizedPropertyListState
implements PropertyErrorStateWireframe {
final dynamic error;
FetchPersonalizedPropertyFail(this.error);
@override
set error(_error) {}
}
class FetchPersonalizedPropertyList
extends Cubit<FetchPersonalizedPropertyListState>
with HydratedMixin
implements PropertyCubitWireframe {
FetchPersonalizedPropertyList() : super(FetchPersonalizedPropertyInitial());
final PersonalizedFeedRepository _personalizedFeedRepository =
PersonalizedFeedRepository();
@override
void fetch({bool? forceRefresh, bool? loadWithoutDelay}) async {
if (forceRefresh != true) {
if (state is FetchPersonalizedPropertySuccess) {
await Future.delayed(Duration(
seconds: loadWithoutDelay == true
? 0
: AppSettings.hiddenAPIProcessDelay));
} else {
emit(FetchPersonalizedPropertyInProgress());
}
} else {
emit(FetchPersonalizedPropertyInProgress());
}
try {
if (forceRefresh == true) {
DataOutput<PropertyModel> result = await _personalizedFeedRepository
.getPersonalizedProeprties(offset: 0);
emit(FetchPersonalizedPropertySuccess(
isLoadingMore: false,
loadingMoreError: false,
properties: result.modelList,
offset: 0,
total: result.total));
} else {
if (state is! FetchPersonalizedPropertySuccess) {
DataOutput<PropertyModel> result = await _personalizedFeedRepository
.getPersonalizedProeprties(offset: 0);
emit(FetchPersonalizedPropertySuccess(
isLoadingMore: false,
loadingMoreError: false,
properties: result.modelList,
offset: 0,
total: result.total));
} else {
await CheckInternet.check(
onInternet: () async {
DataOutput<PropertyModel> result =
await _personalizedFeedRepository.getPersonalizedProeprties(
offset: 0);
emit(FetchPersonalizedPropertySuccess(
isLoadingMore: false,
loadingMoreError: false,
properties: result.modelList,
offset: 0,
total: result.total));
},
onNoInternet: () {
emit(
FetchPersonalizedPropertySuccess(
total: (state as FetchPersonalizedPropertySuccess).total,
offset: (state as FetchPersonalizedPropertySuccess).offset,
isLoadingMore: (state as FetchPersonalizedPropertySuccess)
.isLoadingMore,
loadingMoreError:
(state as FetchPersonalizedPropertySuccess)
.loadingMoreError,
properties:
(state as FetchPersonalizedPropertySuccess).properties),
);
},
);
}
}
} catch (e) {
emit(FetchPersonalizedPropertyFail(e as dynamic));
}
}
@override
void fetchMore() async {
try {
if (state is FetchPersonalizedPropertySuccess) {
if ((state as FetchPersonalizedPropertySuccess).isLoadingMore) {
return;
}
emit((state as FetchPersonalizedPropertySuccess)
.copyWith(isLoadingMore: true));
DataOutput<PropertyModel> result =
await _personalizedFeedRepository.getPersonalizedProeprties(
offset: (state as FetchPersonalizedPropertySuccess).properties.length,
);
FetchPersonalizedPropertySuccess propertiesState =
(state as FetchPersonalizedPropertySuccess);
propertiesState.properties.addAll(result.modelList);
emit(FetchPersonalizedPropertySuccess(
isLoadingMore: false,
loadingMoreError: false,
properties: propertiesState.properties,
offset:
(state as FetchPersonalizedPropertySuccess).properties.length,
total: result.total));
}
} catch (e) {
emit((state as FetchPersonalizedPropertySuccess)
.copyWith(isLoadingMore: false, loadingMoreError: true));
}
}
@override
bool hasMoreData() {
if (state is FetchPersonalizedPropertySuccess) {
return (state as FetchPersonalizedPropertySuccess).properties.length <
(state as FetchPersonalizedPropertySuccess).total;
}
return false;
}
@override
FetchPersonalizedPropertyListState? fromJson(Map<String, dynamic> json) {
try {
if (json['cubit_state'] == "FetchPersonalizedPropertySuccess") {
FetchPersonalizedPropertySuccess fetchPersonalizedPropertySuccess =
FetchPersonalizedPropertySuccess.fromMap(json);
return fetchPersonalizedPropertySuccess;
}
} catch (e, st) {
log("ERROR WHILE lOAD JSON TO MODEL $st");
}
return null;
}
@override
Map<String, dynamic>? toJson(FetchPersonalizedPropertyListState state) {
try {
if (state is FetchPersonalizedPropertySuccess) {
Map<String, dynamic> mapped = state.toMap();
mapped['cubit_state'] = "FetchPersonalizedPropertySuccess";
return mapped;
}
} catch (e) {
log("ISSUE ISSSS $e");
}
return null;
}
}