Skip to content

Commit 2f41571

Browse files
authored
оптимизация, рефакторинг, исправления (#62)
* префикс для profile режима * рефакторинг: блоки, оптимизация: кнопка "наверх" - удалены УтИлИтЫ - добавлен снэк для уведомления о необходимости авторизации * дашборд: билдер не нужен * переработка dashboard в публикациях - размер текста счетчиков - положение табов - фикс: на иконке трекера область бэйджа была некликабельной * переработан скелетон для изображения, там-тут по-мелочи - репаинт для кнопки "читают сейчас" - репаинт для лоадера * оказывается linter на const не работал * линтеру не понравилось * фикс: дублирование ключей * фикс плейсхолдера, свой плейсхолдер для компаний и хабов * виджет для html у публикации в ленте * не создаем блок закладок если неавторизован * рефакторинг тем, карточки, пересказ: путь до пакета, удалены лишние файлы * заменен устаревший метод перевода материал цвета в hex * фикс: card - не применялся цвет указанный извне * UnmodifiableListView во всех моделях, фикс отметки в подписках отметки в подписках (ui): если отмечал как прочитанное, затем листал список и возвращался - то ранее просмотренные отображались как не просмотренные чуть подправлена верстка в подписках, чтобы не менялся размер карточки при отметке rethrow ошибок в кубитах * построже * фикс: не парсился тип публикации при переходе по ссылке потерялась запятая между элементами * рефакторинг: расширение для роутера * избавились от множественных "on" хендлеров в блоках * выпилен AnimatedBuilder из оберток, таббар в публикациях поверх списка * удалены некоторые константы * трекер: при "прочтении" отправлять только непрочитанные * публикации в трекере: фикс цвета лоадера, размер кнопок, фикс размера карточки * фикс: общий скролл для табов в трекере * подписки в трекере: фиксированный размер карточки * цвет для отключенных элементов, стиль FilledButton * трекер, публикации: переписано с использованием стрима - список больше не перезагружается при отметке как прочитанные или удалении из трекера - удалены лишние модели ответов * трекер, подписки: ключи для виджетов * рефакторинг исключений * фикс: переход по внешним ссылкам * отметка публикации локально * трекер, уведомления: переписано с использованием стрима отдельный блок для пометки как прочитанное * залочен масштаб шрифта * bloc как отдельный слой * рефакторинг виджета списка публикаций * фикс: не запускалось на веб-платформе, убраны адаптивные виджеты * рефакторинг экрана поиска, чекбоксов * язык интерфейса: перевод на чипы * выпилена подписка на языки, и их передача по всей цепочке * http клиент: работа с куками, подстановка языков в куки и в параметры разделение интерцепторов * переписан scrollcubit и виджет кнопки "наверх" * рефакторинг логина и авторизации - рефакторинг http клиента - completer для csrf interceptor - допилен менеджер cookie: теперь все взаимодействие с куками происходит с помощью него - переделан кубит авторизации: использование стрима - кубит и виджет входа: использование cookie manager - фикс: не получалось добавить статьи в избранное после входа в приложение * скрипт для build_runner * ключи для заголовков и кук
1 parent e857543 commit 2f41571

File tree

242 files changed

+3644
-3863
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

242 files changed

+3644
-3863
lines changed

.vscode/tasks.json

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,16 @@
1818
"detail": ""
1919
},
2020
{
21-
"type": "flutter",
22-
"command": "flutter",
21+
"type": "shell",
22+
"command": "bash",
2323
"args": [
24-
"pub",
25-
"run",
26-
"build_runner",
27-
"build",
28-
"--delete-conflicting-outputs"
24+
"'./scripts/runner.sh'"
2925
],
3026
"problemMatcher": [
3127
"$dart-build_runner"
3228
],
3329
"group": "build",
34-
"label": "build_runner build",
30+
"label": "build_runner: build",
3531
"detail": ""
3632
}
3733
]

analysis_options.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ linter:
1515
use_super_parameters: true
1616
use_key_in_widget_constructors: true
1717
eol_at_end_of_file: true
18-
# always_declare_return_types: true
18+
prefer_const_constructors: true
19+
always_declare_return_types: true
1920

2021
analyzer:
2122
exclude:

android/app/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ android {
9090
applicationIdSuffix ".debug"
9191
minifyEnabled false
9292
}
93+
94+
profile {
95+
applicationIdSuffix ".debug"
96+
minifyEnabled false
97+
}
9398
}
9499
}
95100

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
4+
import '../../data/exception/exception.dart';
5+
import '../../data/model/company/company.dart';
6+
import '../../data/model/language/language.dart';
7+
import '../../data/repository/repository.dart';
8+
9+
part 'company_state.dart';
10+
11+
class CompanyCubit extends Cubit<CompanyState> {
12+
CompanyCubit(String alias, {required CompanyRepository repository})
13+
: _repository = repository,
14+
super(CompanyState(alias: alias));
15+
16+
final CompanyRepository _repository;
17+
18+
void fetchCard() async {
19+
CompanyCard card = state.card;
20+
21+
try {
22+
if (card.isEmpty) {
23+
emit(state.copyWith(status: CompanyStatus.loading));
24+
25+
card = await _repository.fetchCard(state.alias);
26+
}
27+
28+
emit(state.copyWith(status: CompanyStatus.success, card: card));
29+
} catch (error, stackTrace) {
30+
emit(
31+
state.copyWith(
32+
status: CompanyStatus.failure,
33+
error: error.parseException('Не удалось получить профиль компании'),
34+
),
35+
);
36+
37+
super.onError(error, stackTrace);
38+
}
39+
}
40+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
4+
import '../../data/exception/exception.dart';
5+
import '../../data/model/company/company.dart';
6+
import '../../data/model/list_response_model.dart';
7+
import '../../data/repository/repository.dart';
8+
9+
part 'company_list_state.dart';
10+
11+
class CompanyListCubit extends Cubit<CompanyListState> {
12+
CompanyListCubit({
13+
required CompanyRepository repository,
14+
required LanguageRepository languageRepository,
15+
}) : _repository = repository,
16+
super(const CompanyListState());
17+
18+
final CompanyRepository _repository;
19+
20+
void fetch() async {
21+
if (state.status == CompanyListStatus.loading ||
22+
!state.isFirstFetch && state.isLastPage) {
23+
return;
24+
}
25+
26+
emit(state.copyWith(status: CompanyListStatus.loading));
27+
28+
try {
29+
final response = await _repository.fetchAll(page: state.page);
30+
31+
var newList = state.list.copyWith(
32+
pagesCount: response.pagesCount,
33+
ids: [...state.list.ids, ...response.ids],
34+
refs: [...state.list.refs, ...response.refs],
35+
);
36+
37+
emit(
38+
state.copyWith(
39+
status: CompanyListStatus.success,
40+
list: newList,
41+
page: state.page + 1,
42+
),
43+
);
44+
} catch (error, stackTrace) {
45+
emit(
46+
state.copyWith(
47+
status: CompanyListStatus.failure,
48+
error: error.parseException('Не удалось получить список компаний'),
49+
),
50+
);
51+
52+
super.onError(error, stackTrace);
53+
}
54+
}
55+
}

lib/presentation/page/services/hub/cubit/hub_cubit.dart renamed to lib/bloc/hub/hub_cubit.dart

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
import 'package:equatable/equatable.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33

4-
import '../../../../../data/exception/exception.dart';
5-
import '../../../../../data/model/hub/hub.dart';
6-
import '../../../../../data/repository/repository.dart';
4+
import '../../data/exception/exception.dart';
5+
import '../../data/model/hub/hub.dart';
6+
import '../../data/repository/repository.dart';
77

88
part 'hub_state.dart';
99

1010
class HubCubit extends Cubit<HubState> {
11-
HubCubit(
12-
String alias, {
13-
required HubRepository repository,
14-
required LanguageRepository languageRepository,
15-
}) : _repository = repository,
16-
_languageRepository = languageRepository,
17-
super(HubState(alias: alias));
11+
HubCubit(String alias, {required HubRepository repository})
12+
: _repository = repository,
13+
super(HubState(alias: alias));
1814

1915
final HubRepository _repository;
20-
final LanguageRepository _languageRepository;
2116

2217
void fetchProfile() async {
2318
HubProfile profile = state.profile;
@@ -26,11 +21,7 @@ class HubCubit extends Cubit<HubState> {
2621
if (profile.isEmpty) {
2722
emit(state.copyWith(status: HubStatus.loading));
2823

29-
profile = await _repository.fetchProfile(
30-
state.alias,
31-
langUI: _languageRepository.ui,
32-
langArticles: _languageRepository.articles,
33-
);
24+
profile = await _repository.fetchProfile(state.alias);
3425
}
3526

3627
emit(state.copyWith(status: HubStatus.success, profile: profile));

lib/bloc/hub/hub_list_cubit.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
4+
import '../../data/exception/exception.dart';
5+
import '../../data/model/hub/hub.dart';
6+
import '../../data/model/list_response_model.dart';
7+
import '../../data/repository/repository.dart';
8+
9+
part 'hub_list_state.dart';
10+
11+
class HubListCubit extends Cubit<HubListState> {
12+
HubListCubit({required HubRepository repository})
13+
: _repository = repository,
14+
super(const HubListState());
15+
16+
final HubRepository _repository;
17+
18+
void fetch() async {
19+
if (state.status == HubListStatus.loading ||
20+
!state.isFirstFetch && state.isLastPage) {
21+
return;
22+
}
23+
24+
emit(state.copyWith(status: HubListStatus.loading));
25+
26+
try {
27+
final response = await _repository.fetchAll(page: state.page);
28+
29+
var newList = state.list.copyWith(
30+
ids: [...state.list.ids, ...response.ids],
31+
pagesCount: response.pagesCount,
32+
refs: [...state.list.refs, ...response.refs],
33+
);
34+
35+
emit(
36+
state.copyWith(
37+
status: HubListStatus.success,
38+
list: newList,
39+
page: state.page + 1,
40+
),
41+
);
42+
} catch (error, stackTrace) {
43+
const fallbackMessage = 'Не удалось получить список хабов';
44+
emit(
45+
state.copyWith(
46+
status: HubListStatus.failure,
47+
error: error.parseException(fallbackMessage),
48+
),
49+
);
50+
51+
super.onError(error, stackTrace);
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)