Loading lib/IOC/IOC_containter.dart +2 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import 'package:get_it/get_it.dart'; import 'package:harmonis/songPost/service/SongPostFilterService.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/user/services/userService.dart'; import 'package:harmonis/user/services/usersService.dart'; final getIt = GetIt.instance; Loading @@ -11,5 +12,6 @@ class IOCContainer { getIt.registerSingleton(SongPostService()); getIt.registerSingleton(UserService()); getIt.registerSingleton(SongPostFilterService()); getIt.registerSingleton(UsersService()); } } lib/dashBoard/songPost/song_post.dart +0 −6 Original line number Diff line number Diff line Loading @@ -84,12 +84,6 @@ class SongPost extends StatelessWidget { ); }, ), IconButton( icon: const Icon(Icons.delete, color: Colors.grey), onPressed: () { userService.toggleSongPostLike(post.uId); }, ), ], ), ), Loading lib/dashBoard/songPost/song_post_detail_page.dart +116 −75 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import 'package:harmonis/dashBoard/songPost/song_player.dart'; import 'package:harmonis/post/post_type.dart'; import 'package:harmonis/songPost/model/song_post_DTO.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/user/profile_page.dart'; import 'package:harmonis/user/services/userService.dart'; import '../../common/text_input_field.dart'; import 'package:harmonis/userInteraction/model/comment_DTO.dart'; Loading @@ -28,12 +29,17 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { final _songPostService = GetIt.instance<SongPostService>(); final _userService = GetIt.instance<UserService>(); @override void dispose() { _scrollController.dispose(); _commentController.dispose(); super.dispose(); } void _addComment() { final newCommentText = _commentController.text.trim(); if (newCommentText.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Comment cannot be empty!")), ); _showSnackBar("Comment cannot be empty!"); return; } Loading Loading @@ -64,11 +70,10 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { }); } @override void dispose() { _scrollController.dispose(); _commentController.dispose(); super.dispose(); void _showSnackBar(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message)), ); } @override Loading @@ -84,8 +89,27 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { controller: _scrollController, padding: const EdgeInsets.all(8.0), children: [ Column( _buildPostDetails(), _buildCommentsSection(), ], ), ), _buildCommentInputField(), ], ), ); } Widget _buildPostDetails() { return Column( children: [ Container( alignment: Alignment.centerRight, child: IconButton( icon: const Icon(Icons.more_vert, color: Colors.grey), onPressed: () {}, ), ), const SizedBox(height: 20), const Image( image: AssetImage('assets/images/empty_cover.png'), Loading @@ -99,10 +123,19 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { .headlineSmall ?.copyWith(fontWeight: FontWeight.bold), ), Text( TextButton( onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => ProfilePage( userUid: widget.post.author.uID, ), )); }, child: Text( widget.post.author.name, style: Theme.of(context).textTheme.bodyMedium, ), ), const SizedBox(height: 8), Text( widget.post.description, Loading @@ -111,10 +144,15 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { const SizedBox(height: 16), const SongPlayer(), ], ), ); } Widget _buildCommentsSection() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Padding( padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), child: Text( 'Comments', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), Loading Loading @@ -146,15 +184,18 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { }, ), ], ), ), TextInputField( ); } Widget _buildCommentInputField() { return Padding( padding: const EdgeInsets.all(8.0), child: TextInputField( controller: _commentController, onSend: _addComment, ), const SizedBox(height: 10), ], ), ); } } lib/home_page.dart +6 −2 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:harmonis/user/profile_page.dart'; import 'package:harmonis/user/services/userService.dart'; import 'addPost/add_song_post_page.dart'; import 'dashBoard/dash_board_page.dart'; import 'nav_bar.dart'; // NavigationWrapper class HomePage extends StatefulWidget { const HomePage({super.key}); final userService = GetIt.instance<UserService>(); HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); Loading @@ -30,7 +34,7 @@ class _HomePageState extends State<HomePage> { Center(child: Text('Search')), AddSongPostPage(), Center(child: Text('Chat')), Center(child: Text('Profile')), ProfilePage(userUid: widget.userService.user.uID), ][_selectedIndex], Positioned( bottom: 10, Loading lib/main.dart +8 −2 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import 'package:harmonis/mockedData/mocked_user.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/theme/theme.dart'; import 'package:harmonis/user/services/userService.dart'; import 'package:harmonis/user/services/usersService.dart'; void main() { IOCContainer.setup(); Loading @@ -25,7 +26,7 @@ class MyApp extends StatelessWidget { theme: lightTheme, darkTheme: darkTheme, themeMode: ThemeMode.system, home: const HomePage() home: HomePage() ); } } Loading @@ -33,15 +34,20 @@ class MyApp extends StatelessWidget { void addMockedData() { final userService = GetIt.instance<UserService>(); final songPostService = GetIt.instance<SongPostService>(); final usersService = GetIt.instance<UsersService>(); final mockedUsers = mockedUsersData; mockedUsers[0].posts = Set.of(mockedSongPostsData); final mockedSongPosts = mockedSongPostsData; userService.setUser(mockedUsers[0]); for (final post in mockedSongPosts) { songPostService.addPost(post); } for (final user in mockedUsers) { usersService.addUser(user); } } Loading Loading
lib/IOC/IOC_containter.dart +2 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import 'package:get_it/get_it.dart'; import 'package:harmonis/songPost/service/SongPostFilterService.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/user/services/userService.dart'; import 'package:harmonis/user/services/usersService.dart'; final getIt = GetIt.instance; Loading @@ -11,5 +12,6 @@ class IOCContainer { getIt.registerSingleton(SongPostService()); getIt.registerSingleton(UserService()); getIt.registerSingleton(SongPostFilterService()); getIt.registerSingleton(UsersService()); } }
lib/dashBoard/songPost/song_post.dart +0 −6 Original line number Diff line number Diff line Loading @@ -84,12 +84,6 @@ class SongPost extends StatelessWidget { ); }, ), IconButton( icon: const Icon(Icons.delete, color: Colors.grey), onPressed: () { userService.toggleSongPostLike(post.uId); }, ), ], ), ), Loading
lib/dashBoard/songPost/song_post_detail_page.dart +116 −75 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import 'package:harmonis/dashBoard/songPost/song_player.dart'; import 'package:harmonis/post/post_type.dart'; import 'package:harmonis/songPost/model/song_post_DTO.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/user/profile_page.dart'; import 'package:harmonis/user/services/userService.dart'; import '../../common/text_input_field.dart'; import 'package:harmonis/userInteraction/model/comment_DTO.dart'; Loading @@ -28,12 +29,17 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { final _songPostService = GetIt.instance<SongPostService>(); final _userService = GetIt.instance<UserService>(); @override void dispose() { _scrollController.dispose(); _commentController.dispose(); super.dispose(); } void _addComment() { final newCommentText = _commentController.text.trim(); if (newCommentText.isEmpty) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("Comment cannot be empty!")), ); _showSnackBar("Comment cannot be empty!"); return; } Loading Loading @@ -64,11 +70,10 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { }); } @override void dispose() { _scrollController.dispose(); _commentController.dispose(); super.dispose(); void _showSnackBar(String message) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(message)), ); } @override Loading @@ -84,8 +89,27 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { controller: _scrollController, padding: const EdgeInsets.all(8.0), children: [ Column( _buildPostDetails(), _buildCommentsSection(), ], ), ), _buildCommentInputField(), ], ), ); } Widget _buildPostDetails() { return Column( children: [ Container( alignment: Alignment.centerRight, child: IconButton( icon: const Icon(Icons.more_vert, color: Colors.grey), onPressed: () {}, ), ), const SizedBox(height: 20), const Image( image: AssetImage('assets/images/empty_cover.png'), Loading @@ -99,10 +123,19 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { .headlineSmall ?.copyWith(fontWeight: FontWeight.bold), ), Text( TextButton( onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => ProfilePage( userUid: widget.post.author.uID, ), )); }, child: Text( widget.post.author.name, style: Theme.of(context).textTheme.bodyMedium, ), ), const SizedBox(height: 8), Text( widget.post.description, Loading @@ -111,10 +144,15 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { const SizedBox(height: 16), const SongPlayer(), ], ), ); } Widget _buildCommentsSection() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Padding( padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), padding: EdgeInsets.symmetric(vertical: 16.0, horizontal: 8.0), child: Text( 'Comments', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), Loading Loading @@ -146,15 +184,18 @@ class _SongPostDetailPageState extends State<SongPostDetailPage> { }, ), ], ), ), TextInputField( ); } Widget _buildCommentInputField() { return Padding( padding: const EdgeInsets.all(8.0), child: TextInputField( controller: _commentController, onSend: _addComment, ), const SizedBox(height: 10), ], ), ); } }
lib/home_page.dart +6 −2 Original line number Diff line number Diff line import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:harmonis/user/profile_page.dart'; import 'package:harmonis/user/services/userService.dart'; import 'addPost/add_song_post_page.dart'; import 'dashBoard/dash_board_page.dart'; import 'nav_bar.dart'; // NavigationWrapper class HomePage extends StatefulWidget { const HomePage({super.key}); final userService = GetIt.instance<UserService>(); HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); Loading @@ -30,7 +34,7 @@ class _HomePageState extends State<HomePage> { Center(child: Text('Search')), AddSongPostPage(), Center(child: Text('Chat')), Center(child: Text('Profile')), ProfilePage(userUid: widget.userService.user.uID), ][_selectedIndex], Positioned( bottom: 10, Loading
lib/main.dart +8 −2 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import 'package:harmonis/mockedData/mocked_user.dart'; import 'package:harmonis/songPost/service/song_post_service.dart'; import 'package:harmonis/theme/theme.dart'; import 'package:harmonis/user/services/userService.dart'; import 'package:harmonis/user/services/usersService.dart'; void main() { IOCContainer.setup(); Loading @@ -25,7 +26,7 @@ class MyApp extends StatelessWidget { theme: lightTheme, darkTheme: darkTheme, themeMode: ThemeMode.system, home: const HomePage() home: HomePage() ); } } Loading @@ -33,15 +34,20 @@ class MyApp extends StatelessWidget { void addMockedData() { final userService = GetIt.instance<UserService>(); final songPostService = GetIt.instance<SongPostService>(); final usersService = GetIt.instance<UsersService>(); final mockedUsers = mockedUsersData; mockedUsers[0].posts = Set.of(mockedSongPostsData); final mockedSongPosts = mockedSongPostsData; userService.setUser(mockedUsers[0]); for (final post in mockedSongPosts) { songPostService.addPost(post); } for (final user in mockedUsers) { usersService.addUser(user); } } Loading