From 1239b39e307e4bbaa3bfb3567a44d1e4836a8761 Mon Sep 17 00:00:00 2001 From: kleponijo <158453666+kleponijo@users.noreply.github.com> Date: Sun, 12 Apr 2026 21:11:40 +0700 Subject: [PATCH] ok --- images/atmosfer.png | Bin 0 -> 14210 bytes images/google-icon-logo.png | Bin 0 -> 15459 bytes .../monitoring_bloc/monitoring_bloc.dart | 49 ------------ .../monitoring_bloc/monitoring_event.dart | 24 ------ .../monitoring_bloc/monitoring_state.dart | 33 -------- lib/screens/auth/views/sign_in_screen.dart | 15 ++-- lib/screens/auth/views/sign_up_screen.dart | 14 ++-- lib/screens/home/views/home_screen.dart | 58 +++++++++++++- lib/screens/home/views/main_drawer.dart | 74 ++++++++++++++++++ .../lib/src/firebase_monitoring_repo.dart | 4 +- pubspec.yaml | 4 +- 11 files changed, 151 insertions(+), 124 deletions(-) create mode 100644 images/atmosfer.png create mode 100644 images/google-icon-logo.png create mode 100644 lib/screens/home/views/main_drawer.dart diff --git a/images/atmosfer.png b/images/atmosfer.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5815cab4b83cfc8fa1f7ca74223f3eed3ba28c GIT binary patch literal 14210 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 literal 0 HcmV?d00001 diff --git a/images/google-icon-logo.png b/images/google-icon-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1253984b36afd83972e9c754b41cdca78c222421 GIT binary patch literal 15459 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 Qpq~KB^6GMxG8SR~4^^&{`2YX_ literal 0 HcmV?d00001 diff --git a/lib/blocs/monitoring_bloc/monitoring_bloc.dart b/lib/blocs/monitoring_bloc/monitoring_bloc.dart index 9d83ea7..8b13789 100644 --- a/lib/blocs/monitoring_bloc/monitoring_bloc.dart +++ b/lib/blocs/monitoring_bloc/monitoring_bloc.dart @@ -1,50 +1 @@ -import 'dart:async'; -import 'package:bloc/bloc.dart'; -import 'package:equatable/equatable.dart'; -import 'package:firebase_database/firebase_database.dart'; - -part 'monitoring_event.dart'; -part 'monitoring_state.dart'; - -class MonitoringBloc extends Bloc { - final DatabaseReference _realtimeRef = - FirebaseDatabase.instance.ref('anemometer/realtime'); - StreamSubscription? _realtimeSub; - - MonitoringBloc() : super(const MonitoringState.initial()) { - on(_onLoadMonitoringData); - on(_onMonitoringDataUpdated); - } - - void _onLoadMonitoringData( - LoadMonitoringData event, Emitter emit) { - emit(const MonitoringState.loading()); - - // Start listening to realtime data - _realtimeSub = _realtimeRef.onValue.listen((event) { - final data = event.snapshot.value; - if (data is Map) { - final speed = (data['kecepatan'] ?? 0).toDouble(); - final timestamp = data['timestamp'] ?? 0; - final waktu = DateTime.fromMillisecondsSinceEpoch(timestamp * 1000); - - add(MonitoringDataUpdated(speed: speed, timestamp: waktu)); - } - }); - } - - void _onMonitoringDataUpdated( - MonitoringDataUpdated event, Emitter emit) { - emit(MonitoringState.loaded( - currentSpeed: event.speed, - lastUpdateTime: event.timestamp, - )); - } - - @override - Future close() { - _realtimeSub?.cancel(); - return super.close(); - } -} diff --git a/lib/blocs/monitoring_bloc/monitoring_event.dart b/lib/blocs/monitoring_bloc/monitoring_event.dart index e93e753..8b13789 100644 --- a/lib/blocs/monitoring_bloc/monitoring_event.dart +++ b/lib/blocs/monitoring_bloc/monitoring_event.dart @@ -1,25 +1 @@ -part of 'monitoring_bloc.dart'; -sealed class MonitoringEvent extends Equatable { - const MonitoringEvent(); - - @override - List get props => []; -} - -class LoadMonitoringData extends MonitoringEvent { - const LoadMonitoringData(); -} - -class MonitoringDataUpdated extends MonitoringEvent { - final double speed; - final DateTime timestamp; - - const MonitoringDataUpdated({ - required this.speed, - required this.timestamp, - }); - - @override - List get props => [speed, timestamp]; -} diff --git a/lib/blocs/monitoring_bloc/monitoring_state.dart b/lib/blocs/monitoring_bloc/monitoring_state.dart index 9e28f38..8b13789 100644 --- a/lib/blocs/monitoring_bloc/monitoring_state.dart +++ b/lib/blocs/monitoring_bloc/monitoring_state.dart @@ -1,34 +1 @@ -part of 'monitoring_bloc.dart'; -class MonitoringState extends Equatable { - final MonitoringStatus status; - final double? currentSpeed; - final DateTime? lastUpdateTime; - - const MonitoringState._({ - this.status = MonitoringStatus.initial, - this.currentSpeed, - this.lastUpdateTime, - }); - - const MonitoringState.initial() : this._(); - - const MonitoringState.loading() : this._(status: MonitoringStatus.loading); - - const MonitoringState.loaded({ - required double currentSpeed, - required DateTime lastUpdateTime, - }) : this._( - status: MonitoringStatus.loaded, - currentSpeed: currentSpeed, - lastUpdateTime: lastUpdateTime, - ); - - const MonitoringState.error(String message) - : this._(status: MonitoringStatus.error); - - @override - List get props => [status, currentSpeed, lastUpdateTime]; -} - -enum MonitoringStatus { initial, loading, loaded, error } diff --git a/lib/screens/auth/views/sign_in_screen.dart b/lib/screens/auth/views/sign_in_screen.dart index f687089..4eedd24 100644 --- a/lib/screens/auth/views/sign_in_screen.dart +++ b/lib/screens/auth/views/sign_in_screen.dart @@ -124,19 +124,22 @@ class _SignInScreenState extends State { )), ) : const CircularProgressIndicator(), + + /// ======= Tombol Login Google ======= /// const SizedBox(height: 20), SizedBox( width: MediaQuery.of(context).size.width * 0.5, child: TextButton.icon( onPressed: () { + // == Mengirim event login Google ke Bloc == // context.read().add(GoogleSignInRequired()); }, - icon: const Text( - 'G', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Colors.blue, + icon: SizedBox( + height: 20, + width: 20, + child: Image.asset( + 'images/google-icon-logo.png', + fit: BoxFit.contain, ), ), label: const Text( diff --git a/lib/screens/auth/views/sign_up_screen.dart b/lib/screens/auth/views/sign_up_screen.dart index 32b70e5..a32223e 100644 --- a/lib/screens/auth/views/sign_up_screen.dart +++ b/lib/screens/auth/views/sign_up_screen.dart @@ -234,16 +234,16 @@ class _SignUpScreenState extends State { .read() .add(GoogleSignInRequired()); }, - icon: const Text( - 'G', - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - color: Colors.blue, + icon: SizedBox( + height: 20, + width: 20, + child: Image.asset( + 'images/google-icon-logo.png', + fit: BoxFit.contain, ), ), label: const Text( - 'Daftar dengan Google', + 'Sign In With Google', style: TextStyle( color: Colors.black, fontSize: 16, diff --git a/lib/screens/home/views/home_screen.dart b/lib/screens/home/views/home_screen.dart index 2831845..007c2ff 100644 --- a/lib/screens/home/views/home_screen.dart +++ b/lib/screens/home/views/home_screen.dart @@ -1,10 +1,66 @@ import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../../blocs/authentication_bloc/authentication_bloc.dart'; +import 'main_drawer.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @override Widget build(BuildContext context) { - return Scaffold(); + return Scaffold( + drawer: const MainDrawer(), + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0.5, // Kasih sedikit bayangan tipis agar elegan + centerTitle: false, + leading: Builder( + builder: (context) => IconButton( + icon: const Icon(Icons.menu, + color: Colors.black), // Ikon garis 3 horizontal + onPressed: () { + // ini kodenya untuk membuka: + Scaffold.of(context).openDrawer(); + }, + )), + title: Row( + children: [ + // Ganti dengan Image.asset jika sudah ada logo + const Icon(Icons.cloud_queue, color: Colors.blue, size: 28), + const SizedBox(width: 10), + Text( + "Klimatologi", + style: GoogleFonts.rubik( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ], + ), + actions: [ + IconButton( + icon: const Icon(Icons.notifications_none, color: Colors.black), + onPressed: () { + // Aksi notifikasi + }, + ), + IconButton( + icon: const Icon(Icons.logout, color: Colors.black), + onPressed: () { + // Trigger Logout di AuthenticationBloc kamu + context + .read() + .add(AuthenticationLogoutRequested()); + }, + ), + const SizedBox(width: 8), + ], + ), + body: const Center( + child: Text("body home page"), + ), + ); } } diff --git a/lib/screens/home/views/main_drawer.dart b/lib/screens/home/views/main_drawer.dart new file mode 100644 index 0000000..4f50ed7 --- /dev/null +++ b/lib/screens/home/views/main_drawer.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../../blocs/authentication_bloc/authentication_bloc.dart'; + +class MainDrawer extends StatelessWidget { + const MainDrawer({super.key}); + + @override + Widget build(BuildContext context) { + return Drawer( + child: Column( + children: [ + // Bagian Header (Tempat Nama/Email) + BlocBuilder( + builder: (context, state) { + // Mengambil email user dari Bloc Global + String userEmail = state.user?.email ?? "Guest"; + String userName = + userEmail.split('@')[0]; // Ambil depan email saja + + return UserAccountsDrawerHeader( + decoration: const BoxDecoration(color: Colors.blue), + currentAccountPicture: const CircleAvatar( + backgroundColor: Colors.white, + child: Icon(Icons.person, size: 40, color: Colors.blue), + ), + accountName: Text( + userName, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + accountEmail: Text(userEmail), + ); + }, + ), + + // Daftar Menu + ListTile( + leading: const Icon(Icons.speed), + title: const Text("Wind Speed"), + onTap: () { + // Navigasi ke Wind Speed + }, + ), + ListTile( + leading: const Icon(Icons.water_drop), + title: const Text("Evaporasi"), + onTap: () {}, + ), + ListTile( + leading: Image.asset( + 'images/atmosfer.png', + height: 20, + width: 20, + ), + title: const Text("Udara"), + onTap: () {}, + ), + const Spacer(), // Dorong menu logout ke paling bawah + const Divider(), + ListTile( + leading: const Icon(Icons.logout, color: Colors.red), + title: const Text("Logout", style: TextStyle(color: Colors.red)), + onTap: () { + context + .read() + .add(AuthenticationLogoutRequested()); + }, + ), + const SizedBox(height: 20), + ], + ), + ); + } +} diff --git a/packages/monitoring_repository/lib/src/firebase_monitoring_repo.dart b/packages/monitoring_repository/lib/src/firebase_monitoring_repo.dart index 142ed18..b5da549 100644 --- a/packages/monitoring_repository/lib/src/firebase_monitoring_repo.dart +++ b/packages/monitoring_repository/lib/src/firebase_monitoring_repo.dart @@ -1,6 +1,6 @@ -import 'dart:developer'; +// import 'dart:developer'; import 'dart:async'; -import 'package:rxdart/rxdart.dart'; +// import 'package:rxdart/rxdart.dart'; import 'package:firebase_database/firebase_database.dart'; import 'package:monitoring_repository/monitoring_repository.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index a9c35a5..15b45a0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,5 +31,5 @@ dev_dependencies: sdk: flutter flutter: uses-material-design: true - # assets: - # - assets/images/ + assets: + - images/