Skip to content

Commit fcf859d

Browse files
auth feed working
Signed-off-by: Arnav Gupta <[email protected]>
1 parent d9b16e2 commit fcf859d

File tree

17 files changed

+164
-17
lines changed

17 files changed

+164
-17
lines changed

api/src/main/java/io/realworld/api/ConduitClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ object ConduitClient {
3636
.create(ConduitAPI::class.java)
3737

3838
val authApi = retrofitBuilder
39-
.client(okHttpBuilder.build())
39+
.client(okHttpBuilder.addInterceptor(authInterceptor).build())
4040
.build()
4141
.create(ConduitAuthAPI::class.java)
4242

app/src/main/java/io/realworld/android/AuthViewModel.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ class AuthViewModel : ViewModel() {
1414

1515
fun login(email: String, password: String) = viewModelScope.launch {
1616
UserRepo.login(email, password)?.let {
17-
_user.postValue(it.user)
17+
_user.postValue(it)
18+
}
19+
}
20+
21+
fun signup(username: String, email: String, password: String) = viewModelScope.launch {
22+
UserRepo.signup(username, email, password)?.let {
23+
_user.postValue(it)
1824
}
1925
}
2026
}

app/src/main/java/io/realworld/android/MainActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class MainActivity : AppCompatActivity() {
3939
appBarConfiguration = AppBarConfiguration(
4040
setOf(
4141
R.id.nav_feed,
42+
R.id.nav_my_feed,
4243
R.id.nav_auth
4344
), drawerLayout
4445
)

app/src/main/java/io/realworld/android/data/ArticlesRepo.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import io.realworld.api.ConduitClient
44

55
object ArticlesRepo {
66
val api = ConduitClient.publicApi
7+
val authApi = ConduitClient.authApi
78

8-
suspend fun getGlobalFeed() = api.getArticles()
9+
suspend fun getGlobalFeed() = api.getArticles().body()?.articles
10+
suspend fun getMyFeed() = authApi.getFeedArticles().body()?.articles
911
}

app/src/main/java/io/realworld/android/data/UserRepo.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,35 @@ package io.realworld.android.data
22

33
import io.realworld.api.ConduitClient
44
import io.realworld.api.models.entities.LoginData
5+
import io.realworld.api.models.entities.SignupData
6+
import io.realworld.api.models.entities.User
57
import io.realworld.api.models.requests.LoginRequest
8+
import io.realworld.api.models.requests.SignupRequest
69
import io.realworld.api.models.responses.UserResponse
710

811
object UserRepo {
912
val api = ConduitClient.publicApi
1013
val authAPI = ConduitClient.authApi
1114

12-
suspend fun login(email: String, password: String): UserResponse? {
15+
suspend fun login(email: String, password: String): User? {
1316
val response = api.loginUser(LoginRequest(LoginData(email, password)))
1417

18+
// TODO: Save it in SharedPreferences
1519
ConduitClient.authToken = response.body()?.user?.token
1620

17-
return response.body()
21+
return response.body()?.user
22+
}
23+
24+
suspend fun signup(username: String, email: String, password: String): User? {
25+
val response = api.signupUser(SignupRequest(SignupData(
26+
email, password, username
27+
)))
28+
29+
// TODO: Save it in SharedPreferences
30+
ConduitClient.authToken = response.body()?.user?.token
31+
32+
return response.body()?.user
33+
1834
}
1935

2036
suspend fun getUserProfile() = authAPI.getCurrentUser().body()?.user

app/src/main/java/io/realworld/android/ui/auth/AuthFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class AuthFragment : Fragment() {
3131
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3232
super.onViewCreated(view, savedInstanceState)
3333

34-
navController = _binding?.let { Navigation.findNavController(it.root) }
34+
navController = _binding?.let { Navigation.findNavController(it.root.findViewById(R.id.authFragmentNavHost)) }
3535
_binding?.authTabLayout?.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
3636
override fun onTabSelected(tab: TabLayout.Tab?) {
3737
when(tab?.position) {

app/src/main/java/io/realworld/android/ui/auth/LoginFragment.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,24 @@ import android.os.Bundle
44
import android.view.LayoutInflater
55
import android.view.View
66
import android.view.ViewGroup
7+
import androidx.core.view.isVisible
78
import androidx.fragment.app.Fragment
89
import androidx.fragment.app.activityViewModels
910
import io.realworld.android.AuthViewModel
10-
import io.realworld.android.databinding.FragmentLoginBinding
11+
import io.realworld.android.databinding.FragmentLoginSignupBinding
1112

1213
class LoginFragment : Fragment() {
1314

14-
private var _binding: FragmentLoginBinding? = null
15+
private var _binding: FragmentLoginSignupBinding? = null
1516
val authViewModel: AuthViewModel by activityViewModels()
1617

1718
override fun onCreateView(
1819
inflater: LayoutInflater,
1920
container: ViewGroup?,
2021
savedInstanceState: Bundle?
2122
): View? {
22-
_binding = FragmentLoginBinding.inflate(inflater, container, false)
23+
_binding = FragmentLoginSignupBinding.inflate(inflater, container, false)
24+
_binding?.usernameEditText?.isVisible = false
2325

2426
return _binding?.root
2527
}
@@ -28,7 +30,7 @@ class LoginFragment : Fragment() {
2830
super.onViewCreated(view, savedInstanceState)
2931

3032
_binding?.apply {
31-
loginButton.setOnClickListener {
33+
submitButton.setOnClickListener {
3234
authViewModel.login(
3335
emailEditText.text.toString(),
3436
passwordEditText.text.toString()
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,47 @@
11
package io.realworld.android.ui.auth
22

3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.core.view.isVisible
38
import androidx.fragment.app.Fragment
9+
import androidx.fragment.app.activityViewModels
10+
import io.realworld.android.AuthViewModel
11+
import io.realworld.android.databinding.FragmentLoginSignupBinding
412

513
class SignupFragment : Fragment() {
614

15+
private var _binding: FragmentLoginSignupBinding? = null
16+
val authViewModel: AuthViewModel by activityViewModels()
17+
18+
override fun onCreateView(
19+
inflater: LayoutInflater,
20+
container: ViewGroup?,
21+
savedInstanceState: Bundle?
22+
): View? {
23+
_binding = FragmentLoginSignupBinding.inflate(inflater, container, false)
24+
_binding?.usernameEditText?.isVisible = true
25+
26+
return _binding?.root
27+
}
28+
29+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
30+
super.onViewCreated(view, savedInstanceState)
31+
32+
_binding?.apply {
33+
submitButton.setOnClickListener {
34+
authViewModel.signup(
35+
usernameEditText.text.toString(),
36+
emailEditText.text.toString(),
37+
passwordEditText.text.toString()
38+
)
39+
}
40+
}
41+
}
42+
43+
override fun onDestroyView() {
44+
super.onDestroyView()
45+
_binding = null
46+
}
747
}

app/src/main/java/io/realworld/android/ui/feed/FeedViewModel.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@ class FeedViewModel : ViewModel() {
1616
val feed: LiveData<List<Article>> = _feed
1717

1818
fun fetchGlobalFeed() = viewModelScope.launch {
19-
ArticlesRepo.getGlobalFeed().body()?.let {
20-
_feed.postValue(it.articles)
21-
Log.d("FEED", "feed fetched ${it.articlesCount}")
19+
ArticlesRepo.getGlobalFeed()?.let {
20+
_feed.postValue(it)
2221
}
2322

2423
}
2524

25+
fun fetchMyFeed() = viewModelScope.launch {
26+
ArticlesRepo.getMyFeed()?.let {
27+
_feed.postValue(it)
28+
}
29+
}
30+
2631
}

app/src/main/java/io/realworld/android/ui/feed/GlobalFeedFragment.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.recyclerview.widget.LinearLayoutManager
1010
import io.realworld.android.databinding.FragmentFeedBinding
1111

1212
class GlobalFeedFragment : Fragment() {
13-
1413
private var _binding: FragmentFeedBinding? = null
1514
private lateinit var viewModel: FeedViewModel
1615
private lateinit var feedAdapter: ArticleFeedAdapter
@@ -26,12 +25,17 @@ class GlobalFeedFragment : Fragment() {
2625
_binding = FragmentFeedBinding.inflate(inflater, container, false)
2726
_binding?.feedRecyclerView?.layoutManager = LinearLayoutManager(context)
2827
_binding?.feedRecyclerView?.adapter = feedAdapter
28+
return _binding?.root
29+
}
30+
31+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
32+
super.onViewCreated(view, savedInstanceState)
2933
viewModel.fetchGlobalFeed()
3034
viewModel.feed.observe({ lifecycle }) {
3135
feedAdapter.submitList(it)
3236
}
3337

34-
return _binding?.root
38+
3539
}
3640

3741
override fun onDestroyView() {

0 commit comments

Comments
 (0)