import 'dart:html';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:manager_app/Components/common_loader.dart';
import 'package:manager_app/Components/message_notification.dart';
import 'package:manager_app/Components/rounded_button.dart';
import 'package:manager_app/Components/rounded_input_field.dart';
import 'package:manager_app/Components/rounded_password_field.dart';
import 'package:manager_app/l10n/app_localizations.dart';
import 'package:manager_app/Helpers/FileHelper.dart';
import 'package:manager_app/Models/managerContext.dart';
import 'package:manager_app/Models/session.dart';
import 'package:manager_app/app_context.dart';
import 'package:manager_app/client.dart';
import 'package:manager_app/constants.dart';
import 'package:manager_api_new/api.dart';
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:package_info_plus/package_info_plus.dart';
class LoginScreen extends StatefulWidget {
final Session? session;
LoginScreen({Key? key, this.session}) : super(key: key);
@override
_LoginScreenState createState() => _LoginScreenState();
}
class _LoginScreenState extends State {
String email = ""; // DEV "test@email.be"
String password = ""; // DEV = "kljqsdkljqsd"
String? host = "http://localhost:5000"; // "https://api.myinfomate.be" // "https://api.mymuseum.be" // DEV = "http://192.168.31.96" // http://localhost:5000 // https://api.mymuseum.be // myCore http://192.168.31.140:8089
Client? clientAPI;
bool isLoading = false;
bool isRememberMe = false;
String pageTitle = "MyInfoMate";
String? token;
String? instanceId;
String? pinCode;
Storage localStorage = window.localStorage;
void authenticateTRY(AppContext appContext, bool fromClick) async {
clientAPI = Client(this.host!);
if (this.password.isNotEmpty || this.token != null) {
try {
if (fromClick) {
setState(() {
isLoading = true;
});
}
var accessToken = this.token;
var instanceId = this.instanceId;
var pinCode = this.pinCode;
UserRole? userRole;
if (accessToken == null) {
LoginDTO loginDTO = new LoginDTO(email: email, password: password);
TokenDTO? token = await clientAPI!.authenticationApi!
.authenticationAuthenticateWithJson(loginDTO);
if (token != null) {
accessToken = token.accessToken!;
instanceId = token.instanceId!;
pinCode = token.pinCode;
userRole = token.role;
showNotification(
kSuccess, kWhite, AppLocalizations.of(context)!.loginSuccess, context, null);
if (isRememberMe) {
if (!localStorage.containsKey("remember")) {
localStorage.addEntries({"remember": "true"}.entries);
}
if (!localStorage.containsKey("email") &&
!localStorage.containsKey("token")) {
localStorage.addEntries({"email": email}.entries);
localStorage.addEntries({"token": token.accessToken!}.entries);
localStorage.addEntries({"instanceId": token.instanceId!}.entries);
if (token.pinCode != null) {
localStorage.addEntries({"pinCode": token.pinCode!.toString()}.entries);
}
}
} else {
localStorage.clear();
}
}
}
if (accessToken != null) {
ManagerAppContext? managerAppContext = appContext.getContext();
if (managerAppContext == null) {
managerAppContext = new ManagerAppContext();
}
managerAppContext.email = email;
managerAppContext.host = host;
managerAppContext.instanceId = instanceId;
managerAppContext.pinCode = pinCode;
managerAppContext.accessToken = accessToken;
managerAppContext.role = userRole;
managerAppContext.clientAPI = clientAPI;
setAccessToken(accessToken);
InstanceDTO? instance = await managerAppContext.clientAPI!.instanceApi!
.instanceGetDetail(managerAppContext.instanceId!);
managerAppContext.instanceDTO = instance;
FileHelper().writeSession(new Session(
rememberMe: true,
instanceId: instanceId,
host: host,
token: accessToken,
password: password,
email: email,
role: userRole?.value));
appContext.setContext(managerAppContext);
if (instance!.isMobile!) {
context.go('/main/mobile');
} else {
if (instance.isTablet!) {
context.go('/main/tablet');
} else {
if (instance.isWeb!) {
context.go('/main/web');
} else {
if (instance.isVR!) {
context.go('/main/vr');
}
}
}
}
if (fromClick) {
setState(() {
isLoading = false;
});
}
} else {
showNotification(Colors.orange, kWhite, AppLocalizations.of(context)!.loginError, context, null);
setState(() {
isLoading = false;
});
}
} catch (e) {
print("error auth");
print(e);
if (fromClick) {
showNotification(Colors.orange, kWhite, AppLocalizations.of(context)!.loginError, context, null);
setState(() {
isLoading = false;
});
}
}
}
}
void setAccessToken(String accessToken) {
clientAPI!.apiApi!.addDefaultHeader('authorization', 'Bearer ' + accessToken);
}
@override
void initState() {
this.host = "http://localhost:5000";
if (localStorage.containsKey("remember")) {
this.isRememberMe = true;
if (localStorage.containsKey("email")) {
this.email = localStorage.entries.where((e) => e.key == "email").first.value;
}
if (localStorage.containsKey("token")) {
this.token = localStorage.entries.where((e) => e.key == "token").first.value;
this.password = "AnythingAsWeAlreadyHaveAccessToken";
}
if (localStorage.containsKey("instanceId")) {
this.instanceId = localStorage.entries.where((e) => e.key == "instanceId").first.value;
}
if (localStorage.containsKey("pinCode")) {
this.pinCode = localStorage.entries.where((e) => e.key == "pinCode").first.value;
}
}
super.initState();
}
ManagerAppContext initInstance(ManagerAppContext managerAppContext) {
var url = window.location.href;
if (!url.contains("localhost")) {
var urlParts = url.split('.');
if (urlParts.length > 0) {
var subdomain = urlParts[0].replaceAll('https://', '');
switch (subdomain) {
case "manager":
this.pageTitle = "MyInfoMate";
break;
case "fortsaintheribert":
this.pageTitle = "Fort de Saint Héribert";
break;
}
} else {
print("subdomain not found");
}
} else {
this.email = "test@email.be";
this.password = "kljqsdkljqsd";
print("localhost.. set mymuseum instance by default");
}
return managerAppContext;
}
@override
Widget build(BuildContext context) {
final appContext = Provider.of(context);
initInstance(appContext.getContext());
return Scaffold(
body: LayoutBuilder(
builder: (context, constraints) {
final isMobile = constraints.maxWidth < 550;
final isTablet = constraints.maxWidth < 800;
final cardWidth = isMobile
? constraints.maxWidth - 32.0
: isTablet
? 420.0
: 440.0;
final horizontalPadding = isMobile ? 24.0 : 40.0;
return Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
kPrimaryColor.withValues(alpha: 0.12),
kBackgroundColor,
kBackgroundColor,
],
),
),
child: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(isMobile ? 16.0 : 24.0),
child: Container(
width: cardWidth,
decoration: BoxDecoration(
color: kWhite,
borderRadius: BorderRadius.circular(16.0),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.08),
spreadRadius: 0,
blurRadius: 32,
offset: Offset(0, 8),
),
],
),
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: horizontalPadding,
vertical: 40.0,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
constraints: BoxConstraints(maxHeight: 80, minHeight: 40),
child: SvgPicture.asset('assets/images/MyInfoMate_logo_only.svg'),
),
SizedBox(height: 16),
AutoSizeText(
pageTitle,
style: TextStyle(
color: kPrimaryColor,
fontSize: 24,
fontFamily: "Helvetica",
fontWeight: FontWeight.w600,
),
maxLines: 2,
textAlign: TextAlign.center,
),
FutureBuilder(
future: getAppVersion(),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
snapshot.data != null) {
return Padding(
padding: const EdgeInsets.only(top: 4),
child: Text(
snapshot.data!,
style: TextStyle(fontSize: 11, color: Colors.grey),
),
);
}
return SizedBox.shrink();
},
),
SizedBox(height: 32),
Form(
key: widget.key,
child: AutofillGroup(
child: Column(
children: [
RoundedInputField(
hintText: "E-mail",
autofill: AutofillHints.email,
onChanged: (value) => email = value,
icon: Icons.person_outline,
initialValue: email,
isEmail: true,
),
RoundedPasswordField(
initialValue: password,
onChanged: (value) => password = value,
),
if (kIsWeb)
Padding(
padding: const EdgeInsets.only(top: 4),
child: Row(
children: [
Checkbox(
checkColor: kWhite,
activeColor: kPrimaryColor,
value: isRememberMe,
onChanged: (value) {
if (value != null) {
setState(() => isRememberMe = value);
}
},
),
Text(
AppLocalizations.of(context)!.rememberMe,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
),
],
),
),
SizedBox(height: 24),
!isLoading
? SizedBox(
width: double.infinity,
child: RoundedButton(
text: AppLocalizations.of(context)!.connect,
fontSize: 16,
vertical: 15,
horizontal: 30,
press: () {
TextInput.finishAutofillContext();
authenticateTRY(appContext, true);
},
),
)
: CommonLoader(iconSize: 40),
],
),
),
),
],
),
),
),
),
),
);
},
),
);
}
Future getAppVersion() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
return packageInfo.version;
}
}