Skip to content

Commit

Permalink
udpate
Browse files Browse the repository at this point in the history
  • Loading branch information
robinsrk committed Feb 10, 2023
1 parent a82318d commit a4e43cc
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.buspayment.realtimeDB.repository

import com.example.buspayment.realtimeDB.responses.RealtimeBusResponse
import com.example.buspayment.realtimeDB.responses.RealtimeDistanceResponse
import com.example.buspayment.realtimeDB.responses.RealtimePaymentListResponse
import com.example.buspayment.realtimeDB.responses.RealtimeUserResponse
import com.example.buspayment.utils.ResultState
import com.google.firebase.database.DataSnapshot
Expand Down Expand Up @@ -33,6 +34,34 @@ class DBRepository @Inject constructor(
}


override fun getConductorPaymentList(): Flow<ResultState<List<RealtimePaymentListResponse>>> =
callbackFlow {
trySend(ResultState.Loading)

val valueEvent = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val payment = snapshot.children.map {
RealtimePaymentListResponse(
it.getValue(RealtimePaymentListResponse.PaymentResponse::class.java),
key = it.key
)
}
trySend(ResultState.Success(payment))
}

override fun onCancelled(error: DatabaseError) {
trySend(ResultState.Failure(error.toException()))
}

}

db.child("paymentList").addValueEventListener(valueEvent)
awaitClose {
db.child("paymentList").removeEventListener(valueEvent)
close()
}
}

override fun getUser(): Flow<ResultState<List<RealtimeUserResponse>>> = callbackFlow {
trySend(ResultState.Loading)

Expand Down Expand Up @@ -60,7 +89,7 @@ class DBRepository @Inject constructor(
}
}

override fun delete(key: String): Flow<ResultState<String>> = callbackFlow {
override fun deleteUser(key: String): Flow<ResultState<String>> = callbackFlow {
trySend(ResultState.Loading)
db.child("userList").child(key).removeValue()
.addOnCompleteListener {
Expand Down Expand Up @@ -93,6 +122,23 @@ class DBRepository @Inject constructor(
}
}

override fun submitPayment(payment: RealtimePaymentListResponse.PaymentResponse): Flow<ResultState<String>> =
callbackFlow {
trySend(ResultState.Loading)
db.child("paymentList").push().setValue(
payment
).addOnCompleteListener {
if (it.isSuccessful)
trySend(ResultState.Success("Payment successful"))
}
.addOnFailureListener {
trySend(ResultState.Failure(it))
}
awaitClose {
close()
}
}

override fun addBus(bus: RealtimeBusResponse.BusResponse): Flow<ResultState<String>> =
callbackFlow {
trySend(ResultState.Loading)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.example.buspayment.realtimeDB.repository

import com.example.buspayment.realtimeDB.responses.RealtimeBusResponse
import com.example.buspayment.realtimeDB.responses.RealtimeDistanceResponse
import com.example.buspayment.realtimeDB.responses.RealtimePaymentListResponse
import com.example.buspayment.realtimeDB.responses.RealtimeUserResponse
import com.example.buspayment.utils.ResultState
import kotlinx.coroutines.flow.Flow
Expand All @@ -14,7 +15,9 @@ interface Repository {
fun getUser(): Flow<ResultState<List<RealtimeUserResponse>>>
fun getBus(): Flow<ResultState<List<RealtimeBusResponse>>>
fun getDistance(): Flow<ResultState<List<RealtimeDistanceResponse>>>
fun delete(
fun submitPayment(payment: RealtimePaymentListResponse.PaymentResponse): Flow<ResultState<String>>
fun getConductorPaymentList(): Flow<ResultState<List<RealtimePaymentListResponse>>>
fun deleteUser(
key: String
): Flow<ResultState<String>>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.buspayment.realtimeDB.responses

data class RealtimePaymentListResponse(
val payment: PaymentResponse?,
val key: String? = "",
) {
data class PaymentResponse(
val status: String? = "",
val fromUser: String? = "",
val toUser: String? = "",
val from: String? = "",
val to: String? = "",
val paid: Double? = 0.0,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.lifecycle.viewModelScope
import com.example.buspayment.realtimeDB.repository.Repository
import com.example.buspayment.realtimeDB.responses.RealtimeBusResponse
import com.example.buspayment.realtimeDB.responses.RealtimeDistanceResponse
import com.example.buspayment.realtimeDB.responses.RealtimePaymentListResponse
import com.example.buspayment.realtimeDB.responses.RealtimeUserResponse
import com.example.buspayment.utils.ResultState
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -24,7 +25,12 @@ class RealtimeViewModel @Inject constructor(
val distRes: State<DistState> = _distRes
private val _busRes: MutableState<BusState> = mutableStateOf(BusState())
val busRes: State<BusState> = _busRes
private val _payRes: MutableState<PaymentState> = mutableStateOf(PaymentState())
val payres: State<PaymentState> = _payRes
fun addUser(users: RealtimeUserResponse.UserResponse) = repo.addUser(users)
fun submitPayment(payment: RealtimePaymentListResponse.PaymentResponse) =
repo.submitPayment(payment)

fun addBus(bus: RealtimeBusResponse.BusResponse) = repo.addBus(bus)

init {
Expand Down Expand Up @@ -74,6 +80,29 @@ class RealtimeViewModel @Inject constructor(
}
}
}
viewModelScope.launch {
repo.getConductorPaymentList().collect {
when (it) {
is ResultState.Success -> {
_payRes.value = PaymentState(
payment = it.data
)
}

is ResultState.Failure -> {
_payRes.value = PaymentState(
error = it.msg.toString()
)
}

is ResultState.Loading -> {
_payRes.value = PaymentState(
isLoading = true
)
}
}
}
}
viewModelScope.launch {
repo.getDistance().collect {
when (it) {
Expand All @@ -99,7 +128,7 @@ class RealtimeViewModel @Inject constructor(
}
}

fun delete(key: String) = repo.delete(key)
fun delete(key: String) = repo.deleteUser(key)
fun updateUser(user: RealtimeUserResponse) = repo.updateUser(user)
}

Expand All @@ -120,3 +149,9 @@ data class DistState(
val error: String = "",
val isLoading: Boolean = false
)

data class PaymentState(
val payment: List<RealtimePaymentListResponse> = emptyList(),
val error: String = "",
val isLoading: Boolean = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ fun RegisterScreen(
Text(text = "Confirm password")
},
leadingIcon = {
IconButton(onClick = { /*TODO*/ }) {
IconButton(onClick = { }) {
Icon(imageVector = Icons.Filled.Lock, contentDescription = "Lock icon")
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,78 @@
package com.example.buspayment.screens.conductor

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import com.example.buspayment.navigations.Screens
import com.example.buspayment.realtimeDB.responses.RealtimePaymentListResponse
import com.example.buspayment.realtimeDB.ui.RealtimeViewModel

@Composable
fun PaymentListScreen(navController: NavController) {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) {
fun PaymentListScreen(
navController: NavController,
viewModel: RealtimeViewModel = hiltViewModel()
) {
val res = viewModel.payres.value
Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) {
Row(
Modifier
.fillMaxWidth()
.background(Color.Red, RoundedCornerShape(0.dp, 0.dp, 30.dp, 30.dp))
.padding(20.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
modifier = Modifier.clickable {
navController.popBackStack()
}, imageVector = Icons.Filled.ArrowBack, contentDescription = "Back button"
)
Text(text = "Manage buses", style = MaterialTheme.typography.headlineSmall)
Text(text = "", style = MaterialTheme.typography.headlineSmall)
}
Column {
Box(
Modifier
.height(400.dp)
.width(400.dp)
) {

Text(
text = "Waiting for approval",
textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineSmall,
modifier = Modifier
.clickable {
navController.navigate(Screens.UHome.route)
if (res.payment.isNotEmpty()) {
// val paymentList = res.payment.filter { item -> item.payment!!.status == "Pending" }
LazyColumn() {
items(
res.payment,
key = {
it.key!!
}
.fillMaxWidth()
)
) { res ->
PaymentListRow(itemState = res.payment!!)
}
}
} else if (res.isLoading) {
CircularProgressIndicator()
}
}
}
}

@Composable
fun PaymentListRow(
itemState: RealtimePaymentListResponse.PaymentResponse
) {
Text(itemState.fromUser!!)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
package com.example.buspayment.screens.user

import android.Manifest
import android.app.Application
import android.content.pm.PackageManager
import android.util.Log
import android.util.Size
import android.widget.Toast
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.camera.core.CameraSelector
Expand Down Expand Up @@ -40,8 +42,10 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand All @@ -56,25 +60,37 @@ import androidx.compose.ui.unit.toSize
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import com.example.buspayment.data.User
import com.example.buspayment.data.UserViewModel
import com.example.buspayment.funtions.QrCodeAnalysis
import com.example.buspayment.navigations.Screens
import com.example.buspayment.realtimeDB.responses.RealtimePaymentListResponse
import com.example.buspayment.realtimeDB.ui.RealtimeViewModel
import com.example.buspayment.ui.theme.Typography
import com.example.buspayment.utils.ResultState
import com.google.android.gms.location.LocationServices
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlin.math.abs

@Composable
fun ScanScreen(
navController: NavController,
viewModel: RealtimeViewModel = hiltViewModel()
) {
val context = LocalContext.current
val res = viewModel.distRes.value
val scope = rememberCoroutineScope()
val buses = viewModel.busRes.value
var user by remember { mutableStateOf(listOf<User>()) }
val mUserViewModel: UserViewModel =
viewModel(factory = UserViewModel.UserViewModelFactory(context.applicationContext as Application))
user = mUserViewModel.readUser.observeAsState(listOf()).value
var code by remember { mutableStateOf("") }
var isExpanded by remember { mutableStateOf(false) }
var isToExpanded by remember { mutableStateOf(false) }
val context = LocalContext.current
val lifeCycleOwner = LocalLifecycleOwner.current
val fromList = mutableListOf<String>()
val toList = mutableListOf<String>()
Expand Down Expand Up @@ -238,7 +254,33 @@ fun ScanScreen(
modifier = Modifier.fillMaxWidth()
) {
OutlinedButton(
onClick = { navController.navigate(Screens.UHome.route) },
onClick = {
scope.launch(Dispatchers.Main) {
viewModel.submitPayment(
RealtimePaymentListResponse.PaymentResponse(
"Pending",
from = selectedFrom,
to = selectedTo,
fromUser = user[0].email,
toUser = "[email protected]",
paid = price,
)
).collect { response ->
when (response) {
is ResultState.Success -> {
Toast.makeText(context, "Payment successful", Toast.LENGTH_SHORT).show()
navController.navigate(Screens.UHome.route)
}

is ResultState.Failure -> {
Toast.makeText(context, "Failed", Toast.LENGTH_SHORT).show()
}

is ResultState.Loading -> {}
}
}
}
},
enabled = price > 0
) {
Text(text = "Proceed to payment $price taka")
Expand Down

0 comments on commit a4e43cc

Please sign in to comment.