Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
c689613
Minor Changes
MarceloRobert Aug 16, 2022
6ebd38f
Minor Changes Fix
MarceloRobert Aug 16, 2022
6964b29
Integração Inicial
MarceloRobert Aug 18, 2022
0dc2972
Integração do Ponto 2
MarceloRobert Aug 19, 2022
dab9459
PDF todos os pontos
ODBreno Aug 19, 2022
e35f95d
Init
MarceloRobert Aug 23, 2022
ddb0d25
P2
MarceloRobert Aug 24, 2022
90a4e76
Iteração 3
MarceloRobert Aug 24, 2022
d78c8e0
Reunião LP5
MarceloRobert Aug 25, 2022
d7b7dcb
Mudanças 25/08 LP5
ODBreno Aug 25, 2022
3ab2a96
Limpeza dos testes
MarceloRobert Aug 26, 2022
53a19aa
Merge branch 'backendIntegration' into develop
MarceloRobert Aug 26, 2022
ee29b41
Fix Requisição dos pontos
MarceloRobert Aug 26, 2022
cac4543
Formatação PDF
ODBreno Aug 26, 2022
a240f23
+Integração Backend
MarceloRobert Aug 29, 2022
1538e4f
Edição e PDF final
ODBreno Aug 29, 2022
a0306a1
Integração parcial LP5
MarceloRobert Aug 30, 2022
2b4f416
Edit Point meio integrado
ODBreno Sep 1, 2022
f4ea753
Integração postPoint
MarceloRobert Sep 1, 2022
4073c2e
Fix Problema Id
MarceloRobert Sep 1, 2022
4107493
Integração: Edit e delete
ODBreno Sep 1, 2022
6b4acec
Fix getMapPoints
MarceloRobert Sep 6, 2022
c0c0d44
Adição do mapa do IMC
MarceloRobert Sep 12, 2022
3ec033d
Arrumando o prev
ODBreno Sep 12, 2022
9e272b6
Merge branch 'develop' of https://github.com/PROEX-APP-NavIndoor/modu…
ODBreno Sep 12, 2022
ab97671
Concertado mapa e inicialização do prev
MarceloRobert Sep 12, 2022
8830ae5
Merge pull request #1 from PROEX-APP-NavIndoor/develop
MarceloRobert Sep 14, 2022
15528ec
Init espera do servidor
MarceloRobert Sep 14, 2022
c130a96
Prev/Vizinho
ODBreno Sep 15, 2022
7a91009
Opção de remover aparece apenas quando não há um próximo ponto
Danielhfc Sep 15, 2022
2f74fa2
Remover o ponto excluído dos vizinhos
Danielhfc Sep 15, 2022
aa1de78
Colocado exemplo de tratamento de erros
MarceloRobert Sep 19, 2022
cc5650f
LP5 22/09
MarceloRobert Sep 22, 2022
f3c57d5
Finalização Espera do Servidor
MarceloRobert Sep 26, 2022
ffccec9
Merge branch 'develop' into backendIntegration
ODBreno Sep 28, 2022
a95e481
Merge pull request #2 from PROEX-APP-NavIndoor/backendIntegration
MarceloRobert Sep 29, 2022
adc6d38
Fix Adição de pontos
MarceloRobert Sep 29, 2022
68c4a8c
Mudança servidor; Tratamento dos erros;
MarceloRobert Oct 11, 2022
e56d6e7
formato inicial
ODBreno Oct 13, 2022
a72664a
Novo QR
ODBreno Oct 15, 2022
060970c
add cor ao ponto anterior e validacao para proximo ponto
ODBreno Oct 23, 2022
3afff69
add uuid
ODBreno Oct 26, 2022
7f5b1bf
Person, Dijkstra; Provider; pacotes
MarceloRobert Oct 27, 2022
1b8d42c
Merge pull request #3 from PROEX-APP-NavIndoor/develop-marcelo
MarceloRobert Oct 28, 2022
5e3f03c
Init novo modelo; Change token, delete point; Clean up.
MarceloRobert Oct 31, 2022
6fda804
Limpeza do código; Continuada a implementação;
MarceloRobert Nov 7, 2022
7f9cdbe
Modificações 09/11/22 neighbors -> neighbor
MarceloRobert Nov 9, 2022
6d2ae83
Correções LP5
MarceloRobert Nov 10, 2022
695ad8a
Implementações finais do novo modelo de ponto
MarceloRobert Nov 16, 2022
d410305
adição dos arquivos renomeados
MarceloRobert Nov 16, 2022
c2e3f23
Add traços de caminho e direção do vizinho
MarceloRobert Nov 20, 2022
988aa69
Merge pull request #4 from PROEX-APP-NavIndoor/feature-newPointModel
MarceloRobert Nov 21, 2022
d32b878
Merge pull request #5 from PROEX-APP-NavIndoor/novoQR
MarceloRobert Nov 21, 2022
cebfc36
Fix neighbor direction; minor changes
MarceloRobert Dec 1, 2022
fdb19ac
Add mapselection; minor changes.
MarceloRobert Dec 7, 2022
e71363e
Init Adição de ponto inicial
MarceloRobert Dec 8, 2022
44ad296
Add Ponto inicial
MarceloRobert Dec 19, 2022
847bae2
Fix warnings
MarceloRobert Dec 19, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added assets/images/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6,544 changes: 6,544 additions & 0 deletions assets/maps/c1/c1PavimentoSuperior.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12,023 changes: 12,023 additions & 0 deletions assets/maps/c1/c1PavimentoTerreo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions lib/app/app.color.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:flutter/material.dart';

class AppColors {
// static const Color primary = Color(0xff003E1F);
// static const Color secondary = Color(0xff01110A);
static const Color primary = Colors.deepOrange;
static const Color secondary = Colors.orange;
}
8 changes: 6 additions & 2 deletions lib/app/app.constant.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
/// Valid types:
///
/// common, initial, intermediary.
enum TypePoint {
path,
goal,
common,
entrance,
passage,
}
71 changes: 71 additions & 0 deletions lib/app/app.repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';

class AppRepository {
static const String path = 'https://api-proex.onrender.com';
static const String queryLogin = '/login';
static const String queryUser = '/user';
static const String queryAllUsers = '/users';
static const String queryMap = '/maps';
static const String queryBuilder = '/api/accounts';
static const String queryOrganization = '/api/accounts';
static const String queryPoints = '/points';

Dio dio = Dio();

Future<String> post(
{required dynamic model, required String query, Options? options}) async {
const String erroMessage = "Erro na consulta";
//print(model.toJson());
try {
return await dio
.post(
AppRepository.path + query,
data: model.toJson(),
options: options,
)
.then(
(res) {
return res.data.toString();
},
);
} catch (e) {
if (kDebugMode) {
print("Erro em post:\n");
print(e);
}
return erroMessage;
}
}

Future<String> get(
{required String id, required String query, Options? options}) async {
const String erroMessage = "Erro na consulta";
if (kDebugMode) {
print("GET...\n");
print(AppRepository.path + query + '/' + id);
}
try {
return await dio
.get(
AppRepository.path + query + '/' + id,
options: options,
)
.then(
(res) {
return res.data["id"] == null
? res.data.toString()
: jsonEncode(res.data);
},
);
} catch (e) {
if (kDebugMode) {
print("Erro em post:\n");
print(e);
}
return erroMessage;
}
}
}
31 changes: 20 additions & 11 deletions lib/app/app.widget.dart
Original file line number Diff line number Diff line change
@@ -1,23 +1,32 @@
import 'package:flutter/material.dart';
import 'package:mvp_proex/app/app.color.dart';
import 'package:mvp_proex/features/login/login.view.dart';
import 'package:mvp_proex/features/map/map.view.dart';
import 'package:mvp_proex/features/mapselection/mapselection.view.dart';
import 'package:mvp_proex/features/user/user.model.dart';
import 'package:provider/provider.dart';

class AppWidget extends StatelessWidget {
const AppWidget({Key? key}) : super(key: key);

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MVP Demo',
theme: ThemeData(
primarySwatch: Colors.deepOrange,
scaffoldBackgroundColor: Colors.black26,
return Provider(
create: (_) => UserModel(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MVP Demo',
theme: ThemeData(
primarySwatch: AppColors.primary as MaterialColor,
scaffoldBackgroundColor: Colors.black,
),
initialRoute: '/login',
routes: {
'/map': (context) => const MapView(),
'/login': (context) => const LoginView(),
'/mapselection':(context) => const MapselectionView(),
},
),
initialRoute: '/map',
routes: {
'/map': (context) => const MapView(),
},
);
}
}
13 changes: 13 additions & 0 deletions lib/features/login/login.controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:flutter/cupertino.dart';
import 'package:rx_notifier/rx_notifier.dart';

class LoginController {
TextEditingController emailEditingController = TextEditingController();
TextEditingController passwordEditingController = TextEditingController();

RxNotifier<bool> isVisible = RxNotifier<bool>(false);
bool get getIsVisible => isVisible.value;

RxNotifier<bool> isLoading = RxNotifier<bool>(false);
bool get getIsLoading => isLoading.value;
}
219 changes: 219 additions & 0 deletions lib/features/login/login.view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:rx_notifier/rx_notifier.dart';
import 'package:mvp_proex/app/app.color.dart';
import 'package:mvp_proex/features/login/login.controller.dart';
import 'package:mvp_proex/features/user/user.model.dart';
import 'package:mvp_proex/features/user/user.repository.dart';
import 'package:mvp_proex/features/widgets/shared/button_submit.widget.dart';
import 'package:mvp_proex/features/widgets/shared/form_field.widget.dart';
import 'package:mvp_proex/features/widgets/shared/snackbar.message.dart';

class LoginView extends StatefulWidget {
const LoginView({Key? key}) : super(key: key);

@override
_LoginViewState createState() => _LoginViewState();
}

class _LoginViewState extends State<LoginView> {
late UserModel userModel;
LoginController controller = LoginController();
final _formKey = GlobalKey<FormState>();

@override
void initState() {
super.initState();
userModel = Provider.of<UserModel>(context, listen: false);
if (userModel.token != "") {
Navigator.of(context).pushReplacementNamed('/mapselection');
}
}

@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
body: Center(
child: SingleChildScrollView(
child: Container(
width: size.width < 320 ? size.width * 0.8 : 280,
height: size.height,
alignment: Alignment.center,
child: Form(
key: _formKey,
child: Column(
children: [
const Spacer(
flex: 4,
),
const Text(
"Módulo\n1",
style: TextStyle(
fontSize: 36,
fontWeight: FontWeight.w700,
color: AppColors.primary,
),
textAlign: TextAlign.center,
),
const Spacer(
flex: 2,
),
FormFieldWidget(
title: "E-mail",
description: "Entre com seu email",
validator: (String value) {
if (value.isEmpty) return "Campo vazio";
if (value.length < 10) return "Campo muito pequeno";
if (!value.contains("@")) return "Falta @";
if (!value.contains("@")) return "Falta .";
return null;
},
controller: controller.emailEditingController,
onChanged: (value) {
userModel.email = value;
},
icon: const SizedBox(),
keyboardType: TextInputType.emailAddress,
),
RxBuilder(
builder: (context) {
return FormFieldWidget(
title: "Senha",
description: "Senha do sistema",
validator: (value) {
if (value.isEmpty) return "Campo vazio";
return null;
},
controller: controller.passwordEditingController,
onChanged: (value) {
userModel.password = value;
},
keyboardType: TextInputType.text,
obscure: !controller.getIsVisible,
icon: IconButton(
icon: !controller.getIsVisible == true
? const Icon(Icons.visibility)
: const Icon(Icons.visibility_off),
onPressed: () {
controller.isVisible.value =
!controller.getIsVisible;
},
),
);
},
),
const Spacer(
flex: 2,
),
RxBuilder(
builder: (context) {
return controller.getIsLoading
? const CircularProgressIndicator()
: ButtonSubmitWidget(
textButton: "Entrar",
onPressed: () async {
if (_formKey.currentState!.validate()) {
controller.isLoading.value = true;
await UserRepository()
.login(
userModel: userModel,
)
.then(
(value) async {
if (value.contains("Erro")) {
showMessageError(
context: context, text: value);
} else {
userModel.token = value;
//TODO: tratar possíveis erros de requisição
await UserRepository()
.getUser(value)
.then((othervalue) {
userModel.permission =
othervalue["role"];
});
Navigator.of(context)
.pushReplacementNamed(
'/mapselection');
}
},
).whenComplete(() =>
controller.isLoading.value = false);
}
},
);
},
),
RxBuilder(
builder: ((context) {
return controller.getIsLoading
? const CircularProgressIndicator()
: TextButton(
onPressed: () async {
userModel.email = "[email protected]";
userModel.password = "123456";
await UserRepository()
.login(
userModel: userModel,
)
.then(
(value) async {
if (value.contains("Erro")) {
showMessageError(
context: context, text: value);
} else {
userModel.token = value;
//TODO: tratar possíveis erros de requisição
await UserRepository()
.getUser(value)
.then((othervalue) {
userModel.permission =
othervalue["role"];
});
Navigator.of(context)
.pushReplacementNamed(
'/mapselection');
}
},
).whenComplete(() =>
controller.isLoading.value = false);
},
child: const Text(
"Automático",
style: TextStyle(color: Colors.white),
));
}),
),
const Spacer(
flex: 4,
),
TextButton(
onPressed: () {
Navigator.of(context).pushNamed("/recovery-password");
},
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Text(
"Recuperar Senha",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w400,
color: Colors.grey,
),
textAlign: TextAlign.center,
),
),
),
const Spacer(
flex: 1,
),
],
),
),
),
),
),
);
}
}
Loading