Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:convert';
- import 'dart:io';
- //import 'meeting_fin.dart';
- import 'package:http/http.dart' as http;
- import 'package:flutter/material.dart';
- import 'package:intl/intl.dart';
- import 'package:shared_preferences/shared_preferences.dart';
- import 'package:path_provider/path_provider.dart';
- import 'package:flutter_moving_background/flutter_moving_background.dart';
- import 'package:task_app_es/host_page.dart';
- import 'login_page.dart';
- import 'meeting_list_screen.dart';
- class WorkScreen extends StatefulWidget {
- final String id;
- final String username;
- final String esEmail;
- final String passCode;
- final String deviceID;
- final String jobs;
- final String meetingName;
- const WorkScreen(
- {Key? key,
- required this.id,
- required this.username,
- required this.esEmail,
- required this.passCode,
- required this.deviceID,
- required this.meetingName,
- required this.jobs})
- : super(key: key);
- @override
- _WorkScreenState createState() => _WorkScreenState();
- }
- class Job {
- final String name;
- final List<String> actions;
- Job(this.name, this.actions);
- }
- class _WorkScreenState extends State<WorkScreen> {
- final TextEditingController _meetingNameController = TextEditingController();
- final TextEditingController _jobNameController = TextEditingController();
- final TextEditingController _actionController = TextEditingController();
- String? meetingName;
- String? jobName;
- String? currentAction;
- List<String> actions = [];
- List<Job> jobs = [];
- final ScrollController _scrollController = ScrollController();
- bool _isScrolled = false;
- bool _fadeInCompleted = false;
- bool _meetingOngoing = false; // New variable to track ongoing meeting
- bool _tasksCompleted = false; // New variable to track tasks completion
- bool _showBackArrow = true;
- bool get _isActionInputEmpty => _actionController.text.trim().isEmpty;
- @override
- void initState() {
- super.initState();
- print('ID: ${widget.id}');
- print('Username: ${widget.username}');
- print('ES_Email: ${widget.esEmail}');
- print('Passcode: ${widget.passCode}');
- print('Device ID passed over to WorkScreen: ${widget.deviceID}');
- _scrollController.addListener(_onScroll);
- Future.delayed(const Duration(milliseconds: 1000), () {
- _startFadeInAnimation();
- });
- }
- @override
- void dispose() {
- _scrollController.removeListener(_onScroll);
- _scrollController.dispose();
- super.dispose();
- }
- void _onScroll() {
- setState(() {
- _isScrolled =
- _scrollController.hasClients && _scrollController.offset > 0;
- });
- }
- void _loginback() {
- // Only navigate back if there is no ongoing meeting
- if (meetingName == null && !_meetingOngoing) {
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => HostPage(
- id: widget.id,
- username: widget.username,
- passCode: widget.passCode,
- deviceID: widget.deviceID,
- esEmail: widget.esEmail,
- meetingName: '',
- jobs: '',
- ),
- ),
- );
- }
- }
- void _startFadeInAnimation() {
- Future.delayed(const Duration(milliseconds: 1000), () {
- setState(() {
- _fadeInCompleted = true;
- });
- });
- }
- void _startMeeting() {
- final String newMeetingName = _meetingNameController.text.trim();
- if (newMeetingName.isNotEmpty) {
- setState(() {
- final now = DateTime.now();
- final formattedDate =
- '$newMeetingName (${DateFormat('dd/MM/yyyy - HH:mm').format(now)})';
- meetingName = formattedDate;
- _meetingOngoing = true; // Set meeting ongoing to true
- _meetingNameController.clear();
- });
- } else {
- // Show a styled Snackbar
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- behavior: SnackBarBehavior.floating,
- elevation: 0,
- content: Container(
- height: 40,
- alignment: Alignment.center,
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- decoration: BoxDecoration(
- color: const Color.fromARGB(133, 255, 0, 0),
- borderRadius: BorderRadius.circular(20),
- border: Border.all(color: Colors.white),
- ),
- child: const Text(
- 'Please write a meeting name',
- textAlign: TextAlign.center,
- style: TextStyle(
- color: Colors.white,
- fontSize: 15,
- ),
- ),
- ),
- duration: const Duration(seconds: 4),
- margin: const EdgeInsets.only(bottom: 20),
- ),
- );
- }
- }
- void _addJob() {
- final String newJobName = _jobNameController.text.trim();
- if (newJobName.isNotEmpty) {
- setState(() {
- jobName = newJobName;
- jobs.add(Job(jobName!, [])); // Add job with empty actions list
- _jobNameController.clear();
- _tasksCompleted =
- false; // Reset tasks completion status when adding a new task
- });
- } else {
- // Show a styled Snackbar
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- behavior: SnackBarBehavior.floating,
- elevation: 0,
- content: Container(
- height: 40,
- alignment: Alignment.center,
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- decoration: BoxDecoration(
- color: const Color.fromARGB(133, 255, 0, 0),
- borderRadius: BorderRadius.circular(20),
- border: Border.all(color: Colors.white),
- ),
- child: const Text(
- 'Please write a job name',
- textAlign: TextAlign.center,
- style: TextStyle(
- color: Colors.white,
- fontSize: 15,
- ),
- ),
- ),
- duration: const Duration(seconds: 4),
- margin: const EdgeInsets.only(bottom: 20),
- ),
- );
- }
- }
- void _addAction() {
- final newAction = _actionController.text.trim();
- if (newAction.isNotEmpty) {
- setState(() {
- actions.add(newAction);
- _actionController.clear();
- });
- } else {
- // Show a styled Snackbar
- ScaffoldMessenger.of(context).showSnackBar(
- SnackBar(
- behavior: SnackBarBehavior.floating,
- elevation: 0,
- content: Container(
- height: 40,
- alignment: Alignment.center,
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- decoration: BoxDecoration(
- color: const Color.fromARGB(133, 255, 0, 0),
- borderRadius: BorderRadius.circular(20),
- border: Border.all(color: Colors.white),
- ),
- child: const Text(
- 'Please enter an action',
- textAlign: TextAlign.center,
- style: TextStyle(
- color: Colors.white,
- fontSize: 15,
- ),
- ),
- ),
- duration: const Duration(seconds: 4),
- margin: const EdgeInsets.only(bottom: 20),
- ),
- );
- }
- }
- void _completeActions() {
- if (actions.isNotEmpty &&
- jobName != null &&
- _actionController.text.isEmpty) {
- setState(() {
- for (var job in jobs) {
- if (job.name == jobName) {
- job.actions.addAll(actions);
- }
- }
- jobName = null;
- actions.clear();
- _tasksCompleted = true;
- });
- } else {
- ScaffoldMessenger.of(context).showSnackBar(
- const SnackBar(
- content: Text(
- 'Please enter actions before saving or complete the current action',
- style: TextStyle(color: Colors.white),
- ),
- backgroundColor: Colors.red,
- duration: Duration(seconds: 4),
- ),
- );
- }
- }
- void _deleteJob(Job job) {
- setState(() {
- jobs.remove(job);
- });
- }
- void _editJob(Job job) {
- // Create controllers to manage the text editing for each action
- List<TextEditingController> controllers = List.generate(job.actions.length,
- (index) => TextEditingController(text: job.actions[index]));
- showDialog(
- context: context,
- builder: (BuildContext context) {
- return AlertDialog(
- title: const Text('Edit Actions'),
- content: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- for (int i = 0; i < job.actions.length; i++) ...[
- TextField(
- controller: controllers[i],
- onChanged: (value) {
- // Update the corresponding action in the job actions list
- job.actions[i] = value;
- },
- onSubmitted: (newValue) {
- // Do nothing when submitted
- },
- ),
- const SizedBox(height: 10),
- ],
- ],
- ),
- actions: <Widget>[
- TextButton(
- onPressed: () {
- Navigator.of(context)
- .pop(); // Close the dialog without saving changes
- },
- child: const Text('CANCEL'),
- ),
- ElevatedButton(
- onPressed: () {
- // Close the dialog
- Navigator.of(context).pop();
- },
- child: const Text('SAVE CHANGES'),
- ),
- ],
- );
- },
- );
- }
- void _meetingFinished() async {
- if (meetingName != null && _tasksCompleted) {
- // Ensure tasks are completed
- // Sanitize the meeting name to remove invalid characters
- final sanitizedMeetingName = meetingName!
- .replaceAll(RegExp(r'[^\w\s]+'),
- '') // Replace non-alphanumeric characters with empty string
- .replaceAll(RegExp(r'\s+'),
- '_'); // Replace whitespace characters with underscore
- print(sanitizedMeetingName);
- // Prepare list of jobs with completed status set to false
- final List<Map<String, dynamic>> jobsWithStatus = jobs
- .map((job) => {
- 'name': job.name,
- 'actions': job.actions,
- 'completed': false, // Set default completed status to false
- })
- .toList();
- // Save meeting details locally
- final SharedPreferences prefs = await SharedPreferences.getInstance();
- final meetingDetails = <String, dynamic>{
- 'meetingName': meetingName,
- 'jobs': jobsWithStatus, // Use the prepared list with completed status
- };
- // Log the JSON data to be saved
- print('JSON data to be saved: ${jsonEncode(meetingDetails)}');
- // Save meeting details to SharedPreferences
- await prefs.setString('meetingDetails', jsonEncode(meetingDetails));
- // Clear current meeting details and reset state variables
- setState(() {
- meetingName = null;
- jobs.clear();
- _meetingOngoing = false; // Set meeting ongoing to false
- _tasksCompleted = false; // Reset tasks completion status
- _showBackArrow = true; // Show the back arrow
- });
- // Send the meeting details to the server
- _sendMeetingDetailsToServer(sanitizedMeetingName, meetingDetails);
- } else {
- // Show a snack bar if meeting name is null or tasks are incomplete
- ScaffoldMessenger.of(context).showSnackBar(
- const SnackBar(
- content: Text(
- 'Please start a meeting and complete all tasks before finishing it',
- style: TextStyle(color: Colors.white),
- ),
- backgroundColor: Colors.red,
- duration: Duration(seconds: 4),
- ),
- );
- }
- }
- Future<void> _sendMeetingDetailsToServer(
- String sanitizedMeetingName, Map<String, dynamic> meetingDetails) async {
- try {
- print('User_ID: ${widget.id}');
- print('Username: ${widget.username}');
- print('Passcode: ${widget.passCode}');
- print('Meeting_Title: $sanitizedMeetingName');
- print('Meeting_Json: ${jsonEncode(meetingDetails)}');
- print('Device_ID: ${widget.deviceID}');
- final response = await http.post(
- Uri.parse('https://notsoofriendly.co.uk/TaskApp_ES/handle_save.php'),
- body: {
- 'User_ID': widget.id,
- 'Username': widget.username,
- 'passCode': widget.passCode,
- 'Meeting_Title': sanitizedMeetingName,
- 'Meeting_Json': jsonEncode(meetingDetails),
- 'Device_ID': widget.deviceID,
- },
- );
- if (response.statusCode == 200) {
- // Meeting details successfully sent to the server
- print('Meeting details sent to the server successfully');
- } else {
- // Failed to send meeting details to the server
- print('Failed to send meeting details to the server: ${response.body}');
- }
- } catch (e) {
- // Error occurred while sending meeting details
- print('Error sending meeting details to the server: $e');
- }
- }
- // Function to navigate to MeetingListScreen
- void _viewMeetings() {
- if (!_meetingOngoing) {
- // Only navigate if there is no ongoing meeting
- Navigator.push(
- context,
- MaterialPageRoute(
- builder: (context) => MeetingListScreen(
- id: widget.id,
- username: widget.username,
- passCode: widget.passCode,
- deviceID: widget.deviceID,
- esEmail: widget.esEmail,
- meetingName: '',
- jobs: '',
- ),
- ),
- );
- }
- }
- @override
- Widget build(BuildContext context) {
- return AnimatedOpacity(
- opacity: _fadeInCompleted ? 1.0 : 0.0,
- duration: const Duration(milliseconds: 1500),
- child: Stack(
- children: [
- SizedBox(
- width: MediaQuery.of(context).size.width,
- height: MediaQuery.of(context).size.height,
- child: const MovingBackground(
- backgroundColor: Colors.transparent,
- circles: [
- MovingCircle(
- color: Color.fromARGB(149, 39, 2, 102), blurSigma: 100),
- MovingCircle(
- color: Color.fromARGB(118, 217, 0, 255), blurSigma: 170),
- MovingCircle(
- color: Color.fromARGB(123, 150, 2, 214), blurSigma: 80),
- MovingCircle(
- color: Color.fromARGB(115, 84, 10, 105), blurSigma: 120),
- MovingCircle(
- color: Color.fromARGB(129, 213, 128, 255), blurSigma: 60),
- MovingCircle(
- color: Color.fromARGB(99, 255, 255, 255), blurSigma: 100),
- ],
- ),
- ),
- Scaffold(
- backgroundColor: Colors.transparent,
- appBar: PreferredSize(
- preferredSize: const Size.fromHeight(90.0),
- child: Column(
- children: [
- AppBar(
- backgroundColor: Colors.transparent,
- title: Text(
- meetingName ?? 'Work Screen',
- style: const TextStyle(
- color: Color.fromARGB(255, 242, 0, 255),
- fontSize: 18.0),
- textAlign: TextAlign.center,
- ),
- centerTitle: true,
- automaticallyImplyLeading: false,
- leading:
- _showBackArrow // Show the back arrow only if _showBackArrow is true
- ? IconButton(
- icon: Icon(
- Icons.arrow_back,
- color: meetingName != null
- ? Colors.transparent
- : Colors.white,
- ),
- onPressed: _loginback,
- )
- : null,
- ),
- if (meetingName != null)
- Container(
- alignment: Alignment.center,
- height: 30.0,
- width: double.maxFinite,
- child: ElevatedButton(
- onPressed: _meetingFinished,
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all<Color>(
- _tasksCompleted
- ? const Color.fromARGB(106, 4, 155,
- 255) // Change color to gray if meeting is ongoing
- : const Color.fromARGB(
- 106, 168, 168, 168)), // Default color
- foregroundColor: MaterialStateProperty.all<Color>(
- _tasksCompleted
- ? const Color.fromARGB(203, 255, 255,
- 255) // Change color to gray if meeting is ongoing
- : const Color.fromARGB(153, 149, 149, 149)),
- side: MaterialStateProperty.all<BorderSide>(
- _tasksCompleted
- ? const BorderSide(
- color: Color.fromARGB(212, 0, 200, 255))
- : const BorderSide(
- color: Color.fromARGB(255, 0, 100, 128))),
- shape: MaterialStateProperty.all<OutlinedBorder>(
- RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- 15.0), // Adjust the radius as needed
- ),
- ),
- ),
- child: const Text('Finish and Save Meeting',
- style: TextStyle(
- fontSize: 17.0, fontWeight: FontWeight.w700)),
- ),
- ),
- ],
- ),
- ),
- body: SingleChildScrollView(
- controller: _scrollController,
- child: Padding(
- padding: const EdgeInsets.all(16.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- if (meetingName == null) ...[
- Text(
- 'Hello, ${widget.username},',
- style: const TextStyle(
- color: Color.fromARGB(
- 139, 251, 0, 255), // Faint white color
- fontSize: 18.0,
- fontStyle: FontStyle.italic,
- ),
- ),
- const SizedBox(
- height: 30,
- ),
- const Text(
- 'Meeting Name',
- style: TextStyle(
- color: Color.fromARGB(255, 255, 255, 255),
- fontSize: 25.0,
- fontWeight: FontWeight.bold),
- ),
- TextField(
- style: const TextStyle(
- color: Color.fromARGB(255, 242, 0, 255),
- fontSize: 20.0,
- fontWeight: FontWeight.bold),
- controller: _meetingNameController,
- textCapitalization: TextCapitalization.words,
- decoration: const InputDecoration(
- hintText: 'Enter Meeting Name',
- hintStyle: TextStyle(
- fontSize: 15.0,
- color: Color.fromARGB(181, 161, 11, 220))),
- onSubmitted: (_) {
- _startMeeting();
- },
- ),
- ],
- const SizedBox(
- height:
- 20.0), // Move "Meeting Finished" button below blue meeting name header
- if (meetingName != null && jobName == null) ...[
- const Text(
- 'Task to be completed -',
- style: TextStyle(
- fontSize: 20.0,
- color: Colors.white,
- fontWeight: FontWeight.bold),
- ),
- TextField(
- style: const TextStyle(
- fontSize: 15.0,
- color: Color.fromARGB(255, 242, 0, 255)),
- controller: _jobNameController,
- textCapitalization: TextCapitalization.words,
- decoration: const InputDecoration(
- hintText: 'Enter Task',
- hintStyle: TextStyle(
- fontSize: 15.0,
- color: Color.fromARGB(181, 161, 11, 220))),
- onSubmitted: (_) {
- _addJob();
- },
- ),
- ],
- if (jobName != null) ...[
- const SizedBox(height: 20.0),
- Text(
- jobName!,
- style: const TextStyle(
- color: Color.fromARGB(255, 0, 179, 255),
- fontSize: 20.0,
- fontWeight: FontWeight.bold),
- ),
- const SizedBox(height: 10.0),
- const Text(
- 'Actions Required',
- style: TextStyle(
- color: Colors.white,
- fontSize: 20.0,
- fontWeight: FontWeight.bold),
- ),
- TextField(
- style: const TextStyle(
- fontSize: 15.0,
- color: Color.fromARGB(255, 242, 0, 255)),
- controller: _actionController,
- textCapitalization: TextCapitalization.words,
- decoration: const InputDecoration(
- hintText: 'Enter Action',
- hintStyle: TextStyle(
- fontSize: 15.0,
- color: Color.fromARGB(181, 161, 11, 220))),
- textInputAction: TextInputAction.done,
- onChanged: (_) {
- setState(
- () {}); // Update button state on text input change
- },
- onSubmitted: (_) {
- _addAction();
- },
- ),
- const SizedBox(height: 40.0),
- Center(
- child: ElevatedButton(
- onPressed: () {
- if (actions.isNotEmpty &&
- (_isActionInputEmpty ||
- _actionController.text.trim().isEmpty)) {
- _completeActions();
- }
- },
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all<Color>(
- actions.isNotEmpty &&
- (_isActionInputEmpty ||
- _actionController.text.trim().isEmpty)
- ? const Color.fromARGB(106, 4, 155, 255)
- : const Color.fromARGB(106, 168, 168, 168),
- ),
- foregroundColor: MaterialStateProperty.all<Color>(
- actions.isNotEmpty &&
- (_isActionInputEmpty ||
- _actionController.text.trim().isEmpty)
- ? const Color.fromARGB(203, 255, 255, 255)
- : const Color.fromARGB(153, 149, 149, 149),
- ),
- side: MaterialStateProperty.all<BorderSide>(
- actions.isNotEmpty &&
- (_isActionInputEmpty ||
- _actionController.text.trim().isEmpty)
- ? const BorderSide(
- color: Color.fromARGB(212, 0, 200, 255))
- : const BorderSide(
- color: Color.fromARGB(255, 0, 100, 128)),
- ),
- shape: MaterialStateProperty.all<OutlinedBorder>(
- RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(20.0),
- ),
- ),
- minimumSize: MaterialStateProperty.all(
- Size(25, 31)), // Set minimum size to 0
- ),
- child: const Padding(
- padding: EdgeInsets.zero, // Remove all padding
- child: Text(
- 'Save Logged Actions',
- style: TextStyle(
- fontSize: 15.0, fontWeight: FontWeight.w700),
- ),
- ),
- ),
- ),
- const SizedBox(height: 50.0),
- const Text(
- 'Logged Actions:',
- style: TextStyle(
- color: Colors.white,
- fontSize: 20.0,
- fontWeight: FontWeight.bold),
- ),
- const SizedBox(height: 15.0),
- for (var action in actions) ...[
- Text(
- '- $action',
- style: const TextStyle(
- color: Color.fromARGB(255, 242, 0, 255),
- fontSize: 17.0),
- ),
- ],
- ],
- if (meetingName != null) ...[
- const SizedBox(height: 80.0),
- const Text(
- 'Task List:',
- style: TextStyle(
- color: Colors.white,
- fontSize: 20.0,
- fontWeight: FontWeight.bold,
- ),
- ),
- const SizedBox(height: 20.0),
- for (var job in jobs) ...[
- const SizedBox(
- height: 10.0,
- ),
- Dismissible(
- key: Key(job.name),
- direction: DismissDirection.horizontal,
- background: Container(
- color: Color.fromARGB(132, 11, 145, 255),
- alignment: Alignment.centerLeft,
- child: const Padding(
- padding: EdgeInsets.only(left: 20.0),
- child: Icon(Icons.edit, color: Colors.white),
- ),
- ),
- secondaryBackground: Container(
- color: Color.fromARGB(123, 255, 50, 35),
- alignment: Alignment.centerRight,
- child: const Padding(
- padding: EdgeInsets.only(right: 20.0),
- child: Icon(Icons.delete, color: Colors.white),
- ),
- ),
- confirmDismiss: (direction) async {
- if (direction == DismissDirection.endToStart) {
- // Deleting job
- return await showDialog(
- context: context,
- builder: (BuildContext context) {
- return AlertDialog(
- title: const Text('Confirm Delete'),
- content: const Text(
- 'Are you sure you want to delete this job?'),
- actions: <Widget>[
- TextButton(
- onPressed: () =>
- Navigator.of(context).pop(false),
- child: const Text('CANCEL'),
- ),
- TextButton(
- onPressed: () =>
- Navigator.of(context).pop(true),
- child: const Text('DELETE'),
- ),
- ],
- );
- },
- );
- } else {
- // Editing job
- _editJob(job);
- return false;
- }
- },
- onDismissed: (direction) {
- if (direction == DismissDirection.endToStart) {
- _deleteJob(job);
- }
- },
- child: ExpansionTile(
- title: Text(job.name),
- textColor: Colors.white,
- collapsedTextColor: Colors.white,
- collapsedIconColor:
- const Color.fromARGB(255, 0, 0, 0),
- collapsedBackgroundColor:
- const Color.fromARGB(77, 4, 155, 255),
- collapsedShape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- 15.0), // Adjust the radius as needed
- ),
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- 15.0), // Adjust the radius as needed
- ),
- backgroundColor:
- const Color.fromARGB(101, 4, 155, 255),
- iconColor: const Color.fromARGB(255, 0, 0, 0),
- children: [
- for (var action in job.actions) ...[
- Text(
- '- $action',
- style: const TextStyle(
- color: Color.fromARGB(255, 255, 255, 255),
- fontSize: 15.0),
- ),
- const SizedBox(height: 15.0)
- ],
- ], // Change tile color here
- ),
- ),
- ],
- ],
- ],
- ),
- ),
- ),
- floatingActionButtonLocation:
- FloatingActionButtonLocation.centerFloat,
- floatingActionButton: AnimatedOpacity(
- opacity: _isScrolled
- ? 0.35
- : 1, // Change opacity based on scroll position
- duration: const Duration(
- milliseconds: 200), // Add duration for a smoother transition
- child: SizedBox(
- height: 25, // Change the height of the button
- child: ElevatedButton(
- onPressed: _viewMeetings,
- style: ButtonStyle(
- backgroundColor: MaterialStateProperty.all<Color>(
- _meetingOngoing
- ? Color.fromARGB(106, 168, 168,
- 168) // Change color to gray if meeting is ongoing
- : const Color.fromARGB(
- 106, 4, 155, 255)), // Default color
- foregroundColor: MaterialStateProperty.all<Color>(
- _meetingOngoing
- ? Color.fromARGB(153, 149, 149,
- 149) // Change color to gray if meeting is ongoing
- : Color.fromARGB(203, 255, 255, 255)),
- side: MaterialStateProperty.all<BorderSide>(_meetingOngoing
- ? const BorderSide(
- color: Color.fromARGB(255, 0, 100, 128))
- : const BorderSide(
- color: Color.fromARGB(212, 0, 200, 255))),
- shape: MaterialStateProperty.all<OutlinedBorder>(
- RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- 10.0), // Adjust the radius as needed
- ),
- ),
- ),
- child: const Text('View Meetings',
- style: TextStyle(
- fontSize: 15.0, fontWeight: FontWeight.bold)),
- ),
- ),
- ),
- ),
- ],
- ),
- );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement