studhub-epfl/studhub-app

View on GitHub
app/src/main/java/com/studhub/app/presentation/listing/browse/components/ListingCard.kt

Summary

Maintainability
A
3 hrs
Test Coverage
A
100%
package com.studhub.app.presentation.listing.browse.components


import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.Text
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.studhub.app.R
import com.studhub.app.domain.model.Category
import com.studhub.app.domain.model.Listing
import com.studhub.app.domain.model.ListingType


@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ListingCard(listing: Listing, onClick: () -> Unit) {
    Card(
        onClick = onClick,
        modifier = Modifier
            .padding(8.dp)
            .fillMaxWidth(),
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.tertiaryContainer
        )
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth()
                .height(90.dp)
                .clickable { onClick() }
        ) {
            ThumbnailImage()
            Box(
                modifier = Modifier
                    .fillMaxHeight()
                    .fillMaxWidth()
            ) {
                // Item title
                Text(
                    modifier = Modifier.padding(start = 5.dp),
                    text = listing.name,
                    style = MaterialTheme.typography.labelLarge
                )
                // Price chip
                Column(modifier = Modifier.align(Alignment.BottomStart)) {
                    if (listing.type == ListingType.BIDDING) {
                        Text(
                            modifier = Modifier.padding(3.dp),
                            text = stringResource(R.string.bidding_type_indicator),
                            color = MaterialTheme.colorScheme.secondary
                        )
                    }
                    PriceChip(
                        price = listing.price
                    )
                }
                // Category name and seller
                CategoryAndSellerInfo(
                    category = if (listing.categories.isEmpty()) Category() else listing.categories[0],
                    seller = listing.seller,
                    modifier = Modifier
                        .align(Alignment.BottomEnd)
                        .padding(end = 5.dp, bottom = 4.dp)
                )
            }
        }
    }

}