From cf4a1d64ecbdb9f8d400905e45c3d528ce4e1648 Mon Sep 17 00:00:00 2001 From: Jelena Petrovic Date: Sun, 13 Nov 2022 19:43:26 +0100 Subject: Dodati komentari, dodavanje i pregled #31 --- .../Activities/ActivitySinglePost.kt | 107 +++++++++++++++++---- .../brzodolokacije/Adapters/CommentsAdapter.kt | 38 ++++++++ .../brzodolokacije/Interfaces/IBackendApi.kt | 13 ++- .../java/com/example/brzodolokacije/Models/Post.kt | 18 +++- .../src/main/res/layout/activity_single_post.xml | 51 ++++++++++ .../app/src/main/res/layout/single_comment.xml | 22 +++++ 6 files changed, 224 insertions(+), 25 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt index 69a2bed..8dd7eea 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt @@ -1,36 +1,35 @@ package com.example.brzodolokacije.Activities -import android.content.res.Resources import android.os.Bundle -import android.os.Handler -import android.os.Looper import android.util.Log -import android.widget.ImageButton +import android.widget.Adapter import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.CommentsAdapter import com.example.brzodolokacije.Adapters.PostImageAdapter -import com.example.brzodolokacije.Adapters.ShowPostsAdapter -import com.example.brzodolokacije.Models.PostImage -import com.example.brzodolokacije.Models.PostPreview -import com.example.brzodolokacije.Models.Rating -import com.example.brzodolokacije.Models.RatingReceive +import com.example.brzodolokacije.Models.* import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.example.brzodolokacije.databinding.ActivitySinglePostBinding import okhttp3.ResponseBody +import okhttp3.internal.notifyAll import retrofit2.Call import retrofit2.Response class ActivitySinglePost : AppCompatActivity() { private lateinit var binding: ActivitySinglePostBinding - private var layoutManagerVar: RecyclerView.LayoutManager? = null - private var adapterVar: RecyclerView.Adapter? = null - private var recyclerView: RecyclerView?=null + private var layoutManagerImages: RecyclerView.LayoutManager? = null + private var layoutManagerComments: RecyclerView.LayoutManager? = null + private var adapterImages: RecyclerView.Adapter? = null + private var adapterComments: RecyclerView.Adapter? = null + private var recyclerViewImages: RecyclerView?=null + private var recyclerViewComments: RecyclerView?=null private lateinit var post:PostPreview + private var comments:MutableList?=mutableListOf() private var starNumber:Number=0 override fun onCreate(savedInstanceState: Bundle?) { @@ -38,20 +37,31 @@ class ActivitySinglePost : AppCompatActivity() { binding=ActivitySinglePostBinding.inflate(layoutInflater) setContentView(binding.root) post= intent.extras?.getParcelable("selectedPost")!! - //load data for the list //instantiate adapter and linearLayout - adapterVar= PostImageAdapter(this@ActivitySinglePost, post.images as MutableList) - layoutManagerVar= LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) - recyclerView = binding.rvMain + adapterImages= PostImageAdapter(this@ActivitySinglePost, post.images as MutableList) + layoutManagerImages= LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) + recyclerViewImages = binding.rvMain + buildRecyclerViewComments() + requestGetComments() + // set recyclerView attributes - recyclerView?.setHasFixedSize(true) - recyclerView?.layoutManager = layoutManagerVar - recyclerView?.adapter = adapterVar + recyclerViewImages?.setHasFixedSize(true) + recyclerViewImages?.layoutManager = layoutManagerImages + recyclerViewImages?.adapter = adapterImages loadTextComponents() setRatingListeners() } + fun buildRecyclerViewComments(){ + recyclerViewComments=binding.rvComments + adapterComments=CommentsAdapter(comments as MutableList) + layoutManagerComments= LinearLayoutManager(this@ActivitySinglePost,LinearLayoutManager.VERTICAL,false) + recyclerViewComments!!.setHasFixedSize(true) + recyclerViewComments!!.layoutManager=layoutManagerComments + recyclerViewComments!!.adapter= adapterComments + } + fun setRatingListeners(){ val emptyStar=R.drawable.empty_star val fullStar=R.drawable.full_star @@ -109,7 +119,66 @@ class ActivitySinglePost : AppCompatActivity() { Toast.makeText(this,"poslato",Toast.LENGTH_SHORT).show() } } + binding.btnPostComment.setOnClickListener { + if(binding.NewComment.text.isNotEmpty()){ + val comment=CommentReceive(binding.NewComment.text.toString(),"") + requestAddComment(comment) + } + } + + } + + fun requestAddComment(comment:CommentReceive){ + val postApi= RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", this@ActivitySinglePost) + val request=postApi.addComment("Bearer "+token,post._id,comment) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful){ + requestGetComments() + Toast.makeText( + this@ActivitySinglePost, "prosao zahtev", Toast.LENGTH_LONG + ).show() + }else{ + if(response.errorBody()!=null) + Log.d("main1",response.message().toString()) + } + + } + + override fun onFailure(call: Call, t: Throwable) { + Log.d("main2",t.message.toString()) + } + }) + } + fun requestGetComments(){ + val postApi= RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", this@ActivitySinglePost) + val request=postApi.getComments("Bearer "+token,post._id) + request.enqueue(object : retrofit2.Callback?> { + override fun onResponse(call: Call?>, response: Response?>) { + if(response.isSuccessful){ + comments= response.body()!! + if(comments!=null && comments!!.isNotEmpty()){ + buildRecyclerViewComments() + if(comments!=null) + binding.tvCommentCount.text=comments?.size.toString() + else + binding.tvCommentCount.text="0" + } + }else{ + if(response.errorBody()!=null) + Log.d("main1",response.message().toString()) + } + + + } + + override fun onFailure(call: Call?>, t: Throwable) { + Log.d("main2",t.message.toString()) + } + }) } fun requestAddRating(rating:RatingReceive){ diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt new file mode 100644 index 0000000..d43057f --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Adapters/CommentsAdapter.kt @@ -0,0 +1,38 @@ +package com.example.brzodolokacije.Adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Models.CommentSend +import com.example.brzodolokacije.databinding.SingleCommentBinding + +class CommentsAdapter (val items : MutableList) + : RecyclerView.Adapter(){ + //constructer has one argument - list of objects that need to be displayed + //it is bound to xml of single item + private lateinit var binding: SingleCommentBinding + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater = LayoutInflater.from(parent.context) + binding=SingleCommentBinding.inflate(inflater,parent,false) + return ViewHolder(binding) + } + override fun onBindViewHolder(holder: ViewHolder, position: Int){ + //sets components of particular item + holder.bind(items[position]) + } + override fun getItemCount(): Int { + try{ + return items.size + }catch (e:Exception){ + return 0 + } + } + inner class ViewHolder(itemView : SingleCommentBinding) : RecyclerView.ViewHolder(itemView.root){ + fun bind(item : CommentSend){ + binding.apply { + tvCommentAuthor.text=item.username + tvCommentText.text=item.comment + } + } + } +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt index ac13bca..cd23a65 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -1,13 +1,10 @@ package com.example.brzodolokacije.Interfaces +import com.example.brzodolokacije.Models.* import com.example.brzodolokacije.Models.Auth.JustMail import com.example.brzodolokacije.Models.Auth.Login import com.example.brzodolokacije.Models.Auth.Register import com.example.brzodolokacije.Models.Auth.ResetPass -import com.example.brzodolokacije.Models.Location -import com.example.brzodolokacije.Models.PostPreview -import com.example.brzodolokacije.Models.Rating -import com.example.brzodolokacije.Models.RatingReceive import okhttp3.MultipartBody import okhttp3.Request import okhttp3.RequestBody @@ -40,6 +37,12 @@ interface IBackendApi { ):Call @POST("api/Post/posts/{id}/addrating") fun addRating(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: RatingReceive):Call - //@POST("putanja") + @POST("api/Post/posts/{id}/addcomment") + fun addComment(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: CommentReceive):Call + @GET("api/Post/posts/{id}/listcomments") + fun getComments(@Header("Authorization") authHeader:String,@Path("id") id:String):Call> + + +//@POST("putanja") //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index a1eb5d0..3bbcc0c 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -33,7 +33,7 @@ data class PostPreview ( var description:String, var views:Int, var ratings:Float, - var comments:List?, + var comments:List?, var images:List //nedostaju datum i vreme kreiranja ):Parcelable @@ -47,6 +47,22 @@ data class Comment ( var timeStamp: LocalDateTime ):Parcelable +@Parcelize +data class CommentSend( + var _id: String, + var userId: String, + var comment: String, + var parentId: String, + //var timestamp:LocalDateTime, + var username: String, + var replies: List? +):Parcelable + +data class CommentReceive( + var comment: String, + var parentId: String +) + data class Rating( var useridval :String, var rating:Int diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index 9c30136..cbfc063 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -227,6 +227,57 @@ android:textColor="@color/black" /> + + + + + + + + + + + + + + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml new file mode 100644 index 0000000..f219ea2 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/single_comment.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file -- cgit v1.2.3