implemented a comprehensive Nextcloud file sharing system with support for user, group, and public link shares with gating based on server-side permissions; added sharing management interfaces including a share sheet; updated the file list with visual badges for incoming shares and improved OCS API response handling.

This commit is contained in:
2026-06-02 21:42:08 +02:00
parent b6d06dd3b4
commit baa26a6e79
33 changed files with 2453 additions and 29 deletions
@@ -3,25 +3,39 @@ import 'dart:io';
import 'package:http/http.dart' as http;
import '../../../model/endpoint_data.dart';
import '../../errors/server_exception.dart';
import '../nextcloud_ocs.dart';
import 'autocomplete_response.dart';
class AutocompleteApi {
Future<AutocompleteResponse> find(String query) async {
final endpoint = NextcloudOcs.uri(
'core/autocomplete/get',
queryParameters: {
/// Searches sharees (users by default). Pass [shareTypes] to widen the search
/// — e.g. `[0, 1]` for both users and groups (0 = user, 1 = group).
Future<AutocompleteResponse> find(
String query, {
List<int> shareTypes = const [0],
}) async {
// NextcloudOcs.uri serialises every query value via `toString()`, which
// would turn the `shareTypes[]` list into `"[0, 1]"`. Build the Uri here so
// Dart encodes the list as repeated `shareTypes[]=0&shareTypes[]=1` params.
final endpoint = EndpointData().nextcloud();
final uri = Uri.https(
endpoint.domain,
'${endpoint.path}/ocs/v2.php/core/autocomplete/get',
{
'format': 'json',
'search': query,
'itemType': ' ',
'itemId': ' ',
'shareTypes[]': ['0'],
'shareTypes[]': shareTypes.map((t) => t.toString()).toList(),
'limit': '10',
},
);
final response = await http.get(endpoint, headers: NextcloudOcs.headers());
final response = await http.get(uri, headers: NextcloudOcs.headers());
if (response.statusCode != HttpStatus.ok) {
throw Exception(
'Api call failed with ${response.statusCode}: ${response.body}',
throw ServerException(
statusCode: response.statusCode,
technicalDetails: 'core/autocomplete/get: ${response.body}',
);
}
final decoded = jsonDecode(response.body) as Map<String, dynamic>;