mirror of
https://github.com/rzuasti/oott.git
synced 2026-07-08 19:21:54 +02:00
Fold pagination +1 trick into API methods, return typed records
Remove dead _pageSize from BackendAPI and centralise the
"fetch perPage+1, detect hasNextPage, trim" logic into
listDevices and listNotifications. Both methods now accept
page/perPage and return ({items, hasNextPage}) records,
eliminating the duplicated boilerplate at each call site.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
f75d1ce313
commit
8be65f3ffa
@@ -89,21 +89,21 @@ class _DeviceListState extends State<DeviceList> with RouteAware {
|
|||||||
if (_filter == DeviceFilter.newDevices) isRegistered = false;
|
if (_filter == DeviceFilter.newDevices) isRegistered = false;
|
||||||
if (_filter == DeviceFilter.registered) isRegistered = true;
|
if (_filter == DeviceFilter.registered) isRegistered = true;
|
||||||
|
|
||||||
final results = await BackendAPI.instance.listDevices(
|
final result = await BackendAPI.instance.listDevices(
|
||||||
isRegistered: isRegistered,
|
isRegistered: isRegistered,
|
||||||
owner: _ownerController.text.isEmpty ? null : _ownerController.text,
|
owner: _ownerController.text.isEmpty ? null : _ownerController.text,
|
||||||
deviceType: _typeFilter,
|
deviceType: _typeFilter,
|
||||||
sortBy: _sortColumn.apiName,
|
sortBy: _sortColumn.apiName,
|
||||||
sortAscending: _sortAscending,
|
sortAscending: _sortAscending,
|
||||||
offset: page * _pageSize,
|
page: page,
|
||||||
limit: _pageSize + 1,
|
perPage: _pageSize,
|
||||||
cancelToken: token,
|
cancelToken: token,
|
||||||
);
|
);
|
||||||
if (!mounted || token != _fetchToken) return;
|
if (!mounted || token != _fetchToken) return;
|
||||||
setState(() {
|
setState(() {
|
||||||
_currentPage = page;
|
_currentPage = page;
|
||||||
_hasNextPage = results.length > _pageSize;
|
_hasNextPage = result.hasNextPage;
|
||||||
_devices = _hasNextPage ? results.take(_pageSize).toList() : results;
|
_devices = result.items;
|
||||||
_isLoading = false;
|
_isLoading = false;
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -115,17 +115,17 @@ class _NotificationsListState extends State<NotificationsList>
|
|||||||
_error = null;
|
_error = null;
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
final results = await BackendAPI.instance.listNotifications(
|
final result = await BackendAPI.instance.listNotifications(
|
||||||
_filter.isNew,
|
_filter.isNew,
|
||||||
page * _pageSize,
|
page: page,
|
||||||
limit: _pageSize + 1,
|
perPage: _pageSize,
|
||||||
cancelToken: token,
|
cancelToken: token,
|
||||||
);
|
);
|
||||||
if (!mounted || token != _fetchToken) return;
|
if (!mounted || token != _fetchToken) return;
|
||||||
setState(() {
|
setState(() {
|
||||||
_currentPage = page;
|
_currentPage = page;
|
||||||
_hasNextPage = results.length > _pageSize;
|
_hasNextPage = result.hasNextPage;
|
||||||
_items = _hasNextPage ? results.take(_pageSize).toList() : results;
|
_items = result.items;
|
||||||
_isLoading = false;
|
_isLoading = false;
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -82,8 +82,6 @@ String dioErrorToUserMessage(Object error) {
|
|||||||
|
|
||||||
class BackendAPI {
|
class BackendAPI {
|
||||||
static final BackendAPI _instance = BackendAPI._internal();
|
static final BackendAPI _instance = BackendAPI._internal();
|
||||||
static const _pageSize = 5;
|
|
||||||
|
|
||||||
static BackendAPI get instance => _instance;
|
static BackendAPI get instance => _instance;
|
||||||
|
|
||||||
BackendAPI._internal() {
|
BackendAPI._internal() {
|
||||||
@@ -162,14 +160,14 @@ class BackendAPI {
|
|||||||
return Device.fromJson(response.data as Map<String, dynamic>);
|
return Device.fromJson(response.data as Map<String, dynamic>);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<Device>> listDevices({
|
Future<({List<Device> items, bool hasNextPage})> listDevices({
|
||||||
bool? isRegistered,
|
bool? isRegistered,
|
||||||
String? owner,
|
String? owner,
|
||||||
DeviceType? deviceType,
|
DeviceType? deviceType,
|
||||||
String? sortBy,
|
String? sortBy,
|
||||||
bool? sortAscending,
|
bool? sortAscending,
|
||||||
int? offset,
|
int page = 0,
|
||||||
int? limit,
|
int perPage = 10,
|
||||||
CancelToken? cancelToken,
|
CancelToken? cancelToken,
|
||||||
}) async {
|
}) async {
|
||||||
final params = <String, dynamic>{};
|
final params = <String, dynamic>{};
|
||||||
@@ -184,10 +182,8 @@ class BackendAPI {
|
|||||||
if (sortAscending != null) {
|
if (sortAscending != null) {
|
||||||
params['sort_order'] = sortAscending ? 'asc' : 'desc';
|
params['sort_order'] = sortAscending ? 'asc' : 'desc';
|
||||||
}
|
}
|
||||||
if (offset != null) {
|
params['page_offset'] = page * perPage;
|
||||||
params['page_offset'] = offset;
|
params['page_limit'] = perPage + 1;
|
||||||
params['page_limit'] = limit ?? _pageSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
final response = await _dio.get(
|
final response = await _dio.get(
|
||||||
'/devices',
|
'/devices',
|
||||||
@@ -195,9 +191,14 @@ class BackendAPI {
|
|||||||
cancelToken: cancelToken,
|
cancelToken: cancelToken,
|
||||||
);
|
);
|
||||||
|
|
||||||
return (response.data as List)
|
final results = (response.data as List)
|
||||||
.map((item) => Device.fromJson(item as Map<String, dynamic>))
|
.map((item) => Device.fromJson(item as Map<String, dynamic>))
|
||||||
.toList();
|
.toList();
|
||||||
|
final hasNextPage = results.length > perPage;
|
||||||
|
return (
|
||||||
|
items: hasNextPage ? results.take(perPage).toList() : results,
|
||||||
|
hasNextPage: hasNextPage,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> registerDevice(
|
Future<void> registerDevice(
|
||||||
@@ -284,25 +285,29 @@ class BackendAPI {
|
|||||||
return MdnsScannerStatus.fromJson(response.data as Map<String, dynamic>);
|
return MdnsScannerStatus.fromJson(response.data as Map<String, dynamic>);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<Notification>> listNotifications(
|
Future<({List<Notification> items, bool hasNextPage})> listNotifications(
|
||||||
bool? isNew,
|
bool? isNew, {
|
||||||
int offset, {
|
int page = 0,
|
||||||
int? limit,
|
int perPage = 5,
|
||||||
CancelToken? cancelToken,
|
CancelToken? cancelToken,
|
||||||
}) async {
|
}) async {
|
||||||
final response = await _dio.get(
|
final response = await _dio.get(
|
||||||
'/notifications',
|
'/notifications',
|
||||||
queryParameters: {
|
queryParameters: {
|
||||||
'is_new': isNew ?? '',
|
'is_new': isNew ?? '',
|
||||||
'page_offset': offset,
|
'page_offset': page * perPage,
|
||||||
'page_limit': limit ?? _pageSize,
|
'page_limit': perPage + 1,
|
||||||
},
|
},
|
||||||
cancelToken: cancelToken,
|
cancelToken: cancelToken,
|
||||||
);
|
);
|
||||||
|
|
||||||
final list = response.data as List<dynamic>;
|
final results = (response.data as List<dynamic>)
|
||||||
return List<Notification>.from(
|
.map((item) => Notification.fromJson(item))
|
||||||
list.map((item) => Notification.fromJson(item)),
|
.toList();
|
||||||
|
final hasNextPage = results.length > perPage;
|
||||||
|
return (
|
||||||
|
items: hasNextPage ? results.take(perPage).toList() : results,
|
||||||
|
hasNextPage: hasNextPage,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user