#Real Time Subscription

7 messages · Page 1 of 1 (latest)

tepid gorge
#

when my internet is cut and reconnect,
the subscription is changed and i do not get the updates
how can i reconnect to the subscription or how can i close it

reef quartz
#

Then you can listen for online again, and on reconnect, either reload the page, or recreate the subscribe.

split tartan
#

You can still adapt the procedure of @reef quartz in flutter but that depends on what state management your app used. In instance, if riverpod you can actually use the AutoDisposeAsyncNotifier here. and call the ref.invalidate to refresh the provider

reef quartz
split tartan
#

final consultationRolesControllerProvider =
    AutoDisposeAsyncNotifierProvider<ConsultationRolesController, List<Role>>(
        () => throw UnimplementedError());

class ConsultationRolesController extends AutoDisposeAsyncNotifier<List<Role>> {
  @override
  FutureOr<List<Role>> build() async {
    state = const AsyncValue.loading();

    ref.onDispose(() {
      _subscription?.cancel();
    });

    final consultId = ref.read(consultationdIdProvider);

    final roles = await ref.read(consultationRepoProvider).getRoles(queries: [
      Query.equal("consultationRef", consultId),
    ]);

    roles.removeWhere((element) => element.name == "owner");

    subscribe();

    return roles;
  }

  StreamSubscription<ConsultationRealtime<ConsultationRole>>? _subscription;

  void subscribe() {
    _subscription = ref
        .read(consultationRepoProvider)
        .getConsultationRoleStream(
          Realtime(AppwriteClient.instance.client),
        )
        .listen((roles) => _rolesListener(roles),
            onError: _rolesErrorListener, cancelOnError: true);
  }

  void _rolesErrorListener(Object error, StackTrace stackTrace) {
    state = AsyncValue.error(error, stackTrace);
  }

  void _rolesListener(ConsultationRealtime<ConsultationRole> roles) {
    if (roles.type == ConsultationRealtimeType.create) {
      final merge = [...state.value!, roles.data];
      state = AsyncData(merge);
    } else if (roles.type == ConsultationRealtimeType.delete) {
      final merge = [...state.value!];
      merge.removeWhere((element) => element.id == roles.data.id);
      state = AsyncData(merge);
    } else if (roles.type == ConsultationRealtimeType.update) {
      final merge = [...state.value!];
      final index = merge.indexWhere((element) => element.id == roles.data.id);
      merge[index] = roles.data;
      state = AsyncData(merge);
    }
  }