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

update project structure

parent bfff9e47
import 'package:json_annotation/json_annotation.dart';
import 'package:intl/intl.dart';
import '../../../directional/directional_screen.dart';
import '../../../shared/navigation/directional_screen.dart';
part 'hover_data_model.g.dart';
@JsonSerializable()
......
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 'header_section_type.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';
@JsonSerializable()
......
import 'package:flutter/material.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
import '../../base/base_screen.dart';
import '../../base/basic_state.dart';
import '../../resources/base_color.dart';
import '../../widgets/custom_navigation_bar.dart';
import 'package:mypoint_flutter_app/shared/widgets/custom_empty_widget.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/custom_navigation_bar.dart';
import 'interestied_categories_viewmodel.dart';
class InterestCategoriesScreen extends BaseScreen {
......@@ -49,38 +50,45 @@ class _InterestCategoriesScreenState extends BaseState<InterestCategoriesScreen>
),
),
const SizedBox(height: 16),
Flexible(
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,
if (listItems.isEmpty)
Expanded(
child: Center(
child: EmptyWidget(isLoading: _viewModel.isLoading.value)
),
),
if (listItems.isNotEmpty)
Flexible(
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>
top: false,
child: ElevatedButton(
onPressed:
_onChange
? () {
_viewModel.submitInterestedCategories();
}
: null,
_onChange
? () {
_viewModel.submitInterestedCategories();
}
: null,
style: ElevatedButton.styleFrom(
backgroundColor: _onChange ? BaseColor.primary500 : Colors.grey,
minimumSize: const Size.fromHeight(52),
......@@ -144,7 +152,7 @@ class _InterestCard extends StatelessWidget {
borderRadius: BorderRadius.circular(20),
gradient: LinearGradient(begin: Alignment.centerLeft, end: Alignment.centerRight, colors: [base, light]),
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(
children: [
......@@ -168,9 +176,9 @@ class _InterestCard extends StatelessWidget {
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(16)),
clipBehavior: Clip.antiAlias,
child:
imageUrl?.isNotEmpty == true
? Image.network(imageUrl!, fit: BoxFit.cover)
: const Icon(Icons.category, color: Colors.black54),
imageUrl?.isNotEmpty == true
? Image.network(imageUrl!, fit: BoxFit.cover)
: const Icon(Icons.category, color: Colors.black54),
),
),
// tick chọn
......
import 'package:get/get_rx/src/rx_types/rx_types.dart';
import 'package:mypoint_flutter_app/networking/restful_api_client_all_request.dart';
import '../../base/base_response_model.dart';
import '../../networking/restful_api_viewmodel.dart';
import 'package:mypoint_flutter_app/core/network/restful_api_client_all_request.dart';
import '../../shared/widgets/base_view/base_response_model.dart';
import '../../core/network/restful_api_viewmodel.dart';
import 'models/interested_categories_model.dart';
class InterestedCategoriesViewModel extends RestfulApiViewModel {
......
import 'package:flutter/material.dart';
import '../../widgets/custom_navigation_bar.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
class InviteFriendCampaignListScreen extends StatefulWidget {
const InviteFriendCampaignListScreen({super.key});
......
......@@ -2,16 +2,16 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_contacts/flutter_contacts.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/widgets/custom_toast_message.dart';
import 'package:mypoint_flutter_app/features/invite_friend_campaign/popup_invite_friend_code.dart';
import 'package:mypoint_flutter_app/shared/widgets/custom_toast_message.dart';
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../base/base_screen.dart';
import '../../base/basic_state.dart';
import '../../resources/base_color.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/router_gage.dart';
import '../../widgets/custom_navigation_bar.dart';
import '../../widgets/image_loader.dart';
import '../../shared/widgets/custom_navigation_bar.dart';
import '../../shared/widgets/image_loader.dart';
import 'invite_friend_campaign_viewmodel.dart';
import 'models/invite_friend_campaign_model.dart';
......@@ -32,7 +32,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
fetchContacts();
viewModel.onShowAlertError = (message, onBack) {
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) {
......@@ -304,7 +304,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
...List.generate(displayedContacts.length, (index) {
final contact = displayedContacts[index];
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(
children: [
if (index != 0) const Divider(height: 1, color: Colors.black12, indent: 16, endIndent: 16),
......@@ -360,7 +360,7 @@ class _InviteFriendCampaignScreenState extends BaseState<InviteFriendCampaignScr
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: campaigns.length,
separatorBuilder: (_, __) => const SizedBox(height: 8),
separatorBuilder: (_, _) => const SizedBox(height: 8),
itemBuilder: (context, index) {
final campaign = campaigns[index];
return Container(
......
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/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/restful_api_client_all_request.dart';
import '../../core/network/restful_api_viewmodel.dart';
import 'models/invite_friend_campaign_model.dart';
class InviteFriendCampaignViewModel extends RestfulApiViewModel {
......@@ -19,7 +19,7 @@ class InviteFriendCampaignViewModel extends RestfulApiViewModel {
await callApi<InviteFriendResponse>(
request: () => client.phoneInviteFriend(phone),
onSuccess: (data, _) {
final sms = data?.sms ?? '';
final sms = data.sms ?? '';
if (sms.isNotEmpty) {
phoneInviteFriendResponse?.call(sms, phone);
} 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