From f8283817883b32531ff8c990aae1d7009acb6c19 Mon Sep 17 00:00:00 2001 From: Rishav Kumar Sinha Date: Fri, 26 Jul 2024 19:57:21 +0530 Subject: [PATCH] Implemented UI Page for Redox OS Summer of Code --- assets/redox.png | Bin 0 -> 4466 bytes lib/home_page.dart | 26 ++++ lib/main.dart | 2 + lib/modals/rsoc_project_modal.dart | 36 +++++ lib/opso_timeline.dart | 6 + lib/programs screen/redox.dart | 201 +++++++++++++++++++++++++ lib/programs_info_pages/rsoc_info.dart | 115 ++++++++++++++ lib/widgets/rsoc_project_widget.dart | 68 +++++++++ pubspec.lock | 26 ++-- pubspec.yaml | 3 + 10 files changed, 470 insertions(+), 13 deletions(-) create mode 100644 assets/redox.png create mode 100644 lib/modals/rsoc_project_modal.dart create mode 100644 lib/programs screen/redox.dart create mode 100644 lib/programs_info_pages/rsoc_info.dart create mode 100644 lib/widgets/rsoc_project_widget.dart diff --git a/assets/redox.png b/assets/redox.png new file mode 100644 index 0000000000000000000000000000000000000000..bf132446c9c9a385b13171d8332fcbb3c62a8baf GIT binary patch literal 4466 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 { title: 'Season of KDE', imageAssetPath: 'assets/sokde.png', ), + Program( + title: 'Redox OS Summer of Code', + imageAssetPath: 'assets/redox.png', + ), Program( title: 'Open Summer of Code', imageAssetPath: 'assets/open_summer_of_code.png', @@ -403,6 +408,15 @@ class _HomePageState extends State { ); break; + case 'Redox OS Summer of Code': + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const RsocPage(), + ), + ); + break; + case 'Outreachy': Navigator.push(context, @@ -522,6 +536,10 @@ class ProgramSearchDelegate extends SearchDelegate { title: 'Hacktoberfest', imageAssetPath: 'assets/hacktoberfest.png', ), + Program( + title: 'Redox OS Summer of Code', + imageAssetPath: 'assets/redox.png', + ), Program( title: 'Linux Foundation', imageAssetPath: 'assets/linux_foundation_logo.png', @@ -623,6 +641,14 @@ class ProgramSearchDelegate extends SearchDelegate { ); break; + case 'Redox OS Summer of Code': + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const RsocPage(), + ), + ); + break; case 'Major League Hacking Fellowship': Navigator.push( diff --git a/lib/main.dart b/lib/main.dart index dc5d285..47634e4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:opso/programs%20screen/linux_foundation.dart'; import 'package:opso/programs%20screen/major_league_hacking_fellowship.dart'; import 'package:opso/programs%20screen/open_summer_of_code.dart'; import 'package:opso/programs%20screen/outreachy.dart'; +import 'package:opso/programs%20screen/redox.dart'; import 'package:opso/programs%20screen/season_of_kde.dart'; import 'package:opso/programs%20screen/summer_of_bitcoin.dart'; import 'package:opso/programs%20screen/social_winter_of_code.dart'; @@ -53,6 +54,7 @@ class OpSoApp extends StatelessWidget { "/summer_of_bitcoin": (context) => const SummerOfBitcoin(), "/hacktoberfest_screen": (context) => const Hacktoberfest(), "/open_summer_of_code": (context) => const OpenSummerOfCode(), + "/rsoc": (context) => const RsocPage(), "/outreachy": (context) => const OutreachyScreen(), "/major_league_hacking_fellowship": (context) => const MajorLeagueHackingFellowship(), diff --git a/lib/modals/rsoc_project_modal.dart b/lib/modals/rsoc_project_modal.dart new file mode 100644 index 0000000..86ef5ac --- /dev/null +++ b/lib/modals/rsoc_project_modal.dart @@ -0,0 +1,36 @@ +class RsocProjectModal { + String name; + String contributor; + String description; + String githubUrl; + + RsocProjectModal({ + required this.name, + required this.contributor, + required this.description, + required this.githubUrl, + }); + + factory RsocProjectModal.fromJson(Map json) { + return RsocProjectModal( + name: json['name'], + contributor: json['contributor'], + description: json['description'], + githubUrl: json['githubUrl'], + ); + } + + Map toJson() { + return { + 'name': name, + 'contributor': contributor, + 'description': description, + 'githubUrl': githubUrl, + }; + } + + @override + String toString() { + return 'RsocProjectModal(name: $name, contributor: $contributor, description: $description, githubUrl: $githubUrl)'; + } +} diff --git a/lib/opso_timeline.dart b/lib/opso_timeline.dart index c66b5de..42dc021 100644 --- a/lib/opso_timeline.dart +++ b/lib/opso_timeline.dart @@ -75,6 +75,12 @@ class OpsoTimeLineScreen extends StatelessWidget { 'startDate': DateTime.utc(2024, 5, 1), 'endDate': DateTime.utc(2024, 5, 10), }, + { + 'description': + "Redox OS Summer of Code\nApplication Period - 01/05/2024 to 01/06/2024", + 'startDate': DateTime.utc(2024, 5, 01), + 'endDate': DateTime.utc(2024, 6, 01), + }, { 'description': "Linux Foundation Mentorship(Fall Term)\nApplication Period - 15/07/2024 to 15/08/2024", diff --git a/lib/programs screen/redox.dart b/lib/programs screen/redox.dart new file mode 100644 index 0000000..f944228 --- /dev/null +++ b/lib/programs screen/redox.dart @@ -0,0 +1,201 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:opso/modals/book_mark_model.dart'; +import 'package:opso/modals/rsoc_project_modal.dart'; +import 'package:opso/programs_info_pages/rsoc_info.dart'; +import 'package:opso/widgets/rsoc_project_widget.dart'; + +class RsocPage extends StatefulWidget { + const RsocPage({super.key}); + + @override + _RsocPageState createState() => _RsocPageState(); +} + +class _RsocPageState extends State { + List projectList = []; + String currectPage = "/rsoc"; + String currentProject = "RSoC"; + bool isBookmarked = true; + late Future getProjectFunction; + + Future initializeProjectLists() async { + var response = + await rootBundle.loadString('assets/projects/redox/redox.json'); + var jsonList = await json.decode(response); + for (var data in jsonList) { + projectList.add(RsocProjectModal.fromJson(data)); + } + print(projectList); + } + + @override + void initState() { + super.initState(); + getProjectFunction = initializeProjectLists(); + _checkBookmarkStatus(); + } + + Future _checkBookmarkStatus() async { + bool bookmarkStatus = await HandleBookmark.isBookmarked(currentProject); + setState(() { + isBookmarked = bookmarkStatus; + }); + } + + void searchTag(String searchTag) { + projectList = projectList + .where((element) => element.name.toLowerCase().contains(searchTag)) + .toList(); + setState(() {}); + } + + void search(String searchText) { + if (searchText.isEmpty) { + setState(() {}); + return; + } + searchText = searchText.toLowerCase(); + projectList = projectList + .where((element) => + element.name.toLowerCase().contains(searchText) || + element.contributor.toLowerCase().contains(searchText)) + .toList(); + setState(() {}); + } + + Future _refresh() async { + projectList.clear(); + await initializeProjectLists(); + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return RefreshIndicator( + onRefresh: _refresh, + child: Scaffold( + appBar: AppBar( + title: const Text('Redox Summer of Code'), + actions: [ + IconButton( + icon: Icon( + isBookmarked + ? Icons.bookmark_add_rounded + : Icons.bookmark_add_outlined, + ), + onPressed: () { + setState(() { + isBookmarked = !isBookmarked; + }); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + isBookmarked ? 'Bookmark added' : 'Bookmark removed', + ), + duration: const Duration(seconds: 2), + ), + ); + if (isBookmarked) { + HandleBookmark.addBookmark(currentProject, currectPage); + } else { + HandleBookmark.deleteBookmark(currentProject); + } + }, + ), + IconButton( + icon: const Icon(Icons.info_outline), + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const RsocInfo()), + ); + }, + ), + ], + ), + body: FutureBuilder( + future: getProjectFunction, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text("Error: ${snapshot.error}")); + } else if (snapshot.connectionState == ConnectionState.done) { + return Padding( + padding: EdgeInsets.symmetric( + horizontal: ScreenUtil().setWidth(46), + vertical: ScreenUtil().setHeight(16), + ), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextFormField( + decoration: InputDecoration( + filled: true, + hintText: 'Search', + suffixIcon: const Icon(Icons.search), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: Color(0xFFEEEEEE)), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: Color(0xFFEEEEEE)), + ), + disabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: Color(0xFFEEEEEE)), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide(color: Color(0xFFEEEEEE)), + ), + contentPadding: EdgeInsets.symmetric( + vertical: ScreenUtil().setHeight(12), + horizontal: ScreenUtil().setWidth(20), + ), + ), + onFieldSubmitted: (value) { + search(value.trim()); + }, + onChanged: (value) { + if (value.isEmpty) { + search(value); + } + }, + ), + SizedBox(height: ScreenUtil().setHeight(20)), + SizedBox( + height: MediaQuery.of(context).size.height * 0.8, + child: ListView.builder( + itemCount: projectList.length, + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: RsocProjectWidget( + modal: projectList[index], + height: ScreenUtil().screenHeight * 0.3, + width: ScreenUtil().screenWidth, + index: index, + ), + ); + }, + ), + ), + ], + ), + ), + ); + } else { + return const Center(child: Text("Some error occurred")); + } + }, + ), + ), + ); + } +} diff --git a/lib/programs_info_pages/rsoc_info.dart b/lib/programs_info_pages/rsoc_info.dart new file mode 100644 index 0000000..438a68a --- /dev/null +++ b/lib/programs_info_pages/rsoc_info.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; + +class RsocInfo extends StatelessWidget { + const RsocInfo({super.key}); + + @override + Widget build(BuildContext context) { + + return Scaffold( + appBar: AppBar( + title: const Text('Project Information'), + ), + body: Padding( + padding: const EdgeInsets.all(10.0), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Redox OS Summer of Code', + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 20), + _buildOutlinedBox( + context, + title: 'Overview', + content: 'Announcing Redox Summer of Code for 2024! This summer, we have a small number of positions open for students or recent graduates. To qualify, you must be a contributor to Redox or to a Redox-adjacent project, and be an experienced Rust programmer.', + ), + const SizedBox(height: 20), + _buildOutlinedBox( + context, + title: 'Eligibility', + content: 'Is there any registration fees?\n' + 'No, there’s no registration fees. It is absolutely free for participants.\n\n' + 'Who all can participate?\n' + 'To qualify, you must be a contributor to Redox or to a Redox-adjacent project, and be an experienced Rust programmer.\n\n' + 'Any age limit for participation?\n' + 'No, there is no age limit for participation in Redox OS Summer of Code. It is open for all.', + ), + + const SizedBox(height: 20), + Text( + 'Prizes and Rewards', + style: Theme.of(context).textTheme.headlineSmall, + ), + const SizedBox(height: 10), + Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: _buildPrizeBox( + context, + 'Gain experience working on a real-world project & improve your RUST skills', + ), + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: _buildPrizeBox( + context, + 'Stipend to all the participants upon successful completion of the program', + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildOutlinedBox(BuildContext context, {required String title, required String content}) { + return Container( + padding: const EdgeInsets.all(10.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.orange, width: 1.0), + borderRadius: BorderRadius.circular(8.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: Theme.of(context).textTheme.headlineSmall, + ), + const SizedBox(height: 10), + Text( + content, + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ); + } + + Widget _buildPrizeBox(BuildContext context, String description) { + return Container( + padding: const EdgeInsets.all(10.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.orange, width: 1.0), + borderRadius: BorderRadius.circular(8), + ), + child: Text( + description, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyLarge, + ), + ); + } +} diff --git a/lib/widgets/rsoc_project_widget.dart b/lib/widgets/rsoc_project_widget.dart new file mode 100644 index 0000000..cd73be0 --- /dev/null +++ b/lib/widgets/rsoc_project_widget.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:opso/modals/rsoc_project_modal.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class RsocProjectWidget extends StatelessWidget { + final RsocProjectModal modal; + final double height; + final double width; + final int index; + + const RsocProjectWidget({ + super.key, + required this.modal, + required this.index, + this.height = 100, + this.width = 100, + }); + + @override + Widget build(BuildContext context) { + bool isDarkMode = Theme.of(context).brightness == Brightness.dark; + return GestureDetector( + onTap: () async { + Uri uri = Uri.parse(modal.githubUrl); + if (await canLaunch(uri.toString())) { + await launch(uri.toString()); + } else { + throw 'Could not launch $uri'; + } + }, + child: Container( + width: width, + constraints: BoxConstraints(minHeight: height), + decoration: BoxDecoration( + border: Border.all( + color: isDarkMode ? Colors.orange.shade100 : Colors.orange.shade300, + width: 1, + ), + borderRadius: BorderRadius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "$index. ${modal.name}", + style: const TextStyle( + color: Colors.orange, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 10.0), + child: Text("Contributor: ${modal.contributor}"), + ), + Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text("Description: ${modal.description}"), + ), + ], + ), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 1ed692f..dc98038 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -268,26 +268,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -316,10 +316,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" multi_select_flutter: dependency: "direct main" description: @@ -497,10 +497,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" timeline_tile: dependency: "direct main" description: @@ -617,10 +617,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" web: dependency: transitive description: @@ -663,4 +663,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.3 <4.0.0" - flutter: ">=3.19.0" \ No newline at end of file + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3d8ae6d..a29b49c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,6 +81,7 @@ flutter: # - assets\swoc_logo.png # - assets\Google_season_of_docs.png # - assets\sokde.png + # - assets\redox.png # # - images/a_dot_ham.jpeg assets: - assets/ @@ -92,6 +93,7 @@ flutter: - assets/splash screen.png - assets/github_swag.png - assets/sokde.png + - assets/redox.png - assets/hacktoberfest.png - assets/xyz_domain.png - assets/participation_certificate.png @@ -102,6 +104,7 @@ flutter: - assets/projects/outreachy/outreachy2022.json - assets/projects/outreachy/outreachy2023.json - assets/projects/outreachy/outreachy2024.json + - assets/projects/redox/redox.json # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware