Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": false
}
2 changes: 2 additions & 0 deletions lib/api_key.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
final googMapsKey = 'AIzaSyBPnh4TzaS8FEO7vnHEdobC0Z6hsJATCoE';
final placesKey = 'AIzaSyDqlQTHcwcy2H4YRw0Ta8GUqOQBG7Infyw';
45 changes: 4 additions & 41 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

var kColorScheme = ColorScheme.fromSeed(
seedColor: Color.fromARGB(255, 192, 94, 19),
seedColor: const Color.fromARGB(255, 192, 94, 19),
);

Future main() async {
Expand Down Expand Up @@ -35,46 +35,9 @@ class MyApp extends StatelessWidget {
debugShowCheckedModeBanner: false,
title: title,
theme: ThemeData().copyWith(
useMaterial3: true,
colorScheme: kColorScheme,
appBarTheme: const AppBarTheme().copyWith(
centerTitle: true,
backgroundColor: kColorScheme.onPrimaryContainer,
foregroundColor: kColorScheme.primaryContainer,
),
cardTheme: const CardTheme().copyWith(
color: kColorScheme.secondaryContainer,
margin: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 5,
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: kColorScheme.primaryContainer,
),
),
textTheme: ThemeData().textTheme.copyWith(
titleLarge: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
fontSize: 20,
),
titleMedium: const TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black,
fontSize: 16,
),
bodyMedium: const TextStyle(
fontWeight: FontWeight.normal,
color: Colors.black,
fontSize: 14,
),
),
bottomSheetTheme: const BottomSheetThemeData().copyWith(
backgroundColor: kColorScheme.onPrimaryContainer,
//modalBackgroundColor: kColorScheme.onSecondaryContainer,
)),
useMaterial3: true,
colorScheme: kColorScheme,
),
home: const MainPage(),
);
}
Expand Down
8 changes: 6 additions & 2 deletions lib/models/listing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,14 @@ enum DietaryNeeds {
containsNuts,
containShellfish,
containsSoy,
others,
none,
}

enum Filter {
yes,
no,
}

Map<MainCategory, List<SubCategory>> categorySubcategoryMap = {
MainCategory.babyFood: [
SubCategory.babyFood,
Expand Down Expand Up @@ -109,7 +113,7 @@ Map<MainCategory, List<SubCategory>> categorySubcategoryMap = {
MainCategory.frozen: [
SubCategory.desserts,
SubCategory.meat,
SubCategory.seafood,
SubCategory.seafoods,
],
MainCategory.fruitsAndVegetables: [
SubCategory.fruits,
Expand Down
9 changes: 7 additions & 2 deletions lib/screens/log_in_&_auth/auth_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ import 'package:foodbridge_project/screens/log_in_&_auth/login_screen.dart';
import 'package:foodbridge_project/screens/log_in_&_auth/registration_screen.dart';
import 'package:flutter/material.dart';

/*
* To decide whether to show login page (login_screen) or
* registration page (registration_screen)
*/

class AuthPage extends StatefulWidget {
const AuthPage ({super.key});
const AuthPage({super.key});
@override
_AuthPageState createState() => _AuthPageState();
}
Expand All @@ -17,4 +22,4 @@ class _AuthPageState extends State<AuthPage> {
: SignUpWidget(onClickedSignIn: toggle);

void toggle() => setState(() => isLogin = !isLogin);
}
}
124 changes: 112 additions & 12 deletions lib/screens/tabs_screen.dart
Original file line number Diff line number Diff line change
@@ -1,30 +1,39 @@
import 'dart:ffi';

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:foodbridge_project/models/listing.dart';
import 'package:foodbridge_project/screens/listings_list_screen.dart';
import 'package:foodbridge_project/screens/new_listing_screen.dart';
import 'package:foodbridge_project/screens/profile_screens/own_profile_screen.dart';
import 'package:foodbridge_project/widgets/filter_mapping.dart';
import 'package:foodbridge_project/widgets/profile_appbar.dart';
import '../widgets/listings_column.dart';
import 'listings_list_screen.dart';
import 'chat/chat_list_screen.dart';
import 'favorites_screen.dart';
import 'notifications_screen.dart';
import '../widgets/filter.dart';

class TabsScreen extends StatefulWidget {
const TabsScreen({super.key});

@override
State<TabsScreen> createState() => _TabsScreenState();
}

class _TabsScreenState extends State<TabsScreen> {
String itemName = "";
int selectedPageIndex = 0;

List<String> editedFoodTypes = [];
String editedDietaryNeeds = '';
//Get snapshot from Firestore collection "Listings".
//Filters documents by expiration date and availability, converts snapshots to lists,
//Filters documents by expiration date and availability, converts snapshots to lists,
//then displays it on screen.
//If user has searched for something, it also filters out items that have an exact
//If user has searched for something, it also filters out items that have an exact
//match for item name.
//Get snapshot from Firestore collection "Listings".
//Filters documents by expiration date and availability, converts snapshots to lists,
//then displays it on screen.
//If user has searched for something, it also filters out items that have an exact
//match for item name.
Stream<List<Listing>> readListings(String searchQuery) {
DateTime currentDateTime = DateTime.now();
Expand All @@ -34,12 +43,29 @@ class _TabsScreenState extends State<TabsScreen> {
Query query = listingsRef
.where("expiryDate", isGreaterThan: currentDateTime)
.where("isAvailable", isEqualTo: true);
//.where("subCategory", whereIn: selectedOptions);

if (searchQuery.isNotEmpty) {
String searchResult = searchQuery.trim().toUpperCase();
query = query.where("itemName", isEqualTo: searchResult);
}

if (selectedFoodTypes.isNotEmpty) {
editedFoodTypes = [];
for (int i = 0; i < selectedFoodTypes.length; i += 1) {
editedFoodTypes.add(filterMap[selectedFoodTypes[i]]!);
}
query = query.where('subCategory', whereIn: editedFoodTypes);
}

if (selectedDietaryNeeds.isNotEmpty) {
editedDietaryNeeds = '';
for (int i = 0; i < selectedDietaryNeeds.length; i += 1) {
editedDietaryNeeds = filterMap[selectedDietaryNeeds[i]]!;
}
query = query.where('dietaryNeeds', isEqualTo: editedDietaryNeeds);
}

return query.snapshots().map((snapshot) => snapshot.docs
.map((doc) => Listing.fromJson(doc.data() as Map<String, dynamic>))
.toList());
Expand All @@ -55,13 +81,87 @@ class _TabsScreenState extends State<TabsScreen> {

@override
Widget build(BuildContext context) {
//By default, active screen on opening the app is set to index 0
//Displays the home page, where all listings will be shown
Widget activeScreen = ListingsColumn(
selectedPageIndex: selectedPageIndex,
itemName: itemName,
addNewListing: addNewListing,
readListings: readListings,
Widget activeScreen = Column(
children: [
selectedPageIndex == 0
? Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Row(
children: [
const SizedBox(
width: 16,
),
itemName == ''
? const Text(
'All Listings',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
)
: Expanded(
child: Container(
width: double.infinity,
child: Text(
'Searched for: $itemName',
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
overflow: TextOverflow.ellipsis,
maxLines: 1,
),
),
),
],
),
),
Container(
margin: const EdgeInsets.all(8),
child: ElevatedButton.icon(
onPressed: () {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return const FilterWidget();
/* Container(
height: double.infinity,
color: Colors.orange,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const Text('Modal BottomSheet'),
ElevatedButton(
child: const Text('Close BottomSheet'),
onPressed: () => Navigator.pop(context),
),
],
),
),
);
*/
},
);
},
icon: const Icon(Icons.filter_alt),
label: const Text('Filter'),
),
),
],
)
: Container(),
Expanded(
child: ListingsScreen(
availListings: readListings(itemName),
isYourListing: false,
),
),
],
);

//By default, active app bar is the app bar for home page
Expand Down
Loading