mirror of
				https://gitlab.com/famedly/fluffychat.git
				synced 2025-10-31 12:07:24 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter/services.dart';
 | |
| 
 | |
| import 'package:flutter_gen/gen_l10n/l10n.dart';
 | |
| import 'package:video_player/video_player.dart';
 | |
| 
 | |
| import 'add_story.dart';
 | |
| 
 | |
| class AddStoryView extends StatelessWidget {
 | |
|   final AddStoryController controller;
 | |
|   const AddStoryView(this.controller, {Key? key}) : super(key: key);
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     final video = controller.videoPlayerController;
 | |
| 
 | |
|     return Scaffold(
 | |
|       backgroundColor: Colors.blueGrey.shade900,
 | |
|       appBar: AppBar(
 | |
|         leading: const BackButton(color: Colors.white),
 | |
|         systemOverlayStyle: SystemUiOverlayStyle.light,
 | |
|         backgroundColor: Colors.transparent,
 | |
|         elevation: 0,
 | |
|         iconTheme: const IconThemeData(color: Colors.white),
 | |
|         title: Text(
 | |
|           L10n.of(context)!.addToStory,
 | |
|           style: const TextStyle(
 | |
|             color: Colors.white,
 | |
|             shadows: [
 | |
|               Shadow(
 | |
|                 color: Colors.black,
 | |
|                 offset: Offset(0, 0),
 | |
|                 blurRadius: 5,
 | |
|               ),
 | |
|             ],
 | |
|           ),
 | |
|         ),
 | |
|         actions: [
 | |
|           if (controller.hasMedia)
 | |
|             IconButton(
 | |
|               icon: const Icon(Icons.fullscreen_outlined),
 | |
|               color: Colors.white,
 | |
|               onPressed: controller.toggleBoxFit,
 | |
|             ),
 | |
|           if (!controller.hasMedia)
 | |
|             IconButton(
 | |
|               icon: const Icon(Icons.color_lens_outlined),
 | |
|               color: Colors.white,
 | |
|               onPressed: controller.updateColor,
 | |
|             ),
 | |
|           IconButton(
 | |
|             icon: const Icon(Icons.delete_outlined),
 | |
|             color: Colors.white,
 | |
|             onPressed: controller.reset,
 | |
|           ),
 | |
|         ],
 | |
|       ),
 | |
|       extendBodyBehindAppBar: true,
 | |
|       body: GestureDetector(
 | |
|         onVerticalDragUpdate: controller.onVerticalDragUpdate,
 | |
|         onHorizontalDragUpdate: controller.onHorizontalDragUpdate,
 | |
|         child: Stack(
 | |
|           children: [
 | |
|             if (video != null)
 | |
|               Padding(
 | |
|                 padding: const EdgeInsets.symmetric(vertical: 80.0),
 | |
|                 child: FutureBuilder(
 | |
|                   future: video.initialize().then((_) => video.play()),
 | |
|                   builder: (_, __) => Center(child: VideoPlayer(video)),
 | |
|                 ),
 | |
|               ),
 | |
|             AnimatedContainer(
 | |
|               duration: const Duration(seconds: 1),
 | |
|               padding: const EdgeInsets.symmetric(
 | |
|                 horizontal: 8.0,
 | |
|                 vertical: 80.0,
 | |
|               ),
 | |
|               decoration: BoxDecoration(
 | |
|                 image: controller.image == null
 | |
|                     ? null
 | |
|                     : DecorationImage(
 | |
|                         image: MemoryImage(controller.image!.bytes),
 | |
|                         fit: controller.fit,
 | |
|                         opacity: 0.75,
 | |
|                       ),
 | |
|                 gradient: controller.hasMedia
 | |
|                     ? null
 | |
|                     : LinearGradient(
 | |
|                         colors: [
 | |
|                           controller.backgroundColorDark,
 | |
|                           controller.backgroundColor,
 | |
|                         ],
 | |
|                         begin: Alignment.topCenter,
 | |
|                         end: Alignment.bottomCenter,
 | |
|                       ),
 | |
|               ),
 | |
|               child: Align(
 | |
|                 alignment: Alignment(
 | |
|                   controller.alignmentX / 100,
 | |
|                   controller.alignmentY / 100,
 | |
|                 ),
 | |
|                 child: IntrinsicWidth(
 | |
|                   child: TextField(
 | |
|                     controller: controller.controller,
 | |
|                     focusNode: controller.focusNode,
 | |
|                     minLines: 1,
 | |
|                     maxLines: 15,
 | |
|                     autofocus: false,
 | |
|                     textAlign: TextAlign.center,
 | |
|                     style: TextStyle(
 | |
|                       fontSize: 24,
 | |
|                       color: Colors.white,
 | |
|                       shadows: controller.hasMedia
 | |
|                           ? const [
 | |
|                               Shadow(
 | |
|                                 color: Colors.black,
 | |
|                                 offset: Offset(5, 5),
 | |
|                                 blurRadius: 20,
 | |
|                               ),
 | |
|                               Shadow(
 | |
|                                 color: Colors.black,
 | |
|                                 offset: Offset(5, 5),
 | |
|                                 blurRadius: 20,
 | |
|                               ),
 | |
|                               Shadow(
 | |
|                                 color: Colors.black,
 | |
|                                 offset: Offset(-5, -5),
 | |
|                                 blurRadius: 20,
 | |
|                               ),
 | |
|                               Shadow(
 | |
|                                 color: Colors.black,
 | |
|                                 offset: Offset(-5, -5),
 | |
|                                 blurRadius: 20,
 | |
|                               ),
 | |
|                             ]
 | |
|                           : null,
 | |
|                     ),
 | |
|                     onChanged: controller.updateHasText,
 | |
|                     decoration: InputDecoration(
 | |
|                       border: InputBorder.none,
 | |
|                       hintText: controller.hasMedia
 | |
|                           ? L10n.of(context)!.addDescription
 | |
|                           : L10n.of(context)!.whatIsGoingOn,
 | |
|                       filled: false,
 | |
|                       hintStyle: TextStyle(
 | |
|                         color: Colors.white.withOpacity(0.5),
 | |
|                         backgroundColor: Colors.transparent,
 | |
|                       ),
 | |
|                       enabledBorder: InputBorder.none,
 | |
|                       focusedBorder: InputBorder.none,
 | |
|                     ),
 | |
|                   ),
 | |
|                 ),
 | |
|               ),
 | |
|             ),
 | |
|           ],
 | |
|         ),
 | |
|       ),
 | |
|       floatingActionButton: Row(
 | |
|         mainAxisSize: MainAxisSize.min,
 | |
|         children: [
 | |
|           if (!controller.hasMedia) ...[
 | |
|             FloatingActionButton(
 | |
|               onPressed: controller.importMedia,
 | |
|               backgroundColor: controller.backgroundColorDark,
 | |
|               foregroundColor: Colors.white,
 | |
|               heroTag: null,
 | |
|               child: const Icon(Icons.photo_outlined),
 | |
|             ),
 | |
|             const SizedBox(width: 16),
 | |
|             FloatingActionButton(
 | |
|               onPressed: controller.capturePhoto,
 | |
|               backgroundColor: controller.backgroundColorDark,
 | |
|               foregroundColor: Colors.white,
 | |
|               heroTag: null,
 | |
|               child: const Icon(Icons.camera_alt_outlined),
 | |
|             ),
 | |
|             const SizedBox(width: 16),
 | |
|             FloatingActionButton(
 | |
|               onPressed: controller.captureVideo,
 | |
|               backgroundColor: controller.backgroundColorDark,
 | |
|               foregroundColor: Colors.white,
 | |
|               heroTag: null,
 | |
|               child: const Icon(Icons.video_camera_front_outlined),
 | |
|             ),
 | |
|           ],
 | |
|           if (controller.hasMedia || controller.hasText) ...[
 | |
|             const SizedBox(width: 16),
 | |
|             FloatingActionButton(
 | |
|               onPressed: controller.postStory,
 | |
|               backgroundColor: Theme.of(context).colorScheme.surface,
 | |
|               foregroundColor: Theme.of(context).colorScheme.onSurface,
 | |
|               child: const Icon(Icons.send_rounded),
 | |
|             ),
 | |
|           ],
 | |
|         ],
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 | 
