I just created an ecommerce app and I want the items in the order page to be deleted after every 2 weeks I just created an e commerce flutter app but I want the products to be ordered only once and after 2 weeks the item in the orders page should be deleted. Here is my code below. So my plan is that once an item gets added to the order screen, it should be deleted after two weeks. I dont want there to be too many orders so for each items from the day there added their countdown would start for it to be deleted
orders_providers.dart
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import '../model/orders_model.dart';
class OrdersProvider with ChangeNotifier {
static List<OrderModel> _orders = [];
List<OrderModel> get getOrders {
return _orders;
}
void clearLocalOrders() {
_orders.clear();
notifyListeners();
}
Future<void> fetchOrders() async {
User? user = FirebaseAuth.instance.currentUser;
DateTime.now().subtract(Duration(seconds: 5));
await FirebaseFirestore.instance
.collection('orders')
.where("userId", isEqualTo: user!.uid)
.get()
.then((QuerySnapshot ordersSnapshot) {
_orders = [];
ordersSnapshot.docs.forEach((element) {
_orders.insert(
0,
OrderModel(
orderId: element.get('orderId'),
userId: element.get('userId'),
productId: element.get('productId'),
userName: element.get('userName'),
price: element.get('price').toString(),
imageUrl: element.get('imageUrl'),
quantity: element.get('quantity').toString(),
orderDate: element.get('orderDate'),
),
);
});
});
notifyListeners();
}
}
orders_widget.dart
import 'package:fancy_shimmer_image/fancy_shimmer_image.dart';
import 'package:flutter/material.dart';
import 'package:new_customers_app/screens/orders/order_done.dart';
import 'package:provider/provider.dart';
import '../../inner_screens/product_details.dart';
import '../../model/orders_model.dart';
import '../../providers/products_provider.dart';
import '../../services/global_methods.dart';
import '../../services/utils.dart';
import '../../widgets/text_widget.dart';
class OrderWidget extends StatefulWidget {
const OrderWidget({Key? key}) : super(key: key);
@override
State<OrderWidget> createState() => _OrderWidgetState();
}
class _OrderWidgetState extends State<OrderWidget> {
late String orderDateToShow;
@override
void didChangeDependencies() {
final ordersModel = Provider.of<OrderModel>(context);
var orderDate = ordersModel.orderDate.toDate();
orderDateToShow = '${orderDate.day}/${orderDate.month}/${orderDate.year}';
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final ordersModel = Provider.of\<OrderModel\>(context);
final Color color = Utils(context).color;
Size size = Utils(context).getScreenSize;
final productProvider = Provider.of\<ProductsProvider\>(context);
final getCurrProduct = productProvider.findProdById(ordersModel.productId);
return ListTile(
subtitle:
Text('Paid: \$${double.parse(ordersModel.price).toStringAsFixed(2)}'),
onTap: () {
Navigator.pushNamed(context, OrderDone.routeName,
arguments: ordersModel.productId);
},
leading: FancyShimmerImage(
width: size.width * 0.2,
imageUrl: getCurrProduct.imageUrl,
boxFit: BoxFit.fill,
),
title: TextWidget(
text: '${getCurrProduct.title} x${ordersModel.quantity}',
color: color,
textSize: 18),
trailing: TextWidget(text: orderDateToShow, color: color, textSize: 18),
);
}
}
order_screen.dart
import 'package:flutter/material.dart';
import 'package:flutter_iconly/flutter_iconly.dart';
import 'package:provider/provider.dart';
import '../../../providers/orders_provider.dart';
import '../../../services/utils.dart';
import '../../../widgets/empty_screen.dart';
import '../../../widgets/text_widget.dart';
import 'orders_widget.dart';
class OrdersScreen extends StatefulWidget {
static const routeName = '/OrderScreen';
const OrdersScreen({Key? key}) : super(key: key);
@override
State<OrdersScreen> createState() => _OrdersScreenState();
}
class _OrdersScreenState extends State<OrdersScreen> {
@override
Widget build(BuildContext context) {
final Color color = Utils(context).color;
Size size = Utils(context).getScreenSize;
final ordersProvider = Provider.of\<OrdersProvider\>(context);
final ordersList = ordersProvider.getOrders;
return FutureBuilder(
future: ordersProvider.fetchOrders(),
builder: (context, snapshot) {
return ordersList.isEmpty
? const EmptyScreen(
title: 'You did not place any order yet',
subtitle: 'order something and make me happy :)',
buttonText: 'Shop now',
imagePath: 'assets/images/box.png',
)
: Scaffold(
appBar: AppBar(
leading: InkWell(
borderRadius: BorderRadius.circular(12),
onTap: () {
Navigator.pop(context);
},
child: Icon(
IconlyLight.arrowLeft2,
color: color,
),
),
elevation: 0,
centerTitle: false,
title: TextWidget(
text: 'My Courses (${ordersList.length})',
color: color,
textSize: 24.0,
isTitle: true,
),
backgroundColor: Theme.of(context)
.scaffoldBackgroundColor
.withOpacity(0.9),
),
body: ListView.separated(
itemCount: ordersList.length,
itemBuilder: (ctx, index) {
return GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 2, vertical: 6),
child: ChangeNotifierProvider.value(
value: ordersList\[index\],
child: const OrderWidget(),
),
),
);
},
separatorBuilder: (BuildContext context, int index) {
return Divider(
color: color,
thickness: 1,
);
},
));
});
}
}
The easiest way to do this is to set up a time-to-live policy on the collection that deletes documents after the date/time specified in a certain field of each document. Then in your code, add an additional field with the date/time two weeks into the future, and the policy will automatically delete the documentation at that date/time.