From 15f435e9585a518d823834d8e6bf89c133e27d44 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Fri, 4 Oct 2024 12:11:54 +0300 Subject: [PATCH] feat(auth): password visibility --- .../pages/blog_post_create_screen.dart | 8 +- .../services/blog_post_service.dart | 19 ++++ .../services/blog_post_service.g.dart | 95 +++++++++++++++++++ .../pages/additional_settings_screen.dart | 15 +++ .../certificates_and_diploms_screen.dart | 15 +++ .../pages/last_step_screen.dart | 15 +++ .../pages/photo_or_scans_screen.dart | 15 +++ .../pages/registration_as_screen.dart | 15 +++ .../pages/social_networks_screen.dart | 15 +++ .../stepper_become_consultant_screen.dart | 18 ++-- lib/old/auth/auth_screen/auth_screen.dart | 14 ++- 11 files changed, 231 insertions(+), 13 deletions(-) create mode 100644 lib/features/blog_post_create/services/blog_post_service.dart create mode 100644 lib/features/blog_post_create/services/blog_post_service.g.dart create mode 100644 lib/features/consultant/become_consultant/pages/additional_settings_screen.dart create mode 100644 lib/features/consultant/become_consultant/pages/certificates_and_diploms_screen.dart create mode 100644 lib/features/consultant/become_consultant/pages/last_step_screen.dart create mode 100644 lib/features/consultant/become_consultant/pages/photo_or_scans_screen.dart create mode 100644 lib/features/consultant/become_consultant/pages/registration_as_screen.dart create mode 100644 lib/features/consultant/become_consultant/pages/social_networks_screen.dart diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index baf87e0f..4dbf9277 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -85,12 +85,8 @@ class _BlogPostCreateScreenState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), - backgroundColor: state.image != null || state.title!.text.isNotEmpty || state.description!.text.isNotEmpty || state.youtubeURL!.text.isNotEmpty - ? appTheme.blueA400 - : Colors.grey, - onPressed: state.image != null || state.title!.text.isNotEmpty || state.description!.text.isNotEmpty || state.youtubeURL!.text.isNotEmpty - ? () => _submitForm(context, state.title!.text, state.description!.text, state.youtubeURL!.text) - : null, + backgroundColor: appTheme.blueA400, + onPressed: () => _submitForm(context, state.title!.text, state.description!.text, state.youtubeURL!.text), label: Text( 'Создать', style: theme.textTheme.titleSmall, diff --git a/lib/features/blog_post_create/services/blog_post_service.dart b/lib/features/blog_post_create/services/blog_post_service.dart new file mode 100644 index 00000000..33524124 --- /dev/null +++ b/lib/features/blog_post_create/services/blog_post_service.dart @@ -0,0 +1,19 @@ +import 'package:dio/dio.dart'; +import 'package:retrofit/retrofit.dart'; + +part 'blog_post_service.g.dart'; + +@RestApi() +abstract class BlogPostService { + factory BlogPostService(Dio dio, {String baseUrl}) = _BlogPostService; + + @POST('/api/blogPosts/create') + @MultiPart() + Future sendMessage({ + @Path() String? title, + @Path() required String state, + @Path() String? description, + @Part() String? youtube_url, + @Part(name: 'image', contentType: 'multipart/form-data') List? media_data, + }); +} diff --git a/lib/features/blog_post_create/services/blog_post_service.g.dart b/lib/features/blog_post_create/services/blog_post_service.g.dart new file mode 100644 index 00000000..fab2c34d --- /dev/null +++ b/lib/features/blog_post_create/services/blog_post_service.g.dart @@ -0,0 +1,95 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'blog_post_service.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element + +class _BlogPostService implements BlogPostService { + _BlogPostService( + this._dio, { + this.baseUrl, + this.errorLogger, + }); + + final Dio _dio; + + String? baseUrl; + + final ParseErrorLogger? errorLogger; + + @override + Future sendMessage({ + String? title, + required String state, + String? description, + String? youtube_url, + List? media_data, + }) async { + final _extra = {}; + final queryParameters = {}; + queryParameters.removeWhere((k, v) => v == null); + final _headers = {}; + final _data = FormData(); + if (youtube_url != null) { + _data.fields.add(MapEntry( + 'youtube_url', + youtube_url, + )); + } + if (media_data != null) { + _data.files.addAll(media_data.map((i) => MapEntry('image', i))); + } + final _options = _setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + contentType: 'multipart/form-data', + ) + .compose( + _dio.options, + '/api/blogPosts/create', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + ))); + await _dio.fetch(_options); + } + + RequestOptions _setStreamType(RequestOptions requestOptions) { + if (T != dynamic && + !(requestOptions.responseType == ResponseType.bytes || + requestOptions.responseType == ResponseType.stream)) { + if (T == String) { + requestOptions.responseType = ResponseType.plain; + } else { + requestOptions.responseType = ResponseType.json; + } + } + return requestOptions; + } + + String _combineBaseUrls( + String dioBaseUrl, + String? baseUrl, + ) { + if (baseUrl == null || baseUrl.trim().isEmpty) { + return dioBaseUrl; + } + + final url = Uri.parse(baseUrl); + + if (url.isAbsolute) { + return url.toString(); + } + + return Uri.parse(dioBaseUrl).resolveUri(url).toString(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/additional_settings_screen.dart b/lib/features/consultant/become_consultant/pages/additional_settings_screen.dart new file mode 100644 index 00000000..cecec1db --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/additional_settings_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class AdditionalSettingsScreen extends StatefulWidget { + const AdditionalSettingsScreen({super.key}); + + @override + State createState() => _AdditionalSettingsScreenState(); +} + +class _AdditionalSettingsScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/certificates_and_diploms_screen.dart b/lib/features/consultant/become_consultant/pages/certificates_and_diploms_screen.dart new file mode 100644 index 00000000..4a889223 --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/certificates_and_diploms_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class CertificatesAndDiplomsScreen extends StatefulWidget { + const CertificatesAndDiplomsScreen({super.key}); + + @override + State createState() => _CertificatesAndDiplomsScreenState(); +} + +class _CertificatesAndDiplomsScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/last_step_screen.dart b/lib/features/consultant/become_consultant/pages/last_step_screen.dart new file mode 100644 index 00000000..04b0a561 --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/last_step_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class LastStepScreen extends StatefulWidget { + const LastStepScreen({super.key}); + + @override + State createState() => _LastStepScreenState(); +} + +class _LastStepScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/photo_or_scans_screen.dart b/lib/features/consultant/become_consultant/pages/photo_or_scans_screen.dart new file mode 100644 index 00000000..793d69b4 --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/photo_or_scans_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class PhotoOrScansScreen extends StatefulWidget { + const PhotoOrScansScreen({super.key}); + + @override + State createState() => _PhotoOrScansScreenState(); +} + +class _PhotoOrScansScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/registration_as_screen.dart b/lib/features/consultant/become_consultant/pages/registration_as_screen.dart new file mode 100644 index 00000000..c3a81742 --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/registration_as_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class RegistrationAsScreen extends StatefulWidget { + const RegistrationAsScreen({super.key}); + + @override + State createState() => _RegistrationAsScreenState(); +} + +class _RegistrationAsScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/social_networks_screen.dart b/lib/features/consultant/become_consultant/pages/social_networks_screen.dart new file mode 100644 index 00000000..f94607a8 --- /dev/null +++ b/lib/features/consultant/become_consultant/pages/social_networks_screen.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class SocialNetworksScreen extends StatefulWidget { + const SocialNetworksScreen({super.key}); + + @override + State createState() => _SocialNetworksScreenState(); +} + +class _SocialNetworksScreenState extends State { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/lib/features/consultant/become_consultant/pages/stepper_become_consultant_screen.dart b/lib/features/consultant/become_consultant/pages/stepper_become_consultant_screen.dart index c191c402..2f3a3c83 100644 --- a/lib/features/consultant/become_consultant/pages/stepper_become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/pages/stepper_become_consultant_screen.dart @@ -1,4 +1,10 @@ import 'package:eatvio_app/core/utils/image_constant.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/additional_settings_screen.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/certificates_and_diploms_screen.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/last_step_screen.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/photo_or_scans_screen.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/registration_as_screen.dart'; +import 'package:eatvio_app/features/consultant/become_consultant/pages/social_networks_screen.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:flutter/material.dart'; @@ -126,12 +132,12 @@ class _StepperBecomeConsultantScreenState extends State { bool checkboxState = false; + bool hidePassword = true; @override Widget build(BuildContext context) { @@ -73,9 +74,20 @@ class _AuthScreenState extends State { selector: (state) => state.passwordController, builder: (context, passwordController) { return CustomTextFormField( - obscureText: true, + obscureText: hidePassword, controller: passwordController, hintText: 'Введите пароль', + suffix: IconButton( + onPressed: () { + setState(() { + hidePassword = !hidePassword; + }); + }, + icon: Icon( + hidePassword ? Icons.visibility_outlined : Icons.visibility_off_outlined, + color: Colors.grey, + ), + ), ); }, ),