Skip to content

Commit 11cc6d5

Browse files
feed and settings done
Signed-off-by: Arnav Gupta <[email protected]>
1 parent fcf859d commit 11cc6d5

File tree

9 files changed

+148
-9
lines changed

9 files changed

+148
-9
lines changed

api/src/main/java/io/realworld/api/models/requests/UserUpdateRequest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package io.realworld.api.models.requests
22

33
import com.squareup.moshi.Json
44
import com.squareup.moshi.JsonClass
5-
import io.realworld.api.models.entities.SignupData
5+
import io.realworld.api.models.entities.UserUpdateData
66

77
@JsonClass(generateAdapter = true)
88
data class UserUpdateRequest(
99
@Json(name = "user")
10-
val user: SignupData
10+
val user: UserUpdateData
1111
)

api/src/test/java/io/realworld/api/ConduitClientTests.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,27 @@ import kotlin.random.Random
1010

1111
class ConduitClientTests {
1212

13-
private val conduitClient = ConduitClient()
1413

1514
@Test
1615
fun `GET articles`() {
1716
runBlocking {
18-
val articles = conduitClient.publicApi.getArticles()
17+
val articles = ConduitClient.publicApi.getArticles()
1918
assertNotNull(articles.body()?.articles)
2019
}
2120
}
2221

2322
@Test
2423
fun `GET articles by author`() {
2524
runBlocking {
26-
val articles = conduitClient.publicApi.getArticles(author = "444")
25+
val articles = ConduitClient.publicApi.getArticles(author = "444")
2726
assertNotNull(articles.body()?.articles)
2827
}
2928
}
3029

3130
@Test
3231
fun `GET articles by tags`() {
3332
runBlocking {
34-
val articles = conduitClient.publicApi.getArticles(tag = "dragons")
33+
val articles = ConduitClient.publicApi.getArticles(tag = "dragons")
3534
assertNotNull(articles.body()?.articles)
3635
}
3736
}
@@ -44,7 +43,7 @@ class ConduitClientTests {
4443
username = "rand_user_${Random.nextInt(99, 999)}"
4544
)
4645
runBlocking {
47-
val resp = conduitClient.publicApi.signupUser(SignupRequest(userCreds))
46+
val resp = ConduitClient.publicApi.signupUser(SignupRequest(userCreds))
4847
assertEquals(userCreds.username, resp.body()?.user?.username)
4948
}
5049
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,16 @@ class AuthViewModel : ViewModel() {
2323
_user.postValue(it)
2424
}
2525
}
26+
27+
fun update(
28+
bio: String?,
29+
username: String?,
30+
image: String?,
31+
email: String?,
32+
password: String?
33+
) = viewModelScope.launch {
34+
UserRepo.updateUser(bio, username, image, email, password)?.let {
35+
_user.postValue(it)
36+
}
37+
}
2638
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import io.realworld.api.ConduitClient
44
import io.realworld.api.models.entities.LoginData
55
import io.realworld.api.models.entities.SignupData
66
import io.realworld.api.models.entities.User
7+
import io.realworld.api.models.entities.UserUpdateData
78
import io.realworld.api.models.requests.LoginRequest
89
import io.realworld.api.models.requests.SignupRequest
10+
import io.realworld.api.models.requests.UserUpdateRequest
911
import io.realworld.api.models.responses.UserResponse
1012

1113
object UserRepo {
@@ -33,6 +35,20 @@ object UserRepo {
3335

3436
}
3537

38+
suspend fun updateUser(
39+
bio: String?,
40+
username: String?,
41+
image: String?,
42+
email: String?,
43+
password: String?
44+
): User? {
45+
val response = authAPI.updateCurrentUser(UserUpdateRequest(UserUpdateData(
46+
bio, email, image, username, password
47+
)))
48+
49+
return response.body()?.user
50+
}
51+
3652
suspend fun getUserProfile() = authAPI.getCurrentUser().body()?.user
3753

3854
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.realworld.android.ui.settings
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.fragment.app.Fragment
8+
import androidx.fragment.app.activityViewModels
9+
import io.realworld.android.AuthViewModel
10+
import io.realworld.android.databinding.FragmentSettingsBinding
11+
12+
class SettingsFragment : Fragment() {
13+
14+
private var _binding: FragmentSettingsBinding? = null
15+
private val authViewModel by activityViewModels<AuthViewModel>()
16+
17+
override fun onCreateView(
18+
inflater: LayoutInflater,
19+
container: ViewGroup?,
20+
savedInstanceState: Bundle?
21+
): View? {
22+
_binding = FragmentSettingsBinding.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+
authViewModel.user.observe({ lifecycle }) {
31+
_binding?.apply {
32+
bioEditText.setText(it?.bio ?: "")
33+
emailEditText.setText(it?.email ?: "")
34+
usernameEditText.setText(it?.username ?: "")
35+
imageEditText.setText(it?.image ?: "")
36+
}
37+
}
38+
39+
_binding?.apply {
40+
submitButton.setOnClickListener {
41+
authViewModel.update(
42+
bio = bioEditText.text.toString(),
43+
username = usernameEditText.text.toString().takeIf { it.isNotBlank() },
44+
image = imageEditText.text.toString(),
45+
email = emailEditText.text.toString().takeIf { it.isNotBlank() },
46+
password = passwordEditText.text.toString().takeIf { it.isNotBlank() }
47+
)
48+
}
49+
}
50+
51+
}
52+
53+
override fun onDestroyView() {
54+
super.onDestroyView()
55+
}
56+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:padding="10dp"
4+
android:orientation="vertical"
5+
android:layout_width="match_parent"
6+
android:layout_height="match_parent">
7+
8+
<EditText
9+
android:hint="URL of profile image"
10+
android:id="@+id/imageEditText"
11+
android:inputType="textUri"
12+
android:layout_width="match_parent"
13+
android:layout_height="wrap_content"/>
14+
<EditText
15+
android:hint="username"
16+
android:id="@+id/usernameEditText"
17+
android:layout_width="match_parent"
18+
android:layout_height="wrap_content"/>
19+
<EditText
20+
android:hint="Short bio"
21+
android:lines="5"
22+
android:gravity="top"
23+
android:id="@+id/bioEditText"
24+
android:layout_width="match_parent"
25+
android:layout_height="wrap_content"/>
26+
<EditText
27+
android:hint="Email ID"
28+
android:id="@+id/emailEditText"
29+
android:inputType="textEmailAddress"
30+
android:layout_width="match_parent"
31+
android:layout_height="wrap_content"/>
32+
<EditText
33+
android:hint="Password"
34+
android:id="@+id/passwordEditText"
35+
android:inputType="textPassword"
36+
android:layout_width="match_parent"
37+
android:layout_height="wrap_content"/>
38+
<Button
39+
android:layout_gravity="center"
40+
android:text="Update Settings"
41+
android:id="@+id/submitButton"
42+
android:layout_width="wrap_content"
43+
android:layout_height="wrap_content"/>
44+
45+
</LinearLayout>

app/src/main/res/menu/menu_main_user.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,10 @@
1212
android:id="@+id/nav_my_feed"
1313
android:icon="@drawable/ic_my_feed"
1414
android:title="@string/menu_my_feed" />
15+
16+
<item
17+
android:id="@+id/nav_settings"
18+
android:icon="@drawable/ic_menu_settings"
19+
android:title="@string/menu_settings" />
1520
</group>
1621
</menu>

app/src/main/res/navigation/navigation_main.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
android:id="@+id/nav_auth"
2222
android:name="io.realworld.android.ui.auth.AuthFragment"
2323
android:label="@string/menu_auth"
24-
tools:layout="@layout/fragment_auth">
25-
</fragment>
24+
tools:layout="@layout/fragment_auth"/>
25+
26+
<fragment
27+
android:id="@+id/nav_settings"
28+
android:name="io.realworld.android.ui.settings.SettingsFragment"
29+
android:label="@string/menu_settings"
30+
tools:layout="@layout/fragment_feed" />
2631
</navigation>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010
<string name="menu_feed">Feed</string>
1111
<string name="menu_my_feed">My Feed</string>
1212
<string name="menu_auth">Login / Signup</string>
13+
<string name="menu_settings">Settings</string>
1314
</resources>

0 commit comments

Comments
 (0)