routes.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. import 'dart:developer';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_riverpod/flutter_riverpod.dart';
  4. import 'package:go_router/go_router.dart';
  5. import 'package:hive_flutter/hive_flutter.dart';
  6. import 'package:jiffy/jiffy.dart';
  7. import 'package:tp5/authpages/auth_magiclink.dart';
  8. import 'package:tp5/authpages/login_otp.dart';
  9. import 'package:tp5/core/basic_page.dart';
  10. import 'package:tp5/core/utils.dart';
  11. import 'package:tp5/flightslist/flightslist_page.dart';
  12. import 'package:tp5/fltinfo/view/dutyinfo_page.dart';
  13. import 'package:tp5/fltinfo/view/fltinfo_page.dart';
  14. import 'package:tp5/ftl/view/ftl_page.dart';
  15. import 'package:tp5/lido/view/lido_form.dart';
  16. import 'package:tp5/lido/view/lidolist_page.dart';
  17. import 'package:tp5/lido/view/lidoofp_page.dart';
  18. import 'package:tp5/onboarding/onboarding.dart';
  19. import 'package:tp5/pdf/pdf_page.dart';
  20. import 'package:tp5/roster/view/crewlink_form.dart';
  21. import 'package:tp5/roster/view/crewlist_page.dart';
  22. import 'package:tp5/roster/view/roster_page.dart';
  23. import 'package:tp5/rosters/rosters_page.dart';
  24. import 'package:supabase_flutter/supabase_flutter.dart';
  25. import 'package:tp5/settings/settings_page.dart';
  26. final routeProvider = Provider<RouterConfig<Object>?>((ref) {
  27. return _routes;
  28. });
  29. final _routes = GoRouter(
  30. debugLogDiagnostics: false,
  31. redirect: (context, state) {
  32. log("${state.fullPath} | ${state.extra.runtimeType.toString()}",
  33. name: "routes");
  34. // Check app expiration
  35. if (DateTime.now().isAfter(DateTime(2024, 12, 31))) {
  36. return "/expired";
  37. }
  38. // Get current auth state
  39. final session = Supabase.instance.client.auth.currentSession;
  40. final isLoggedIn = session != null;
  41. // List of paths that don't require authentication
  42. final publicPaths = ['/auth/login-otp', '/magic-link', '/auth/signup'];
  43. final isPublicPath = publicPaths.contains(state.fullPath);
  44. // Redirect to login if not authenticated and trying to access protected route
  45. if (!isLoggedIn && !isPublicPath) {
  46. return '/auth/login-otp';
  47. }
  48. // Allow access to public paths even when logged out
  49. if (isPublicPath) {
  50. return null;
  51. }
  52. return null;
  53. },
  54. // initialLocation: '/test',
  55. // initialLocation: '/auth/magiclink',
  56. initialLocation: '/home',
  57. routes: [
  58. GoRoute(
  59. path: '/magic-link',
  60. builder: (BuildContext context, GoRouterState state) {
  61. // Access query parameters here
  62. final token = state.uri.queryParameters['token'];
  63. return AuthMagiclink(token: token);
  64. }),
  65. GoRoute(
  66. path: '/test',
  67. builder: (context, state) => BasicPage(
  68. appBar: AppBar(
  69. automaticallyImplyLeading: false,
  70. title: const Text("TAR Pilot v5"),
  71. ),
  72. drawer: ListView(),
  73. body: Column(
  74. children: [
  75. Text("${Jiffy.parseFromList([
  76. 2024,
  77. 9,
  78. 1,
  79. 20,
  80. 0
  81. ], isUtc: true).setTz(ap: "TUN").toUtc().dateTime}"),
  82. Text(DTInterval.fromHm(
  83. apartir:
  84. Jiffy.parseFromList([2024, 9, 1, 1, 1], isUtc: true)
  85. .setTz(ap: "TUN"),
  86. h: 2,
  87. m: 0,
  88. duration: const Duration(hours: 2, minutes: 59),
  89. ap: "TUN")
  90. .start
  91. .dateTime
  92. .toIso8601String())
  93. ],
  94. ),
  95. ),
  96. ),
  97. GoRoute(
  98. path: "/auth",
  99. redirect: (_, state) {
  100. // if
  101. // (state.fullPath != "/crewlink/settings" &&
  102. // (((Hive.box("settings").get("crewlink_user") ?? "") == "") ||
  103. // ((Hive.box("settings").get("crewlink_pass") ?? "") ==
  104. // ""))) {
  105. // return "/crewlink/settings";
  106. // }
  107. return null;
  108. },
  109. routes: [
  110. GoRoute(
  111. path: '/signup',
  112. builder: (BuildContext context, GoRouterState state) {
  113. // Access query parameters here
  114. return Text("signup");
  115. }),
  116. GoRoute(
  117. path: '/login-otp',
  118. builder: (BuildContext context, GoRouterState state) {
  119. // Access query parameters here
  120. final token = state.uri.queryParameters['token'];
  121. return LoginOtp();
  122. }),
  123. ]),
  124. GoRoute(
  125. path: '/expired',
  126. builder: (context, state) => BasicPage(
  127. appBar: AppBar(
  128. automaticallyImplyLeading: false,
  129. title: const Text("TAR Pilot v5"),
  130. ),
  131. drawer: ListView(),
  132. body: const Text("App is Expired please Update")),
  133. ),
  134. GoRoute(
  135. path: '/home',
  136. redirect: (context, state) => '/crewlink/roster',
  137. ),
  138. GoRoute(
  139. path: '/settings',
  140. builder: (context, state) {
  141. final params = (state.extra as SettingsParams?) ?? SettingsParams();
  142. return SettingsPage(params: params);
  143. },
  144. ),
  145. GoRoute(
  146. path: '/pdf',
  147. builder: (context, state) {
  148. final params = state.extra as PdfPageParams;
  149. return PdfPage(params: params);
  150. },
  151. ),
  152. GoRoute(
  153. path: '/rosters',
  154. builder: (context, state) {
  155. return const RostersPage();
  156. },
  157. ),
  158. GoRoute(
  159. path: '/flightslist',
  160. builder: (context, state) {
  161. return const FlightslistPage();
  162. },
  163. ),
  164. GoRoute(
  165. path: '/ftl',
  166. builder: (context, state) {
  167. final params = (state.extra as FtlPageParams?) ?? const FtlPageParams();
  168. return FtlPage(params: params);
  169. },
  170. ),
  171. GoRoute(
  172. path: '/fltinfo',
  173. builder: (context, state) {
  174. final params = (state.extra as FltinfoParams?) ?? const FltinfoParams();
  175. return FltinfoPage(params: params);
  176. },
  177. ),
  178. GoRoute(
  179. path: '/dutyinfo',
  180. builder: (context, state) {
  181. final params =
  182. (state.extra as DutyinfoParams?) ?? const DutyinfoParams();
  183. return DutyinfoPage(params: params);
  184. },
  185. ),
  186. GoRoute(
  187. path: "/lido",
  188. redirect: (_, state) {
  189. // log(state.fullPath.toString());
  190. if
  191. // (["/crewlink/roster"].contains(state.uri.toString())&&
  192. (state.fullPath != "/lido/settings" &&
  193. (((Hive.box("settings").get("lido_user") ?? "") == "") ||
  194. ((Hive.box("settings").get("lido_pass") ?? "") == ""))) {
  195. return "/lido/settings";
  196. }
  197. return null;
  198. },
  199. routes: [
  200. GoRoute(
  201. name: "lido.list",
  202. path: 'list',
  203. builder: (context, state) {
  204. final params = (state.extra as LidolistPageParams?) ??
  205. const LidolistPageParams();
  206. return LidolistPage(params: params);
  207. }),
  208. GoRoute(
  209. name: "lido.ofp",
  210. path: 'ofp',
  211. builder: (context, state) {
  212. final params = (state.extra as LidoofpPageParams?) ??
  213. const LidoofpPageParams();
  214. return LidoofpPage(params: params);
  215. }),
  216. GoRoute(
  217. path: 'settings', builder: (context, state) => const LidoForm()),
  218. ]),
  219. GoRoute(
  220. path: "/crewlink",
  221. redirect: (_, state) {
  222. // log(state.fullPath.toString());
  223. if
  224. // (["/crewlink/roster"].contains(state.uri.toString())&&
  225. (state.fullPath != "/crewlink/settings" &&
  226. (((Hive.box("settings").get("crewlink_user") ?? "") == "") ||
  227. ((Hive.box("settings").get("crewlink_pass") ?? "") ==
  228. ""))) {
  229. return "/crewlink/settings";
  230. }
  231. return null;
  232. },
  233. routes: [
  234. GoRoute(
  235. name: "crewlink.roster",
  236. path: 'roster',
  237. builder: (context, state) {
  238. final params = (state.extra as RosterPageParams?) ??
  239. const RosterPageParams();
  240. return RosterPage(
  241. params: RosterPageParams(
  242. datestart: params.datestart ??
  243. Jiffy.now()
  244. .toUtc()
  245. .startOf(Unit.month)
  246. // .subtract(days: 30)
  247. .format(pattern: "ddMMMyy"),
  248. dateend: params.dateend ??
  249. Jiffy.now()
  250. .toUtc()
  251. .endOf(Unit.month)
  252. .format(pattern: "ddMMMyy"),
  253. crewlinkuser: params.crewlinkuser ??
  254. Hive.box("settings").get("crewlink_user") ??
  255. "",
  256. crewlinkpass: params.crewlinkpass ??
  257. Hive.box("settings").get("crewlink_pass") ??
  258. ""),
  259. );
  260. }),
  261. GoRoute(
  262. name: "crewlink.crewlist",
  263. path: 'crewlist',
  264. builder: (context, state) {
  265. final params = (state.extra as CrewlistPageParams?) ??
  266. const CrewlistPageParams();
  267. print(
  268. "${params.datestart} ${params.dateend} ${params.al} ${params.fnum} ${params.dep} ${params.des}");
  269. return CrewlistPage(
  270. params: CrewlistPageParams(
  271. datestart: params.datestart ?? //"04Dec23",
  272. Jiffy.now()
  273. .toUtc()
  274. //.subtract(days: 1)
  275. .format(pattern: "ddMMMyy"),
  276. dateend: params.dateend ?? //"05Dec23",
  277. params.datestart ??
  278. Jiffy.now().toUtc().format(pattern: "ddMMMyy"),
  279. al: params.al ?? "",
  280. fnum: params.fnum ?? "",
  281. dep: params.dep ?? "",
  282. des: params.des ?? "",
  283. crewlinkuser: params.crewlinkuser ??
  284. Hive.box("settings").get("crewlink_user") ??
  285. "",
  286. crewlinkpass: params.crewlinkpass ??
  287. Hive.box("settings").get("crewlink_pass") ??
  288. ""),
  289. );
  290. }),
  291. GoRoute(
  292. path: 'settings',
  293. builder: (context, state) => const CrewlinkForm()),
  294. ])
  295. ],
  296. );