diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 9e9dcd5..574d161 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7470bb7..986cea2 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/api/src/main/java/io/realworld/api/models/entities/ArticleData.kt b/api/src/main/java/io/realworld/api/models/entities/ArticleData.kt index 2669839..467baf6 100644 --- a/api/src/main/java/io/realworld/api/models/entities/ArticleData.kt +++ b/api/src/main/java/io/realworld/api/models/entities/ArticleData.kt @@ -7,11 +7,11 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class ArticleData( @Json(name = "body") - val body: String, + val body: String?=null, @Json(name = "description") - val description: String, + val description: String?=null, @Json(name = "tagList") - val tagList: List, + val tagList: List?=null, @Json(name = "title") - val title: String + val title: String?=null ) \ No newline at end of file diff --git a/api/src/main/java/io/realworld/api/models/requests/UpsertArticleRequest.kt b/api/src/main/java/io/realworld/api/models/requests/UpsertArticleRequest.kt new file mode 100644 index 0000000..fd745fd --- /dev/null +++ b/api/src/main/java/io/realworld/api/models/requests/UpsertArticleRequest.kt @@ -0,0 +1,13 @@ +package io.realworld.api.models.requests + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import io.realworld.api.models.entities.Article +import io.realworld.api.models.entities.ArticleData + + +@JsonClass(generateAdapter = true) +data class UpsertArticleRequest( + @Json(name ="article") + val article : ArticleData +) \ No newline at end of file diff --git a/api/src/main/java/io/realworld/api/services/ConduitAuthAPI.kt b/api/src/main/java/io/realworld/api/services/ConduitAuthAPI.kt index 4cff90d..e38d398 100644 --- a/api/src/main/java/io/realworld/api/services/ConduitAuthAPI.kt +++ b/api/src/main/java/io/realworld/api/services/ConduitAuthAPI.kt @@ -1,5 +1,6 @@ package io.realworld.api.services +import io.realworld.api.models.requests.UpsertArticleRequest import io.realworld.api.models.requests.UserUpdateRequest import io.realworld.api.models.responses.ArticleResponse import io.realworld.api.models.responses.ArticlesResponse @@ -45,4 +46,9 @@ interface ConduitAuthAPI { suspend fun unfavoriteArticle( @Path("slug") slug: String ): Response + + @POST("articles") + suspend fun createArticle( + @Body article: UpsertArticleRequest + ) :Response } \ No newline at end of file diff --git a/app/src/main/java/io/realworld/android/data/ArticlesRepo.kt b/app/src/main/java/io/realworld/android/data/ArticlesRepo.kt index d7b59e9..510dee4 100644 --- a/app/src/main/java/io/realworld/android/data/ArticlesRepo.kt +++ b/app/src/main/java/io/realworld/android/data/ArticlesRepo.kt @@ -1,6 +1,9 @@ package io.realworld.android.data import io.realworld.api.ConduitClient +import io.realworld.api.models.entities.Article +import io.realworld.api.models.entities.ArticleData +import io.realworld.api.models.requests.UpsertArticleRequest object ArticlesRepo { val api = ConduitClient.publicApi @@ -8,4 +11,24 @@ object ArticlesRepo { suspend fun getGlobalFeed() = api.getArticles().body()?.articles suspend fun getMyFeed() = authApi.getFeedArticles().body()?.articles + + suspend fun createArticle( + title:String?, + description:String?, + body:String?, + tagList:List?=null + ) : Article? { + val response =authApi.createArticle( + UpsertArticleRequest( + ArticleData( + title=title, + description = description, + body = body, + tagList = tagList + ) + ) + ) + + return response.body()?.article + } } \ No newline at end of file diff --git a/app/src/main/java/io/realworld/android/ui/article/ArticleViewModel.kt b/app/src/main/java/io/realworld/android/ui/article/ArticleViewModel.kt index 39f7d5e..4d1e5aa 100644 --- a/app/src/main/java/io/realworld/android/ui/article/ArticleViewModel.kt +++ b/app/src/main/java/io/realworld/android/ui/article/ArticleViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import io.realworld.android.data.ArticlesRepo import io.realworld.api.ConduitClient import io.realworld.api.models.entities.Article import kotlinx.coroutines.launch @@ -20,4 +21,21 @@ class ArticleViewModel : ViewModel() { response.body()?.article.let { _article.postValue(it) } } + + + fun createArticle( + title:String?, + description:String?, + body:String?, + tagList:List?=null + ) =viewModelScope.launch { + val article = ArticlesRepo.createArticle( + title=title, + description = description, + body=body, + tagList = tagList + ) + } + + } \ No newline at end of file diff --git a/app/src/main/java/io/realworld/android/ui/article/CreateArticleFragment.kt b/app/src/main/java/io/realworld/android/ui/article/CreateArticleFragment.kt new file mode 100644 index 0000000..7b1f447 --- /dev/null +++ b/app/src/main/java/io/realworld/android/ui/article/CreateArticleFragment.kt @@ -0,0 +1,46 @@ +package io.realworld.android.ui.article + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import io.realworld.android.databinding.FragmentCreateArticleBinding + +class CreateArticleFragment: Fragment() { + + + private var _binding:FragmentCreateArticleBinding?= null + private lateinit var articleViewModel:ArticleViewModel + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding= FragmentCreateArticleBinding.inflate(layoutInflater,container,false) + articleViewModel= ViewModelProvider(this).get(ArticleViewModel::class.java) + + + return _binding?.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + _binding?.apply { + submitButton.setOnClickListener{ + articleViewModel.createArticle( + title=articleTitleTv.text.toString().takeIf { it.isNotBlank() }, + description = articleDesciptionTv.text.toString().takeIf { it.isNotBlank() }, + body = articleBodyTv.text.toString().takeIf{it.isNotBlank()}, + tagList = articleTagTv.text.toString().split("\\s".toRegex()) + ) + Toast.makeText(requireContext(),"Article Published",Toast.LENGTH_SHORT).show() + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_create_article.xml b/app/src/main/res/drawable/ic_create_article.xml new file mode 100644 index 0000000..9718be6 --- /dev/null +++ b/app/src/main/res/drawable/ic_create_article.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_create_article.xml b/app/src/main/res/layout/fragment_create_article.xml new file mode 100644 index 0000000..e4a50e9 --- /dev/null +++ b/app/src/main/res/layout/fragment_create_article.xml @@ -0,0 +1,38 @@ + + + + + + +