feat(auth): password visibility

This commit is contained in:
mso7nueh
2024-10-04 12:11:54 +03:00
parent 1217c72f2f
commit 15f435e958
11 changed files with 231 additions and 13 deletions

View File

@@ -85,12 +85,8 @@ class _BlogPostCreateScreenState extends State<BlogPostCreateScreen> {
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,

View File

@@ -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<void> sendMessage({
@Path() String? title,
@Path() required String state,
@Path() String? description,
@Part() String? youtube_url,
@Part(name: 'image', contentType: 'multipart/form-data') List<MultipartFile>? media_data,
});
}

View File

@@ -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<void> sendMessage({
String? title,
required String state,
String? description,
String? youtube_url,
List<MultipartFile>? media_data,
}) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.removeWhere((k, v) => v == null);
final _headers = <String, dynamic>{};
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<void>(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<void>(_options);
}
RequestOptions _setStreamType<T>(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();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class AdditionalSettingsScreen extends StatefulWidget {
const AdditionalSettingsScreen({super.key});
@override
State<AdditionalSettingsScreen> createState() => _AdditionalSettingsScreenState();
}
class _AdditionalSettingsScreenState extends State<AdditionalSettingsScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class CertificatesAndDiplomsScreen extends StatefulWidget {
const CertificatesAndDiplomsScreen({super.key});
@override
State<CertificatesAndDiplomsScreen> createState() => _CertificatesAndDiplomsScreenState();
}
class _CertificatesAndDiplomsScreenState extends State<CertificatesAndDiplomsScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class LastStepScreen extends StatefulWidget {
const LastStepScreen({super.key});
@override
State<LastStepScreen> createState() => _LastStepScreenState();
}
class _LastStepScreenState extends State<LastStepScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class PhotoOrScansScreen extends StatefulWidget {
const PhotoOrScansScreen({super.key});
@override
State<PhotoOrScansScreen> createState() => _PhotoOrScansScreenState();
}
class _PhotoOrScansScreenState extends State<PhotoOrScansScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class RegistrationAsScreen extends StatefulWidget {
const RegistrationAsScreen({super.key});
@override
State<RegistrationAsScreen> createState() => _RegistrationAsScreenState();
}
class _RegistrationAsScreenState extends State<RegistrationAsScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -0,0 +1,15 @@
import 'package:flutter/material.dart';
class SocialNetworksScreen extends StatefulWidget {
const SocialNetworksScreen({super.key});
@override
State<SocialNetworksScreen> createState() => _SocialNetworksScreenState();
}
class _SocialNetworksScreenState extends State<SocialNetworksScreen> {
@override
Widget build(BuildContext context) {
return const Placeholder();
}
}

View File

@@ -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<StepperBecomeConsultantS
});
},
children: [
Container(),
Container(),
Container(),
Container(),
Container(),
Container(),
CertificatesAndDiplomsScreen(),
PhotoOrScansScreen(),
AdditionalSettingsScreen(),
SocialNetworksScreen(),
RegistrationAsScreen(),
LastStepScreen(),
],
),
);

View File

@@ -37,6 +37,7 @@ class AuthScreen extends StatefulWidget {
class _AuthScreenState extends State<AuthScreen> {
bool checkboxState = false;
bool hidePassword = true;
@override
Widget build(BuildContext context) {
@@ -73,9 +74,20 @@ class _AuthScreenState extends State<AuthScreen> {
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,
),
),
);
},
),