This commit is contained in:
Hamza-Ayed
2024-11-04 06:18:19 +02:00
parent 229646d664
commit c9ac8da2ec
15 changed files with 388 additions and 24 deletions

View File

@@ -0,0 +1,193 @@
import 'package:SEFER/constant/info.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:video_player/video_player.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';
import '../../../../controller/home/captin/help/video_controller.dart';
import 'package:flutter/cupertino.dart';
class VideoListPage extends StatelessWidget {
final VideoController videoController = Get.put(VideoController());
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Videos Tutorials'.tr),
),
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 10.0), // Outer padding around the list
child: GetBuilder<VideoController>(
builder: (videoController) {
return ListView.builder(
itemCount: videoController.videos.length,
itemBuilder: (context, index) {
final video = videoController.videos[index];
return Container(
margin: const EdgeInsets.symmetric(
vertical: 8.0), // Spacing between each card
decoration: BoxDecoration(
color: CupertinoColors.white,
borderRadius:
BorderRadius.circular(12.0), // Rounded corners
boxShadow: [
BoxShadow(
color: CupertinoColors.systemGrey.withOpacity(0.3),
offset: const Offset(
0, 4), // Offset for shadow to appear below
blurRadius: 10.0, // Blur for softer shadow effect
),
],
border: Border.all(
color: CupertinoColors.systemGrey4,
width: 0.5, // Subtle border for a refined iOS-like look
),
),
child: CupertinoListTile(
title: Padding(
padding: const EdgeInsets.only(bottom: 4.0),
child: Text(
video['title'],
style: const TextStyle(
color: CupertinoColors.black,
fontWeight: FontWeight.bold,
),
),
),
subtitle: Text(
video['description'],
style: const TextStyle(
color: CupertinoColors.systemGrey,
),
),
onTap: () {
// Navigate to video player page (iOS-style)
Get.to(() => VideoPlayerPage1(videoUrl: video['url']));
},
),
);
},
);
},
),
),
),
);
}
}
class VideoPlayerPage extends StatelessWidget {
final String videoUrl;
VideoPlayerPage({required this.videoUrl});
final VideoController videoController = Get.put(VideoController());
@override
Widget build(BuildContext context) {
// Initialize the video when the page is loaded
videoController.initializeVideo(videoUrl);
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text(AppInformation.appName),
),
child: SafeArea(
child: Center(
child: GetBuilder<VideoController>(
builder: (controller) {
if (!controller.videoPlayerController.value.isInitialized) {
return const CircularProgressIndicator(); // Show loading indicator while initializing
}
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Video player widget
AspectRatio(
aspectRatio:
controller.videoPlayerController.value.aspectRatio,
// child: VideoPlayer(controller.videoPlayerController),
child: VideoPlayer(controller.videoPlayerController),
),
const SizedBox(height: 20),
// Play/pause button
CupertinoButton(
onPressed: () {
if (controller.videoPlayerController.value.isPlaying) {
controller.pause();
} else {
controller.play();
}
},
child: Icon(
controller.videoPlayerController.value.isPlaying
? CupertinoIcons.pause
: CupertinoIcons.play_arrow,
color: CupertinoColors.activeBlue,
size: 30,
),
),
],
);
},
),
),
),
);
}
}
class VideoPlayerPage1 extends StatelessWidget {
final String videoUrl;
VideoPlayerPage1({required this.videoUrl});
@override
Widget build(BuildContext context) {
// Extract the video ID from the URL
String videoId = YoutubePlayer.convertUrlToId(videoUrl)!;
// Create a YoutubePlayerController
final YoutubePlayerController _controller = YoutubePlayerController(
initialVideoId: videoId,
flags: const YoutubePlayerFlags(
autoPlay: true,
loop: true,
mute: false,
captionLanguage: 'ar',
),
);
return Scaffold(
body: Stack(
children: [
// Full-screen YouTube player
Positioned.fill(
child: YoutubePlayer(
controller: _controller,
showVideoProgressIndicator: true,
),
),
// Overlay back button in the top left corner for exit
Positioned(
top: 40.0,
left: 16.0,
child: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.white),
onPressed: () {
Navigator.pop(context);
},
),
),
],
),
);
}
}

View File

@@ -19,6 +19,7 @@ import 'package:SEFER/views/notification/notification_captain.dart';
import '../../../../constant/colors.dart';
import '../../../../controller/functions/upload_image.dart';
import '../About Us/video_page.dart';
import '../assurance_health_page.dart';
import '../maintain_center_page.dart';
import 'package:flutter/cupertino.dart';
@@ -97,7 +98,13 @@ class CupertinoDrawerCaptain extends StatelessWidget {
_buildDrawerItem(
icon: CupertinoIcons.mail,
text: "Contact Us".tr,
onTap: () => Get.to(() => ContactUsPage()),
onTap: () => Get.to(() => const SettingsCaptain()),
),
_buildDivider(),
_buildDrawerItem(
icon: CupertinoIcons.settings,
text: 'Videos Tutorials'.tr,
onTap: () => Get.to(() => VideoListPage()),
),
_buildDivider(),
_buildDrawerItem(

View File

@@ -453,6 +453,7 @@ class PassengerInfoWindow extends StatelessWidget {
() async {
await controller
.startRideFromDriver();
Get.back();
// Close dialog after confirmation
},
);
@@ -467,7 +468,7 @@ class PassengerInfoWindow extends StatelessWidget {
onPressed: () async {
if (await controller
.calculateDistanceBetweenDriverAndPassengerLocation() <
40) {
140) {
// Notify Passenger
FirebaseMessagesController()
.sendNotificationToPassengerToken(