Skip to content

Instantly share code, notes, and snippets.

View saturov's full-sized avatar

Eugene Saturov saturov

View GitHub Profile
## Links
- 📝 Функциональные требования и техническая спецификация: `docs/ai/workflow/02-features/main-screen/business-requirements.md`
- 📄 Файл, в который необходимо сохранить сгенерированный таск-лист: `docs/ai/workflow/02-features/main-screen/task-list.md`
- 🖼 Скриншот реализуемого экрана для визуального референса: `docs/ai/workflow/02-features/main-screen/design/main_screen.png`
- 🎨 Макет экрана в Figma: https://www.figma.com/design/nLDpIUh4gksHkJxWpdx5Jq/AI-Boost?node-id=11-3647&t=WFtpghSDDURrFhNG-4
- 🗂️ Верхнеуровневое описание проекта: `docs/ai/workflow/01-project/overview.md`
- 🏗️ Архитектурный гайдлайн: `docs/ai/workflow/01-project/architecture.md`
- 🧑‍💻 Правила написания кода: `.cursor/rules/combined-rules.mdc`
- 🔌 Swagger API спецификация: `docs/swagger/rigla_swagger.yaml`
## 1. Ссылки
- 📄 Файл, в который будет сохранён сгенерированный таск-лист: `docs/ai/workflow/02-features/main-screen/task-list.md`
- 📝 Функциональные требования и техническая спецификация: `docs/ai/workflow/02-features/main-screen/business-requirements.md`
- 🖼 Скриншот реализуемого экрана для визуального референса: `docs/ai/workflow/02-features/main-screen/design/main_screen.png`
- 🎨 Макет экрана в Figma: `https://www.figma.com/design/nLDpIUh4gksHkJxWpdx5Jq/AI-Boost?node-id=11-3647&t=WFtpghSDDURrFhNG-4`
- 🗺 Верхнеуровневое описание проекта: `docs/ai/workflow/01-project/overview.md`
- 🏗 Архитектурный гайдлайн: `docs/ai/workflow/01-project/architecture.md`
- 📐 Правила написания кода: `.cursor/rules/combined-rules.mdc`
void _applyTemplateData(
Map<Organization, List<Account>> organizationsToAccountsMap,
) {
if (_templateBuy != null) {
_applyTemplateDataBuy(organizationsToAccountsMap, _templateBuy);
} else if (_templateSell != null) {
_applyTemplateDataSell(organizationsToAccountsMap, _templateSell);
}
}
/// Помощник с логикой пагинации
class PaginationHelper<T> {
static const double _defaultPaginationOffset = 50;
/// Смещение от конца прокрутки после которого начинать пагинацию
double paginationOffset;
/// Контроллер прокрутки
ScrollController scrollController;
/// Билдер [WidgetModel] для экрана Дэшборда [DashboardScreen]
DashboardWidgetModel createDashboardScreenWm(BuildContext context) {
final component = Injector.of<DashboardScreenComponent>(context).component;
final dependencies = WidgetModelDependencies(
errorHandler: StandardErrorHandler(
component.messageController,
component.dialogController,
component.sessionInteractor,
component.authInteractor,
///Базовый класс для обработки ошибок, связанных с сервисным слоем
abstract class NetworkErrorHandler implements ErrorHandler {
@override
void handleError(Object error) {
Object e;
bool isSilent = false;
bool isOverlayed = false;
if (error is SilentException) {
e = error.originalError;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// виджет для настройки статус-бара
/// [child] - дочерний виджет для вёрстки всего остального экрана
///
/// [statusBarColor] - цвет статус-бара (по-умолчанию прозрачный)
///
/// [iconTone] - тон иконок в статус-баре (светлые/тёмные)
///
/**
* Виджет "звездного" прогресс-бара.
*
* Для корректной работы необходимо в рантайме задать значение [@see totalProgress], а затем задать
* актуальное значение [@see currentProgress].
*
* Четыре цвета градиента задаются через XML-атрибуты:
* * [@see ProgressStarView_psv_color_start]
* * [@see ProgressStarView_psv_color_middle_1]
* * [@see ProgressStarView_psv_color_middle_2]
if (rateViewInRecyclerView != null) {
val offset: Float
if (rateViewInRecyclerView.top < post_rate_container.top) {
offset = (rateViewInRecyclerView.top - post_rate_container.top).toFloat()
post_rate_container.animate().yBy(offset).setDuration(0)?.start()
}
}
post_content_rv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val rateViewInRecyclerView: View? =
postAdapter.stickyLayoutManager.findViewByPosition(postItems.indexOf(rateBaseItem))
if (rateViewInRecyclerView != null) {
if (rateViewInRecyclerView.yLocationInWindow() != 0 &&
(rateViewInRecyclerView.yLocationInWindow() < initialRateViewYPosition)) {