This is a dating app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

300 lines
11 KiB

package com.example.dattingapp.Login
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import com.example.dattingapp.ui.theme.DattingAPPTheme
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.AddAPhoto
import androidx.compose.material.icons.filled.CameraAlt
import androidx.compose.material.icons.filled.Image
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PathEffect
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
class UploadProfileImgae : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
DattingAPPTheme {
ProfileImageUploadScreen()
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ProfileImageUploadScreen(
onBackClick: () -> Unit = {},
onUploadFromGalleryClick: () -> Unit = {},
onTakePhotoClick: () -> Unit = {},
onContinueClick: () -> Unit = {},
onContactSupportClick: () -> Unit = {}
) {
val backgroundGradient = Brush.verticalGradient(
colors = listOf(
Color(0xFFFFF7F8),
Color(0xFFFFFFFF),
Color(0xFFF7EFFC)
)
)
val buttonGradient = Brush.horizontalGradient(
colors = listOf(
Color(0xFFD84B75),
Color(0xFF8E54C1)
)
)
val avatarGradientBorder = Brush.sweepGradient(
colors = listOf(
Color(0xFFB00020),
Color(0xFF7B1FA2),
Color(0xFFB00020)
)
)
Scaffold(
topBar = {
TopAppBar(
title = {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
Text(
text = "VibeCheck",
fontWeight = FontWeight.Bold,
color = Color(0xFF9C0037),
fontSize = 20.sp,
modifier = Modifier.padding(end = 48.dp) // Offset navigation icon width to center text perfectly
)
}
},
navigationIcon = {
IconButton(onClick = onBackClick) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = "Back",
tint = Color.Black
)
}
},
colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Transparent)
)
},
containerColor = Color.Transparent
) { innerPadding ->
Column(
modifier = Modifier
.fillMaxSize()
.background(brush = backgroundGradient)
.padding(innerPadding)
.padding(horizontal = 24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "Upload profile photo",
fontSize = 22.sp,
fontWeight = FontWeight.Bold,
color = Color(0xFF1D1B20)
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "Choose a photo that shows your\nbest self. You can always change\nthis later.",
fontSize = 13.sp,
color = Color(0xFF666666),
textAlign = TextAlign.Center,
lineHeight = 18.sp
)
Spacer(modifier = Modifier.height(36.dp))
// Circular Avatar Placeholder with Gradient Ring
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(190.dp)
.shadow(
elevation = 16.dp,
shape = CircleShape,
spotColor = Color(0x33B00020),
ambientColor = Color(0x337B1FA2)
)
.background(Color.White, CircleShape)
.border(width = 3.dp, brush = avatarGradientBorder, shape = CircleShape)
) {
// Dashed Inner Circle Outline
Canvas(modifier = Modifier.size(160.dp)) {
val stroke = Stroke(
width = 2f,
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
)
drawCircle(
color = Color(0xFFE0C4CD),
style = stroke
)
}
// Center Camera Icon
Icon(
imageVector = Icons.Default.AddAPhoto,
contentDescription = "Add Photo",
tint = Color(0xFFE5A8B8),
modifier = Modifier.size(44.dp)
)
}
Spacer(modifier = Modifier.weight(1f))
// Secondary Action Options
Column(
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = Modifier.fillMaxWidth()
) {
// Upload from gallery Button
Surface(
onClick = onUploadFromGalleryClick,
shape = RoundedCornerShape(12.dp),
color = Color(0xFFE8DDED).copy(alpha = 0.6f),
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
Icon(
imageVector = Icons.Default.Image,
contentDescription = null,
tint = Color(0xFF6B008A),
modifier = Modifier.size(18.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = "Upload from gallery",
color = Color(0xFF6B008A),
fontSize = 13.sp,
fontWeight = FontWeight.SemiBold
)
}
}
// Take a photo Button
Surface(
onClick = onTakePhotoClick,
shape = RoundedCornerShape(12.dp),
color = Color(0xFFE8DDED).copy(alpha = 0.6f),
modifier = Modifier
.fillMaxWidth()
.height(48.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
Icon(
imageVector = Icons.Default.CameraAlt,
contentDescription = null,
tint = Color(0xFF6B008A),
modifier = Modifier.size(18.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = "Take a photo",
color = Color(0xFF6B008A),
fontSize = 13.sp,
fontWeight = FontWeight.SemiBold
)
}
}
}
Spacer(modifier = Modifier.height(20.dp))
// Main Gradient Continue Button
Button(
onClick = onContinueClick,
modifier = Modifier
.fillMaxWidth()
.height(50.dp)
.background(
brush = buttonGradient,
shape = RoundedCornerShape(12.dp)
),
colors = ButtonDefaults.buttonColors(containerColor = Color.Transparent),
shape = RoundedCornerShape(12.dp)
) {
Text(
text = "Continue",
color = Color.White,
fontWeight = FontWeight.Bold,
fontSize = 16.sp
)
}
Spacer(modifier = Modifier.height(16.dp))
// Need help? Contact support Footer
Row(
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
) {
Text(
text = "Need help? ",
fontSize = 12.sp,
color = Color(0xFF666666)
)
Text(
text = "Contact support",
fontSize = 12.sp,
fontWeight = FontWeight.Bold,
color = Color(0xFFB00020),
modifier = Modifier.clickable { onContactSupportClick() }
)
}
Spacer(modifier = Modifier.height(16.dp))
}
}
}
@Preview(showBackground = true, device = "spec:width=411dp,height=891dp")
@Composable
fun ProfileImageUploadScreenPreview() {
ProfileImageUploadScreen()
}