import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:neon/sync.dart'; import 'package:nextcloud/webdav.dart' as webdav; import 'package:nextcloud/webdav.dart'; import 'package:universal_io/io.dart'; import 'package:watcher/watcher.dart'; part 'mapping.g.dart'; @JsonSerializable() class FilesSyncMapping implements SyncMapping { FilesSyncMapping({ required this.accountId, required this.appId, required this.journal, required this.remotePath, required this.localPath, }); factory FilesSyncMapping.fromJson(final Map json) => _$FilesSyncMappingFromJson(json); Map toJson() => _$FilesSyncMappingToJson(this); @override final String accountId; @override final String appId; @override final SyncJournal journal; final PathUri remotePath; @JsonKey( fromJson: _directoryFromJson, toJson: _directoryToJson, ) final Directory localPath; static Directory _directoryFromJson(final String value) => Directory(value); static String _directoryToJson(final Directory value) => value.path; StreamSubscription? _subscription; @override void watch(final void Function() onUpdated) { debugPrint('Watching file changes: $localPath'); _subscription ??= DirectoryWatcher(localPath.path).events.listen( (final event) { debugPrint('Registered file change: ${event.path} ${event.type}'); onUpdated(); }, ); } @override void dispose() { unawaited(_subscription?.cancel()); } }