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
+13
View File
@@ -33,6 +33,7 @@ import 'state/app/modules/breaker/bloc/breaker_bloc.dart';
import 'state/app/modules/capabilities/bloc/capabilities_cubit.dart';
import 'state/app/modules/chat/bloc/chat_bloc.dart';
import 'state/app/modules/chat_list/bloc/chat_list_bloc.dart';
import 'state/app/modules/nextcloud_capabilities/bloc/nextcloud_capabilities_cubit.dart';
import 'state/app/modules/settings/bloc/settings_cubit.dart';
import 'state/app/modules/timetable/bloc/timetable_bloc.dart';
import 'storage/settings.dart';
@@ -161,6 +162,9 @@ Future<void> main() async {
),
BlocProvider<BreakerBloc>(create: (_) => BreakerBloc()),
BlocProvider<CapabilitiesCubit>(create: (_) => CapabilitiesCubit()),
BlocProvider<NextcloudCapabilitiesCubit>(
create: (_) => NextcloudCapabilitiesCubit(),
),
BlocProvider<ChatListBloc>(create: (_) => ChatListBloc()),
BlocProvider<ChatBloc>(
create: (ctx) => ChatBloc(chatListBloc: ctx.read<ChatListBloc>()),
@@ -201,6 +205,7 @@ class _MainState extends State<Main> {
// change, so the loggedIn listener below never fires — refresh
// capabilities here.
unawaited(context.read<CapabilitiesCubit>().load());
unawaited(context.read<NextcloudCapabilitiesCubit>().load());
}
});
}
@@ -274,6 +279,9 @@ class _MainState extends State<Main> {
// for the newly authenticated user.
if (accountState.status == AccountStatus.loggedIn) {
unawaited(context.read<CapabilitiesCubit>().load());
unawaited(
context.read<NextcloudCapabilitiesCubit>().load(),
);
}
if (accountState.status != AccountStatus.loggedOut) return;
// A pending share would otherwise survive logout and be
@@ -297,6 +305,8 @@ class _MainState extends State<Main> {
final chatBloc = context.read<ChatBloc>();
final breakerBloc = context.read<BreakerBloc>();
final capabilitiesCubit = context.read<CapabilitiesCubit>();
final nextcloudCapabilitiesCubit = context
.read<NextcloudCapabilitiesCubit>();
// Defer the actual wipe until after this frame so the
// App tree (TimetableBloc/ChatListBloc watchers etc.)
// is already torn down. Resetting blocs while App is
@@ -310,6 +320,7 @@ class _MainState extends State<Main> {
chatBloc: chatBloc,
breakerBloc: breakerBloc,
capabilitiesCubit: capabilitiesCubit,
nextcloudCapabilitiesCubit: nextcloudCapabilitiesCubit,
),
);
});
@@ -355,6 +366,7 @@ Future<void> _wipeUserState({
required ChatBloc chatBloc,
required BreakerBloc breakerBloc,
required CapabilitiesCubit capabilitiesCubit,
required NextcloudCapabilitiesCubit nextcloudCapabilitiesCubit,
}) async {
try {
// Reset user-data blocs whose tree is no longer mounted after the
@@ -368,6 +380,7 @@ Future<void> _wipeUserState({
chatBloc.reset(),
breakerBloc.reset(),
capabilitiesCubit.reset(),
nextcloudCapabilitiesCubit.reset(),
]);
final prefs = await SharedPreferences.getInstance();
await prefs.clear();