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/directional/directional_screen.dart';
import '../../../directional/directional_action_type.dart';
import 'package:mypoint_flutter_app/shared/navigation/directional_screen.dart';
import '../../../app/routing/directional_action_type.dart';
part 'affiliate_product_top_sale_model.g.dart';
@JsonSerializable()
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart';
import '../../../resources/base_color.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import '../../../core/theme/base_color.dart';
import '../../../shared/router_gage.dart';
import '../../../widgets/image_loader.dart';
import '../../../shared/widgets/image_loader.dart';
import '../model/affiliate_brand_model.dart';
class AffiliateBrand extends StatelessWidget {
......@@ -65,7 +65,7 @@ class AffiliateBrand extends StatelessWidget {
Widget buildAffiliateBrandItem(AffiliateBrandModel brand) {
return LayoutBuilder(
builder: (context, constraints) {
final double imageWidth = constraints.maxWidth / 2;
final double imageWidth = constraints.maxWidth / 1.9;
return GestureDetector(
onTap: () {
Get.toNamed(affiliateBrandDetailScreen, arguments: {"brandId": brand.brandId});
......@@ -80,22 +80,18 @@ Widget buildAffiliateBrandItem(AffiliateBrandModel brand) {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// SizedBox(
// width: imageWidth,
// height: imageWidth, // ✅ 1:1 tỉ lệ
// child: ClipOval(
// child: Image.network(
// brand.logo ?? '',
// fit: BoxFit.contain,
// errorBuilder: (_, __, ___) => const Icon(Icons.broken_image),
// ),
// ),
// ),
loadNetworkImage(
SizedBox(
width: imageWidth,
height: imageWidth,
child: ClipRRect(
borderRadius: BorderRadius.circular(imageWidth),
child: loadNetworkImage(
url: brand.logo ?? '',
width: imageWidth,
height: imageWidth,
fit: BoxFit.contain,
fit: BoxFit.cover,
),
),
),
const SizedBox(height: 4),
Text(
......
import 'package:flutter/material.dart';
import '../../../resources/base_color.dart';
import '../../../core/theme/base_color.dart';
import '../model/affiliate_category_model.dart';
class AffiliateCategory extends StatelessWidget {
......@@ -54,7 +54,7 @@ class AffiliateCategory extends StatelessWidget {
Image.asset('assets/images/cashback/${category.icon}.png', width: imageWidth, height: imageWidth,),
const SizedBox(height: 4),
Text(
category.name ?? '',
category.name,
textAlign: TextAlign.center,
maxLines: 2,
overflow: TextOverflow.ellipsis,
......
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:mypoint_flutter_app/extensions/num_extension.dart';
import 'package:mypoint_flutter_app/extensions/string_extension.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/num_extension.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/string_extension.dart';
import '../model/affiliate_product_top_sale_model.dart';
class AffiliateProductTopSale extends StatelessWidget {
......@@ -72,7 +72,7 @@ class AffiliateProductTopSale extends StatelessWidget {
child: Image.network(
imageUrl,
fit: BoxFit.cover,
errorBuilder: (_, __, ___) => Image.asset('assets/images/ic_logo.png'),
errorBuilder: (_, _, _) => Image.asset('assets/images/bg_default_11.png'),
),
),
),
......@@ -93,7 +93,7 @@ class AffiliateProductTopSale extends StatelessWidget {
children: [
const TextSpan(text: "Hoàn đến: "),
TextSpan(
text: "${(commission ?? '').toNum()?.toString() ?? ''}%",
text: "${(commission).toNum()?.toString() ?? ''}%",
style: const TextStyle(color: Colors.orange, fontWeight: FontWeight.bold, fontSize: 14),
),
],
......
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:mypoint_flutter_app/extensions/num_extension.dart';
import '../../../base/base_screen.dart';
import '../../../base/basic_state.dart';
import '../../resources/base_color.dart';
import '../../widgets/back_button.dart';
import '../../widgets/image_loader.dart';
import '../../widgets/measure_size.dart';
import 'package:mypoint_flutter_app/core/utils/extensions/num_extension.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/back_button.dart';
import '../../shared/widgets/image_loader.dart';
import '../../shared/widgets/measure_size.dart';
import 'affiliate_brand_detail_tip_box.dart';
import 'affiliate_brand_detail_viewmodel.dart';
import 'package:get/get.dart';
......@@ -250,7 +250,7 @@ class _AffiliateBrandDetailScreenState extends BaseState<AffiliateBrandDetailScr
style: const TextStyle(color: Colors.black, fontSize: 13),
children: [
TextSpan(
text: detail.showCommision ?? '',
text: detail.showCommision,
style: const TextStyle(color: Colors.deepOrangeAccent, fontWeight: FontWeight.bold),
),
],
......@@ -262,7 +262,7 @@ class _AffiliateBrandDetailScreenState extends BaseState<AffiliateBrandDetailScr
const Icon(Icons.check_circle, color: Colors.green, size: 16),
const SizedBox(width: 2),
Text(
'${detail?.quantitySold?.money(CurrencyUnit.noneSpace) ?? '1'} đơn hàng',
'${detail.quantitySold?.money(CurrencyUnit.noneSpace) ?? '1'} đơn hàng',
style: TextStyle(color: Colors.green, fontSize: 13),
),
],
......
import 'package:flutter/material.dart';
import 'models/affiliate_brand_detail_model.dart';
class AffiliateTagListScrollable extends StatelessWidget {
......@@ -81,65 +80,3 @@ class AffiliateTagListScrollable extends StatelessWidget {
);
}
}
// import 'package:flutter/material.dart';
//
// import 'models/affiliate_brand_detail_model.dart';
//
// class AffiliateTagList extends StatelessWidget {
// final List<AffiliateBrandCategoryModel> items;
//
// const AffiliateTagList({super.key, required this.items});
//
// @override
// Widget build(BuildContext context) {
// int maxLines = 2;
// if (items.length > 20) {
// maxLines = 3;
// } else if (items.length < 10) {
// maxLines = 1;
// }
//
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// const Padding(
// padding: EdgeInsets.all(8.0),
// child: Text(
// "Tỉ lệ hoàn điểm",
// style: TextStyle(fontWeight: FontWeight.bold),
// ),
// ),
// Wrap(
// spacing: 8,
// runSpacing: 8,
// children: items
// .take(maxLines * 3) // optional: limit total number if needed
// .map(
// (item) => Container(
// padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
// decoration: BoxDecoration(
// color: Colors.grey.shade100,
// borderRadius: BorderRadius.circular(16),
// ),
// child: RichText(
// text: TextSpan(
// text: '${item.categoryName}: ',
// style: const TextStyle(color: Colors.black87, fontSize: 14),
// children: [
// TextSpan(
// text: item.commision ?? '',
// style: const TextStyle(color: Colors.orange, fontSize: 14),
// ),
// ],
// ),
// ),
// ),
// )
// .toList(),
// ),
// ],
// );
// }
// }
import 'package:get/get.dart';
import 'package:mypoint_flutter_app/configs/constants.dart';
import 'package:mypoint_flutter_app/networking/api/affiliate_api.dart'
deferred as affiliate_api;
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart';
import '../../networking/restful_api_viewmodel.dart';
import 'package:mypoint_flutter_app/app/config/constants.dart';
import 'package:mypoint_flutter_app/core/network/api/affiliate_api.dart' deferred as affiliate_api;
import '../../core/network/restful_api_viewmodel.dart';
import 'models/affiliate_brand_detail_model.dart';
class AffiliateBrandDetailViewModel extends RestfulApiViewModel {
......@@ -13,8 +10,7 @@ class AffiliateBrandDetailViewModel extends RestfulApiViewModel {
AffiliateBrandDetailViewModel(this.brandId);
void Function(String message)? onShowAlertError;
final Rxn<AffiliateBrandDetailModel> brandDetailData =
Rxn<AffiliateBrandDetailModel>();
final Rxn<AffiliateBrandDetailModel> brandDetailData = Rxn<AffiliateBrandDetailModel>();
bool _affiliateLibLoaded = false;
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../widgets/custom_navigation_bar.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
import '../affiliate/model/affiliate_brand_model.dart';
import '../affiliate/sub_widget/build_affiliate_brand.dart';
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../resources/base_color.dart';
import '../../widgets/custom_navigation_bar.dart';
import '../../core/theme/base_color.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
import '../affiliate/affiliate_popup_brands.dart';
import '../affiliate/model/affiliate_category_model.dart';
import 'affiliate_category_grid_viewmodel.dart';
......@@ -67,7 +67,7 @@ class _AffiliateCategoryGridScreenState extends State<AffiliateCategoryGridScree
Image.asset('assets/images/cashback/${category.icon}.png', width: imageWidth, height: imageWidth),
const SizedBox(height: 4),
Text(
category.name ?? '',
category.name,
textAlign: TextAlign.center,
maxLines: 2,
overflow: TextOverflow.ellipsis,
......
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/affiliate_api.dart'
deferred as affiliate_api;
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart';
import '../../networking/restful_api_viewmodel.dart';
import 'package:mypoint_flutter_app/core/network/api/affiliate_api.dart' deferred as affiliate_api;
import '../../core/network/restful_api_viewmodel.dart';
import '../affiliate/model/affiliate_brand_model.dart';
import '../affiliate/model/affiliate_category_model.dart';
class AffiliateCategoryGridViewModel extends RestfulApiViewModel {
void Function((List<AffiliateBrandModel>, String) data)?
onShowAffiliateBrandPopup;
void Function((List<AffiliateBrandModel>, String) data)? onShowAffiliateBrandPopup;
void Function(String message)? onShowAlertError;
bool _affiliateLibLoaded = false;
......@@ -20,20 +15,16 @@ class AffiliateCategoryGridViewModel extends RestfulApiViewModel {
_affiliateLibLoaded = true;
}
Future<void> affiliateBrandGetListBuyCategory(
AffiliateCategoryModel category,
) async {
Future<void> affiliateBrandGetListBuyCategory(AffiliateCategoryModel category) async {
await callApi<List<AffiliateBrandModel>>(
request: () async {
await _ensureAffiliateLibraryLoaded();
final api = affiliate_api.AffiliateApi(client);
return api.affiliateBrandGetList(
categoryCode: AffiliateCategoryModel.codeToJson(category.code),
);
return api.affiliateBrandGetList(categoryCode: AffiliateCategoryModel.codeToJson(category.code));
},
onSuccess: (data, _) {
if (data.isNotEmpty) {
onShowAffiliateBrandPopup?.call((data, category.name ?? ''));
onShowAffiliateBrandPopup?.call((data, category.name));
}
},
onFailure: (msg, _, _) async {
......
import 'package:mypoint_flutter_app/directional/directional_action_type.dart';
import '../../../configs/constants.dart';
import '../../../directional/directional_screen.dart';
import 'package:mypoint_flutter_app/app/routing/directional_action_type.dart';
import '../../../app/config/constants.dart';
import '../../../shared/navigation/directional_screen.dart';
class AffiliateBrandDetailModel {
final String? commision;
......
import 'package:json_annotation/json_annotation.dart';
part 'brand_category_model.g.dart'; // Nếu dùng build_runner
@JsonSerializable()
class BrandCategoryModel {
final String? id;
......
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'brand_category_model.dart';
part of '../../affiliate_brand_detail/models/brand_category_model.dart';
// **************************************************************************
// JsonSerializableGenerator
......
import 'package:json_annotation/json_annotation.dart';
import 'brand_category_model.dart';
import 'image_model.dart';
import '../../home/models/image_model.dart';
part 'brand_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