From a66f13f1d74b1a48402f25d32af223a6df0f6095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20K=C4=85dzio=C5=82ka?= Date: Fri, 23 Dec 2022 09:59:53 +0100 Subject: [PATCH 1/2] Corrected navigation --- .../bridge/detail/DetailModel.kt | 4 +-- .../snipmeandroid/bridge/main/MainModel.kt | 7 +---- .../snipmeandroid/di/ModelModule.kt | 2 +- .../domain/snippet/DeleteSnippetUseCase.kt | 5 ++-- .../navigation/details/details_navigator.dart | 1 - .../presentation/screens/details_screen.dart | 30 +++++++++++-------- 6 files changed, 25 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt index 6971c51..0a6a026 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt @@ -111,12 +111,12 @@ class DetailModel( .subscribeOn(Schedulers.io()) .subscribeBy( onComplete = { + Timber.d("Deleted ${it.uuid}") mutableEvent.value = Deleted }, onError = { error -> - Timber.e("Couldn't save snippet, error = $error") + Timber.e("Couldn't delete snippet, error = $error") parseError(error) - mutableEvent.value = Deleted } ).also { disposables += it } } diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt index 557033f..c2ef6ea 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt @@ -42,7 +42,6 @@ class MainModel( private var cachedSnippets = emptyList() private var scopedSnippets = emptyList() - private var shouldRefresh = false private lateinit var filterState: SnippetFilters; override fun parseError(throwable: Throwable) { @@ -66,7 +65,7 @@ class MainModel( .subscribeOn(Schedulers.io()) .subscribeBy( onNext = { updatedPage -> - initState() +// initState() }, onError = { Timber.e("Couldn't refresh snippet updates, error = $it") } ).also { disposables += it } @@ -155,10 +154,6 @@ class MainModel( filterState ) loadNextPage() - if (shouldRefresh) { - mutableEvent.value = ListRefreshed - shouldRefresh = false - } }, onError = { Timber.e("Couldn't load snippets, error = $it") diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/di/ModelModule.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/di/ModelModule.kt index 955874b..87f3dd1 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/di/ModelModule.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/di/ModelModule.kt @@ -9,6 +9,6 @@ import pl.tkadziolka.snipmeandroid.bridge.session.SessionModel internal val modelModule = module { single { SessionModel(get()) } single { LoginModel(get(), get(), get()) } - single { MainModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) } + single { MainModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) } single { DetailModel(get(), get(), get(), get(), get(), get(), get(), get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt index 8cb6d76..1e3aab5 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt @@ -1,12 +1,13 @@ package pl.tkadziolka.snipmeandroid.domain.snippet +import io.reactivex.Completable import pl.tkadziolka.snipmeandroid.domain.repository.snippet.SnippetRepository import pl.tkadziolka.snipmeandroid.domain.snippets.Snippet class DeleteSnippetUseCase(private val repository: SnippetRepository) { - operator fun invoke(uuid: String) = + operator fun invoke(uuid: String): Completable = repository .delete(uuid) - .andThen { repository.updateListener.onNext(Snippet.EMPTY) } +// .doOnComplete { repository.updateListener.onNext(Snippet.EMPTY.copy(uuid)) } } \ No newline at end of file diff --git a/flutter_module/lib/presentation/navigation/details/details_navigator.dart b/flutter_module/lib/presentation/navigation/details/details_navigator.dart index ab7ee0c..f937a15 100644 --- a/flutter_module/lib/presentation/navigation/details/details_navigator.dart +++ b/flutter_module/lib/presentation/navigation/details/details_navigator.dart @@ -13,6 +13,5 @@ class DetailsNavigator extends ScreenNavigator { void goToDetails(BuildContext context, String snippetId) { _snippetId = snippetId; router.push(DetailsScreen.name.route); - print("Navigated to $_snippetId"); } } diff --git a/flutter_module/lib/presentation/screens/details_screen.dart b/flutter_module/lib/presentation/screens/details_screen.dart index 53ad98b..924758f 100644 --- a/flutter_module/lib/presentation/screens/details_screen.dart +++ b/flutter_module/lib/presentation/screens/details_screen.dart @@ -62,20 +62,26 @@ class _DetailsPage extends HookWidget { (current, newState) => (current as DetailModelEventData).equals(newState), ).value; - if (event.event == DetailModelEvent.saved) { - final snippetId = event.value; - if (snippetId == null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (event.event == DetailModelEvent.saved) { + final snippetId = event.value; + if (snippetId == null) { + _exit(); + return; + } + _exit(); - return const SizedBox(); + WidgetsBinding.instance.addPostFrameCallback((_) { + navigator.goToDetails(context, snippetId); + }); } + }); - _exit(); - navigator.goToDetails(context, snippetId); - } - - if (event.event == DetailModelEvent.deleted) { - _exit(); - } + WidgetsBinding.instance.addPostFrameCallback((_) { + if (event.event == DetailModelEvent.deleted) { + _exit(); + } + }); useEffect(() { model.load(navigator.snippetId ?? ''); @@ -111,8 +117,8 @@ class _DetailsPage extends HookWidget { } void _exit() { - navigator.back(); model.resetEvent(); + navigator.back(); } } From e77d28d2778368c60ef78c454e30ca9144a2091d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20K=C4=85dzio=C5=82ka?= Date: Fri, 23 Dec 2022 10:27:08 +0100 Subject: [PATCH 2/2] Simplified observing changes --- .../snipmeandroid/bridge/detail/DetailModel.kt | 5 +---- .../pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt | 9 ++++----- .../java/pl/tkadziolka/snipmeandroid/di/UseCaseModule.kt | 1 + .../snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt | 2 +- .../domain/snippet/ObserveSnippetUpdatesUseCase.kt | 9 +++++++++ 5 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/ObserveSnippetUpdatesUseCase.kt diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt index 0a6a026..3b1721b 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/detail/DetailModel.kt @@ -110,10 +110,7 @@ class DetailModel( deleteSnippet(it.uuid) .subscribeOn(Schedulers.io()) .subscribeBy( - onComplete = { - Timber.d("Deleted ${it.uuid}") - mutableEvent.value = Deleted - }, + onComplete = { mutableEvent.value = Deleted }, onError = { error -> Timber.e("Couldn't delete snippet, error = $error") parseError(error) diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt index c2ef6ea..4ac150a 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModel.kt @@ -9,6 +9,7 @@ import pl.tkadziolka.snipmeandroid.bridge.session.SessionModel import pl.tkadziolka.snipmeandroid.domain.error.exception.* import pl.tkadziolka.snipmeandroid.domain.filter.* import pl.tkadziolka.snipmeandroid.domain.message.ErrorMessages +import pl.tkadziolka.snipmeandroid.domain.snippet.ObserveSnippetUpdatesUseCase import pl.tkadziolka.snipmeandroid.domain.snippet.ObserveUpdatedSnippetPageUseCase import pl.tkadziolka.snipmeandroid.domain.snippet.ResetUpdatedSnippetPageUseCase import pl.tkadziolka.snipmeandroid.domain.snippets.* @@ -24,7 +25,7 @@ class MainModel( private val errorMessages: ErrorMessages, private val getUser: GetSingleUserUseCase, private val getSnippets: GetSnippetsUseCase, - private val observeUpdatedPage: ObserveUpdatedSnippetPageUseCase, + private val observeUpdates: ObserveSnippetUpdatesUseCase, private val hasMore: HasMoreSnippetPagesUseCase, private val getLanguageFilters: GetLanguageFiltersUseCase, private val filterSnippetsByLanguage: FilterSnippetsByLanguageUseCase, @@ -61,12 +62,10 @@ class MainModel( } init { - observeUpdatedPage(getScope()) + observeUpdates() .subscribeOn(Schedulers.io()) .subscribeBy( - onNext = { updatedPage -> -// initState() - }, + onNext = { initState() }, onError = { Timber.e("Couldn't refresh snippet updates, error = $it") } ).also { disposables += it } } diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/di/UseCaseModule.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/di/UseCaseModule.kt index dc31770..65704ac 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/di/UseCaseModule.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/di/UseCaseModule.kt @@ -41,6 +41,7 @@ internal val useCaseModule = module { factory { CreateSnippetUseCase(get(), get(), get()) } factory { UpdateSnippetUseCase(get(), get(), get()) } factory { ObserveUpdatedSnippetPageUseCase(get()) } + factory { ObserveSnippetUpdatesUseCase(get()) } factory { ResetUpdatedSnippetPageUseCase(get()) } factory { GetTargetUserReactionUseCase() } factory { SetUserReactionUseCase(get(), get(), get()) } diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt index 1e3aab5..0cb0bf5 100644 --- a/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/DeleteSnippetUseCase.kt @@ -9,5 +9,5 @@ class DeleteSnippetUseCase(private val repository: SnippetRepository) { operator fun invoke(uuid: String): Completable = repository .delete(uuid) -// .doOnComplete { repository.updateListener.onNext(Snippet.EMPTY.copy(uuid)) } + .doOnComplete { repository.updateListener.onNext(Snippet.EMPTY.copy(uuid)) } } \ No newline at end of file diff --git a/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/ObserveSnippetUpdatesUseCase.kt b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/ObserveSnippetUpdatesUseCase.kt new file mode 100644 index 0000000..354ccde --- /dev/null +++ b/app/src/main/java/pl/tkadziolka/snipmeandroid/domain/snippet/ObserveSnippetUpdatesUseCase.kt @@ -0,0 +1,9 @@ +package pl.tkadziolka.snipmeandroid.domain.snippet + +import io.reactivex.Observable +import pl.tkadziolka.snipmeandroid.domain.repository.snippet.SnippetRepository +import pl.tkadziolka.snipmeandroid.domain.snippets.Snippet + +class ObserveSnippetUpdatesUseCase(private val repository: SnippetRepository) { + operator fun invoke(): Observable = repository.updateListener.share() +} \ No newline at end of file