Skip to content

Commit 29547e5

Browse files
author
Patrick Jackson
committed
[WIP] refactor presenters to functions
1 parent 9cc84aa commit 29547e5

File tree

21 files changed

+225
-328
lines changed

21 files changed

+225
-328
lines changed

android/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ dependencies {
7474
implementation 'nl.dionsegijn:konfetti:1.1.2'
7575
implementation "com.russhwolf:multiplatform-settings:$multiplatformSettingsVersion"
7676
implementation "com.squareup.sqldelight:android-driver:$sqldelightVersion"
77+
implementation "org.reduxkotlin:redux-kotlin:0.2.2"
7778

7879

7980
kapt 'com.github.bumptech.glide:compiler:4.8.0'

android/src/main/java/com/jackson/openlibrary/store/BaseLibraryViewFragment.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@ package com.jackson.openlibrary.store
33
import android.os.Bundle
44
import androidx.fragment.app.Fragment
55
import com.willowtreeapps.common.Logger
6-
import com.willowtreeapps.common.ui.Presenter
7-
import com.willowtreeapps.common.ui.View
86
import com.jackson.openlibrary.OpenLibraryApp
7+
import com.willowtreeapps.common.AppState
8+
import com.willowtreeapps.common.SelectorSubscriberBuilder
9+
import com.willowtreeapps.common.ui.LibraryProvider
10+
import com.willowtreeapps.common.ui.LibraryView
911
import kotlinx.coroutines.CoroutineScope
1012
import kotlinx.coroutines.Dispatchers
13+
import org.reduxkotlin.Dispatcher
1114
import kotlin.coroutines.CoroutineContext
1215

13-
open class BaseLibraryViewFragment<TPresenter: Presenter<*>?>: Fragment(), CoroutineScope, View<TPresenter?> {
16+
open class BaseLibraryViewFragment<V: LibraryView>: Fragment(),
17+
CoroutineScope, LibraryView, LibraryProvider by OpenLibraryApp.gameEngine() {
18+
override lateinit var dispatch: Dispatcher
19+
override lateinit var selectorBuilder: SelectorSubscriberBuilder<AppState>
20+
1421
override val coroutineContext: CoroutineContext
1522
get() = Dispatchers.Main
1623

17-
override var presenter: TPresenter? = null
1824
private var viewRecreated: Boolean = false
1925

2026
override fun onViewCreated(view: android.view.View, savedInstanceState: Bundle?) {
@@ -31,7 +37,8 @@ open class BaseLibraryViewFragment<TPresenter: Presenter<*>?>: Fragment(), Corou
3137
super.onResume()
3238
OpenLibraryApp.gameEngine().attachView(this)
3339
if (viewRecreated) {
34-
presenter?.recreateView()
40+
//TODO update view with all state
41+
// presenter?.recreateView()
3542
}
3643
}
3744

android/src/main/java/com/jackson/openlibrary/store/CompletedFragment.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,20 @@ import android.view.ViewGroup
77
import androidx.recyclerview.widget.LinearLayoutManager
88
import com.jackson.openlibrary.OpenLibraryApp
99
import com.jackson.openlibrary.R
10+
import com.willowtreeapps.common.Actions
1011
import com.willowtreeapps.common.BookListItemViewState
11-
import com.willowtreeapps.common.ui.CompletedPresenter
1212
import com.willowtreeapps.common.ui.CompletedView
1313
import kotlinx.android.synthetic.main.fragment_completed.*
14-
import kotlinx.android.synthetic.main.fragment_to_read.*
1514
import kotlinx.android.synthetic.main.fragment_to_read.loading_spinner
1615
import kotlinx.android.synthetic.main.fragment_to_read.txt_error
1716
import kotlinx.coroutines.CoroutineScope
1817
import kotlinx.coroutines.Dispatchers
1918
import kotlin.coroutines.CoroutineContext
2019

21-
class CompletedFragment : BaseLibraryViewFragment<CompletedPresenter?>(), CoroutineScope, CompletedView {
20+
class CompletedFragment : BaseLibraryViewFragment<CompletedView>(), CoroutineScope, CompletedView {
2221
override val coroutineContext: CoroutineContext
2322
get() = Dispatchers.Main
2423

25-
override var presenter: CompletedPresenter? = null
2624
private val adapter = BooksAdapter()
2725

2826
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -37,8 +35,7 @@ class CompletedFragment : BaseLibraryViewFragment<CompletedPresenter?>(), Corout
3735

3836
override fun onResume() {
3937
super.onResume()
40-
OpenLibraryApp.gameEngine().attachView(this)
41-
presenter?.loadBooks()
38+
dispatch(Actions.LoadCompleted())
4239
}
4340

4441
override fun onPause() {

android/src/main/java/com/jackson/openlibrary/store/DetailsFragment.kt

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,39 @@
11
package com.jackson.openlibrary.store
22

33
import android.os.Bundle
4-
import android.text.Editable
5-
import android.text.TextWatcher
64
import android.view.LayoutInflater
75
import android.view.View
86
import android.view.ViewGroup
9-
import androidx.recyclerview.widget.LinearLayoutManager
107
import com.jackson.openlibrary.GlideApp
118
import com.jackson.openlibrary.OpenLibraryApp
129
import com.jackson.openlibrary.R
10+
import com.willowtreeapps.common.Actions
1311
import com.willowtreeapps.common.BookListItemViewState
1412
import com.willowtreeapps.common.ui.*
1513
import kotlinx.android.synthetic.main.fragment_book_detail.*
16-
import kotlinx.android.synthetic.main.fragment_book_detail.view.*
17-
import kotlinx.android.synthetic.main.fragment_search.*
18-
import kotlinx.android.synthetic.main.fragment_to_read.loading_spinner
19-
import kotlinx.android.synthetic.main.fragment_to_read.txt_error
2014
import kotlinx.coroutines.CoroutineScope
2115
import kotlinx.coroutines.Dispatchers
2216
import kotlin.coroutines.CoroutineContext
2317

24-
class DetailsFragment : BaseLibraryViewFragment<DetailsPresenter?>(), CoroutineScope, DetailsView {
18+
class DetailsFragment : BaseLibraryViewFragment<DetailsView>(), CoroutineScope, DetailsView {
2519

2620
override val coroutineContext: CoroutineContext
2721
get() = Dispatchers.Main
2822

29-
override var presenter: DetailsPresenter? = null
3023

3124
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3225
return inflater.inflate(R.layout.fragment_book_detail, container, false)
3326
}
3427

3528
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3629
btnToRead.setOnClickListener {
37-
presenter?.toReadTapped()
30+
dispatch(Actions.LoadToRead())
3831
}
3932
btnCompleted.setOnClickListener {
40-
presenter?.completedTapped()
33+
dispatch(Actions.LoadCompleted())
4134
}
4235
}
4336

44-
override fun onResume() {
45-
super.onResume()
46-
OpenLibraryApp.gameEngine().attachView(this)
47-
}
48-
49-
override fun onPause() {
50-
super.onPause()
51-
OpenLibraryApp.gameEngine().detachView(this)
52-
}
5337
override fun render(book: BookListItemViewState) {
5438
txtTitle.text = book.title
5539
txtAuthorName.text = book.author

android/src/main/java/com/jackson/openlibrary/store/SearchFragment.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
1010
import com.jackson.openlibrary.OpenLibraryApp
1111
import com.jackson.openlibrary.R
1212
import com.willowtreeapps.common.BookListItemViewState
13-
import com.willowtreeapps.common.ui.SearchPresenter
1413
import com.willowtreeapps.common.ui.SearchView
1514
import kotlinx.android.synthetic.main.fragment_search.*
1615
import kotlinx.android.synthetic.main.fragment_to_read.loading_spinner
@@ -20,13 +19,12 @@ import kotlinx.coroutines.Dispatchers
2019
import java.util.*
2120
import kotlin.coroutines.CoroutineContext
2221

23-
class SearchFragment : BaseLibraryViewFragment<SearchPresenter?>(), CoroutineScope, SearchView {
22+
class SearchFragment : BaseLibraryViewFragment<SearchView>(), CoroutineScope, SearchView {
2423
private val adapter = BooksAdapter()
2524

2625
override val coroutineContext: CoroutineContext
2726
get() = Dispatchers.Main
2827

29-
override var presenter: SearchPresenter? = null
3028

3129
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
3230
return inflater.inflate(R.layout.fragment_search, container, false)
@@ -45,8 +43,9 @@ class SearchFragment : BaseLibraryViewFragment<SearchPresenter?>(), CoroutineSco
4543
timer = Timer()
4644
timer?.schedule(object: TimerTask() {
4745
override fun run() {
48-
49-
presenter?.onTextChanged(s.toString())
46+
//could be a regular action with network middleware?
47+
dispatch(OpenLibraryApp.gameEngine().networkThunks.fetchBooks(s.toString()))
48+
// presenter?.onTextChanged(s.toString())
5049
}
5150

5251
}, 1000)
@@ -62,17 +61,6 @@ class SearchFragment : BaseLibraryViewFragment<SearchPresenter?>(), CoroutineSco
6261

6362
})
6463
}
65-
66-
override fun onResume() {
67-
super.onResume()
68-
OpenLibraryApp.gameEngine().attachView(this)
69-
}
70-
71-
override fun onPause() {
72-
super.onPause()
73-
OpenLibraryApp.gameEngine().detachView(this)
74-
}
75-
7664
override fun hideLoading() {
7765
loading_spinner.visibility = View.GONE
7866
}

android/src/main/java/com/jackson/openlibrary/store/ToReadFragment.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,18 @@ import android.view.ViewGroup
77
import androidx.recyclerview.widget.LinearLayoutManager
88
import com.jackson.openlibrary.OpenLibraryApp
99
import com.jackson.openlibrary.R
10+
import com.willowtreeapps.common.Actions
1011
import com.willowtreeapps.common.BookListItemViewState
11-
import com.willowtreeapps.common.repo.Book
12-
import com.willowtreeapps.common.ui.ToReadPresenter
1312
import com.willowtreeapps.common.ui.ToReadView
1413
import kotlinx.android.synthetic.main.fragment_to_read.*
1514
import kotlinx.coroutines.CoroutineScope
1615
import kotlinx.coroutines.Dispatchers
1716
import kotlin.coroutines.CoroutineContext
1817

19-
class ToReadFragment : BaseLibraryViewFragment<ToReadPresenter?>(), CoroutineScope, ToReadView {
18+
class ToReadFragment : BaseLibraryViewFragment<ToReadView>(), CoroutineScope, ToReadView {
2019
override val coroutineContext: CoroutineContext
2120
get() = Dispatchers.Main
2221

23-
override var presenter: ToReadPresenter? = null
2422

2523
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
2624
return inflater.inflate(R.layout.fragment_to_read, container, false)
@@ -35,8 +33,8 @@ class ToReadFragment : BaseLibraryViewFragment<ToReadPresenter?>(), CoroutineSco
3533

3634
override fun onResume() {
3735
super.onResume()
38-
OpenLibraryApp.gameEngine().attachView(this)
39-
presenter?.loadBooks()
36+
dispatch(Actions.LoadToRead())
37+
// presenter?.loadBooks()
4038
}
4139

4240
override fun onPause() {

common/build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ kotlin {
2121
final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
2222
? presets.iosArm64 : presets.iosX64
2323

24+
/*
2425
fromPreset(iOSTarget, 'ios') {
2526
binaries {
2627
framework('common')
2728
}
2829
}
30+
31+
*/
2932
// fromPreset(presets.iosArm64, 'ios') {
3033
// binaries {
3134
// framework('common')
@@ -90,6 +93,7 @@ kotlin {
9093
}
9194
}
9295

96+
/*
9397
iosMain {
9498
dependencies {
9599
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutinesVersion"
@@ -102,6 +106,8 @@ kotlin {
102106
implementation "io.ktor:ktor-client-json-native:$ktorVersion"
103107
}
104108
}
109+
110+
*/
105111
}
106112
}
107113

@@ -123,6 +129,7 @@ android {
123129
}
124130
}
125131

132+
/*
126133
// This task attaches native framework built from ios module to Xcode project
127134
// Don't run this task directly,
128135
// Xcode runs this task itself during its build process when we configure it.
@@ -149,6 +156,8 @@ task packForXCode(type: Sync) {
149156
150157
tasks.build.dependsOn packForXCode
151158
159+
*/
160+
152161
// workaround for https://youtrack.jetbrains.com/issue/KT-27170
153162
configurations {
154163
compileClasspath

common/src/commonMain/kotlin/com/willowtreeapps/common/Actions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.willowtreeapps.common
22

33
import com.willowtreeapps.common.repo.Book
4+
import com.willowtreeapps.common.ui.View
45

56
sealed class Actions {
67

@@ -22,5 +23,6 @@ sealed class Actions {
2223
data class ToReadLoaded(val books: List<Book>)
2324
class LoadCompleted
2425
data class CompletedLoaded(val books: List<Book>)
26+
data class AttachView<S: Any>(val view: View<S>)
2527
}
2628

common/src/commonMain/kotlin/com/willowtreeapps/common/LibraryApp.kt

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,27 @@ import org.reduxkotlin.applyMiddleware
66
import com.willowtreeapps.common.middleware.*
77
import com.willowtreeapps.common.middleware.NavigationMiddleware
88
import com.willowtreeapps.common.repo.*
9-
import com.willowtreeapps.common.ui.Presenter
9+
import com.willowtreeapps.common.ui.LibraryProvider
10+
import com.willowtreeapps.common.ui.LibraryView
1011
import com.willowtreeapps.common.ui.PresenterFactory
11-
import com.willowtreeapps.common.ui.View
1212
import kotlinx.coroutines.CoroutineScope
1313
import kotlinx.coroutines.launch
1414
import org.reduxkotlin.thunk
1515
import kotlin.coroutines.CoroutineContext
1616

1717
class LibraryApp(navigator: Navigator,
1818
networkContext: CoroutineContext,
19-
val uiContext: CoroutineContext,
20-
sqlDriver: SqlDriver) {
19+
private val uiContext: CoroutineContext,
20+
sqlDriver: SqlDriver): LibraryProvider {
2121
private val navigationMiddleware = NavigationMiddleware(navigator)
2222
private val localStorageRepo = BookDatabaseRepo(createDatabase(sqlDriver))
2323
private val databaseMiddleware = DatabaseMiddleware(localStorageRepo)
2424
private val bookRepository: BookRepository by lazy { KtorOpenBookRepository(networkContext) }
25-
private val presenterFactory by lazy { PresenterFactory(this, bookRepository, networkContext, uiContext) }
25+
private val presenterFactory by lazy { PresenterFactory(this, uiContext) }
26+
// val fetchBooks = fetchBooksThunk(networkContext, bookRepository)
27+
override val networkThunks = NetworkThunks(networkContext, bookRepository)
2628

27-
val appStore by lazy {
29+
val store by lazy {
2830
createStore(reducer, AppState.INITIAL_STATE, applyMiddleware(thunk,
2931
databaseMiddleware.middleware,
3032
navigationMiddleware::dispatch,
@@ -33,20 +35,21 @@ class LibraryApp(navigator: Navigator,
3335

3436
init {
3537
CoroutineScope(uiContext).launch {
36-
appStore.dispatch(Actions.LoadAllSettingsAction())
38+
store.dispatch(Actions.LoadAllSettingsAction())
3739
}
3840
}
3941

4042
fun dispatch(action: Any) {
4143
CoroutineScope(uiContext).launch {
42-
appStore.dispatch(action)
44+
store.dispatch(action)
4345
}
4446
}
4547

4648
val state: AppState
47-
get() = appStore.state as AppState
49+
get() = store.state as AppState
4850

49-
fun <T : Presenter<*>?> attachView(view: View<T>) = presenterFactory.attachView(view as View<Presenter<*>>)
51+
fun <V: LibraryView>attachView(view: V) = presenterFactory.attachView(view)
52+
53+
fun detachView(view: LibraryView) = presenterFactory.detachView(view)
5054

51-
fun detachView(view: View<*>) = presenterFactory.detachView(view)
5255
}

common/src/commonMain/kotlin/com/willowtreeapps/common/NetworkThunks.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,35 @@ package com.willowtreeapps.common
22

33
import com.willowtreeapps.common.repo.*
44
import kotlinx.coroutines.*
5+
import org.reduxkotlin.Dispatcher
6+
import org.reduxkotlin.GetState
57
import org.reduxkotlin.Thunk
68
import kotlin.coroutines.CoroutineContext
79

10+
/*
11+
fun fetchBooksThunk(networkContext: CoroutineContext, repo: BookRepository): ((String) -> Thunk) = { s: String ->
12+
{ dispatch, getState, extraArgument ->
13+
{
14+
Logger.d("Fetching Books and Feed")
15+
launch {
16+
dispatch(Actions.FetchingItemsStartedAction())
17+
val result = repo.search(query)
18+
if (result.isSuccessful) {
19+
Logger.d("Success")
20+
dispatch(Actions.FetchingItemsSuccessAction(result.response!!))
21+
} else {
22+
Logger.d("Failure")
23+
dispatch(Actions.FetchingItemsFailedAction(result.message!!))
24+
}
25+
}
26+
}
27+
}
28+
29+
30+
}
31+
32+
*/
33+
834
/**
935
* Thunks are functions that are executed by the "ThunkMiddleware". They are asynchronous and dispatch
1036
* actions. This allows dispatching a loading, success, and failure state.

0 commit comments

Comments
 (0)