Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

254 lignes
9.6 KiB

  1. // ignore_for_file: public_member_api_docs, sort_constructors_first
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
  4. import 'package:go_router/go_router.dart';
  5. import 'package:provider/provider.dart';
  6. import 'package:qadirneyriz/utils/tools/tools.dart';
  7. import 'package:qadirneyriz/widgets/card_meeting.dart';
  8. import 'package:qadirneyriz/widgets/custom_appbar.dart';
  9. import 'package:qadirneyriz/widgets/today_widget.dart';
  10. import 'package:shamsi_date/shamsi_date.dart';
  11. import 'package:flutter_gen/gen_l10n/app_localizations.dart';
  12. import 'package:qadirneyriz/config/config.dart';
  13. import 'package:qadirneyriz/screens/home/state.dart';
  14. import 'package:qadirneyriz/utils/enums/status.dart';
  15. import 'package:qadirneyriz/widgets/loading_widget.dart';
  16. class HomeScreen extends StatefulWidget {
  17. const HomeScreen({super.key});
  18. @override
  19. State<HomeScreen> createState() => _HomeScreenState();
  20. }
  21. class _HomeScreenState extends State<HomeScreen> {
  22. @override
  23. void initState() {
  24. super.initState();
  25. HomeState homeState = Provider.of(context, listen: false);
  26. Future.delayed(Duration.zero, () async {
  27. await homeState.getTodayMeetings();
  28. });
  29. }
  30. @override
  31. Widget build(BuildContext context) {
  32. final Jalali shamsi = Jalali.now(); // دریافت تاریخ شمسی کنونی
  33. String formattedDate =
  34. '${shamsi.day} ${Tools.getMonthName(shamsi.month)} ${shamsi.year}'; // فرمت کردن تاریخ
  35. return Consumer<HomeState>(
  36. builder: (context, value, child) {
  37. switch (value.todayMettingsStatus) {
  38. case Status.ready:
  39. return CustomScrollView(
  40. slivers: [
  41. const CustomAppbar(),
  42. SliverToBoxAdapter(
  43. child: Padding(
  44. padding: const EdgeInsets.symmetric(
  45. horizontal: 20, vertical: 10),
  46. child: Container(
  47. decoration: BoxDecoration(
  48. color: const Color(0xffF4F9F6),
  49. boxShadow: [
  50. BoxShadow(
  51. color: config.ui.mainGray.withOpacity(.1),
  52. spreadRadius: .1,
  53. offset: const Offset(0, 5),
  54. blurRadius: 6)
  55. ],
  56. borderRadius: BorderRadius.circular(25)),
  57. width: double.infinity,
  58. child: Padding(
  59. padding: const EdgeInsets.all(20),
  60. child: Row(
  61. crossAxisAlignment: CrossAxisAlignment.start,
  62. children: [
  63. Icon(
  64. Icons.edit_outlined,
  65. color: config.ui.mainGreen,
  66. ),
  67. const SizedBox(
  68. width: 10,
  69. ),
  70. Expanded(
  71. child: Text(
  72. style: const TextStyle(fontSize: 13),
  73. value.todayMeetingsModel!.note ?? ''),
  74. ),
  75. ],
  76. ),
  77. ),
  78. ),
  79. ),
  80. ),
  81. SliverToBoxAdapter(
  82. child: TodayWidget(formattedDate: formattedDate),
  83. ),
  84. SliverToBoxAdapter(
  85. child: SizedBox(
  86. height: 165,
  87. child: value.todayMeetingsModel!.meetings!.isNotEmpty
  88. ? ListView.builder(
  89. scrollDirection: Axis.horizontal,
  90. itemCount:
  91. value.todayMeetingsModel!.meetings!.length,
  92. itemBuilder: (BuildContext context, int index) {
  93. final items =
  94. value.todayMeetingsModel!.meetings![index];
  95. return CustomCardMeeting(
  96. titel: items.subject!.subject ?? '',
  97. fromTime: items.azHour ?? '',
  98. toTime: items.taHour ?? "",
  99. location: items.location!.address ?? '',
  100. date: items.dateJalali ?? '',
  101. cardId: items.id ?? 0,
  102. );
  103. },
  104. )
  105. : Center(
  106. child: Column(
  107. mainAxisAlignment: MainAxisAlignment.center,
  108. children: [
  109. Icon(Icons.error_outline,
  110. size: 40,
  111. color: config.ui.mainGray.withOpacity(.5)),
  112. const SizedBox(
  113. height: 20,
  114. ),
  115. Text(
  116. AppLocalizations.of(context)!
  117. .nomeetingfortoday,
  118. style: TextStyle(
  119. color:
  120. config.ui.mainGray.withOpacity(.5)),
  121. ),
  122. ],
  123. ),
  124. ),
  125. ),
  126. ),
  127. SliverPadding(
  128. padding:
  129. const EdgeInsets.symmetric(vertical: 30, horizontal: 10),
  130. sliver: SliverToBoxAdapter(
  131. child: StaggeredGrid.count(
  132. crossAxisCount: 4,
  133. mainAxisSpacing: 4,
  134. crossAxisSpacing: 4,
  135. children: [
  136. StaggeredGridTile.count(
  137. crossAxisCellCount: 2,
  138. mainAxisCellCount: 1,
  139. child: ItemInGrid(
  140. icon: Icons.assessment,
  141. backColor: const Color(0xff03C85F),
  142. text: AppLocalizations.of(context)!.reports,
  143. onTap: () {},
  144. ),
  145. ),
  146. StaggeredGridTile.count(
  147. crossAxisCellCount: 2,
  148. mainAxisCellCount: 2,
  149. child: ItemInGrid(
  150. icon: Icons.people,
  151. backColor: const Color(0xff04A54F),
  152. text: AppLocalizations.of(context)!.meetings,
  153. onTap: () {
  154. context.pushNamed('navigate',
  155. pathParameters: {'tab': '1'});
  156. },
  157. ),
  158. ),
  159. StaggeredGridTile.count(
  160. crossAxisCellCount: 2,
  161. mainAxisCellCount: 2,
  162. child: ItemInGrid(
  163. icon: Icons.calendar_today,
  164. backColor: const Color(0xff37A068),
  165. text: AppLocalizations.of(context)!.events,
  166. onTap: () {},
  167. ),
  168. ),
  169. StaggeredGridTile.count(
  170. crossAxisCellCount: 2,
  171. mainAxisCellCount: 1,
  172. child: ItemInGrid(
  173. icon: Icons.exit_to_app,
  174. backColor: const Color(0xff00843D),
  175. text: AppLocalizations.of(context)!.exit,
  176. onTap: () {},
  177. ),
  178. ),
  179. ],
  180. ),
  181. ),
  182. ),
  183. ],
  184. );
  185. case Status.loading:
  186. return const LoadingWidget();
  187. default:
  188. return Container();
  189. }
  190. },
  191. );
  192. }
  193. }
  194. class ItemInGrid extends StatelessWidget {
  195. final IconData icon;
  196. final Color backColor;
  197. final String text;
  198. final void Function() onTap;
  199. const ItemInGrid(
  200. {super.key,
  201. required this.icon,
  202. required this.backColor,
  203. required this.text,
  204. required this.onTap});
  205. @override
  206. Widget build(BuildContext context) {
  207. return Padding(
  208. padding: const EdgeInsets.all(4.0),
  209. child: GestureDetector(
  210. onTap: onTap,
  211. child: Container(
  212. decoration: BoxDecoration(
  213. borderRadius: BorderRadius.circular(20),
  214. color: backColor,
  215. boxShadow: [
  216. BoxShadow(
  217. color: config.ui.mainGray.withOpacity(.5),
  218. spreadRadius: .1,
  219. offset: const Offset(0, 2),
  220. blurRadius: 6)
  221. ],
  222. ),
  223. child: Column(
  224. mainAxisAlignment: MainAxisAlignment.center,
  225. children: [
  226. Icon(
  227. icon,
  228. size: 40,
  229. color: Colors.white,
  230. ),
  231. const SizedBox(
  232. height: 8,
  233. ),
  234. Text(
  235. text,
  236. style: const TextStyle(
  237. color: Colors.white,
  238. ),
  239. ),
  240. ],
  241. ),
  242. ),
  243. ),
  244. );
  245. }
  246. }