Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

242 linhas
8.7 KiB

  1. import 'package:flutter/material.dart';
  2. import 'package:http/http.dart' as http;
  3. import 'dart:convert';
  4. import 'dart:io';
  5. import 'package:http/io_client.dart';
  6. import 'package:flutter_dotenv/flutter_dotenv.dart';
  7. class CameraPage extends StatelessWidget {
  8. final String loginUrl = dotenv.env['SERVER_URL']! + '/auth/login';
  9. final String moveCameraUrl = dotenv.env['SERVER_URL']! + '/move-camera';
  10. Future<http.Client> createHttpClient() async {
  11. final ioc = HttpClient()
  12. ..badCertificateCallback =
  13. (X509Certificate cert, String host, int port) => true;
  14. return IOClient(ioc);
  15. }
  16. Future<String> loginAndGetToken(http.Client client) async {
  17. var url = Uri.parse(loginUrl);
  18. var data = {
  19. 'username': dotenv.env['USERNAME']!,
  20. 'password': dotenv.env['PASSWORD']!,
  21. };
  22. var body = data.keys
  23. .map((key) =>
  24. "${Uri.encodeComponent(key)}=${Uri.encodeComponent(data[key] ?? '')}")
  25. .join("&");
  26. var response = await client.post(
  27. url,
  28. headers: {
  29. "Content-Type": "application/x-www-form-urlencoded",
  30. },
  31. body: body,
  32. );
  33. var responseBody = response.body;
  34. var parsedJson = jsonDecode(responseBody);
  35. if (parsedJson['access_token'] != null) {
  36. return parsedJson['access_token'];
  37. } else {
  38. throw Exception('Token not found in response');
  39. }
  40. }
  41. Future<void> sendPostRequestMoveCamera(
  42. BuildContext context, String token, Map<String, dynamic> data) async {
  43. var url = Uri.parse(moveCameraUrl);
  44. var jsonData = jsonEncode(data);
  45. HttpClient httpClient = HttpClient()
  46. ..badCertificateCallback =
  47. ((X509Certificate cert, String host, int port) => true);
  48. var request = await httpClient.postUrl(url)
  49. ..headers.contentType = ContentType.json
  50. ..headers.add('Authorization', 'Bearer $token')
  51. ..write(jsonData);
  52. var response = await request.close();
  53. var responseBody = await utf8.decodeStream(response);
  54. var responseJson = jsonDecode(responseBody);
  55. var message = responseJson['message'] ?? 'Unknown response';
  56. bool isError = message.startsWith('Error:') || message.startsWith('Errore:');
  57. ScaffoldMessenger.of(context).showSnackBar(
  58. SnackBar(
  59. content: Text(message),
  60. backgroundColor: isError ? Colors.red : Colors.green,
  61. ),
  62. );
  63. }
  64. @override
  65. Widget build(BuildContext context) {
  66. double screenWidth = MediaQuery.of(context).size.width;
  67. double screenHeight = MediaQuery.of(context).size.height;
  68. return Scaffold(
  69. body: OrientationBuilder(
  70. builder: (context, orientation) {
  71. return Stack(
  72. children: [
  73. Column(
  74. children: [
  75. Expanded(
  76. child: GestureDetector(
  77. onTap: () async {
  78. final client = await createHttpClient();
  79. String token = await loginAndGetToken(client);
  80. await sendPostRequestMoveCamera(context, token, {
  81. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  82. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  83. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  84. "preset": 1
  85. });
  86. },
  87. child: Container(
  88. color: Colors.transparent,
  89. child: Transform.rotate(
  90. angle: 3.14 / 2,
  91. child: Image.asset(
  92. 'assets/images/img1.png',
  93. fit: BoxFit.cover,
  94. ),
  95. ),
  96. ),
  97. ),
  98. ),
  99. Expanded(
  100. child: GestureDetector(
  101. onTap: () async {
  102. final client = await createHttpClient();
  103. String token = await loginAndGetToken(client);
  104. await sendPostRequestMoveCamera(context, token, {
  105. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  106. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  107. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  108. "preset": 3
  109. });
  110. },
  111. child: Container(
  112. color: Colors.transparent,
  113. child: Transform.rotate(
  114. angle: 3.14 / 2,
  115. child: Image.asset(
  116. 'assets/images/img2.png',
  117. fit: BoxFit.cover,
  118. ),
  119. ),
  120. ),
  121. ),
  122. ),
  123. Expanded(
  124. child: GestureDetector(
  125. onTap: () async {
  126. final client = await createHttpClient();
  127. String token = await loginAndGetToken(client);
  128. await sendPostRequestMoveCamera(context, token, {
  129. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  130. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  131. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  132. "preset": 2
  133. });
  134. },
  135. child: Container(
  136. color: Colors.transparent,
  137. child: Transform.rotate(
  138. angle: 3.14 / 2,
  139. child: Image.asset(
  140. 'assets/images/img3.png',
  141. fit: BoxFit.cover,
  142. ),
  143. ),
  144. ),
  145. ),
  146. ),
  147. ],
  148. ),
  149. Positioned(
  150. top: screenHeight * 0.15,
  151. left: screenWidth * 0.05,
  152. child: GestureDetector(
  153. onTap: () async {
  154. final client = await createHttpClient();
  155. String token = await loginAndGetToken(client);
  156. await sendPostRequestMoveCamera(context, token, {
  157. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  158. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  159. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  160. "preset": 5
  161. });
  162. },
  163. child: Transform.rotate(
  164. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  165. child: FaceSymbol(),
  166. ),
  167. ),
  168. ),
  169. Positioned(
  170. top: screenHeight * 0.35,
  171. left: screenWidth * 0.05,
  172. child: GestureDetector(
  173. onTap: () async {
  174. final client = await createHttpClient();
  175. String token = await loginAndGetToken(client);
  176. await sendPostRequestMoveCamera(context, token, {
  177. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  178. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  179. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  180. "preset": 4
  181. });
  182. },
  183. child: Transform.rotate(
  184. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  185. child: FaceSymbol(),
  186. ),
  187. ),
  188. ),
  189. Positioned(
  190. top: screenHeight * 0.7,
  191. left: screenWidth * 0.05,
  192. child: GestureDetector(
  193. onTap: () async {
  194. final client = await createHttpClient();
  195. String token = await loginAndGetToken(client);
  196. await sendPostRequestMoveCamera(context, token, {
  197. "baseUrl": dotenv.env['IP_CAMERA_BASE_URL']!,
  198. "username": dotenv.env['IP_CAMERA_USERNAME']!,
  199. "password": dotenv.env['IP_CAMERA_PASSWORD']!,
  200. "preset": 6
  201. });
  202. },
  203. child: Transform.rotate(
  204. angle: 3.14 / 2, // Rotating 90 degrees (PI / 2 radians)
  205. child: FaceSymbol(),
  206. ),
  207. ),
  208. ),
  209. ],
  210. );
  211. },
  212. ),
  213. );
  214. }
  215. }
  216. class FaceSymbol extends StatelessWidget {
  217. @override
  218. Widget build(BuildContext context) {
  219. return Icon(
  220. Icons.face, // Using a built-in face icon
  221. size: 50.0,
  222. color: Colors.blue,
  223. );
  224. }
  225. }