Added socket-io client to mobile app

This commit is contained in:
Alex Tran 2022-02-13 23:34:58 -06:00
parent 3384fdcc6c
commit 9bce627c98
6 changed files with 109 additions and 3 deletions

View file

@ -5,6 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/routing/router.dart';
import 'package:immich_mobile/shared/providers/app_state.provider.dart';
import 'package:immich_mobile/shared/providers/backup.provider.dart';
import 'package:immich_mobile/shared/providers/websocket.provider.dart';
import 'constants/hive_box.dart';
import 'package:google_fonts/google_fonts.dart';
@ -38,6 +39,7 @@ class _ImmichAppState extends ConsumerState<ImmichApp> with WidgetsBindingObserv
debugPrint("[APP STATE] resumed");
ref.read(appStateProvider.notifier).state = AppStateEnum.resumed;
ref.read(backupProvider.notifier).resumeBackup();
ref.read(websocketProvider.notifier).connect();
break;
case AppLifecycleState.inactive:
debugPrint("[APP STATE] inactive");

View file

@ -10,8 +10,9 @@ import 'package:photo_manager/photo_manager.dart';
class AssetNotifier extends StateNotifier<List<ImmichAsset>> {
final AssetService _assetService = AssetService();
final DeviceInfoService _deviceInfoService = DeviceInfoService();
final Ref ref;
AssetNotifier() : super([]);
AssetNotifier(this.ref) : super([]);
getAllAsset() async {
List<ImmichAsset>? allAssets = await _assetService.getAllAsset();
@ -43,7 +44,6 @@ class AssetNotifier extends StateNotifier<List<ImmichAsset>> {
}
final List<String> result = await PhotoManager.editor.deleteWithIds(deleteIdList);
print(result);
// Delete asset on server
List<DeleteAssetResponse>? deleteAssetResult = await _assetService.deleteAssets(deleteAssets);
@ -62,7 +62,7 @@ class AssetNotifier extends StateNotifier<List<ImmichAsset>> {
final currentLocalPageProvider = StateProvider<int>((ref) => 0);
final assetProvider = StateNotifierProvider<AssetNotifier, List<ImmichAsset>>((ref) {
return AssetNotifier();
return AssetNotifier(ref);
});
final assetGroupByDateTimeProvider = StateProvider((ref) {

View file

@ -11,6 +11,7 @@ import 'package:immich_mobile/modules/home/ui/immich_sliver_appbar.dart';
import 'package:immich_mobile/modules/home/ui/monthly_title_text.dart';
import 'package:immich_mobile/modules/home/ui/profile_drawer.dart';
import 'package:immich_mobile/modules/home/providers/asset.provider.dart';
import 'package:immich_mobile/shared/providers/websocket.provider.dart';
import 'package:sliver_tools/sliver_tools.dart';
class HomePage extends HookConsumerWidget {
@ -25,6 +26,7 @@ class HomePage extends HookConsumerWidget {
var homePageState = ref.watch(homePageStateProvider);
useEffect(() {
ref.read(websocketProvider.notifier).connect();
ref.read(assetProvider.notifier).getAllAsset();
return null;
}, []);

View file

@ -0,0 +1,87 @@
import 'package:hive/hive.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:socket_io_client/socket_io_client.dart';
import 'package:immich_mobile/constants/hive_box.dart';
import 'package:immich_mobile/modules/login/providers/authentication.provider.dart';
class WebscoketState {
final Socket? socket;
final bool isConnected;
WebscoketState({
this.socket,
required this.isConnected,
});
WebscoketState copyWith({
Socket? socket,
bool? isConnected,
}) {
return WebscoketState(
socket: socket ?? this.socket,
isConnected: isConnected ?? this.isConnected,
);
}
@override
String toString() => 'WebscoketState(socket: $socket, isConnected: $isConnected)';
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is WebscoketState && other.socket == socket && other.isConnected == isConnected;
}
@override
int get hashCode => socket.hashCode ^ isConnected.hashCode;
}
class WebsocketNotifier extends StateNotifier<WebscoketState> {
WebsocketNotifier(this.ref) : super(WebscoketState(socket: null, isConnected: false));
final Ref ref;
connect() {
var authenticationState = ref.watch(authenticationProvider);
if (authenticationState.isAuthenticated) {
var accessToken = Hive.box(userInfoBox).get(accessTokenKey);
try {
// Configure socket transports must be sepecified
Socket socket = io(
'http://192.168.1.216:2283/${authenticationState.userId}',
OptionBuilder()
.setTransports(['websocket'])
.enableReconnection()
.enableAutoConnect()
.setExtraHeaders({"Authorization": "Bearer $accessToken"})
.build(),
);
socket.onConnect((_) {
state = WebscoketState(isConnected: true, socket: socket);
});
socket.onDisconnect((_) {
state = WebscoketState(isConnected: false, socket: null);
});
socket.onError((data) => print("error connect to web socket $data"));
socket.on('on_connected', (data) => print("on connect msg from server $data"));
socket.on(
'on_upload_success',
(data) => print("on new asset $data"),
);
} catch (e) {
print(e.toString());
}
}
}
}
final websocketProvider = StateNotifierProvider<WebsocketNotifier, WebscoketState>((ref) {
return WebsocketNotifier(ref);
});

View file

@ -742,6 +742,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.5"
socket_io_client:
dependency: "direct main"
description:
name: socket_io_client
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0-beta.4-nullsafety.0"
socket_io_common:
dependency: transitive
description:
name: socket_io_common
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
source_gen:
dependency: transitive
description:

View file

@ -33,6 +33,7 @@ dependencies:
sliver_tools: ^0.2.5
badges: ^2.0.2
photo_view: ^0.13.0
socket_io_client: ^2.0.0-beta.4-nullsafety.0
dev_dependencies:
flutter_test: