282 lines
9.9 KiB
Dart
282 lines
9.9 KiB
Dart
import 'dart:ui';
|
|
|
|
import 'package:firebase_core/firebase_core.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:manager_api_new/api.dart';
|
|
import 'package:manager_app/Models/managerContext.dart';
|
|
import 'package:manager_app/Screens/Main/main_screen.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:responsive_framework/responsive_framework.dart';
|
|
import 'Components/common_loader.dart';
|
|
import 'Helpers/FileHelper.dart';
|
|
import 'Models/session.dart';
|
|
import 'Screens/Main/main_screen.dart';
|
|
import 'Screens/login_screen.dart';
|
|
import 'Screens/Policy/policy_screen.dart';
|
|
import 'app_context.dart';
|
|
import 'client.dart';
|
|
import 'constants.dart';
|
|
import 'package:flutter_web_plugins/url_strategy.dart';
|
|
import 'dart:html' as html;
|
|
//import 'package:window_size/window_size.dart';
|
|
|
|
Future<void> main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
var session = await loadJsonSessionFile();
|
|
|
|
ManagerAppContext managerAppContext = ManagerAppContext();
|
|
managerAppContext.instanceId = session.instanceId;
|
|
|
|
await Firebase.initializeApp(
|
|
// Replace with actual values
|
|
options: FirebaseOptions(
|
|
apiKey: "AIzaSyCFXuDsslqHiPpK6WTcxdIvTDP3ioaaxp4",
|
|
authDomain: "mymuseum-3b97f.firebaseapp.com",
|
|
projectId: "mymuseum-3b97f",
|
|
storageBucket: "mymuseum-3b97f.appspot.com",
|
|
messagingSenderId: "1034665398515",
|
|
appId: "1:1034665398515:web:688e2a7b3465e621d6a786",
|
|
measurementId: "G-EKKHJLJ1E9"
|
|
),
|
|
);
|
|
|
|
String? currentPath = html.window.location.pathname;
|
|
|
|
usePathUrlStrategy();
|
|
|
|
runApp(
|
|
ChangeNotifierProvider<AppContext>(
|
|
create: (_) => AppContext(managerAppContext),
|
|
child: MaterialApp(
|
|
home: FutureBuilder(
|
|
future: getInstanceInfo(managerAppContext),
|
|
builder: (context, asyncSnapshot) {
|
|
if (asyncSnapshot.connectionState == ConnectionState.done) {
|
|
var instanceDTO = asyncSnapshot.data;
|
|
managerAppContext.instanceId = instanceDTO?.id;
|
|
managerAppContext.instanceDTO = instanceDTO;
|
|
|
|
String initialRoute = currentPath!.isNotEmpty ? currentPath : '/login';
|
|
|
|
var _router = GoRouter(
|
|
initialLocation: initialRoute,
|
|
redirect: (context, state) {
|
|
var instanceId = managerAppContext.instanceId;
|
|
if (instanceId == null && state.fullPath != '/login') {
|
|
return '/login';
|
|
}
|
|
|
|
|
|
if (instanceId != null) {
|
|
if(state.fullPath == '/login' || state.fullPath == "") {
|
|
if(managerAppContext.instanceDTO!.isMobile!) {
|
|
return '/main/mobile';
|
|
}
|
|
if(managerAppContext.instanceDTO!.isTablet!) {
|
|
return '/main/tablet';
|
|
}
|
|
if(managerAppContext.instanceDTO!.isWeb!) {
|
|
return '/main/web';
|
|
}
|
|
if(managerAppContext.instanceDTO!.isVR!) {
|
|
return '/main/vr';
|
|
}
|
|
}
|
|
return state.matchedLocation;
|
|
}
|
|
|
|
return null;
|
|
},
|
|
routes: [
|
|
GoRoute(
|
|
path: '/login',
|
|
builder: (context, state) => LoginScreen(),
|
|
),
|
|
GoRoute(
|
|
path: '/main/:view',
|
|
builder: (context, state) {
|
|
final view = state.pathParameters['view'];
|
|
return MainScreen(
|
|
instance: managerAppContext.instanceDTO!,
|
|
view: view,
|
|
);
|
|
},
|
|
),
|
|
GoRoute(
|
|
path: '/policy',
|
|
builder: (context, state) => PolicyScreen(),
|
|
),
|
|
GoRoute(
|
|
path: '/policy/mdlf',
|
|
builder: (context, state) => PolicyScreen(param: "mdlf"),
|
|
),
|
|
GoRoute(
|
|
path: '/policy/fort',
|
|
builder: (context, state) => PolicyScreen(param: "fort"),
|
|
),
|
|
],
|
|
errorBuilder: (context, state) => MaterialApp(
|
|
home: Scaffold(
|
|
body: Center(
|
|
child: SizedBox(
|
|
width: MediaQuery.of(context).size.width * 0.85,
|
|
child: Text(
|
|
"404 - Cette page n'existe pas",
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(color: kPrimaryColor, fontSize: 20.0),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
return MyApp(
|
|
session: session,
|
|
managerAppContext: managerAppContext,
|
|
router: _router
|
|
);
|
|
} else if (asyncSnapshot.connectionState == ConnectionState.none) {
|
|
return MaterialApp(
|
|
home: Scaffold(
|
|
body: Center(
|
|
child: SizedBox(
|
|
width: MediaQuery.of(context).size.width * 0.85,
|
|
child: Text(
|
|
"No data",
|
|
textAlign: TextAlign.center,
|
|
style: TextStyle(color: kPrimaryColor, fontSize: 20.0),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
} else {
|
|
return MaterialApp(
|
|
home: Scaffold(
|
|
body: Center(
|
|
child: SizedBox(
|
|
width: MediaQuery.of(context).size.width * 0.85,
|
|
child: Container(
|
|
height: 250,
|
|
child: CommonLoader()
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
),
|
|
),
|
|
)
|
|
);
|
|
}
|
|
|
|
Future<InstanceDTO?> getInstanceInfo(ManagerAppContext managerAppContext) async {
|
|
var session = await loadJsonSessionFile();
|
|
|
|
try {
|
|
managerAppContext.instanceId = managerAppContext.instanceId ?? session.instanceId;
|
|
managerAppContext.host = managerAppContext.host ?? session.host;
|
|
managerAppContext.accessToken = managerAppContext.accessToken ?? session.token;
|
|
managerAppContext.email = managerAppContext.email ?? session.email;
|
|
|
|
if(session.instanceId != null) {
|
|
if(managerAppContext.clientAPI == null) {
|
|
managerAppContext.clientAPI = Client(session.host!);
|
|
managerAppContext.clientAPI!.apiApi!.addDefaultHeader('authorization', 'Bearer '+ managerAppContext.accessToken!);
|
|
}
|
|
|
|
InstanceDTO? instance = await managerAppContext.clientAPI!.instanceApi!.instanceGetDetail(managerAppContext.instanceId!);
|
|
managerAppContext.instanceDTO = instance;
|
|
return instance;
|
|
}
|
|
|
|
return null;
|
|
} catch(e) {
|
|
// todo
|
|
/*Navigator.pushNamedAndRemoveUntil(
|
|
context,
|
|
'/login',
|
|
(Route<dynamic> route) => false,
|
|
);*/
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class MyApp extends StatefulWidget {
|
|
final Session session;
|
|
final ManagerAppContext managerAppContext;
|
|
final GoRouter router;
|
|
MyApp({required this.session, required this.managerAppContext, required this.router});
|
|
|
|
// This widget is the root of your application.
|
|
@override
|
|
_MyAppState createState() => _MyAppState();
|
|
}
|
|
|
|
class _MyAppState extends State<MyApp> {
|
|
final GlobalKey<_MyAppState> mainKey = GlobalKey();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp.router(
|
|
routerConfig: widget.router,
|
|
key: mainKey,
|
|
builder: (context, child) => ResponsiveBreakpoints.builder(
|
|
child: child!,
|
|
breakpoints: [
|
|
const Breakpoint(start: 0, end: 550, name: MOBILE),
|
|
const Breakpoint(start: 550, end: 800, name: TABLET),
|
|
const Breakpoint(start: 801, end: 1920, name: DESKTOP),
|
|
const Breakpoint(start: 1921, end: double.infinity, name: '4K'),
|
|
],
|
|
),
|
|
scrollBehavior: MyCustomScrollBehavior(),
|
|
debugShowCheckedModeBanner: false,
|
|
title: 'MyInfoMate - Manager',
|
|
//initialRoute: widget.initialRoute,
|
|
/*supportedLocales: [
|
|
const Locale('en', 'US'),
|
|
//const Locale('fr', 'FR'),
|
|
],*/
|
|
theme: ThemeData(
|
|
primarySwatch: Colors.blue,
|
|
primaryColor: kPrimaryColor,
|
|
scaffoldBackgroundColor: kBackgroundColor,
|
|
//fontFamily: "Vollkorn",
|
|
textTheme: TextTheme(bodyLarge: TextStyle(color: kBodyTextColor)),
|
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
|
),
|
|
/*routes: {
|
|
'/login': (context) => LoginScreen(session: widget.session),
|
|
'/main': (context) => MainScreen(),
|
|
'/policy': (context) => PolicyScreen(),
|
|
'/policy/mdlf': (context) => PolicyScreen(param: "mdlf"),
|
|
'/policy/fort': (context) => PolicyScreen(param: "fort"),
|
|
},
|
|
onUnknownRoute: (settings) => MaterialPageRoute(
|
|
builder: (context) => Container(child: Center(child: Text("Not found"))),
|
|
),*/
|
|
);
|
|
}
|
|
}
|
|
|
|
Future<Session> loadJsonSessionFile() async {
|
|
Session session = await FileHelper().readSessionWeb();
|
|
//print(session);
|
|
return session;
|
|
}
|
|
|
|
class MyCustomScrollBehavior extends MaterialScrollBehavior {
|
|
// Override behavior methods and getters like dragDevices
|
|
@override
|
|
Set<PointerDeviceKind> get dragDevices => {
|
|
PointerDeviceKind.touch,
|
|
PointerDeviceKind.mouse,
|
|
};
|
|
}
|