Skip to content

Commit 42b6a81

Browse files
author
Patrick Jackson
committed
add UiActions for ui events
1 parent 00c8552 commit 42b6a81

File tree

20 files changed

+170
-54
lines changed

20 files changed

+170
-54
lines changed

android/src/main/java/com/jackson/openlibrary/AndroidNavigator.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import android.app.Application
55
import android.content.Intent
66
import android.os.Bundle
77
import androidx.appcompat.app.AppCompatActivity
8+
import androidx.fragment.app.Fragment
89
import androidx.navigation.findNavController
10+
import com.jackson.openlibrary.store.CompletedFragment
11+
import com.jackson.openlibrary.store.ReadingListFragment
912
import com.willowtreeapps.common.Logger
1013
import com.willowtreeapps.common.middleware.Navigator
1114
import com.willowtreeapps.common.middleware.Screen
@@ -28,16 +31,24 @@ class AndroidNavigator : Navigator, Application.ActivityLifecycleCallbacks {
2831
cachedNavigationScreen = screen
2932
} else {
3033
// val navController = currentActivity!!.findNavController(R.id.nav_host_fragment)
34+
3135
when (screen) {
32-
// Screen.QUESTION -> navController.navigate(R.id.action_startScreen_to_questionScreen)
33-
// Screen.GAME_COMPLETE -> navController.navigate(R.id.action_questionScreen_to_resultsFragment)
3436
Screen.BOOK_DETAILS -> currentActivity?.startActivity(Intent(currentActivity, DetailsActivity::class.java))
35-
// Screen.START -> navController.navigate(R.id.action_resultsFragment_to_startScreen)
37+
Screen.COMPLETED_LIST -> navigateToFragment(currentActivity!!.supportFragmentManager.findFragmentByTag(CompletedFragment::class.java.name)
38+
?: CompletedFragment())
39+
Screen.READING_LIST -> navigateToFragment(currentActivity!!.supportFragmentManager.findFragmentByTag(ReadingListFragment::class.java.name)
40+
?: ReadingListFragment())
3641
else -> throw IllegalArgumentException("Screen $screen is not handled in AndroidNavigator")
3742
}
3843
}
3944
}
4045

46+
private fun navigateToFragment(fragment: Fragment) {
47+
val fragTransaction = currentActivity!!.supportFragmentManager.beginTransaction()
48+
fragTransaction.replace(R.id.nav_host_fragment, fragment, fragment::class.java.name)
49+
fragTransaction.commit()
50+
}
51+
4152
override fun onActivityPaused(activity: Activity?) {
4253
}
4354

android/src/main/java/com/jackson/openlibrary/BottomSheetDialogFragment.kt

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,42 @@ import android.widget.Toast
88
import androidx.fragment.app.Fragment
99
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
1010
import com.jackson.openlibrary.store.CompletedFragment
11-
import com.jackson.openlibrary.store.ReadingListFragment
11+
import com.willowtreeapps.common.AppState
12+
import com.willowtreeapps.common.NavigationActions
13+
import com.willowtreeapps.common.SelectorSubscriberBuilder
14+
import com.willowtreeapps.common.middleware.Screen
15+
import com.willowtreeapps.common.ui.BottomNavSheet
16+
import com.willowtreeapps.common.ui.LibraryView
1217
import kotlinx.android.synthetic.main.fragment_bottomsheet.*
18+
import org.reduxkotlin.Dispatcher
1319
import java.lang.IllegalArgumentException
1420

15-
class BottomNavigationDrawerFragment : BottomSheetDialogFragment() {
21+
class BottomNavigationDrawerFragment : BottomSheetDialogFragment(), BottomNavSheet {
22+
23+
override lateinit var dispatch: Dispatcher
24+
override var selectorBuilder: SelectorSubscriberBuilder<AppState>? = null
25+
1626

1727
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
1828
return inflater.inflate(R.layout.fragment_bottomsheet, container, false)
1929
}
2030

31+
override fun onResume() {
32+
super.onResume()
33+
OpenLibraryApp.gameEngine().attachView(this)
34+
}
35+
36+
override fun onPause() {
37+
super.onPause()
38+
OpenLibraryApp.gameEngine().detachView(this)
39+
}
40+
2141
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2242
navigation_view.setNavigationItemSelectedListener { menuItem ->
2343
// Bottom Navigation Drawer menu item clicks
2444

25-
val fragment: Fragment = when (menuItem!!.itemId) {
45+
/*
46+
val fragment: Fragment = when (menuItem.itemId) {
2647
R.id.readingList -> {
2748
fragmentManager?.findFragmentByTag(ReadingListFragment::class.java.name)
2849
?: ReadingListFragment()
@@ -37,6 +58,11 @@ class BottomNavigationDrawerFragment : BottomSheetDialogFragment() {
3758
val fragTransaction = fragmentManager?.beginTransaction()
3859
fragTransaction?.replace(R.id.nav_host_fragment, fragment, fragment::class.java.name)
3960
fragTransaction?.commit()
61+
*/
62+
when (menuItem.itemId) {
63+
R.id.readingList -> dispatch(NavigationActions.GotoScreen(Screen.READING_LIST))
64+
R.id.completedList -> dispatch(NavigationActions.GotoScreen(Screen.COMPLETED_LIST))
65+
}
4066
dismiss()
4167

4268
true

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package com.jackson.openlibrary.store
22

33
import android.os.Bundle
44
import androidx.fragment.app.Fragment
5+
import androidx.lifecycle.Lifecycle
6+
import androidx.lifecycle.LifecycleObserver
7+
import androidx.lifecycle.OnLifecycleEvent
58
import com.willowtreeapps.common.Logger
69
import com.jackson.openlibrary.OpenLibraryApp
710
import com.willowtreeapps.common.AppState
@@ -13,15 +16,16 @@ import kotlinx.coroutines.Dispatchers
1316
import org.reduxkotlin.Dispatcher
1417
import kotlin.coroutines.CoroutineContext
1518

16-
open class BaseLibraryViewFragment<V: LibraryView>: Fragment(),
17-
CoroutineScope, LibraryView, LibraryProvider by OpenLibraryApp.gameEngine() {
19+
open class BaseLibraryViewFragment<V: LibraryView>: Fragment(), LibraryView, CoroutineScope,
20+
LibraryProvider by OpenLibraryApp.gameEngine() {
21+
22+
private var viewRecreated: Boolean = false
1823
override lateinit var dispatch: Dispatcher
1924
override var selectorBuilder: SelectorSubscriberBuilder<AppState>? = null
2025

2126
override val coroutineContext: CoroutineContext
2227
get() = Dispatchers.Main
2328

24-
private var viewRecreated: Boolean = false
2529

2630
override fun onViewCreated(view: android.view.View, savedInstanceState: Bundle?) {
2731
super.onViewCreated(view, savedInstanceState)
@@ -47,3 +51,5 @@ open class BaseLibraryViewFragment<V: LibraryView>: Fragment(),
4751
OpenLibraryApp.gameEngine().detachView(this)
4852
}
4953
}
54+
55+

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import com.jackson.openlibrary.GlideApp
88
import com.jackson.openlibrary.OpenLibraryApp
99
import com.jackson.openlibrary.R
1010
import com.willowtreeapps.common.Actions
11-
import com.willowtreeapps.common.BookListItemViewState
11+
import com.willowtreeapps.common.UiActions
12+
import com.willowtreeapps.common.ui.BookListItemViewState
1213
import com.willowtreeapps.common.ui.ListHeader
1314
import kotlinx.android.synthetic.main.item_book.view.*
1415
import kotlinx.android.synthetic.main.item_list_header.view.*
@@ -57,7 +58,7 @@ class BookViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
5758
GlideApp.with(itemView)
5859
.load(book.coverImageUrl)
5960
.into(itemView.ivBookCover)
60-
itemView.setOnClickListener { OpenLibraryApp.gameEngine().dispatch(Actions.BookSelected(book)) }
61+
itemView.setOnClickListener { OpenLibraryApp.gameEngine().dispatch(UiActions.BookTapped(book)) }
6162
}
6263

6364
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import android.view.ViewGroup
77
import com.jackson.openlibrary.GlideApp
88
import com.jackson.openlibrary.R
99
import com.willowtreeapps.common.Actions
10-
import com.willowtreeapps.common.BookListItemViewState
10+
import com.willowtreeapps.common.UiActions
11+
import com.willowtreeapps.common.ui.BookDetailViewState
1112
import com.willowtreeapps.common.ui.*
1213
import kotlinx.android.synthetic.main.fragment_book_detail.*
1314
import kotlinx.coroutines.CoroutineScope
@@ -24,17 +25,17 @@ class DetailsFragment : BaseLibraryViewFragment<DetailsView>(), CoroutineScope,
2425
return inflater.inflate(R.layout.fragment_book_detail, container, false)
2526
}
2627

27-
override fun render(bookViewState: BookListItemViewState) {
28-
txtTitle.text = bookViewState.title
29-
txtAuthorName.text = bookViewState.author
28+
override fun render(vs: BookDetailViewState) {
29+
txtTitle.text = vs.book.title
30+
txtAuthorName.text = vs.book.author
3031
GlideApp.with(this)
31-
.load(bookViewState.coverImageUrl)
32+
.load(vs.book.coverImageUrl)
3233
.into(imgBook)
3334
btnToRead.setOnClickListener {
34-
dispatch(Actions.AddCurrentToRead())
35+
dispatch(UiActions.AddToReadingButtonTapped())
3536
}
3637
btnCompleted.setOnClickListener {
37-
dispatch(Actions.AddCurrentToCompleted())
38+
dispatch(UiActions.AddToCompletedButtonTapped())
3839
}
3940
}
4041
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,14 @@ import android.os.Bundle
44
import android.view.LayoutInflater
55
import android.view.View
66
import android.view.ViewGroup
7-
import android.widget.LinearLayout
8-
import androidx.recyclerview.widget.DividerItemDecoration
97
import androidx.recyclerview.widget.LinearLayoutManager
108
import com.jackson.openlibrary.OpenLibraryApp
119
import com.willowtreeapps.common.Actions
12-
import com.willowtreeapps.common.BookListItemViewState
1310
import com.willowtreeapps.common.ui.ReadingListView
1411
import kotlinx.android.synthetic.main.fragment_reading_list.*
1512
import kotlinx.coroutines.CoroutineScope
1613
import kotlinx.coroutines.Dispatchers
1714
import kotlin.coroutines.CoroutineContext
18-
import android.graphics.drawable.InsetDrawable
1915
import com.jackson.openlibrary.R
2016

2117

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import android.view.ViewGroup
99
import androidx.recyclerview.widget.LinearLayoutManager
1010
import com.jackson.openlibrary.OpenLibraryApp
1111
import com.jackson.openlibrary.R
12-
import com.willowtreeapps.common.BookListItemViewState
12+
import com.willowtreeapps.common.UiActions
13+
import com.willowtreeapps.common.ui.BookListItemViewState
1314
import com.willowtreeapps.common.ui.SearchView
1415
import kotlinx.android.synthetic.main.fragment_search.*
1516
import kotlinx.android.synthetic.main.fragment_reading_list.loading_spinner
@@ -43,9 +44,7 @@ class SearchFragment : BaseLibraryViewFragment<SearchView>(), CoroutineScope, Se
4344
timer = Timer()
4445
timer?.schedule(object: TimerTask() {
4546
override fun run() {
46-
//could be a regular action with network middleware?
47-
dispatch(OpenLibraryApp.gameEngine().networkThunks.fetchBooks(s.toString()))
48-
// presenter?.onTextChanged(s.toString())
47+
dispatch(UiActions.SearchQueryEntered(s.toString()))
4948
}
5049

5150
}, 1000)

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

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

3+
import com.willowtreeapps.common.middleware.Screen
34
import com.willowtreeapps.common.repo.Book
5+
import com.willowtreeapps.common.ui.BookListItemViewState
46
import com.willowtreeapps.common.ui.View
57

68
sealed class Actions {
@@ -16,13 +18,28 @@ sealed class Actions {
1618
class AddCurrentToRead
1719

1820

19-
class LoadAllSettingsAction
20-
data class ChangeNumQuestionsSettingsAction(val num: Int)
21-
data class ChangeMicrophoneModeSettingsAction(val enabled: Boolean)
2221
class LoadToRead
2322
data class ToReadLoaded(val books: List<Book>)
2423
class LoadCompleted
2524
data class CompletedLoaded(val books: List<Book>)
2625
data class AttachView<S: Any>(val view: View<S>)
26+
27+
class NextBook
28+
class PrevBook
29+
}
30+
31+
sealed class UiActions {
32+
//Should we fire event when screen shown? or always navigate to a screen
33+
class ReadingListShown
34+
class CompletedListShown
35+
class BookTapped(val book: BookListItemViewState)
36+
data class SearchQueryEntered(val query: String)
37+
class AddToReadingButtonTapped
38+
class RemoveFromReadingButtonTapped
39+
class AddToCompletedButtonTapped
40+
class RemoveFromCompletedButtonTapped
2741
}
2842

43+
sealed class NavigationActions {
44+
data class GotoScreen(val screen: Screen)
45+
}

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

Lines changed: 5 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 kotlin.reflect.KProperty0
45

56

67
data class AppState(val isLoadingItems: Boolean = false,
@@ -9,11 +10,15 @@ data class AppState(val isLoadingItems: Boolean = false,
910
val errorLoadingItems: Boolean = false,
1011
val toReadBook: Set<Book> = setOf(),
1112
val completed: Set<Book> = setOf(),
13+
val currentList: KProperty0<Set<Book>>? = null,
1214
val errorMsg: String = "",
1315
val settings: UserSettings = UserSettings.defaults()) {
1416
companion object {
1517
val INITIAL_STATE = AppState()
1618
}
19+
20+
21+
fun currentSearchIndex() = currentList?.invoke()?.indexOf(selectedBook) ?: 0
1722
}
1823

1924
data class UserSettings(val numQuestions: Int,

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.willowtreeapps.common.ui.LibraryView
1111
import com.willowtreeapps.common.ui.PresenterFactory
1212
import kotlinx.coroutines.CoroutineScope
1313
import kotlinx.coroutines.launch
14-
import org.reduxkotlin.thunk
1514
import kotlin.coroutines.CoroutineContext
1615

1716
class LibraryApp(navigator: Navigator,
@@ -23,19 +22,19 @@ class LibraryApp(navigator: Navigator,
2322
private val databaseMiddleware = DatabaseMiddleware(localStorageRepo)
2423
private val bookRepository: BookRepository by lazy { KtorOpenBookRepository(networkContext) }
2524
private val presenterFactory by lazy { PresenterFactory(this, uiContext) }
26-
// val fetchBooks = fetchBooksThunk(networkContext, bookRepository)
2725
override val networkThunks = NetworkThunks(networkContext, bookRepository)
2826

2927
val store by lazy {
3028
createStore(reducer, AppState.INITIAL_STATE, applyMiddleware(createThunkMiddleware2(),
29+
uiActionMiddleware(networkThunks),
3130
databaseMiddleware.middleware,
3231
navigationMiddleware::dispatch,
3332
loggerMiddleware))
3433
}
3534

3635
init {
3736
CoroutineScope(uiContext).launch {
38-
store.dispatch(Actions.LoadAllSettingsAction())
37+
//do any initialization here
3938
}
4039
}
4140

0 commit comments

Comments
 (0)