Правки + иконка
This commit is contained in:
@@ -12,14 +12,59 @@ import 'package:remever/screens/dialogs/alert_dialog.dart';
|
||||
import 'package:remever/screens/dialogs/dialog_header.dart';
|
||||
import 'package:remever/screens/dialogs/dialog_item.dart';
|
||||
import 'package:remever/services/collection/collections_interface.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
class ActionDialog extends StatelessWidget {
|
||||
const ActionDialog({super.key, required this.collection});
|
||||
|
||||
final Collection collection;
|
||||
|
||||
void _onTrainingTap(BuildContext context) {
|
||||
showInfoToast('Все скоро будет. Рим не сразу строился');
|
||||
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
||||
void _onEditTap(BuildContext context) {
|
||||
Navigator.pop(context);
|
||||
context.pushRoute(CrudCollectionRoute(editedCollection: collection));
|
||||
}
|
||||
|
||||
void _onStatistickTap(BuildContext context) {
|
||||
showInfoToast('Ты серьезно?');
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
||||
void _onDownloadTap(BuildContext context) {
|
||||
showInfoToast('Ты серьезно?');
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
||||
void _onShareTap(BuildContext context) async {
|
||||
await Share.share('View my collection ${collection.id}');
|
||||
}
|
||||
|
||||
void _onDeleteTap(BuildContext context) async {
|
||||
final bool? res = await showCuperModalBottomSheet(
|
||||
context: context,
|
||||
height: 262.h,
|
||||
builder:
|
||||
(BuildContext context) => const AlertInfoDialog(
|
||||
title: 'Вы хотите удалить коллекцию?\nЭто действие необратимо',
|
||||
acceptTitle: 'Да, удалить',
|
||||
declineTitle: 'Нет, оставить',
|
||||
),
|
||||
);
|
||||
|
||||
if (res != null && res) {
|
||||
await getIt<CollectionsInterface>().deleteCollection(collection.id);
|
||||
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}
|
||||
|
||||
void _makePublic(BuildContext context, bool public) {
|
||||
if (public) {
|
||||
if (!public) {
|
||||
showCuperModalBottomSheet(
|
||||
context: context,
|
||||
height: 282.h,
|
||||
@@ -55,65 +100,32 @@ class ActionDialog extends StatelessWidget {
|
||||
DialogItem(
|
||||
title: 'Исключена из тренировки',
|
||||
child: Assets.icons.typeHide.image(color: AppColors.primary),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
onTap: () => _onTrainingTap(context),
|
||||
),
|
||||
DialogItem(
|
||||
title: 'Редактировать',
|
||||
child: Assets.icons.typeEdit.image(color: AppColors.primary),
|
||||
onTap: () {
|
||||
// context.back();
|
||||
context.pushRoute(
|
||||
CrudCollectionRoute(editedCollection: collection),
|
||||
);
|
||||
},
|
||||
onTap: () => _onEditTap(context),
|
||||
),
|
||||
DialogItem(
|
||||
title: 'Статистика',
|
||||
child: Assets.icons.typeStat.image(color: AppColors.primary),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
onTap: () => _onStatistickTap(context),
|
||||
),
|
||||
DialogItem(
|
||||
title: 'Скачать',
|
||||
child: Assets.icons.typeDownload.image(color: AppColors.primary),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
onTap: () => _onDownloadTap(context),
|
||||
),
|
||||
DialogItem(
|
||||
title: 'Поделиться',
|
||||
child: Assets.icons.typeShare.image(color: AppColors.primary),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
onTap: () => _onShareTap(context),
|
||||
),
|
||||
DialogItem(
|
||||
title: 'Удалить',
|
||||
color: AppColors.danger,
|
||||
onTap: () async {
|
||||
final bool? res = await showCuperModalBottomSheet(
|
||||
context: context,
|
||||
height: 262.h,
|
||||
builder:
|
||||
(BuildContext context) => const AlertInfoDialog(
|
||||
title:
|
||||
'Вы хотите удалить коллекцию?\nЭто действие необратимо',
|
||||
acceptTitle: 'Да, удалить',
|
||||
declineTitle: 'Нет, оставить',
|
||||
),
|
||||
);
|
||||
|
||||
if (true) {
|
||||
await getIt<CollectionsInterface>().deleteCollection(
|
||||
collection.id,
|
||||
);
|
||||
|
||||
Navigator.pop(context);
|
||||
}
|
||||
},
|
||||
onTap: () => _onDeleteTap(context),
|
||||
child: Assets.icons.typeTrash.image(color: AppColors.danger),
|
||||
),
|
||||
const BottomSafeSpace(),
|
||||
|
||||
@@ -1,47 +1,55 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:remever/common/resources.dart';
|
||||
import 'package:remever/common/widgets/typography.dart';
|
||||
import 'package:remever/common/widgets/w_if.dart';
|
||||
import 'package:remever/common/widgets/wspace.dart';
|
||||
import 'package:remever/components/extensions/context.dart';
|
||||
import 'package:remever/gen/assets.gen.dart';
|
||||
import 'package:remever/database/database.dart';
|
||||
import 'package:remever/widgets/primary_button.dart';
|
||||
|
||||
class InfoDialog extends StatelessWidget {
|
||||
const InfoDialog({super.key});
|
||||
const InfoDialog({super.key, required this.collection});
|
||||
|
||||
final Collection collection;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: const BoxDecoration(color: Colors.white),
|
||||
constraints: BoxConstraints(
|
||||
minHeight: MediaQuery.sizeOf(context).height / 6,
|
||||
maxHeight: MediaQuery.sizeOf(context).height / 1.1,
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 32, horizontal: 16).r,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
children: <Widget>[
|
||||
_buildAvatar(),
|
||||
const WSpace(5),
|
||||
Flexible(child: _buildCollectionTitle()),
|
||||
],
|
||||
),
|
||||
const HSpace(8),
|
||||
_buildText(),
|
||||
const HSpace(16),
|
||||
PrimaryButton(
|
||||
onTap: () => Navigator.of(context).pop(),
|
||||
color: AppColors.primary,
|
||||
child: AppTypography(
|
||||
'Закрыть',
|
||||
type: Medium14px(),
|
||||
color: AppColors.white,
|
||||
return Material(
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(color: Colors.white),
|
||||
constraints: BoxConstraints(
|
||||
minHeight: MediaQuery.sizeOf(context).height / 6,
|
||||
maxHeight: MediaQuery.sizeOf(context).height / 1.1,
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 32, horizontal: 16).r,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
children: <Widget>[
|
||||
_buildAvatar(),
|
||||
const WSpace(5),
|
||||
Flexible(child: _buildCollectionTitle()),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
const HSpace(8),
|
||||
_buildText(),
|
||||
const HSpace(16),
|
||||
PrimaryButton(
|
||||
onTap: () => Navigator.of(context).pop(),
|
||||
color: AppColors.primary,
|
||||
child: AppTypography(
|
||||
'Закрыть',
|
||||
type: Medium14px(),
|
||||
color: AppColors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -52,13 +60,7 @@ class InfoDialog extends StatelessWidget {
|
||||
child: SingleChildScrollView(
|
||||
controller: ScrollController(),
|
||||
child: AppTypography(
|
||||
'Предварительные выводы неутешительны: убеждённость некоторых оппонентов способствует подготовке и реализации форм воздействия. Как принято считать, предприниматели в сети интернет представляют собой не что иное, как квинтэссенцию победы маркетинга над разумом и должны быть описаны максимально подробно.'
|
||||
'Идейные соображения высшего порядка, а также высокотехнологичная концепция общественного уклада говорит о возможностях кластеризации усилий. Задача организации, в особенности же реализация намеченных плановых заданий выявляет срочную потребность первоочередных требований. Вот вам яркий пример современных тенденций — существующая теория обеспечивает широкому кругу (специалистов) участие в формировании поставленных обществом задач. Имеется спорная точка зрения, гласящая примерно следующее: сторонники тоталитаризма в науке освещают чрезвычайно интересные особенности картины в целом, однако конкретные выводы, разумеется, представлены в исключительно положительном свете. Лишь базовые сценарии поведения пользователей представляют собой не что иное, как квинтэссенцию победы маркетинга над разумом и должны быть функционально разнесены на независимые элементы. Каждый из нас понимает очевидную вещь: начало повседневной работы по формированию позиции способствует повышению качества распределения внутренних резервов и ресурсов.'
|
||||
'В своём стремлении улучшить пользовательский опыт мы упускаем, что тщательные исследования конкурентов набирают популярность среди определенных слоев населения, а значит, должны быть представлены в исключительно положительном свете. Противоположная точка зрения подразумевает, что непосредственные участники технического прогресса преданы социально-демократической анафеме. Вот вам яркий пример современных тенденций — выбранный нами инновационный путь не оставляет шанса для поставленных обществом задач. Задача организации, в особенности же понимание сути ресурсосберегающих технологий влечет за собой процесс внедрения и модернизации новых принципов формирования материально-технической и кадровой базы. В своём стремлении улучшить пользовательский опыт мы упускаем, что непосредственные участники технического прогресса ассоциативно распределены по отраслям. Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: синтетическое тестирование влечет за собой процесс внедрения и модернизации системы массового участия!'
|
||||
'Сложно сказать, почему стремящиеся вытеснить традиционное производство, нанотехнологии призваны к ответу. Но предприниматели в сети интернет, инициированные исключительно синтетически, призваны к ответу. Следует отметить, что экономическая повестка сегодняшнего дня способствует подготовке и реализации глубокомысленных рассуждений. Равным образом, укрепление и развитие внутренней структуры в значительной степени обусловливает важность соответствующих условий активизации. Противоположная точка зрения подразумевает, что диаграммы связей будут призваны к ответу. И нет сомнений, что независимые государства формируют глобальную экономическую сеть и при этом — ограничены исключительно образом мышления.'
|
||||
'И нет сомнений, что реплицированные с зарубежных источников, современные исследования освещают чрезвычайно интересные особенности картины в целом, однако конкретные выводы, разумеется, разоблачены! Мы вынуждены отталкиваться от того, что современная методология разработки говорит о возможностях как самодостаточных, так и внешне зависимых концептуальных решений. Повседневная практика показывает, что курс на социально-ориентированный национальный проект требует от нас анализа распределения внутренних резервов и ресурсов. Задача организации, в особенности же курс на социально-ориентированный национальный проект представляет собой интересный эксперимент проверки укрепления моральных ценностей. Значимость этих проблем настолько очевидна, что социально-экономическое развитие говорит о возможностях кластеризации усилий. Не следует, однако, забывать, что дальнейшее развитие различных форм деятельности в значительной степени обусловливает важность прогресса профессионального сообщества.'
|
||||
'А ещё реплицированные с зарубежных источников, современные исследования могут быть превращены в посмешище, хотя само их существование приносит несомненную пользу обществу. Задача организации, в особенности же социально-экономическое развитие является качественно новой ступенью системы обучения кадров, соответствующей насущным потребностям. В целом, конечно, начало повседневной работы по формированию позиции требует анализа поставленных обществом задач. Но курс на социально-ориентированный национальный проект говорит о возможностях экспериментов, поражающих по своей масштабности и грандиозности. Прежде всего, существующая теория создаёт предпосылки для экономической целесообразности принимаемых решений. Внезапно, представители современных социальных резервов лишь добавляют фракционных разногласий и разоблачены.'
|
||||
'В рамках спецификации современных стандартов, действия представителей оппозиции ассоциативно распределены по отраслям. Не следует, однако, забывать, что новая модель организационной деятельности позволяет оценить значение соответствующих условий активизации. Значимость этих проблем настолько очевидна, что курс на социально-ориентированный национальный проект позволяет выполнить важные задания по разработке глубокомысленных рассуждений. Современные технологии достигли такого уровня, что начало повседневной работы по формированию позиции обеспечивает широкому кругу (специалистов) участие в формировании инновационных методов управления процессами. Имеется спорная точка зрения, гласящая примерно следующее: активно развивающиеся страны третьего мира будут объявлены нарушающими общечеловеческие нормы этики и морали. Картельные сговоры не допускают ситуации, при которой диаграммы связей будут обнародованы.',
|
||||
collection.desc,
|
||||
type: Regular14px(),
|
||||
maxLines: 9999,
|
||||
),
|
||||
@@ -71,7 +73,7 @@ class InfoDialog extends StatelessWidget {
|
||||
///
|
||||
Widget _buildCollectionTitle() {
|
||||
return AppTypography(
|
||||
'Астрономия и тайная комната Харли Хоттера',
|
||||
collection.title,
|
||||
type: Medium16px(),
|
||||
maxLines: 2,
|
||||
softWrap: true,
|
||||
@@ -86,9 +88,21 @@ class InfoDialog extends StatelessWidget {
|
||||
return SizedBox.square(
|
||||
dimension: 40.r,
|
||||
child: DecoratedBox(
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
image: DecorationImage(image: Assets.images.img.provider()),
|
||||
decoration: BoxDecoration(shape: BoxShape.circle, color: AppColors.bg),
|
||||
|
||||
child: Wif(
|
||||
condition: collection.image != null,
|
||||
builder:
|
||||
(context) => ClipOval(
|
||||
child: Image.memory(collection.image!, fit: BoxFit.cover),
|
||||
),
|
||||
fallback:
|
||||
(context) => Center(
|
||||
child: AppTypography(
|
||||
collection.title.substring(0, 1),
|
||||
type: Bold34px(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user