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

update project structure

parent bfff9e47
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import '../../../directional/directional_screen.dart'; import '../../../shared/navigation/directional_screen.dart';
part 'hover_data_model.g.dart'; part 'hover_data_model.g.dart';
@JsonSerializable() @JsonSerializable()
......
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:mypoint_flutter_app/directional/directional_screen.dart'; import 'package:mypoint_flutter_app/shared/navigation/directional_screen.dart';
import '../../flash_sale/models/preview_flash_sale_model.dart'; import '../../flash_sale/models/preview_flash_sale_model.dart';
import 'header_section_type.dart'; import 'header_section_type.dart';
......
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:mypoint_flutter_app/directional/directional_screen.dart'; import 'package:mypoint_flutter_app/shared/navigation/directional_screen.dart';
part 'main_service_model.g.dart'; part 'main_service_model.g.dart';
@JsonSerializable() @JsonSerializable()
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart'; import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
import '../../base/base_screen.dart'; import 'package:mypoint_flutter_app/shared/widgets/custom_empty_widget.dart';
import '../../base/basic_state.dart'; import '../../shared/widgets/base_view/base_screen.dart';
import '../../resources/base_color.dart'; import '../../shared/widgets/base_view/basic_state.dart';
import '../../widgets/custom_navigation_bar.dart'; import '../../core/theme/base_color.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
import 'interestied_categories_viewmodel.dart'; import 'interestied_categories_viewmodel.dart';
class InterestCategoriesScreen extends BaseScreen { class InterestCategoriesScreen extends BaseScreen {
...@@ -49,38 +50,45 @@ class _InterestCategoriesScreenState extends BaseState<InterestCategoriesScreen> ...@@ -49,38 +50,45 @@ class _InterestCategoriesScreenState extends BaseState<InterestCategoriesScreen>
), ),
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Flexible( if (listItems.isEmpty)
child: GridView.builder( Expanded(
padding: const EdgeInsets.only(bottom: 16, left: 16, right: 16), child: Center(
itemCount: listItems.length, child: EmptyWidget(isLoading: _viewModel.isLoading.value)
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( ),
crossAxisCount: 2, ),
crossAxisSpacing: 16, if (listItems.isNotEmpty)
mainAxisSpacing: 16, Flexible(
childAspectRatio: 1.6, child: GridView.builder(
padding: const EdgeInsets.only(bottom: 16, left: 16, right: 16),
itemCount: listItems.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
childAspectRatio: 1.6,
),
itemBuilder: (context, index) {
final it = listItems[index];
final id = it.categoryCode ?? '$index';
final selected = _viewModel.selectedIds.contains(id);
return _InterestCard(
title: it.categoryName ?? '',
imageUrl: it.imageUrl,
selected: selected,
onTap: () {
setState(() {
_onChange = true;
if (selected) {
_viewModel.selectedIds.remove(id);
} else {
_viewModel.selectedIds.add(id);
}
});
},
);
},
), ),
itemBuilder: (context, index) {
final it = listItems[index];
final id = it.categoryCode ?? '$index';
final selected = _viewModel.selectedIds.contains(id);
return _InterestCard(
title: it.categoryName ?? '',
imageUrl: it.imageUrl,
selected: selected,
onTap: () {
setState(() {
_onChange = true;
if (selected) {
_viewModel.selectedIds.remove(id);
} else {
_viewModel.selectedIds.add(id);
}
});
},
);
},
), ),
),
], ],
); );
}), }),
...@@ -99,11 +107,11 @@ class _InterestCategoriesScreenState extends BaseState<InterestCategoriesScreen> ...@@ -99,11 +107,11 @@ class _InterestCategoriesScreenState extends BaseState<InterestCategoriesScreen>
top: false, top: false,
child: ElevatedButton( child: ElevatedButton(
onPressed: onPressed:
_onChange _onChange
? () { ? () {
_viewModel.submitInterestedCategories(); _viewModel.submitInterestedCategories();
} }
: null, : null,
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: _onChange ? BaseColor.primary500 : Colors.grey, backgroundColor: _onChange ? BaseColor.primary500 : Colors.grey,
minimumSize: const Size.fromHeight(52), minimumSize: const Size.fromHeight(52),
...@@ -144,7 +152,7 @@ class _InterestCard extends StatelessWidget { ...@@ -144,7 +152,7 @@ class _InterestCard extends StatelessWidget {
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
gradient: LinearGradient(begin: Alignment.centerLeft, end: Alignment.centerRight, colors: [base, light]), gradient: LinearGradient(begin: Alignment.centerLeft, end: Alignment.centerRight, colors: [base, light]),
boxShadow: boxShadow:
selected ? [BoxShadow(color: base.withOpacity(0.35), blurRadius: 12, offset: const Offset(0, 6))] : null, selected ? [BoxShadow(color: base.withOpacity(0.35), blurRadius: 12, offset: const Offset(0, 6))] : null,
), ),
child: Stack( child: Stack(
children: [ children: [
...@@ -168,9 +176,9 @@ class _InterestCard extends StatelessWidget { ...@@ -168,9 +176,9 @@ class _InterestCard extends StatelessWidget {
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(16)), decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(16)),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
child: child:
imageUrl?.isNotEmpty == true imageUrl?.isNotEmpty == true
? Image.network(imageUrl!, fit: BoxFit.cover) ? Image.network(imageUrl!, fit: BoxFit.cover)
: const Icon(Icons.category, color: Colors.black54), : const Icon(Icons.category, color: Colors.black54),
), ),
), ),
// tick chọn // tick chọn
......
import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart';
import '../../base/base_response_model.dart'; import '../../shared/widgets/base_view/base_response_model.dart';
import '../../networking/restful_api_viewmodel.dart'; import '../../core/network/restful_api_viewmodel.dart';
import 'models/interested_categories_model.dart'; import 'models/interested_categories_model.dart';
class InterestedCategoriesViewModel extends RestfulApiViewModel { class InterestedCategoriesViewModel extends RestfulApiViewModel {
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import '../../widgets/custom_navigation_bar.dart'; import '../../shared/widgets/custom_navigation_bar.dart';
class InviteFriendCampaignListScreen extends StatefulWidget { class InviteFriendCampaignListScreen extends StatefulWidget {
const InviteFriendCampaignListScreen({super.key}); const InviteFriendCampaignListScreen({super.key});
......
...@@ -2,16 +2,16 @@ import 'package:flutter/material.dart'; ...@@ -2,16 +2,16 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:flutter_contacts/flutter_contacts.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:mypoint_flutter_app/screen/invite_friend_campaign/popup_invite_friend_code.dart'; import 'package:mypoint_flutter_app/features/invite_friend_campaign/popup_invite_friend_code.dart';
import 'package:mypoint_flutter_app/widgets/custom_toast_message.dart'; import 'package:mypoint_flutter_app/shared/widgets/custom_toast_message.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../../base/base_screen.dart'; import '../../shared/widgets/base_view/base_screen.dart';
import '../../base/basic_state.dart'; import '../../shared/widgets/base_view/basic_state.dart';
import '../../resources/base_color.dart'; import '../../core/theme/base_color.dart';
import '../../shared/router_gage.dart'; import '../../shared/router_gage.dart';
import '../../widgets/custom_navigation_bar.dart'; import '../../shared/widgets/custom_navigation_bar.dart';
import '../../widgets/image_loader.dart'; import '../../shared/widgets/image_loader.dart';
import 'invite_friend_campaign_viewmodel.dart'; import 'invite_friend_campaign_viewmodel.dart';
import 'models/invite_friend_campaign_model.dart'; import 'models/invite_friend_campaign_model.dart';
...@@ -32,7 +32,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr ...@@ -32,7 +32,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
fetchContacts(); fetchContacts();
viewModel.onShowAlertError = (message, onBack) { viewModel.onShowAlertError = (message, onBack) {
if (message.isNotEmpty) { if (message.isNotEmpty) {
showAlertError(content: message, onConfirmed: onBack ? () => Get.back() : null, showCloseButton: onBack == null); showAlertError(content: message, onConfirmed: onBack ? () => Get.back() : null, showCloseButton: !onBack);
} }
}; };
viewModel.phoneInviteFriendResponse = (sms, phone) { viewModel.phoneInviteFriendResponse = (sms, phone) {
...@@ -304,7 +304,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr ...@@ -304,7 +304,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
...List.generate(displayedContacts.length, (index) { ...List.generate(displayedContacts.length, (index) {
final contact = displayedContacts[index]; final contact = displayedContacts[index];
final name = contact.displayName; final name = contact.displayName;
final phone = contact.phones?.isNotEmpty == true ? contact.phones?.first.number ?? 'Không số' : 'Không số'; final phone = contact.phones.firstOrNull?.number ?? 'Không số';
return Column( return Column(
children: [ children: [
if (index != 0) const Divider(height: 1, color: Colors.black12, indent: 16, endIndent: 16), if (index != 0) const Divider(height: 1, color: Colors.black12, indent: 16, endIndent: 16),
...@@ -360,7 +360,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr ...@@ -360,7 +360,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemCount: campaigns.length, itemCount: campaigns.length,
separatorBuilder: (_, __) => const SizedBox(height: 8), separatorBuilder: (_, _) => const SizedBox(height: 8),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final campaign = campaigns[index]; final campaign = campaigns[index];
return Container( return Container(
......
import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:mypoint_flutter_app/configs/constants.dart'; import 'package:mypoint_flutter_app/app/config/constants.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart'; import 'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart';
import '../../networking/restful_api_viewmodel.dart'; import '../../core/network/restful_api_viewmodel.dart';
import 'models/invite_friend_campaign_model.dart'; import 'models/invite_friend_campaign_model.dart';
class InviteFriendCampaignViewModel extends RestfulApiViewModel { class InviteFriendCampaignViewModel extends RestfulApiViewModel {
...@@ -19,7 +19,7 @@ class InviteFriendCampaignViewModel extends RestfulApiViewModel { ...@@ -19,7 +19,7 @@ class InviteFriendCampaignViewModel extends RestfulApiViewModel {
await callApi<InviteFriendResponse>( await callApi<InviteFriendResponse>(
request: () => client.phoneInviteFriend(phone), request: () => client.phoneInviteFriend(phone),
onSuccess: (data, _) { onSuccess: (data, _) {
final sms = data?.sms ?? ''; final sms = data.sms ?? '';
if (sms.isNotEmpty) { if (sms.isNotEmpty) {
phoneInviteFriendResponse?.call(sms, phone); phoneInviteFriendResponse?.call(sms, phone);
} else { } else {
......
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