Files
Remever/lib/screens/dialogs/info_dialog.dart
2025-10-29 10:13:34 +03:00

114 lines
3.1 KiB
Dart

import 'dart:convert';
import 'dart:io';
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/database/database.dart';
import 'package:remever/widgets/primary_button.dart';
class InfoDialog extends StatelessWidget {
const InfoDialog({super.key, required this.collection});
final Collection collection;
@override
Widget build(BuildContext context) {
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,
),
),
],
),
),
),
);
}
Widget _buildText() {
return Flexible(
child: SingleChildScrollView(
controller: ScrollController(),
child: AppTypography(
collection.desc,
type: Regular14px(),
maxLines: 9999,
),
),
);
}
///
/// Название коллекции
///
Widget _buildCollectionTitle() {
return AppTypography(
collection.title,
type: Medium16px(),
maxLines: 2,
softWrap: true,
color: AppColors.primary,
);
}
///
/// Обложка коллекции
///
Widget _buildAvatar() {
return SizedBox.square(
dimension: 40.r,
child: DecoratedBox(
decoration: BoxDecoration(shape: BoxShape.circle, color: AppColors.bg),
child: Wif(
condition: collection.image != null,
builder:
(context) => ClipOval(
child: Image.file(File(collection.image!), fit: BoxFit.cover),
),
fallback:
(context) => Center(
child: AppTypography(
collection.title.isNotEmpty
? collection.title.substring(0, 1)
: '',
type: Bold34px(),
),
),
),
),
);
}
}