Skip to content

Commit 5b6a642

Browse files
login process and navigation done
Signed-off-by: Arnav Gupta <[email protected]>
1 parent c072ac9 commit 5b6a642

File tree

15 files changed

+193
-8
lines changed

15 files changed

+193
-8
lines changed

api/src/main/java/io/realworld/api/services/ConduitAPI.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ interface ConduitAPI {
1616
@Body userCreds: SignupRequest
1717
): Response<UserResponse>
1818

19-
@POST("users")
19+
@POST("users/login")
2020
suspend fun loginUser(
2121
@Body userCreds: LoginRequest
2222
): Response<UserResponse>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.realworld.android
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.MutableLiveData
5+
import androidx.lifecycle.ViewModel
6+
import androidx.lifecycle.viewModelScope
7+
import io.realworld.android.data.UserRepo
8+
import io.realworld.api.models.entities.User
9+
import kotlinx.coroutines.launch
10+
11+
class AuthViewModel : ViewModel() {
12+
private val _user = MutableLiveData<User?>()
13+
val user: LiveData<User?> = _user
14+
15+
fun login(email: String, password: String) = viewModelScope.launch {
16+
UserRepo.login(email, password)?.let {
17+
_user.postValue(it.user)
18+
}
19+
}
20+
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,30 @@ package io.realworld.android
22

33
import android.os.Bundle
44
import android.view.Menu
5+
import android.widget.Toast
56
import androidx.appcompat.app.AppCompatActivity
67
import androidx.drawerlayout.widget.DrawerLayout
8+
import androidx.lifecycle.ViewModelProvider
79
import androidx.navigation.findNavController
810
import androidx.navigation.ui.AppBarConfiguration
911
import androidx.navigation.ui.navigateUp
1012
import androidx.navigation.ui.setupActionBarWithNavController
1113
import androidx.navigation.ui.setupWithNavController
1214
import com.google.android.material.navigation.NavigationView
13-
import com.google.android.material.snackbar.Snackbar
1415
import io.realworld.android.databinding.ActivityMainBinding
16+
import io.realworld.api.models.entities.User
1517

1618
class MainActivity : AppCompatActivity() {
1719

1820
private lateinit var appBarConfiguration: AppBarConfiguration
1921
private lateinit var binding: ActivityMainBinding
22+
private lateinit var authViewModel: AuthViewModel
2023

2124
override fun onCreate(savedInstanceState: Bundle?) {
2225
super.onCreate(savedInstanceState)
2326

27+
authViewModel = ViewModelProvider(this).get(AuthViewModel::class.java)
28+
2429
binding = ActivityMainBinding.inflate(layoutInflater)
2530
setContentView(binding.root)
2631

@@ -34,10 +39,29 @@ class MainActivity : AppCompatActivity() {
3439
appBarConfiguration = AppBarConfiguration(
3540
setOf(
3641
R.id.nav_feed,
42+
R.id.nav_auth
3743
), drawerLayout
3844
)
3945
setupActionBarWithNavController(navController, appBarConfiguration)
4046
navView.setupWithNavController(navController)
47+
48+
authViewModel.user.observe({ lifecycle }) {
49+
updateMenu(it)
50+
navController.navigateUp()
51+
}
52+
}
53+
54+
private fun updateMenu(user: User?) {
55+
when (user) {
56+
is User -> {
57+
binding.navView.menu.clear()
58+
binding.navView.inflateMenu(R.menu.menu_main_user)
59+
}
60+
else -> {
61+
62+
}
63+
}
64+
4165
}
4266

4367
override fun onCreateOptionsMenu(menu: Menu): Boolean {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.realworld.android.data
2+
3+
import io.realworld.api.ConduitClient
4+
import io.realworld.api.models.entities.LoginData
5+
import io.realworld.api.models.requests.LoginRequest
6+
import io.realworld.api.models.responses.UserResponse
7+
8+
object UserRepo {
9+
val api = ConduitClient().api
10+
11+
suspend fun login(email: String, password: String): UserResponse? {
12+
val response = api.loginUser(LoginRequest(LoginData(email, password)))
13+
return response.body()
14+
}
15+
16+
}

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import android.view.View
66
import android.view.ViewGroup
77
import androidx.fragment.app.Fragment
88
import androidx.navigation.NavController
9+
import androidx.navigation.NavHost
10+
import androidx.navigation.NavHostController
911
import androidx.navigation.Navigation
1012
import androidx.navigation.fragment.NavHostFragment
1113
import com.google.android.material.tabs.TabLayout
@@ -15,17 +17,31 @@ import io.realworld.android.databinding.FragmentAuthBinding
1517
class AuthFragment : Fragment() {
1618

1719
private var _binding: FragmentAuthBinding? = null
20+
private var navController: NavController? = null
1821

1922
override fun onCreateView(
2023
inflater: LayoutInflater,
2124
container: ViewGroup?,
2225
savedInstanceState: Bundle?
2326
): View? {
2427
_binding = FragmentAuthBinding.inflate(inflater, container, false)
28+
return _binding?.root
29+
}
2530

31+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
32+
super.onViewCreated(view, savedInstanceState)
2633

34+
navController = _binding?.let { Navigation.findNavController(it.root) }
2735
_binding?.authTabLayout?.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
2836
override fun onTabSelected(tab: TabLayout.Tab?) {
37+
when(tab?.position) {
38+
0 -> {
39+
navController?.navigate(R.id.gotoLoginFragment)
40+
}
41+
1 -> {
42+
navController?.navigate(R.id.gotoSignupFragment)
43+
}
44+
}
2945
}
3046

3147
override fun onTabUnselected(tab: TabLayout.Tab?) {
@@ -35,8 +51,6 @@ class AuthFragment : Fragment() {
3551
}
3652

3753
})
38-
39-
return _binding?.root
4054
}
4155

4256
override fun onDestroyView() {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,45 @@
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
37
import androidx.fragment.app.Fragment
8+
import androidx.fragment.app.activityViewModels
9+
import io.realworld.android.AuthViewModel
10+
import io.realworld.android.databinding.FragmentLoginBinding
411

512
class LoginFragment : Fragment() {
13+
14+
private var _binding: FragmentLoginBinding? = null
15+
val authViewModel: AuthViewModel by activityViewModels()
16+
17+
override fun onCreateView(
18+
inflater: LayoutInflater,
19+
container: ViewGroup?,
20+
savedInstanceState: Bundle?
21+
): View? {
22+
_binding = FragmentLoginBinding.inflate(inflater, container, false)
23+
24+
return _binding?.root
25+
}
26+
27+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
28+
super.onViewCreated(view, savedInstanceState)
29+
30+
_binding?.apply {
31+
loginButton.setOnClickListener {
32+
authViewModel.login(
33+
emailEditText.text.toString(),
34+
passwordEditText.text.toString()
35+
)
36+
}
37+
38+
}
39+
}
40+
41+
override fun onDestroyView() {
42+
super.onDestroyView()
43+
_binding = null
44+
}
645
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ package io.realworld.android.ui.auth
33
import androidx.fragment.app.Fragment
44

55
class SignupFragment : Fragment() {
6+
67
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ class FeedViewModel : ViewModel() {
1313

1414

1515
private val _feed = MutableLiveData<List<Article>>()
16-
1716
val feed: LiveData<List<Article>> = _feed
1817

1918
fun fetchGlobalFeed() = viewModelScope.launch {

app/src/main/res/layout/activity_main.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@
2121
android:layout_gravity="start"
2222
android:fitsSystemWindows="true"
2323
app:headerLayout="@layout/nav_header_main"
24-
app:menu="@menu/activity_main_drawer" />
24+
app:menu="@menu/menu_main_guest" />
2525
</androidx.drawerlayout.widget.DrawerLayout>

app/src/main/res/layout/content_main.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
app:layout_constraintLeft_toLeftOf="parent"
1717
app:layout_constraintRight_toRightOf="parent"
1818
app:layout_constraintTop_toTopOf="parent"
19-
app:navGraph="@navigation/navigation_main" />
19+
app:navGraph="@navigation/navigation_main_guest" />
2020
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)