Skip to content

Commit c578c85

Browse files
Remove ViewModels for basic implementation
* Improved error handling in coroutine
1 parent 125468a commit c578c85

File tree

4 files changed

+60
-131
lines changed

4 files changed

+60
-131
lines changed

app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersFragment.kt

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,21 @@ import android.view.View
66
import android.view.ViewGroup
77
import android.widget.Toast
88
import androidx.fragment.app.Fragment
9-
import androidx.fragment.app.viewModels
10-
import androidx.lifecycle.Observer
9+
import androidx.lifecycle.lifecycleScope
1110
import androidx.navigation.fragment.findNavController
1211
import androidx.recyclerview.widget.DividerItemDecoration
1312
import androidx.recyclerview.widget.LinearLayoutManager
13+
import com.apollographql.apollo.coroutines.toDeferred
14+
import com.apollographql.apollo.exception.ApolloException
1415
import com.google.android.material.transition.MaterialSharedAxis
16+
import guide.graphql.toc.ChaptersQuery
1517
import guide.graphql.toc.R
16-
import guide.graphql.toc.data.Status
18+
import guide.graphql.toc.data.apolloClient
1719
import guide.graphql.toc.databinding.ChaptersFragmentBinding
1820

1921
class ChaptersFragment : Fragment() {
2022

21-
private val viewModel: ChaptersViewModel by viewModels()
22-
2323
private lateinit var binding: ChaptersFragmentBinding
24-
2524
override fun onCreateView(
2625
inflater: LayoutInflater,
2726
container: ViewGroup?,
@@ -44,7 +43,6 @@ class ChaptersFragment : Fragment() {
4443
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4544
super.onViewCreated(view, savedInstanceState)
4645

47-
requireActivity()
4846
val adapter =
4947
ChaptersAdapter(
5048
requireContext()
@@ -69,21 +67,33 @@ class ChaptersFragment : Fragment() {
6967
binding.chapters.addItemDecoration(itemDivider)
7068
binding.chapters.adapter = adapter
7169

72-
viewModel.chapterList.observe(viewLifecycleOwner, Observer { chapterListResponse ->
73-
when (chapterListResponse.status) {
74-
Status.SUCCESS -> {
75-
chapterListResponse.data?.let {
76-
adapter.updateChapters(it)
77-
}
78-
}
79-
Status.ERROR -> Toast.makeText(
80-
requireContext(),
81-
getString(R.string.graphql_error, chapterListResponse.message),
82-
Toast.LENGTH_SHORT
83-
).show()
84-
Status.LOADING -> {
70+
lifecycleScope.launchWhenStarted {
71+
// Loading
72+
try {
73+
val response = apolloClient.query(
74+
ChaptersQuery()
75+
).toDeferred().await()
76+
if (response.hasErrors()) {
77+
throw Exception("Response has errors")
8578
}
79+
val chapters = response.data?.chapters ?: throw Exception("Data is null")
80+
// Success
81+
adapter.updateChapters(chapters)
82+
} catch (e: ApolloException) {
83+
// Error
84+
showErrorMessage("GraphQL request failed")
85+
} catch (e: Exception) {
86+
showErrorMessage(e.message.orEmpty())
8687
}
87-
})
88+
}
89+
}
90+
91+
92+
private fun showErrorMessage(errorMessage: String) {
93+
Toast.makeText(
94+
requireContext(),
95+
getString(R.string.graphql_error, errorMessage),
96+
Toast.LENGTH_SHORT
97+
).show()
8898
}
8999
}

app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersViewModel.kt

Lines changed: 0 additions & 38 deletions
This file was deleted.

app/src/main/java/guide/graphql/toc/ui/sections/SectionsFragment.kt

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import android.view.ViewGroup
77
import androidx.fragment.app.Fragment
88
import androidx.fragment.app.viewModels
99
import androidx.lifecycle.Observer
10+
import androidx.lifecycle.lifecycleScope
1011
import androidx.navigation.fragment.navArgs
1112
import androidx.recyclerview.widget.DividerItemDecoration
1213
import androidx.recyclerview.widget.LinearLayoutManager
14+
import com.apollographql.apollo.coroutines.toDeferred
15+
import com.apollographql.apollo.exception.ApolloException
1316
import com.google.android.material.transition.MaterialSharedAxis
17+
import guide.graphql.toc.ChaptersQuery
18+
import guide.graphql.toc.SectionsQuery
1419
import guide.graphql.toc.data.Status
20+
import guide.graphql.toc.data.apolloClient
1521
import guide.graphql.toc.databinding.SectionsFragmentBinding
1622

1723
class SectionsFragment : Fragment() {
1824

19-
private val viewModel: SectionsViewModel by viewModels()
2025

2126
private lateinit var binding: SectionsFragmentBinding
2227
private val args: SectionsFragmentArgs by navArgs()
@@ -56,26 +61,33 @@ class SectionsFragment : Fragment() {
5661
binding.sections.addItemDecoration(itemDivider)
5762
binding.sections.adapter = adapter
5863

59-
viewModel.sectionsList.observe(viewLifecycleOwner, Observer { sectionsResource ->
60-
when (sectionsResource.status) {
61-
Status.SUCCESS -> {
62-
sectionsResource.data?.let {
63-
adapter.updateSections(it)
64-
binding.spinner.visibility = View.GONE
65-
binding.error.visibility = View.GONE
66-
}
64+
lifecycleScope.launchWhenStarted {
65+
// Loading
66+
binding.spinner.visibility = View.VISIBLE
67+
binding.error.visibility = View.GONE
68+
try {
69+
val response = apolloClient.query(
70+
SectionsQuery(id = args.chapterId)
71+
).toDeferred().await()
72+
if (response.hasErrors()) {
73+
throw Exception("Response has errors")
6774
}
68-
Status.ERROR -> {
69-
showErrorMessage(sectionsResource.message ?: "")
70-
}
71-
Status.LOADING -> {
72-
binding.spinner.visibility = View.VISIBLE
75+
val sections = response.data?.chapter?.sections ?: throw Exception("Data is null")
76+
// Success
77+
if (sections.size > 1) {
78+
adapter.updateSections(sections)
79+
binding.spinner.visibility = View.GONE
7380
binding.error.visibility = View.GONE
81+
} else {
82+
throw Exception("No sections")
7483
}
84+
} catch (e: ApolloException) {
85+
// Error
86+
showErrorMessage("GraphQL request failed")
87+
} catch (e: Exception) {
88+
showErrorMessage(e.message.orEmpty())
7589
}
76-
})
77-
78-
viewModel.chapterId = args.chapterId
90+
}
7991
}
8092

8193
private fun showErrorMessage(error: String) {

app/src/main/java/guide/graphql/toc/ui/sections/SectionsViewModel.kt

Lines changed: 0 additions & 55 deletions
This file was deleted.

0 commit comments

Comments
 (0)