diff --git a/lib/AddPage.dart b/lib/AddPage.dart index d748a0e..2398419 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -45,13 +45,26 @@ class _AddScreenState extends State { // Das neue Element in der Firestore-Sammlung "Issues" speichern - if(_selectedIndex == 1) + if(_selectedIndex == 0) { - Reference ref = FirebaseStorage.instance.ref().child("Issues/${DateTime.now().toString()}"); + Reference ref = FirebaseStorage.instance.ref().child("CitizensForum/${DateTime.now().toString()}"); UploadTask uploadTask = ref.putFile(imageFile); String imageUrl = await (await uploadTask).ref.getDownloadURL(); - await FirebaseFirestore.instance.collection("Issues").add({ + await FirebaseFirestore.instance.collection("CitizensForum").add({ + "title": title, + "description": description, + "imageUrl": imageUrl, + "createdDate": DateTime.now(), + }); + } + else if(_selectedIndex == 1) + { + Reference ref = FirebaseStorage.instance.ref().child("News/${DateTime.now().toString()}"); + UploadTask uploadTask = ref.putFile(imageFile); + String imageUrl = await (await uploadTask).ref.getDownloadURL(); + + await FirebaseFirestore.instance.collection("News").add({ "title": title, "description": description, "imageUrl": imageUrl, @@ -60,10 +73,10 @@ class _AddScreenState extends State { } else { - Reference ref = FirebaseStorage.instance.ref().child("News/${DateTime.now().toString()}"); + Reference ref = FirebaseStorage.instance.ref().child("Issues/${DateTime.now().toString()}"); UploadTask uploadTask = ref.putFile(imageFile); String imageUrl = await (await uploadTask).ref.getDownloadURL(); - await FirebaseFirestore.instance.collection("News").add({ + await FirebaseFirestore.instance.collection("Issues").add({ "title": title, "description": description, "imageUrl": imageUrl, diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 2a1547e..6372d17 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -93,10 +93,6 @@ class UserDefinedItem extends StatelessWidget { } } - - - - class NewsList extends StatefulWidget { const NewsList({Key? key}) : super(key: key); @@ -104,6 +100,193 @@ class NewsList extends StatefulWidget { _NewsListState createState() => _NewsListState(); } +class _NewsListState extends State { + final FirebaseFirestore firestore = FirebaseFirestore.instance; + late Stream newsStream; + + @override + void initState() { + super.initState(); + + // Enable persistence + firestore.enablePersistence(); + + // Enable network + firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + + // Configure the stream to use the cache first and then the server + newsStream = firestore + .collection('News') + .orderBy('createdDate', descending: true) + .snapshots(includeMetadataChanges: true); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: newsStream, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return const Text('Loading...'); + default: + final List documents = snapshot.data!.docs; + return ListView.builder( + itemCount: documents.length, + itemBuilder: (BuildContext context, int index) { + final Map data = + documents[index].data()! as Map; + final DateTime createdDate = + data['createdDate'].toDate(); + final formattedDate = + DateFormat('dd.MM.yyyy').format(createdDate); + return UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + image: Image.network((data['imageUrl'])), + ); + }, + ); + } + }, + ); + } +} +class IssueList extends StatefulWidget { + const IssueList({Key? key}) : super(key: key); + + @override + _IssueListState createState() => _IssueListState(); +} +class _IssueListState extends State { + final FirebaseFirestore firestore = FirebaseFirestore.instance; + late Stream issueStream; + + @override + void initState() { + super.initState(); + + // Enable persistence + firestore.enablePersistence(); + + // Enable network + firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + + // Configure the stream to use the cache first and then the server + issueStream = firestore + .collection('Issues') + .orderBy('createdDate', descending: true) + .snapshots(includeMetadataChanges: true); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: issueStream, + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return const Text('Loading...'); + default: + final List documents = snapshot.data!.docs; + return ListView.builder( + itemCount: documents.length, + itemBuilder: (BuildContext context, int index) { + final Map data = + documents[index].data()! as Map; + final DateTime createdDate = + data['createdDate'].toDate(); + final formattedDate = + DateFormat('dd.MM.yyyy').format(createdDate); + return UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + image: Image.network((data['imageUrl'])), + ); + }, + ); + } + }, + ); + } +} +class CitizensForum extends StatefulWidget { + const CitizensForum({Key? key}) : super(key: key); + + @override + _CitizensForumState createState() => _CitizensForumState(); +} + +class _CitizensForumState extends State { + final FirebaseFirestore firestore = FirebaseFirestore.instance; + late Stream>> citizenStream; + + @override + void initState() { + super.initState(); + + // Enable persistence + firestore.enablePersistence(); + + // Enable network + firestore.settings = Settings(cacheSizeBytes: Settings.CACHE_SIZE_UNLIMITED); + + // Configure the stream to use the cache first and then the server + citizenStream = firestore + .collection('CitizensForum') + .orderBy('createdDate', descending: true) + .snapshots(includeMetadataChanges: true); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder>>( + stream: citizenStream, + builder: (BuildContext context, AsyncSnapshot>> snapshot) { + if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } + switch (snapshot.connectionState) { + case ConnectionState.waiting: + return const Text('Loading...'); + default: + final List>> documents = snapshot.data!.docs; + return ListView.builder( + itemCount: documents.length, + itemBuilder: (BuildContext context, int index) { + final Map data = documents[index].data(); + final DateTime createdDate = data['createdDate'].toDate(); + final formattedDate = DateFormat.yMd().format(createdDate); + return UserDefinedItem( + title: data['title'] ?? '', + datum: formattedDate, + description: data['description'] ?? '', + image: Image.network((data['imageUrl'])), + ); + }, + ); + } + }, + ); + } +} + + +/*class NewsList extends StatefulWidget { + const NewsList({Key? key}) : super(key: key); + + @override + _NewsListState createState() => _NewsListState(); +} + class _NewsListState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; late Stream newsStream; @@ -201,12 +384,12 @@ class CitizensForum extends StatefulWidget { const CitizensForum({Key? key}) : super(key: key); @override - _CitizensForum createState() => _CitizensForum(); + _CitizensForumState createState() => _CitizensForumState(); } -class _CitizensForum extends State { +class _CitizensForumState extends State { final FirebaseFirestore firestore = FirebaseFirestore.instance; - late Stream citizenStream; + late Stream>> citizenStream; @override void initState() { @@ -216,9 +399,9 @@ class _CitizensForum extends State { @override Widget build(BuildContext context) { - return StreamBuilder( + return StreamBuilder>>( stream: citizenStream, - builder: (BuildContext context, AsyncSnapshot snapshot) { + builder: (BuildContext context, AsyncSnapshot>> snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } @@ -226,13 +409,13 @@ class _CitizensForum extends State { case ConnectionState.waiting: return const Text('Loading...'); default: - final List documents = snapshot.data!.docs; + final List>> documents = snapshot.data!.docs; return ListView.builder( itemCount: documents.length, itemBuilder: (BuildContext context, int index) { - final Map data = documents[index].data()! as Map; + final Map data = documents[index].data(); final DateTime createdDate = data['createdDate'].toDate(); - final formattedDate = DateFormat('dd.MM.yyyy').format(createdDate); + final formattedDate = DateFormat.yMd().format(createdDate); return UserDefinedItem( title: data['title'] ?? '', datum: formattedDate, @@ -245,4 +428,4 @@ class _CitizensForum extends State { }, ); } -} \ No newline at end of file +}*/ diff --git a/lib/home.dart b/lib/home.dart index b3d8033..2567aab 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'UserDefinedList.dart'; class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); + const MyHomePage({Key? key, required this.title}); final String title; @@ -14,89 +14,84 @@ class MyHomePage extends StatefulWidget { class _MyHomePageState extends State { int _selectedIndex = 0; bool login = false; - bool isIssueItemEnabled = true; static const TextStyle optionStyle = - TextStyle(fontSize: 30, fontWeight: FontWeight.bold); + TextStyle(fontSize: 30, fontWeight: FontWeight.bold); + void _onItemTapped(int index) { setState(() { _selectedIndex = index; }); } + void setLogin(bool value) { setState(() { login = value; - isIssueItemEnabled = value; }); } + @override Widget build(BuildContext context) { final List widgetOptions = [ + const CitizensForum(), const NewsList(), - login ? const IssueList(): const Text( - 'Mängel (nur für angemeldete Benutzer verfügbar)', - style: optionStyle, - textAlign: TextAlign.center, - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ElevatedButton( - child: Text(login ? 'Logout' : 'Login'), - onPressed: () { - setLogin(!login); - }, - ), - const Text( - 'Index 2: Profil', - style: optionStyle, - ), - ], - ), + const IssueList(), + Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + ElevatedButton( + child: Text(login ? 'Logout' : 'Login'), + onPressed: () { + setLogin(!login); + }, + ), + const Text( + 'Index 2: Profil', + style: optionStyle, + ), + ]) ]; return Scaffold( appBar: AppBar( title: const Text('Oggauer Gemeinde Trommler'), - - ), body: Center( child: widgetOptions.elementAt(_selectedIndex), - ), - floatingActionButton: FloatingActionButton( onPressed: () { Navigator.push( context, - MaterialPageRoute(builder: (context) => AddScreen(initialIndex: _selectedIndex,)), + MaterialPageRoute( + builder: (context) => AddScreen(initialIndex: _selectedIndex)), ); }, tooltip: "Add", child: Icon(Icons.add), ), - bottomNavigationBar: BottomNavigationBar( - items: const - [ + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.person), + label: 'BürgerForum', + ), BottomNavigationBarItem( icon: Icon(Icons.newspaper), - label: 'News', + label: 'Neuigkeiten', ), BottomNavigationBarItem( icon: Icon(Icons.report), label: 'Mängel', ), BottomNavigationBarItem( - icon: Icon(Icons.person), + icon: Icon(Icons.account_circle), label: 'Profil', ), ], currentIndex: _selectedIndex, selectedItemColor: Colors.blue, + unselectedItemColor: Colors.black26, onTap: _onItemTapped, ), ); } -} \ No newline at end of file +} diff --git a/lib/main.dart b/lib/main.dart index 6a451e2..2aa1d9e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ //TEST, TEST +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'home.dart';