Commit 6b980613 authored by DatHV's avatar DatHV
Browse files

update project structure

parent bfff9e47
import 'package:json_annotation/json_annotation.dart';
import 'package:mypoint_flutter_app/extensions/datetime_extensions.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/datetime_extensions.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
part 'product_mobile_card_model.g.dart';
@JsonSerializable(explicitToJson: true)
......
import 'package:flutter/foundation.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:mypoint_flutter_app/screen/mobile_card/models/product_mobile_card_model.dart';
import '../../home/models/brand_model.dart';
import 'package:mypoint_flutter_app/features/mobile_card/models/product_mobile_card_model.dart';
import '../../affiliate_brand_detail/models/brand_model.dart';
part 'usable_voucher_model.g.dart';
@JsonSerializable()
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/extensions/num_extension.dart';
import 'package:mypoint_flutter_app/screen/mobile_card/product_mobile_card_viewmodel.dart';
import 'package:mypoint_flutter_app/screen/mobile_card/usable_mobile_card_popup.dart';
import 'package:mypoint_flutter_app/widgets/custom_empty_widget.dart';
import 'package:mypoint_flutter_app/widgets/image_loader.dart';
import '../../base/base_screen.dart';
import '../../base/basic_state.dart';
import '../../resources/base_color.dart';
import '../../widgets/alert/custom_alert_dialog.dart';
import '../../widgets/alert/data_alert_model.dart';
import '../../widgets/custom_navigation_bar.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/num_extension.dart';
import 'package:mypoint_flutter_app/features/mobile_card/product_mobile_card_viewmodel.dart';
import 'package:mypoint_flutter_app/features/mobile_card/usable_mobile_card_popup.dart';
import 'package:mypoint_flutter_app/shared/widgets/custom_empty_widget.dart';
import 'package:mypoint_flutter_app/shared/widgets/image_loader.dart';
import '../../shared/widgets/base_view/base_screen.dart';
import '../../shared/widgets/base_view/basic_state.dart';
import '../../core/theme/base_color.dart';
import '../../shared/widgets/alert/custom_alert_dialog.dart';
import '../../shared/widgets/alert/data_alert_model.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
class ProductMobileCardScreen extends BaseScreen {
const ProductMobileCardScreen({super.key});
......@@ -132,9 +132,9 @@ class _ProductMobileCardScreenState extends BaseState<ProductMobileCardScreen> w
final widthItem = (MediaQuery.of(context).size.width - 12 * 3) / 2;
return
(_viewModel.products.isEmpty) ?
const Expanded(
Expanded(
child: Center(
child: EmptyWidget(),
child: EmptyWidget(isLoading: _viewModel.isLoading.value),
),
) : Expanded(
child: GridView.count(
......
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:mypoint_flutter_app/configs/constants.dart';
import 'package:mypoint_flutter_app/networking/api/product_api.dart' deferred as product_api;
import 'package:mypoint_flutter_app/screen/mobile_card/models/product_mobile_card_model.dart';
import '../../base/base_response_model.dart';
import '../../networking/restful_api_viewmodel.dart';
import '../../preference/point/point_manager.dart';
import 'package:mypoint_flutter_app/app/config/constants.dart';
import 'package:mypoint_flutter_app/core/network/api/product_api.dart' deferred as product_api;
import 'package:mypoint_flutter_app/features/mobile_card/models/product_mobile_card_model.dart';
import '../../shared/widgets/base_view/base_response_model.dart';
import '../../core/network/restful_api_viewmodel.dart';
import '../../shared/preferences/point/point_manager.dart';
import 'models/mobile_service_redeem_data.dart';
import 'models/usable_voucher_model.dart';
......
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mypoint_flutter_app/extensions/datetime_extensions.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart';
import '../../resources/base_color.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/datetime_extensions.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import '../../core/theme/base_color.dart';
import 'models/usable_voucher_model.dart';
class UsableMobileCardPopup extends StatelessWidget {
......
import 'package:flutter/material.dart';
import 'package:mypoint_flutter_app/widgets/image_loader.dart';
import 'package:mypoint_flutter_app/shared/widgets/image_loader.dart';
import '../faqs/faqs_model.dart';
class PageItemWidget extends StatelessWidget {
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../shared/router_gage.dart';
import '../../../widgets/custom_empty_widget.dart';
import '../../../widgets/custom_navigation_bar.dart';
import '../../shared/widgets/custom_empty_widget.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
import 'news_item_widget.dart';
import 'news_list_viewmodel.dart';
......@@ -19,6 +19,7 @@ class _NewsListScreenState extends State<NewsListScreen> {
@override
void initState() {
super.initState();
_viewModel.getNewsList(isRefresh: true);
}
@override
......@@ -30,19 +31,26 @@ class _NewsListScreenState extends State<NewsListScreen> {
children: [
Expanded(
child: Obx(() {
if (_viewModel.newsList.value.isEmpty) {
return const Center(child: EmptyWidget());
if (_viewModel.newsList.isEmpty) {
return Center(child: EmptyWidget(isLoading: _viewModel.isLoading.value));
}
return RefreshIndicator(
onRefresh: () => _viewModel.getNewsList(isRefresh: true),
child: ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
itemCount: _viewModel.newsList.length,
itemCount: _viewModel.newsList.length + (_viewModel.canLoadMore ? 1 : 0),
itemBuilder: (context, index) {
if (index >= _viewModel.newsList.length) {
_viewModel.getNewsList(isRefresh: false);
if (index >= _viewModel.newsList.length && _viewModel.newsList.isNotEmpty) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!_viewModel.isLoading.value) {
_viewModel.getNewsList(isRefresh: false);
}
});
return const Center(
child: Padding(padding: EdgeInsets.all(16), child: CircularProgressIndicator()),
child: Padding(
padding: EdgeInsets.all(16),
child: CircularProgressIndicator(),
),
);
}
final news = _viewModel.newsList.value[index];
......
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/networking/api/website_api.dart' deferred as website_api;
import '../../networking/restful_api_viewmodel.dart';
import 'package:mypoint_flutter_app/core/network/api/website_api.dart' deferred as website_api;
import '../../core/network/restful_api_viewmodel.dart';
import '../faqs/faqs_model.dart';
class NewsListViewModel extends RestfulApiViewModel {
String folderUri;
final RxList<PageItemModel> newsList = <PageItemModel>[].obs;
final RxBool isLoading = false.obs;
var _canLoadMore = true;
int limit = 20;
final int _limit = 20;
bool _websiteApiLoaded = false;
bool get canLoadMore => _canLoadMore;
NewsListViewModel({this.folderUri = "TIN-TUC"});
Future<void> _ensureWebsiteApiLoaded() async {
if (_websiteApiLoaded) return;
......@@ -18,19 +19,10 @@ class NewsListViewModel extends RestfulApiViewModel {
_websiteApiLoaded = true;
}
NewsListViewModel({this.folderUri = "TIN-TUC"});
@override
onInit() {
super.onInit();
getNewsList();
}
Future<void> getNewsList({bool isRefresh = false}) async {
if (isLoading.value) return;
if (isRefresh) _canLoadMore = true;
if (!isRefresh && !_canLoadMore) return;
isLoading(true);
final body = {"folder_uri": folderUri, "start": isRefresh ? 0 : newsList.length, "limit": limit};
final body = {"folder_uri": folderUri, "start": isRefresh ? 0 : newsList.length, "limit": _limit};
await callApi<FAQItemModelResponse>(
request: () async {
await _ensureWebsiteApiLoaded();
......@@ -38,16 +30,13 @@ class NewsListViewModel extends RestfulApiViewModel {
return api.websiteFolderGetPageList(body);
},
onSuccess: (data, _) {
_canLoadMore = (data.items?.length ?? 0) == limit;
_canLoadMore = (data.items?.length ?? 0) == _limit;
if (isRefresh) {
newsList.clear();
}
newsList.addAll(data.items ?? []);
},
withLoading: false,
onComplete: () {
isLoading(false);
},
withLoading: isRefresh,
);
}
}
\ No newline at end of file
}
import 'package:json_annotation/json_annotation.dart';
import 'package:mypoint_flutter_app/directional/directional_screen.dart';
import '../../../model/auth/working_site_model.dart';
import 'package:mypoint_flutter_app/shared/navigation/directional_screen.dart';
import '../../personal/model/working_site_model.dart';
part 'notification_detail_model.g.dart';
@JsonSerializable()
......
import 'package:json_annotation/json_annotation.dart';
import '../../../directional/directional_screen.dart';
import '../../../shared/navigation/directional_screen.dart';
part 'notification_item_model.g.dart';
@JsonSerializable()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment