2026-07-14 17:20:20 +02:00

177 lines
5.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:manager_app/Components/string_input_container.dart';
import 'package:manager_app/Screens/Resources/select_resource_modal.dart';
import 'package:manager_app/constants.dart';
import 'package:manager_api_new/api.dart';
enum _VideoSourceMode { youtube, vimeo, resource }
_VideoSourceMode _detectMode(String? url) {
if (url == null || url.isEmpty) return _VideoSourceMode.youtube;
if (url.contains('youtube.com') || url.contains('youtu.be')) return _VideoSourceMode.youtube;
if (url.contains('vimeo.com')) return _VideoSourceMode.vimeo;
return _VideoSourceMode.resource;
}
class VideoConfig extends StatefulWidget {
final String? color;
final String? label;
final VideoDTO initialValue;
final ValueChanged<VideoDTO> onChanged;
const VideoConfig({
Key? key,
this.color,
this.label,
required this.initialValue,
required this.onChanged,
}) : super(key: key);
@override
_VideoConfigState createState() => _VideoConfigState();
}
class _VideoConfigState extends State<VideoConfig> {
late VideoDTO resourceSource;
late _VideoSourceMode _mode;
String? _selectedResourceLabel;
String? _youtubeUrl;
String? _vimeoUrl;
String? _resourceUrl;
@override
void initState() {
resourceSource = widget.initialValue;
_mode = _detectMode(resourceSource.source_);
switch (_mode) {
case _VideoSourceMode.youtube:
_youtubeUrl = resourceSource.source_;
break;
case _VideoSourceMode.vimeo:
_vimeoUrl = resourceSource.source_;
break;
case _VideoSourceMode.resource:
_resourceUrl = resourceSource.source_;
break;
}
super.initState();
}
void _onModeChanged(_VideoSourceMode mode) {
setState(() {
_mode = mode;
_selectedResourceLabel = null;
switch (mode) {
case _VideoSourceMode.youtube:
resourceSource.source_ = _youtubeUrl;
break;
case _VideoSourceMode.vimeo:
resourceSource.source_ = _vimeoUrl;
break;
case _VideoSourceMode.resource:
resourceSource.source_ = _resourceUrl;
break;
}
});
widget.onChanged(resourceSource);
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SegmentedButton<_VideoSourceMode>(
segments: const [
ButtonSegment(value: _VideoSourceMode.youtube, label: Text('YouTube'), icon: Icon(Icons.smart_display)),
ButtonSegment(value: _VideoSourceMode.vimeo, label: Text('Vimeo'), icon: Icon(Icons.play_circle)),
ButtonSegment(value: _VideoSourceMode.resource, label: Text('Ressource'), icon: Icon(Icons.video_file)),
],
selected: {_mode},
onSelectionChanged: (selection) => _onModeChanged(selection.first),
),
const SizedBox(height: 12),
if (_mode == _VideoSourceMode.youtube)
StringInputContainer(
key: const ValueKey('youtube'),
label: 'URL YouTube :',
initialValue: _youtubeUrl,
onChanged: (url) {
_youtubeUrl = url;
resourceSource.source_ = url;
widget.onChanged(resourceSource);
},
isUrl: true,
maxLength: 200,
),
if (_mode == _VideoSourceMode.vimeo)
StringInputContainer(
key: const ValueKey('vimeo'),
label: 'URL Vimeo :',
initialValue: _vimeoUrl,
onChanged: (url) {
_vimeoUrl = url;
resourceSource.source_ = url;
widget.onChanged(resourceSource);
},
isUrl: true,
maxLength: 200,
),
if (_mode == _VideoSourceMode.resource)
_ResourceVideoPicker(
selectedLabel: _selectedResourceLabel,
selectedUrl: _resourceUrl,
onChanged: (resource) {
setState(() {
_resourceUrl = resource.url;
resourceSource.source_ = resource.url;
_selectedResourceLabel = resource.label;
});
widget.onChanged(resourceSource);
},
),
],
);
}
}
class _ResourceVideoPicker extends StatelessWidget {
final String? selectedLabel;
final String? selectedUrl;
final ValueChanged<ResourceDTO> onChanged;
const _ResourceVideoPicker({
required this.selectedLabel,
required this.selectedUrl,
required this.onChanged,
});
@override
Widget build(BuildContext context) {
return Row(
children: [
const Text('Vidéo :', style: TextStyle(fontSize: 18)),
const SizedBox(width: 10),
ElevatedButton.icon(
icon: const Icon(Icons.video_file),
label: Text(selectedLabel ?? (selectedUrl != null ? 'Vidéo sélectionnée' : 'Choisir')),
style: ElevatedButton.styleFrom(backgroundColor: kPrimaryColor, foregroundColor: Colors.white),
onPressed: () async {
final result = await showSelectResourceModal(
'Sélectionner une vidéo',
1,
[ResourceType.Video, ResourceType.VideoUrl],
context,
true,
true,
true,
);
if (result != null && result is ResourceDTO) {
onChanged(result);
}
},
),
],
);
}
}