Skip to content

Latest commit

 

History

900 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Thryft

Thryft

A second-hand marketplace for buyers and sellers.
List items. Make offers. Trade with confidence.

Flutter Dart Supabase Provider go_router SETAP Team 4c


The Problem

Buying and selling used goods is messy. Listings live across scattered marketplaces, communication happens in DMs that get lost, offers are tracked in screenshots, and trust between strangers is hard to establish. Sellers struggle to surface their items and buyers can't easily negotiate or browse confidently.

The Solution

Thryft brings the full second-hand trade flow into a single mobile-first app: list items with photos, browse and filter by category, send offers, chat with a built-in assistant, manage orders and reviews, and keep a wishlist — all backed by secure authentication and a real-time database.


✨ Features

Feature Description
🛍️ Browse & Search Category-based browsing, keyword search, and a flexible filter system
📸 Create Listings Photo upload via image picker, category tagging, and price setting
💬 Make Offers Send, receive, accept, or decline offers on listings
🛒 Cart & Orders Add items to cart, place orders, and track sold items
❤️ Wishlist Save listings to revisit later
Reviews Leave and read reviews to build seller trust
🤖 Navigation Assistant In-app chat assistant to help users find their way around
🔔 Notifications In-app notification feed with unread badges
🔐 Secure Auth Email/password authentication with password reset via Supabase
👤 Profiles Public seller profiles, account settings, and listing management

🏗️ Tech Stack

Framework        Flutter 3 (Dart ^3.9.2)
State Management Provider
Routing          go_router
Auth & Database  Supabase (PostgreSQL + Row Level Security)
Images           image_picker
Local Storage    shared_preferences
Config           flutter_dotenv (.env)
Platforms        Android · iOS · Web · Windows · macOS · Linux

📁 Project Structure

thryft/
├── android/ · ios/ · web/ · windows/ · macos/ · linux/   # Platform targets
├── assets/
│   └── images/                          # Logo, banners, product imagery
├── lib/
│   ├── main.dart                        # App entry point
│   ├── router.dart                      # go_router route definitions
│   ├── models/
│   │   ├── product.dart                 # Listing/product model
│   │   ├── offer_model.dart             # Buyer/seller offers
│   │   ├── chat_message.dart            # Assistant chat messages
│   │   └── notification_model.dart      # In-app notifications
│   ├── providers/                       # Provider-based state
│   │   ├── cart_provider.dart
│   │   ├── create_listing_provider.dart
│   │   ├── wishlist_provider.dart
│   │   ├── offer_provider.dart
│   │   ├── search_provider.dart
│   │   ├── notification_provider.dart
│   │   ├── assistant_chat_provider.dart
│   │   ├── navigation_assistant.dart
│   │   ├── navigation_map.dart
│   │   └── chat_service.dart
│   ├── repositories/                    # Data access (Supabase)
│   │   ├── auth_repository.dart
│   │   ├── listing_repository.dart
│   │   ├── create_listing_repository.dart
│   │   ├── order_repository.dart
│   │   └── trust_info_repository.dart
│   ├── services/
│   │   └── auth_validation.dart         # Email/password validation
│   ├── screens/                         # ~27 screens (home, auth, product
│   │                                    #  detail, cart, offers, orders,
│   │                                    #  reviews, profile, settings, …)
│   └── widgets/                         # Reusable UI components
│       ├── header.dart · footer.dart · app_drawer.dart
│       ├── hero_banner.dart · category_section.dart
│       ├── product_card.dart · product_carousel.dart
│       ├── standard_product_grid.dart · search_dropdown.dart
│       ├── filter_system.dart · making_offer_system.dart
│       └── notification_badge.dart
├── test/                                # Unit & widget tests
├── pubspec.yaml                         # Dependencies
├── .env                                 # Supabase keys (not committed)
└── .env.test                            # Test Supabase keys for integration tests (not committed)

🚀 Getting Started

Prerequisites

  • Flutter SDK 3.x (Dart ^3.9.2)
  • A Supabase project (URL + anon key)
  • An IDE with Flutter support — Android Studio, VS Code, or IntelliJ
  • Platform tooling for your target (Android SDK / Xcode / Chrome / etc.)

1. Clone the repo

git clone https://github.com/setap-4c/thryft.git
cd thryft

2. Install dependencies

flutter pub get

3. Configure environment variables

Create a .env file in the project root:

SUPABASE_URL=https://your-project.supabase.co
SUPABASE_ANON_KEY=your-anon-key

The .env file is loaded at startup via flutter_dotenv and is declared as an asset in pubspec.yaml.

.env.test (for integration tests)

Integration tests run against a separate Supabase test project so they never touch production data. To run them, create a .env.test file in the project root (next to pubspec.yaml) with the test project's credentials:

TEST_SUPABASE_URL=https://your-test-project.supabase.co
TEST_SUPABASE_ANON_KEY=your-test-anon-key
TEST_SUPABASE_SERVICE_KEY=your-test-service-role-key

See .env.test.example for the full template. Credentials for the shared team test project can be obtained from George / the team password manager. The service_role key bypasses Row Level Security and must be kept secret — .env.test is gitignored.

If .env.test is missing, integration test suites are skipped automatically rather than failing.

4. Run the app

# Pick a connected device / emulator / browser
flutter devices

# Run
flutter run                    # default device
flutter run -d chrome          # web
flutter run -d windows         # Windows desktop

5. Run tests

# Unit & widget tests && integration tests (require .env.test — see above)
cd thryft; flutter test --dart-define-from-file=.env.test -j 1

🗄️ Data Model

Thryft uses Supabase (PostgreSQL) with Row Level Security. The core entities accessed via the repository layer:

-- Users (managed by Supabase Auth + profile table)
users
├── id (uuid, PK)
├── email (text)
├── display_name (text)
└── created_at (timestamptz)

-- Marketplace listings
listings
├── id (uuid, PK)
├── seller_id (uuid, FK → users.id)
├── title (text)
├── description (text)
├── price (numeric)
├── category (text)
├── image_url (text)
├── status (text)              -- active / sold / removed
└── created_at (timestamptz)

-- Offers on listings
offers
├── id (uuid, PK)
├── listing_id (uuid, FK → listings.id)
├── buyer_id (uuid, FK → users.id)
├── amount (numeric)
├── status (text)              -- pending / accepted / declined
└── created_at (timestamptz)

-- Orders, reviews, notifications, wishlists
orders · reviews · notifications · wishlists

🔄 Core User Flow

Sign up / Log in
      ↓
Browse home feed  ─┬─→  Search + filter
                   ├─→  Open product detail
                   ├─→  Add to wishlist / cart
                   └─→  Send offer to seller
      ↓
Seller accepts offer  →  Order created
      ↓
Buyer pays / collects  →  Review left on seller
      ↓
Notifications update both parties at each step

👥 Team — SETAP Group 4c

Member GitHub
Joyee Hing up2245819 / Joyeehing
Konstantinos Savva up2219830 / kotsiossav
Georgios Papageorgiou up2227777 / geopadev
Abigail Hinchliffe up2205638 / AbigailHinchliffe
Connor Watkin up2306089 / Corezsl
Chrystalla Tambouri up2257593 / ChrystallaT1

📄 License

This project is developed for the SETAP module at the University of Portsmouth. All rights reserved by the contributing team.


Buy less new. Trade more good.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages