first commit

This commit is contained in:
Anbarasu
2026-05-26 18:01:57 +05:30
commit 6d59c8daf6
297 changed files with 35238 additions and 0 deletions

View File

@@ -0,0 +1,854 @@
import 'dart:io';
import 'package:dotted_line/dotted_line.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:nearledaily/view/account/share_app.dart';
import 'package:nearledaily/view/authentication/login_view.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shimmer/shimmer.dart';
import '../../constants/color_constants.dart';
import '../../constants/font_constants.dart';
import '../../controllers/account_controller/profile.dart';
import '../../controllers/authentication/auth_controller.dart';
import '../../domain/repository/authentication/auth_repository.dart';
import '../../service/bindings.dart';
import '../../widgets/text_widget.dart';
import '../orders/orders_by_tenant.dart';
import 'edit_profile_view.dart';
import 'faq_view.dart';
import 'help/create_request.dart';
import 'notification_settings_view.dart';
class AccountPage extends StatefulWidget {
const AccountPage({super.key});
@override
State<AccountPage> createState() => _AccountPageState();
}
class _AccountPageState extends State<AccountPage> {
static const Color primaryColor = Color(0xFF662582);
final controller = Get.put(AccountController());
String Name = '';
String Profile = '';
String Number = '';
@override
void initState() {
super.initState();
_loadProfile();
}
Future<void> _loadProfile() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int? id = prefs.getInt('customerId');
if (id == null) return;
final repo = LoginRepository();
final fetchedProfile = await repo.fetchProfile(id.toString());
if (fetchedProfile != null) {
setState(() {
Name = fetchedProfile.firstname ?? '';
Profile = fetchedProfile.profileimage ?? '';
Number = fetchedProfile.contactno ?? '';
});
print(Name);
print(Profile);
print(Number);
}
}
Widget _profileShimmer() {
return Container(
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Row(
children: [
Shimmer.fromColors(
baseColor: Colors.grey.shade300, // shimmer base
highlightColor: Colors.grey.shade100, // shimmer highlight
child: CircleAvatar(
radius: 28,
backgroundColor: Colors.grey.shade200, // light background
child: Icon(
Icons.person,
size: 28,
color: Colors.grey.shade500, // darker icon color
),
),
),
const SizedBox(width: 12),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Shimmer.fromColors(
baseColor: Colors.grey[300]!,
highlightColor: Colors.grey[100]!,
child: Container(
height: 14,
width: 120,
decoration: BoxDecoration(
color: Colors.white, // <-- background color goes here
borderRadius: BorderRadius.circular(8), // <-- rounded corners
),
),
),
const SizedBox(height: 6),
Shimmer.fromColors(
baseColor: Colors.grey[300]!,
highlightColor: Colors.grey[100]!,
child: Container(
height: 12,
width: 90,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8), // <-- add radius here too
),
),
),
],
)
],
),
);
}
@override
Widget build(BuildContext context) {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.white, // or transparent
statusBarIconBrightness: Brightness.dark, // Android
statusBarBrightness: Brightness.light, // iOS
),
);
return SafeArea(
child: Scaffold(
extendBodyBehindAppBar: false,
backgroundColor: Color(0xFFF6F6F6),
appBar: AppBar(
backgroundColor: Colors.white,
surfaceTintColor: Colors.transparent,
// 🔥 Prevent color overlay when scrolled
scrolledUnderElevation: 0,
animateColor: false, // ✨ prevent color change on scroll
elevation: 0,
title: ReusableTextWidget(
text: "Profile",
fontSize: 20,
fontWeight: FontWeight.w600,
fontFamily: FontConstants.fontFamily,
color: Colors.black,
),
),
body: Obx(
() => SingleChildScrollView(
physics: const ClampingScrollPhysics(),
child: Column(
children: [
const SizedBox(height: 20),
/// PROFILE CARD (EXACT LIKE IMAGE)
controller.isLoading.value
? _profileShimmer()
: GestureDetector(
onTap: () async {
final res = await Get.to(
() => EditProfilePage(),
// transition: Transition.fade, // Your desired transition
// duration: Duration(milliseconds: 400), // Duration of the transition
);
if (res != null && res['status'] == true) {
_loadProfile();
}
},
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 11),
padding: const EdgeInsets.only(
left: 16,
right: 16,
top: 30,
bottom: 30,
),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Color(0xFF1B1333), // Dark background (luxury dark purple/indigo)
Color(0xFF662582).withOpacity(0.9), // Primary color accent
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Colors.black12,
width: 0.30
),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.03),
blurRadius: 2,
offset: const Offset(0, 3),
),
],
),
child: Row(
children: [
CircleAvatar(
radius: 28,
backgroundColor: Colors.grey.shade300,
backgroundImage:
Profile.isNotEmpty ? NetworkImage(Profile) : null,
child: Profile.isEmpty
? const Icon(Icons.person, size: 26)
: null,
),
const SizedBox(width: 14),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ReusableTextWidget(
text: Name,
fontSize: 16,
fontWeight: FontWeight.w600,
fontFamily: FontConstants.fontFamily,
color: Colors.white,
),
const SizedBox(height: 4),
ReusableTextWidget(
text: Number,
fontSize: 13,
fontWeight: FontWeight.w400,
fontFamily: FontConstants.fontFamily,
color: Colors.white,
),
],
),
),
],
),
),
),
const SizedBox(height: 24),
/// ACCOUNT
controller.isLoading.value
? accountListShimmerSingleBox()
:
_section(
title: "Account",
children: [
_tile(
icon: Icons.person,
title: "Manage Profile",
onTap: () async {
final res = await Get.to(
() => EditProfilePage(),
// transition: Transition.fade, // Your desired transition
// duration: Duration(milliseconds: 400), // Duration of the transition
);
if (res != null && res['status'] == true) {
_loadProfile();
}
},
),
_divider(),
_tile(
icon: Icons.question_answer,
title: "Faq",
onTap: () => Get.to(
() => FaqView(),
// transition: Transition.fade, // or any transition you like
// duration: Duration(milliseconds: 400),
),
),
_divider(),
_tile(
icon: Icons.reorder,
title: "Your Orders",
onTap: () => Get.to(
() => const OrdersByStoreScreen(showBackArrow: true),
// transition: Transition.fade, // or any transition you prefer
// duration: Duration(milliseconds: 400),
),
),
// _divider(),
],
),
/// PREFERENCES
controller.isLoading.value
? Preferences()
:
_section(
title: "Preferences",
children: [
_tile(
icon: Icons.star_rate,
title: "Rate the app in Playstore",
onTap: controller.rateApp,
),
_divider(),
// _tile(
// icon: Icons.group_add,
// title: "Refer a Friend",
// onTap: () => Get.to(
// () => const ShowContactsScreen(),
// // transition: Transition.fade, // or any style you like
// // duration: Duration(milliseconds: 400),
// ),
// ),
],
),
/// SUPPORT
controller.isLoading.value
? Preferences()
:
_section(
title: "Support",
children: [
_tile(
icon: Icons.support_agent,
title: "Help & Support",
onTap: () => Get.to(
() => Help_Support(),
// transition: Transition.fade, // simple fade
// duration: Duration(milliseconds: 400),
),
),
_divider(),
_tile(
icon: Icons.logout,
title: "Logout",
isLogout: true,
onTap: () {
showLogoutDialog();
},
),
],
),
const SizedBox(height: 20),
/// LOGOUT
// GestureDetector(
// onTap: showLogoutDialog,
// child: Container(
// margin: const EdgeInsets.symmetric(horizontal: 16),
// padding: const EdgeInsets.symmetric(vertical: 14),
// decoration: BoxDecoration(
// color: Colors.white,
// borderRadius: BorderRadius.circular(16),
// border: Border.all(color: Colors.red, width: 0.4),
// ),
// child: Center(
// child: ReusableTextWidget(
// text: "Logout",
// color: Colors.red,
// fontSize: 16,
// fontWeight: FontWeight.w600,
// fontFamily: FontConstants.fontFamily,
// ),
// ),
// ),
// ),
const SizedBox(height: 30),
],
),
),
),
),
);
}
/// SECTION CARD
Widget _section({
required String title,
required List<Widget> children,
}) {
return Padding(
padding: const EdgeInsets.fromLTRB(11, 0, 11, 11),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Colors.black12,
width: 0.20
),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.03),
blurRadius: 2,
offset: const Offset(0, 3),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(16, 14, 16, 6),
child: ReusableTextWidget(
text: title,
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.black,
fontFamily: FontConstants.fontFamily,
),
),
...children,
],
),
),
);
}
/// LIST TILE (EXACT STYLE)
Widget _tile({
required IconData icon,
required String title,
required VoidCallback onTap,
bool isLogout = false,
}) {
final Color mainColor =
isLogout ? Colors.red : Colors.black45;
return ListTile(
dense: true,
minVerticalPadding: 0,
contentPadding: const EdgeInsets.symmetric(horizontal: 12),
visualDensity: const VisualDensity(vertical: 0.10),
leading: Icon(
icon,
size: 22,
color: mainColor,
shadows: [
Shadow(
color: Colors.grey.withOpacity(0.2),
offset: const Offset(0.30, 0.30),
blurRadius: 1,
),
],
),
title: ReusableTextWidget(
text: title,
fontSize: 13,
fontWeight: FontWeight.w700,
fontFamily: FontConstants.fontFamily,
color: isLogout
? Colors.red
: Colors.black.withOpacity(0.7),
),
// 👇 Arrow ALWAYS normal black
trailing: Icon(
Icons.arrow_forward_ios,
size: 14,
weight: 400,
color: Colors.black.withOpacity(0.9),
),
onTap: onTap,
);
}
Widget _divider() {
return Divider(
color: Color(0xFFF6F6F6),
thickness: 1.5,
height: 0.10, //
);
}
/// LOGOUT DIALOG (UNCHANGED LOGIC)
void showLogoutDialog() {
Get.dialog(
Dialog(
elevation: 0,
backgroundColor: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.15),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
padding: const EdgeInsets.all(22),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 🔴 Icon Container
Container(
height: 64,
width: 64,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: LinearGradient(
colors: [
primaryColor.withOpacity(0.9),
primaryColor,
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
),
child: const Icon(
Icons.logout_rounded,
size: 30,
color: Colors.white,
),
),
const SizedBox(height: 16),
// 📝 Title
ReusableTextWidget(
text: "Logout",
fontSize: 18,
fontWeight: FontWeight.w600,
fontFamily: FontConstants.fontFamily,
color: Colors.black,
),
const SizedBox(height: 6),
// 🧾 Subtitle
ReusableTextWidget(
text: "Are you sure you want to logout?",
fontSize: 14,
fontWeight: FontWeight.w400,
fontFamily: FontConstants.fontFamily,
color: Colors.black54,
textAlign: TextAlign.center,
),
const SizedBox(height: 24),
// 🔘 Buttons
Row(
children: [
Expanded(
child: OutlinedButton(
onPressed: () => Navigator.pop(context),
style: OutlinedButton.styleFrom(
foregroundColor: primaryColor,
side: BorderSide(color: primaryColor),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
padding: const EdgeInsets.symmetric(vertical: 12),
),
child: ReusableTextWidget(
text: "Cancel",
fontFamily: FontConstants.fontFamily,
fontWeight: FontWeight.w500,
),
),
),
const SizedBox(width: 12),
Expanded(
child: ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 4,
padding: const EdgeInsets.symmetric(vertical: 12),
),
onPressed: () async {
final prefs = await SharedPreferences.getInstance();
String fcmToken = prefs.getString('fcmToken') ?? '';
String deviceId =
prefs.getString('currentDeviceId') ?? '';
await prefs.clear();
await prefs.setString('fcmToken', fcmToken);
await prefs.setString('currentDeviceId', deviceId);
Get.deleteAll();
GlobalBinding().dependencies();
Get.offAll(() => Login_view());
},
child: ReusableTextWidget(
text: "Logout",
fontFamily: FontConstants.fontFamily,
color: Colors.white,
fontWeight: FontWeight.w600,
),
),
),
],
),
],
),
),
),
);
}
Widget accountListShimmerSingleBox() {
return Container(
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.symmetric(vertical: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: List.generate(4, (index) {
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 14,
),
child: Row(
children: [
// Leading avatar
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 44,
width: 44,
decoration: const BoxDecoration(
color: Colors.white,
),
),
),
const SizedBox(width: 14),
// Title + subtitle
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Padding(
padding: const EdgeInsets.only(right: 18.0),
child: Container(
height: 14,
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(6),
),
),
),
),
const SizedBox(height: 8),
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 12,
width: 120,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(6),
),
),
),
],
),
),
const SizedBox(width: 12),
// Trailing arrow shimmer
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 18,
width: 18,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
),
),
],
),
),
// Divider (except last)
if (index != 3)
Padding(
padding: const EdgeInsets.only(left: 74),
child: Divider(
height: 1,
thickness: 0.8,
color: Colors.grey.shade200,
),
),
],
);
}),
),
);
}
Widget Preferences() {
return Container(
margin: const EdgeInsets.all(16),
padding: const EdgeInsets.symmetric(vertical: 8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: List.generate(2, (index) {
return Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 14,
),
child: Row(
children: [
// Leading avatar
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 44,
width: 44,
decoration: const BoxDecoration(
color: Colors.white,
),
),
),
const SizedBox(width: 14),
// Title + subtitle
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Padding(
padding: const EdgeInsets.only(right: 18.0),
child: Container(
height: 14,
width: double.infinity,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(6),
),
),
),
),
const SizedBox(height: 8),
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 12,
width: 120,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(6),
),
),
),
],
),
),
const SizedBox(width: 12),
// Trailing arrow shimmer
Shimmer.fromColors(
baseColor: Colors.grey.shade300,
highlightColor: Colors.grey.shade100,
child: Container(
height: 18,
width: 18,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(4),
),
),
),
],
),
),
// Divider (except last)
if (index != 1)
Padding(
padding: const EdgeInsets.only(left: 74),
child: Divider(
height: 1,
thickness: 0.8,
color: Colors.grey.shade200,
),
),
],
);
}),
),
);
}
}