kopia lustrzana https://gitlab.com/mysocialportal/relatica
				
				
				
			
		
			
				
	
	
		
			88 wiersze
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Dart
		
	
	
			
		
		
	
	
			88 wiersze
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Dart
		
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:logging/logging.dart';
 | |
| import 'package:result_monad/result_monad.dart';
 | |
| 
 | |
| import '../../models/media_attachment_uploads/entry_media_items.dart';
 | |
| import '../../services/media_upload_attachment_helper.dart';
 | |
| import '../../utils/snackbar_builder.dart';
 | |
| import '../padding.dart';
 | |
| import 'media_upload_editor_control.dart';
 | |
| 
 | |
| final _logger = Logger('$MediaUploadsControl');
 | |
| 
 | |
| class MediaUploadsControl extends StatefulWidget {
 | |
|   final EntryMediaItems entryMediaItems;
 | |
| 
 | |
|   const MediaUploadsControl({super.key, required this.entryMediaItems});
 | |
| 
 | |
|   @override
 | |
|   State<MediaUploadsControl> createState() => _MediaUploadsControlState();
 | |
| }
 | |
| 
 | |
| class _MediaUploadsControlState extends State<MediaUploadsControl> {
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     _logger.finest('Building');
 | |
|     return Column(
 | |
|       children: [
 | |
|         Row(
 | |
|           mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | |
|           children: [
 | |
|             Text(
 | |
|               'Images',
 | |
|               style: Theme.of(context).textTheme.titleLarge,
 | |
|             ),
 | |
|             Row(
 | |
|               mainAxisAlignment: MainAxisAlignment.end,
 | |
|               children: [
 | |
|                 IconButton(
 | |
|                   onPressed: () async {
 | |
|                     await MediaUploadAttachmentHelper.getNewImagesFromCamera()
 | |
|                         .match(
 | |
|                             onSuccess: (newEntries) => setState(() => widget
 | |
|                                 .entryMediaItems.attachments
 | |
|                                 .addAll(newEntries)),
 | |
|                             onError: (error) {
 | |
|                               if (mounted) {
 | |
|                                 buildSnackbar(context,
 | |
|                                     'Error selecting attachments: $error');
 | |
|                               }
 | |
|                             });
 | |
|                   },
 | |
|                   icon: const Icon(Icons.camera_alt),
 | |
|                 ),
 | |
|                 IconButton(
 | |
|                   onPressed: () async {
 | |
|                     await MediaUploadAttachmentHelper.getImagesFromGallery()
 | |
|                         .match(
 | |
|                             onSuccess: (newEntries) => setState(() => widget
 | |
|                                 .entryMediaItems.attachments
 | |
|                                 .addAll(newEntries)),
 | |
|                             onError: (error) {
 | |
|                               if (mounted) {
 | |
|                                 buildSnackbar(context,
 | |
|                                     'Error selecting attachments: $error');
 | |
|                               }
 | |
|                             });
 | |
|                   },
 | |
|                   icon: const Icon(Icons.add_to_photos),
 | |
|                 ),
 | |
|               ],
 | |
|             )
 | |
|           ],
 | |
|         ),
 | |
|         const VerticalPadding(),
 | |
|         ...widget.entryMediaItems.attachments.map(
 | |
|           (m) => MediaUploadEditorControl(
 | |
|             media: m,
 | |
|             onDelete: () {
 | |
|               widget.entryMediaItems.attachments.remove(m);
 | |
|               setState(() {});
 | |
|             },
 | |
|           ),
 | |
|         ),
 | |
|       ],
 | |
|     );
 | |
|   }
 | |
| }
 |