Compare commits
No commits in common. "feature/pagination" and "main" have entirely different histories.
feature/pa
...
main
@ -42,62 +42,17 @@ class ListItemOrganizers extends StatefulWidget {
|
|||||||
|
|
||||||
// homepage state
|
// homepage state
|
||||||
class _MyHomePageState extends State<ListItemOrganizers> {
|
class _MyHomePageState extends State<ListItemOrganizers> {
|
||||||
int _fetchCount = 0;
|
|
||||||
bool _isLoading = false;
|
|
||||||
late ScrollController _scrollController;
|
|
||||||
|
|
||||||
final AuthService _authService = AuthService();
|
final AuthService _authService = AuthService();
|
||||||
|
|
||||||
void _incrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
_fetchCount++;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _decrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
if (_fetchCount > 0) {
|
|
||||||
_fetchCount--;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _scrollListener() {
|
|
||||||
if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.maxScrollExtent) {
|
|
||||||
_incrementFetchCount();
|
|
||||||
} else if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.minScrollExtent) {
|
|
||||||
_decrementFetchCount();
|
|
||||||
}
|
|
||||||
_fetchData();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _fetchData() async {
|
|
||||||
print("Counter : ${_fetchCount}");
|
|
||||||
if (_isLoading) return;
|
|
||||||
setState(() {
|
|
||||||
_isLoading = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Future.delayed(Duration(seconds: 2));
|
|
||||||
getPosts(widget.organizer, count: _fetchCount);
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
_isLoading = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// variable to call and store future list of posts
|
// variable to call and store future list of posts
|
||||||
|
|
||||||
// function to fetch data from api and return future list of posts
|
// function to fetch data from api and return future list of posts
|
||||||
static Future<List<Events>> getPosts(organizer, {count = 0}) async {
|
static Future<List<Events>> getPosts(organizer) async {
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
var accessToken = prefs.getString("access_token") ?? "";
|
var accessToken = prefs.getString("access_token") ?? "";
|
||||||
final List<Events> body = [];
|
final List<Events> body = [];
|
||||||
if (accessToken.isNotEmpty) {
|
if (accessToken.isNotEmpty) {
|
||||||
var url = Uri.parse(
|
var url = Uri.parse("${globals.api}/events?organizers=${organizer}");
|
||||||
"${globals.api}/events?organizers=${organizer}&skip=${count}");
|
|
||||||
final response = await http.get(url, headers: {
|
final response = await http.get(url, headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
HttpHeaders.cookieHeader: "access_token=${accessToken}"
|
HttpHeaders.cookieHeader: "access_token=${accessToken}"
|
||||||
@ -112,14 +67,6 @@ class _MyHomePageState extends State<ListItemOrganizers> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_authService.checkTokenStatus(context);
|
_authService.checkTokenStatus(context);
|
||||||
_scrollController = ScrollController();
|
|
||||||
_scrollController.addListener(_scrollListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_scrollController.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build function
|
// build function
|
||||||
@ -162,10 +109,7 @@ class _MyHomePageState extends State<ListItemOrganizers> {
|
|||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
body: ListView.separated(
|
body: ListView.separated(
|
||||||
controller: _scrollController,
|
itemCount: posts.length,
|
||||||
itemCount: posts.isNotEmpty
|
|
||||||
? posts.length + (_isLoading ? 1 : 0) // Add 1 only if loading
|
|
||||||
: 0,
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final post = posts[index];
|
final post = posts[index];
|
||||||
final startDate = DateTime.parse(post.startDate!);
|
final startDate = DateTime.parse(post.startDate!);
|
||||||
|
@ -44,59 +44,15 @@ class ListItemTags extends StatefulWidget {
|
|||||||
class _MyHomePageState extends State<ListItemTags> {
|
class _MyHomePageState extends State<ListItemTags> {
|
||||||
// variable to call and store future list of posts
|
// variable to call and store future list of posts
|
||||||
|
|
||||||
int _fetchCount = 0;
|
|
||||||
bool _isLoading = false;
|
|
||||||
late ScrollController _scrollController;
|
|
||||||
|
|
||||||
final AuthService _authService = AuthService();
|
final AuthService _authService = AuthService();
|
||||||
|
|
||||||
void _incrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
_fetchCount++;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _decrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
if (_fetchCount > 0) {
|
|
||||||
_fetchCount--;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _scrollListener() {
|
|
||||||
if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.maxScrollExtent) {
|
|
||||||
_incrementFetchCount();
|
|
||||||
} else if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.minScrollExtent) {
|
|
||||||
_decrementFetchCount();
|
|
||||||
}
|
|
||||||
_fetchData();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _fetchData() async {
|
|
||||||
print("Counter : ${_fetchCount}");
|
|
||||||
if (_isLoading) return;
|
|
||||||
setState(() {
|
|
||||||
_isLoading = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Future.delayed(Duration(seconds: 2));
|
|
||||||
getPosts(widget.tags, count: _fetchCount);
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
_isLoading = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// function to fetch data from api and return future list of posts
|
// function to fetch data from api and return future list of posts
|
||||||
static Future<List<Events>> getPosts(tags, {count = 0}) async {
|
static Future<List<Events>> getPosts(tags) async {
|
||||||
SharedPreferences prefs = await SharedPreferences.getInstance();
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
var accessToken = prefs.getString("access_token") ?? "";
|
var accessToken = prefs.getString("access_token") ?? "";
|
||||||
final List<Events> body = [];
|
final List<Events> body = [];
|
||||||
if (accessToken.isNotEmpty) {
|
if (accessToken.isNotEmpty) {
|
||||||
var url = Uri.parse("${globals.api}/events?tags=${tags}&skip=${count}");
|
var url = Uri.parse("${globals.api}/events?tags=${tags}");
|
||||||
final response = await http.get(url, headers: {
|
final response = await http.get(url, headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
HttpHeaders.cookieHeader: "access_token=${accessToken}"
|
HttpHeaders.cookieHeader: "access_token=${accessToken}"
|
||||||
@ -111,15 +67,6 @@ class _MyHomePageState extends State<ListItemTags> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_authService.checkTokenStatus(context);
|
_authService.checkTokenStatus(context);
|
||||||
_authService.checkTokenStatus(context);
|
|
||||||
_scrollController = ScrollController();
|
|
||||||
_scrollController.addListener(_scrollListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_scrollController.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build function
|
// build function
|
||||||
@ -161,10 +108,7 @@ class _MyHomePageState extends State<ListItemTags> {
|
|||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
body: ListView.separated(
|
body: ListView.separated(
|
||||||
controller: _scrollController,
|
itemCount: posts.length,
|
||||||
itemCount: posts.isNotEmpty
|
|
||||||
? posts.length + (_isLoading ? 1 : 0) // Add 1 only if loading
|
|
||||||
: 0,
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final post = posts[index];
|
final post = posts[index];
|
||||||
final startDate = DateTime.parse(post.startDate!);
|
final startDate = DateTime.parse(post.startDate!);
|
||||||
|
@ -48,9 +48,6 @@ class ListItemMenu extends StatefulWidget {
|
|||||||
class _MyHomePageState extends State<ListItemMenu> {
|
class _MyHomePageState extends State<ListItemMenu> {
|
||||||
BannerAd? _bannerAd;
|
BannerAd? _bannerAd;
|
||||||
final AuthService _authService = AuthService();
|
final AuthService _authService = AuthService();
|
||||||
late ScrollController _scrollController;
|
|
||||||
int _fetchCount = 0;
|
|
||||||
bool _isLoading = false;
|
|
||||||
|
|
||||||
Future<List<Events>> postsFuture = getPosts();
|
Future<List<Events>> postsFuture = getPosts();
|
||||||
List<Events> filteredPosts = [];
|
List<Events> filteredPosts = [];
|
||||||
@ -147,46 +144,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
return "${year}-${month}-${day}";
|
return "${year}-${month}-${day}";
|
||||||
}
|
}
|
||||||
|
|
||||||
void _incrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
_fetchCount++;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _decrementFetchCount() {
|
|
||||||
setState(() {
|
|
||||||
if (_fetchCount > 0 && filteredPosts.isNotEmpty) {
|
|
||||||
_fetchCount--;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _scrollListener() {
|
|
||||||
if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.maxScrollExtent) {
|
|
||||||
_incrementFetchCount();
|
|
||||||
} else if (_scrollController.position.pixels ==
|
|
||||||
_scrollController.position.minScrollExtent) {
|
|
||||||
_decrementFetchCount();
|
|
||||||
}
|
|
||||||
_fetchData();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _fetchData() async {
|
|
||||||
print("Counter : ${_fetchCount}");
|
|
||||||
if (_isLoading) return;
|
|
||||||
setState(() {
|
|
||||||
_isLoading = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
await Future.delayed(Duration(seconds: 2));
|
|
||||||
fetchPostsByLocation();
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
_isLoading = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
@ -196,19 +153,10 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
_bannerAd = ad;
|
_bannerAd = ad;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
_scrollController = ScrollController();
|
|
||||||
_scrollController.addListener(_scrollListener);
|
|
||||||
|
|
||||||
// Initialize data fetch when the page loads
|
// Initialize data fetch when the page loads
|
||||||
_getCurrentLocation();
|
_getCurrentLocation();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_scrollController.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the device's current location
|
// Get the device's current location
|
||||||
Future<void> _getCurrentLocation() async {
|
Future<void> _getCurrentLocation() async {
|
||||||
PermissionStatus status = await Permission.location.status;
|
PermissionStatus status = await Permission.location.status;
|
||||||
@ -399,8 +347,7 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
queryParameters = dateParameter;
|
queryParameters = dateParameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Uri.parse(
|
return Uri.parse("${globals.api}/$endpoint?$queryParameters");
|
||||||
"${globals.api}/$endpoint?$queryParameters&skip=${_fetchCount}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> searchSuggestionsByItem(String input) async {
|
Future<void> searchSuggestionsByItem(String input) async {
|
||||||
@ -623,7 +570,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
controller: inputItem,
|
controller: inputItem,
|
||||||
labelText: 'Search by item',
|
labelText: 'Search by item',
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
_fetchCount = 0;
|
|
||||||
if (value.isNotEmpty) {
|
if (value.isNotEmpty) {
|
||||||
setState(() {
|
setState(() {
|
||||||
itemName = value;
|
itemName = value;
|
||||||
@ -641,7 +587,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClear: () {
|
onClear: () {
|
||||||
_fetchCount = 0;
|
|
||||||
setState(() {
|
setState(() {
|
||||||
inputItem.clear();
|
inputItem.clear();
|
||||||
itemName = '';
|
itemName = '';
|
||||||
@ -653,8 +598,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
},
|
},
|
||||||
suggestions: suggestionsItem,
|
suggestions: suggestionsItem,
|
||||||
onSuggestionTap: (suggestion) async {
|
onSuggestionTap: (suggestion) async {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
itemName = suggestion['name'];
|
itemName = suggestion['name'];
|
||||||
inputItem.text = itemName;
|
inputItem.text = itemName;
|
||||||
@ -670,8 +613,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
controller: inputTags,
|
controller: inputTags,
|
||||||
labelText: 'Search by tags',
|
labelText: 'Search by tags',
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
if (value.isNotEmpty) {
|
if (value.isNotEmpty) {
|
||||||
setState(() {
|
setState(() {
|
||||||
itemTags = value;
|
itemTags = value;
|
||||||
@ -689,7 +630,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClear: () {
|
onClear: () {
|
||||||
_fetchCount = 0;
|
|
||||||
setState(() {
|
setState(() {
|
||||||
inputTags.clear();
|
inputTags.clear();
|
||||||
});
|
});
|
||||||
@ -697,8 +637,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
},
|
},
|
||||||
suggestions: suggestionsTags,
|
suggestions: suggestionsTags,
|
||||||
onSuggestionTap: (suggestion) async {
|
onSuggestionTap: (suggestion) async {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
itemTags = suggestion['name'];
|
itemTags = suggestion['name'];
|
||||||
inputTags.text = itemTags;
|
inputTags.text = itemTags;
|
||||||
@ -722,8 +660,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
controller: inputGeo,
|
controller: inputGeo,
|
||||||
labelText: 'Search by geographical zone',
|
labelText: 'Search by geographical zone',
|
||||||
onChanged: (value) async {
|
onChanged: (value) async {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
if (value.isNotEmpty) {
|
if (value.isNotEmpty) {
|
||||||
setState(() {
|
setState(() {
|
||||||
geographicalZone = value;
|
geographicalZone = value;
|
||||||
@ -745,8 +681,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onClear: () async {
|
onClear: () async {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
final prefs = await SharedPreferences.getInstance();
|
final prefs = await SharedPreferences.getInstance();
|
||||||
prefs.remove("city_lat");
|
prefs.remove("city_lat");
|
||||||
prefs.remove("city_long");
|
prefs.remove("city_long");
|
||||||
@ -762,8 +696,6 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
},
|
},
|
||||||
suggestions: suggestionsGeo,
|
suggestions: suggestionsGeo,
|
||||||
onSuggestionTap: (suggestion) async {
|
onSuggestionTap: (suggestion) async {
|
||||||
_fetchCount = 0;
|
|
||||||
|
|
||||||
final latitude = suggestion['geometry']['coordinates'][1];
|
final latitude = suggestion['geometry']['coordinates'][1];
|
||||||
final longitude = suggestion['geometry']['coordinates'][0];
|
final longitude = suggestion['geometry']['coordinates'][0];
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -838,22 +770,12 @@ class _MyHomePageState extends State<ListItemMenu> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return ListView.separated(
|
return ListView.separated(
|
||||||
controller: _scrollController,
|
itemCount: displayedPosts.length,
|
||||||
itemCount: displayedPosts.isNotEmpty
|
|
||||||
? displayedPosts.length +
|
|
||||||
(_isLoading ? 1 : 0) // Add 1 only if loading
|
|
||||||
: 0,
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (index >= displayedPosts.length) {
|
|
||||||
return _isLoading
|
|
||||||
? Center(child: CircularProgressIndicator())
|
|
||||||
: SizedBox.shrink();
|
|
||||||
}
|
|
||||||
final post = displayedPosts[index];
|
final post = displayedPosts[index];
|
||||||
final startDate = DateTime.parse(post.startDate!);
|
final startDate = DateTime.parse(post.startDate!);
|
||||||
final date = DateFormat.yMd().format(startDate);
|
final date = DateFormat.yMd().format(startDate);
|
||||||
final time = DateFormat.Hm().format(startDate);
|
final time = DateFormat.Hm().format(startDate);
|
||||||
|
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text('${post.name!}'),
|
title: Text('${post.name!}'),
|
||||||
subtitle: Text('${post.place!}\n${date} ${time}'),
|
subtitle: Text('${post.place!}\n${date} ${time}'),
|
||||||
|
@ -13,10 +13,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: args
|
name: args
|
||||||
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
|
sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.7.0"
|
version: "2.6.0"
|
||||||
asn1lib:
|
asn1lib:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user