package com.sffteam.voidclient import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn 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.ArrowBackIos import androidx.compose.material.icons.filled.Block import androidx.compose.material.icons.filled.ChatBubble import androidx.compose.material3.Button import androidx.compose.material3.ButtonColors import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme.colorScheme import androidx.compose.material3.Text import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import coil3.compose.AsyncImage import com.sffteam.voidclient.ui.theme.AppTheme import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.jsonArray import java.util.Locale.getDefault class ProfileViewActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() val userId = intent.getLongExtra("userId", 0L) setContent { AppTheme() { val users by UserManager.usersList.collectAsState() val currentUser = users[userId] val avatarUrl = currentUser?.avatarUrl val description = currentUser?.description val coroutineScope = rememberCoroutineScope() val fullName = currentUser?.firstName + if (currentUser?.lastName?.isNotEmpty() == true) { " " + currentUser.lastName } else { "" } val context = LocalContext.current var userMap : MutableMap = mutableMapOf( ) if (description?.isNotEmpty() == true) { userMap["О себе"] = description } userMap["ID"] = userId.toString() LazyColumn( modifier = Modifier .fillMaxSize() .background(colorScheme.background) .windowInsetsPadding(WindowInsets.statusBars) ) { item { IconButton({ finish() }) { Icon( Icons.AutoMirrored.Filled.ArrowBackIos, "", modifier = Modifier.size(25.dp), tint = colorScheme.primary ) } } item { Column(modifier = Modifier .padding(8.dp) .fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterVertically) ) { if (avatarUrl?.isNotEmpty() == true) { AsyncImage( avatarUrl, "", modifier = Modifier .align(Alignment.CenterHorizontally) .size(110.dp) .clip(CircleShape) .clickable { val intent = Intent(context, ImageViewerActivity::class.java) intent.putExtra("isSingleImage", true) intent.putExtra("image", avatarUrl) context.startActivity(intent) }, contentScale = ContentScale.FillBounds ) } else { val initial = fullName?.split(" ")?.mapNotNull { it.firstOrNull() } ?.take(2)?.joinToString("")?.uppercase(getDefault()) Box( contentAlignment = Alignment.Center, modifier = Modifier .width(100.dp) .height(100.dp) .clip(CircleShape) .background( brush = Brush.linearGradient( colors = listOf( Utils.getColorForAvatar(fullName).first, Utils.getColorForAvatar(fullName).second ) ) ) .align(Alignment.CenterHorizontally), ) { Text( text = initial.toString(), color = Color.White, style = MaterialTheme.typography.labelLarge, fontSize = 40.sp ) } } Text( fullName, fontSize = 24.sp, modifier = Modifier.align(Alignment.CenterHorizontally).padding(start = 8.dp, end = 8.dp), color = colorScheme.secondary, maxLines = 1, overflow = TextOverflow.Ellipsis ) } } item { Row(modifier = Modifier .fillMaxWidth() .padding(4.dp), horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally) ) { Button(onClick = { val chatId = AccountManager.accountID xor userId val packet = SocketManager.packPacket( OPCode.CHAT_INFO.opcode, JsonObject( mapOf( "chatIds" to JsonArray(listOf(Json.encodeToJsonElement(Long.serializer(), chatId))), ) ) ) val intent = Intent(context, ChatActivity::class.java) try { GlobalScope.launch { SocketManager.sendPacket( packet, { packet -> println(packet) GlobalScope.launch { if (packet.payload is JsonObject) ChatManager.processChats( packet.payload["chats"]!!.jsonArray ) } } ) } } catch (e : Exception) { println(e) } intent.putExtra("chatID", chatId) intent.putExtra("chatTitle", fullName); intent.putExtra("chatType", "DIALOG") intent.putExtra("chatIcon", avatarUrl); context.startActivity(intent) }, modifier = Modifier.padding(4.dp).width(160.dp), colors = ButtonColors( containerColor = colorScheme.primaryContainer, contentColor = colorScheme.onPrimaryContainer, disabledContainerColor = colorScheme.primaryContainer, disabledContentColor = colorScheme.onPrimaryContainer, ) ) { Column { Icon( Icons.Filled.ChatBubble, "", modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally) ) Text("Чат", fontSize = 18.sp, modifier = Modifier.align(Alignment.CenterHorizontally), ) } } Button(onClick = { }, modifier = Modifier.padding(4.dp).width(160.dp), colors = ButtonColors( containerColor = colorScheme.primaryContainer, contentColor = colorScheme.onPrimaryContainer, disabledContainerColor = colorScheme.primaryContainer, disabledContentColor = colorScheme.onPrimaryContainer, ) ) { Column() { Icon( Icons.Filled.Block, "", modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally) ) Text("Заблокировать", fontSize = 18.sp, modifier = Modifier.align(Alignment.CenterHorizontally), maxLines = 1 ) } } // // For future updates // Button(onClick = { // }, // modifier = Modifier.padding(4.dp).widthIn(min = 100.dp), // colors = ButtonColors( // containerColor = colorScheme.primaryContainer, // contentColor = colorScheme.onPrimaryContainer, // disabledContainerColor = colorScheme.primaryContainer, // disabledContentColor = colorScheme.onPrimaryContainer, // ) // ) { // Column() { // Icon( // Icons.Filled.Folder, // "", // modifier = Modifier.size(25.dp).align(Alignment.CenterHorizontally) // ) // Text("Добавить в папку", // fontSize = 18.sp, // modifier = Modifier.align(Alignment.CenterHorizontally), // maxLines = 1 // ) // } // } } } item { Box(modifier = Modifier .fillMaxWidth() .padding(8.dp) .background(colorScheme.secondaryContainer, RoundedCornerShape(16.dp)) ) { Column(modifier = Modifier.padding(8.dp)) { for (setting in userMap.toList()) { Text(setting.first, modifier = Modifier.alpha(0.7f), color = colorScheme.onSecondaryContainer, fontSize = 16.sp) Text(setting.second, color = colorScheme.onSecondaryContainer, fontSize = 20.sp, modifier = Modifier.padding(bottom = 4.dp) ) } } } } } } } } }