diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..968a8655 Binary files /dev/null and b/.DS_Store differ diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 00000000..8853a5a3 Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellAsyncImage.kt b/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellAsyncImage.kt new file mode 100644 index 00000000..ad5fcb3c --- /dev/null +++ b/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellAsyncImage.kt @@ -0,0 +1,54 @@ +package com.cornellappdev.resell.android.ui.components.global + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.DefaultAlpha +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.res.painterResource +import coil.compose.AsyncImage +import coil.compose.AsyncImagePainter +import coil.compose.AsyncImagePainter.Companion.DefaultTransform +import com.cornellappdev.resell.android.R + +/** + * A wrapper around coil's AsyncImage, but contains an extra parameter, previewImageResource, which + * allows us to specify what image should be used when the image is being viewed in a Preview. This + * is useful because AsyncImages don't load in previews and it causes the previews to not look good. + */ +@Composable +fun ResellAsyncImage( + model: Any?, + contentDescription: String?, + modifier: Modifier = Modifier, + transform: (AsyncImagePainter.State) -> AsyncImagePainter.State = DefaultTransform, + onState: ((AsyncImagePainter.State) -> Unit)? = null, + alignment: Alignment = Alignment.Center, + contentScale: ContentScale = ContentScale.Fit, + alpha: Float = DefaultAlpha, + @DrawableRes previewImageResource: Int = R.drawable.ic_image, +) { + if (LocalInspectionMode.current) { + Image( + painterResource(previewImageResource), + contentDescription = contentDescription, + contentScale = contentScale, + modifier = modifier, + alpha = alpha, + ) + } else { + AsyncImage( + model, + contentDescription, + modifier, + transform, + onState, + alignment, + contentScale, + alpha, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellTextButton.kt b/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellTextButton.kt index 4c9760ac..724a8420 100644 --- a/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellTextButton.kt +++ b/app/src/main/java/com/cornellappdev/resell/android/ui/components/global/ResellTextButton.kt @@ -29,9 +29,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.cornellappdev.resell.android.ui.theme.AppDev import com.cornellappdev.resell.android.ui.theme.Primary +import com.cornellappdev.resell.android.ui.theme.ResellPreview import com.cornellappdev.resell.android.ui.theme.ResellPurple import com.cornellappdev.resell.android.ui.theme.Style import com.cornellappdev.resell.android.ui.theme.Warning @@ -209,44 +212,16 @@ private fun ResellTextButtonPreview( } } -@Preview -@Composable -private fun ResellPrimaryTextButtonPreview() { - ResellTextButtonPreview() -} - -@Preview -@Composable -private fun ResellSecondaryTextButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.SECONDARY) -} - -@Preview -@Composable -private fun ResellPrimaryRedTextButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.PRIMARY_RED) -} - -@Preview -@Composable -private fun ResellSecondaryRedTextButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.SECONDARY_RED) -} - -@Preview -@Composable -private fun ResellSecondaryNakedButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.NAKED) -} - -@Preview -@Composable -private fun ResellSecondaryNakedRedTextButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.NAKED_RED) -} +private class ResellTextButtonContainerPreviewProvider( + override val values: Sequence = sequenceOf( + *ResellTextButtonContainer.entries.toTypedArray() + ) +) : PreviewParameterProvider @Preview @Composable -private fun ResellPrimaryNakedButtonPreview() { - ResellTextButtonPreview(containerType = ResellTextButtonContainer.NAKED_PRIMARY) -} +private fun ResellButtonPreview( + @PreviewParameter(ResellTextButtonContainerPreviewProvider::class) container: ResellTextButtonContainer +) = ResellPreview { + ResellTextButtonPreview(container) +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/resell/android/ui/components/main/ProfilePictureView.kt b/app/src/main/java/com/cornellappdev/resell/android/ui/components/main/ProfilePictureView.kt index c6ce1cb2..cae0d96c 100644 --- a/app/src/main/java/com/cornellappdev/resell/android/ui/components/main/ProfilePictureView.kt +++ b/app/src/main/java/com/cornellappdev/resell/android/ui/components/main/ProfilePictureView.kt @@ -6,21 +6,32 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage +import com.cornellappdev.resell.android.R +import com.cornellappdev.resell.android.ui.components.global.ResellAsyncImage +import com.cornellappdev.resell.android.ui.theme.ResellPreview + @Composable fun ProfilePictureView( imageUrl: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { - // TODO Improve loading animation & shimmer - AsyncImage( + + ResellAsyncImage( model = imageUrl, contentDescription = "pfp", modifier = modifier .sizeIn(minWidth = 31.dp, minHeight = 31.dp) .clip(CircleShape), - contentScale = ContentScale.Crop + contentScale = ContentScale.Crop, + previewImageResource = R.drawable.ic_empty_pfp, ) } + +@Preview +@Composable +fun ProfilePictureViewPreview() = ResellPreview { + ProfilePictureView("https://core-docs.s3.amazonaws.com/murray_county_central_schools_ar/article/image/66f00638-2227-4795-84cc-8cefe4e4fb75.png") +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/resell/android/ui/components/profile/ProfileHeader.kt b/app/src/main/java/com/cornellappdev/resell/android/ui/components/profile/ProfileHeader.kt index b259c7ce..a2fd4a62 100644 --- a/app/src/main/java/com/cornellappdev/resell/android/ui/components/profile/ProfileHeader.kt +++ b/app/src/main/java/com/cornellappdev/resell/android/ui/components/profile/ProfileHeader.kt @@ -17,11 +17,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import com.cornellappdev.resell.android.R import com.cornellappdev.resell.android.ui.components.global.ResellTabBar import com.cornellappdev.resell.android.ui.components.main.ProfilePictureView import com.cornellappdev.resell.android.ui.theme.IconInactive +import com.cornellappdev.resell.android.ui.theme.ResellPreview import com.cornellappdev.resell.android.ui.theme.Secondary import com.cornellappdev.resell.android.ui.theme.Style import com.cornellappdev.resell.android.util.clickableNoIndication @@ -56,7 +61,6 @@ fun ProfileHeader( imageUrl = imageUrl, ) - if (leftIcon != null) { Icon( painter = painterResource(id = leftIcon), @@ -108,6 +112,7 @@ fun ProfileHeader( maxLines = 3, style = Style.body2, textAlign = TextAlign.Center, + overflow = TextOverflow.Ellipsis, ) } @@ -135,3 +140,25 @@ fun ProfileHeader( } } } + +class BioPreviewProvider( + override val values: Sequence = sequenceOf( + "This is a short bio.", + "This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio.This is an insanely super duper very very extremely so long super duper long omg I don't think I've ever seen something this long it is just so long I cannot begin to fathom how long it is bio." + ) +) : PreviewParameterProvider + +@Preview +@Composable +fun ProfileHeaderBiosPreview( + @PreviewParameter(BioPreviewProvider::class) bio: String +) = ResellPreview { + ProfileHeader( + imageUrl = "", + shopName = "Hello", + vendorName = "world", + bio = bio, + selectedTab = null, + onTabSelected = {} + ) +} diff --git a/app/src/main/res/drawable/profile_background.xml b/app/src/main/res/drawable/profile_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/main/res/drawable/profile_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/profile.xml b/app/src/main/res/mipmap-anydpi-v26/profile.xml new file mode 100644 index 00000000..67995ddc --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/profile.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/profile_foreground.webp b/app/src/main/res/mipmap-hdpi/profile_foreground.webp new file mode 100644 index 00000000..9c37ec85 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/profile_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/profile_foreground.webp b/app/src/main/res/mipmap-mdpi/profile_foreground.webp new file mode 100644 index 00000000..33a6d515 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/profile_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/profile_foreground.webp b/app/src/main/res/mipmap-xhdpi/profile_foreground.webp new file mode 100644 index 00000000..36c8a67c Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/profile_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/profile_foreground.webp b/app/src/main/res/mipmap-xxhdpi/profile_foreground.webp new file mode 100644 index 00000000..def748f6 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/profile_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/profile_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/profile_foreground.webp new file mode 100644 index 00000000..c5474414 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/profile_foreground.webp differ