diff --git a/app/src/main/java/com/delecrode/devhub/MainActivity.kt b/app/src/main/java/com/delecrode/devhub/MainActivity.kt index 71fec80..6eccc8c 100644 --- a/app/src/main/java/com/delecrode/devhub/MainActivity.kt +++ b/app/src/main/java/com/delecrode/devhub/MainActivity.kt @@ -5,8 +5,8 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import com.delecrode.devhub.domain.session.SessionViewModel -import com.delecrode.devhub.navigation.AppNavHost -import com.delecrode.devhub.ui.theme.DevHubTheme +import com.delecrode.devhub.presentation.navigation.AppNavHost +import com.delecrode.devhub.presentation.ui.theme.DevHubTheme import org.koin.androidx.compose.koinViewModel class MainActivity : ComponentActivity() { diff --git a/app/src/main/java/com/delecrode/devhub/data/local/database/AppDatabase.kt b/app/src/main/java/com/delecrode/devhub/data/local/database/AppDatabase.kt index d7f918d..5008b68 100644 --- a/app/src/main/java/com/delecrode/devhub/data/local/database/AppDatabase.kt +++ b/app/src/main/java/com/delecrode/devhub/data/local/database/AppDatabase.kt @@ -7,7 +7,7 @@ import com.delecrode.devhub.data.model.entity.RepoEntity @Database( entities = [RepoEntity::class], - version = 1 + version = 2 ) abstract class AppDatabase : RoomDatabase() { abstract fun repoDao(): RepoDao diff --git a/app/src/main/java/com/delecrode/devhub/data/local/database/Migration.kt b/app/src/main/java/com/delecrode/devhub/data/local/database/Migration.kt new file mode 100644 index 0000000..20265cc --- /dev/null +++ b/app/src/main/java/com/delecrode/devhub/data/local/database/Migration.kt @@ -0,0 +1,33 @@ +package com.delecrode.devhub.data.local.database + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +val MIGRATION_1_2 = object : Migration(1, 2) { + override fun migrate(db: SupportSQLiteDatabase) { + + db.execSQL(""" + CREATE TABLE repositories_new ( + idLocal INTEGER NOT NULL PRIMARY KEY, + id INTEGER NOT NULL, + name TEXT NOT NULL, + userName TEXT NOT NULL, + description TEXT, + url TEXT NOT NULL + ) + """) + + db.execSQL(""" + INSERT INTO repositories_new ( + idLocal, id, name, userName, description, url + ) + SELECT + idLocal, id, name, userName, description, url + FROM repositories + """) + + db.execSQL("DROP TABLE repositories") + db.execSQL("ALTER TABLE repositories_new RENAME TO repositories") + } +} + diff --git a/app/src/main/java/com/delecrode/devhub/data/model/entity/Repo.kt b/app/src/main/java/com/delecrode/devhub/data/model/entity/Repo.kt index 5f8a52d..30944f9 100644 --- a/app/src/main/java/com/delecrode/devhub/data/model/entity/Repo.kt +++ b/app/src/main/java/com/delecrode/devhub/data/model/entity/Repo.kt @@ -11,6 +11,6 @@ data class RepoEntity( val id: Int, val name: String, val userName: String, - val description: String, + val description: String?, val url: String, ) diff --git a/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/RetrofitInstance.kt b/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/RetrofitInstance.kt index de3ebb7..99f8e11 100644 --- a/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/RetrofitInstance.kt +++ b/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/RetrofitInstance.kt @@ -1,26 +1,21 @@ package com.delecrode.devhub.data.remote.webApi.instance import com.delecrode.devhub.BuildConfig +import com.delecrode.devhub.data.remote.webApi.instance.intercptor.FullLoggingInterceptor import com.delecrode.devhub.data.remote.webApi.service.RepoApiService import com.delecrode.devhub.data.remote.webApi.service.UserApiService import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.util.concurrent.TimeUnit object RetrofitInstance { - private val loggingInterceptor = HttpLoggingInterceptor().apply { - level = - if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE - } - private val client = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) - .addInterceptor(loggingInterceptor) + .addInterceptor(FullLoggingInterceptor()) .build() val retrofit: Retrofit = Retrofit.Builder() diff --git a/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/intercptor/FullLoggingInterceptor.kt b/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/intercptor/FullLoggingInterceptor.kt new file mode 100644 index 0000000..93e4cce --- /dev/null +++ b/app/src/main/java/com/delecrode/devhub/data/remote/webApi/instance/intercptor/FullLoggingInterceptor.kt @@ -0,0 +1,48 @@ +package com.delecrode.devhub.data.remote.webApi.instance.intercptor + +import android.util.Log +import okhttp3.Interceptor +import okhttp3.Response +import okio.Buffer + +class FullLoggingInterceptor : Interceptor { + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + + // ===== REQUEST ===== + Log.d("Interceptor Method + URL", "${request.method}: ${request.url.toString()}") + Log.d("Interceptor Header", request.headers.toString()) + + request.body?.let { body -> + val buffer = Buffer() + body.writeTo(buffer) + Log.d("Interceptor Buffer", buffer.readUtf8()) + } + + val startTime = System.nanoTime() + val response = chain.proceed(request) + val endTime = System.nanoTime() + + // ===== RESPONSE ===== + Log.d("Interceptor Code", response.code.toString()) + Log.d("Interceptor Message", response.message) + Log.d("Interceptor Header", response.headers.toString()) + + val responseBody = response.body + val source = responseBody?.source() + source?.request(Long.MAX_VALUE) + + val buffer = source?.buffer + val responseString = buffer?.clone()?.readUtf8() + + Log.d("Interceptor Response", responseString ?: "") + + Log.d( + "Interceptor Time", + "Took ${(endTime - startTime) / 1e6} ms" + ) + + return response + } +} diff --git a/app/src/main/java/com/delecrode/devhub/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/delecrode/devhub/data/repository/AuthRepositoryImpl.kt index 4c1e6c6..73b935a 100644 --- a/app/src/main/java/com/delecrode/devhub/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/delecrode/devhub/data/repository/AuthRepositoryImpl.kt @@ -7,9 +7,9 @@ import com.delecrode.devhub.data.remote.firebase.UserExtraData import com.delecrode.devhub.domain.model.RegisterUser import com.delecrode.devhub.domain.model.UserAuth import com.delecrode.devhub.domain.repository.AuthRepository -import com.delecrode.devhub.utils.Result -import com.delecrode.devhub.utils.mapAuthError -import com.delecrode.devhub.utils.mapSignUpError +import com.delecrode.devhub.data.utils.Result +import com.delecrode.devhub.data.utils.mapAuthError +import com.delecrode.devhub.data.utils.mapSignUpError class AuthRepositoryImpl( private val authDataSource: FirebaseAuth, diff --git a/app/src/main/java/com/delecrode/devhub/data/repository/RepoRepositoryImpl.kt b/app/src/main/java/com/delecrode/devhub/data/repository/RepoRepositoryImpl.kt index acc2b4b..2849b09 100644 --- a/app/src/main/java/com/delecrode/devhub/data/repository/RepoRepositoryImpl.kt +++ b/app/src/main/java/com/delecrode/devhub/data/repository/RepoRepositoryImpl.kt @@ -11,8 +11,8 @@ import com.delecrode.devhub.domain.model.Languages import com.delecrode.devhub.domain.model.RepoDetail import com.delecrode.devhub.domain.model.RepoFav import com.delecrode.devhub.domain.repository.RepoRepository -import com.delecrode.devhub.utils.Result -import com.delecrode.devhub.utils.mapHttpError +import com.delecrode.devhub.data.utils.Result +import com.delecrode.devhub.data.utils.mapHttpError import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import java.io.IOException diff --git a/app/src/main/java/com/delecrode/devhub/data/repository/UserRepositoryImpl.kt b/app/src/main/java/com/delecrode/devhub/data/repository/UserRepositoryImpl.kt index 244a0b5..c5b1253 100644 --- a/app/src/main/java/com/delecrode/devhub/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/delecrode/devhub/data/repository/UserRepositoryImpl.kt @@ -11,8 +11,8 @@ import com.delecrode.devhub.domain.model.Repos import com.delecrode.devhub.domain.model.UserForFirebase import com.delecrode.devhub.domain.model.UserForGit import com.delecrode.devhub.domain.repository.UserRepository -import com.delecrode.devhub.utils.Result -import com.delecrode.devhub.utils.mapHttpError +import com.delecrode.devhub.data.utils.Result +import com.delecrode.devhub.data.utils.mapHttpError import kotlinx.coroutines.flow.first import java.io.IOException diff --git a/app/src/main/java/com/delecrode/devhub/utils/HttpMap.kt b/app/src/main/java/com/delecrode/devhub/data/utils/HttpMap.kt similarity index 97% rename from app/src/main/java/com/delecrode/devhub/utils/HttpMap.kt rename to app/src/main/java/com/delecrode/devhub/data/utils/HttpMap.kt index 16ce048..7e6ba17 100644 --- a/app/src/main/java/com/delecrode/devhub/utils/HttpMap.kt +++ b/app/src/main/java/com/delecrode/devhub/data/utils/HttpMap.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.utils +package com.delecrode.devhub.data.utils import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException import com.google.firebase.auth.FirebaseAuthInvalidUserException diff --git a/app/src/main/java/com/delecrode/devhub/utils/Result.kt b/app/src/main/java/com/delecrode/devhub/data/utils/Result.kt similarity index 78% rename from app/src/main/java/com/delecrode/devhub/utils/Result.kt rename to app/src/main/java/com/delecrode/devhub/data/utils/Result.kt index 17445cd..18c6c65 100644 --- a/app/src/main/java/com/delecrode/devhub/utils/Result.kt +++ b/app/src/main/java/com/delecrode/devhub/data/utils/Result.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.utils +package com.delecrode.devhub.data.utils sealed class Result { data class Success(val data: T) : Result() diff --git a/app/src/main/java/com/delecrode/devhub/di/AppModule.kt b/app/src/main/java/com/delecrode/devhub/di/AppModule.kt index b8052cd..4f93016 100644 --- a/app/src/main/java/com/delecrode/devhub/di/AppModule.kt +++ b/app/src/main/java/com/delecrode/devhub/di/AppModule.kt @@ -4,6 +4,7 @@ import androidx.room.Room import com.delecrode.devhub.data.local.dataStore.AuthLocalDataSource import com.delecrode.devhub.data.local.dataStore.AuthLocalDataSourceImpl import com.delecrode.devhub.data.local.database.AppDatabase +import com.delecrode.devhub.data.local.database.MIGRATION_1_2 import com.delecrode.devhub.data.local.database.data.RepoLocalDataSource import com.delecrode.devhub.data.local.database.data.RepoLocalDataSourceImpl import com.delecrode.devhub.data.remote.firebase.UserExtraData @@ -15,13 +16,13 @@ import com.delecrode.devhub.domain.repository.AuthRepository import com.delecrode.devhub.domain.repository.RepoRepository import com.delecrode.devhub.domain.repository.UserRepository import com.delecrode.devhub.domain.session.SessionViewModel -import com.delecrode.devhub.ui.favoritos.RepoFavViewModel -import com.delecrode.devhub.ui.forgot.ForgotPasswordViewModel -import com.delecrode.devhub.ui.home.HomeViewModel -import com.delecrode.devhub.ui.login.AuthViewModel -import com.delecrode.devhub.ui.profile.ProfileViewModel -import com.delecrode.devhub.ui.register.RegisterViewModel -import com.delecrode.devhub.ui.repo.RepoDetailViewModel +import com.delecrode.devhub.presentation.ui.favoritos.RepoFavViewModel +import com.delecrode.devhub.presentation.ui.forgot.ForgotPasswordViewModel +import com.delecrode.devhub.presentation.ui.home.HomeViewModel +import com.delecrode.devhub.presentation.ui.login.AuthViewModel +import com.delecrode.devhub.presentation.ui.profile.ProfileViewModel +import com.delecrode.devhub.presentation.ui.register.RegisterViewModel +import com.delecrode.devhub.presentation.ui.repo.RepoDetailViewModel import com.google.firebase.auth.FirebaseAuth import com.google.firebase.firestore.FirebaseFirestore import org.koin.android.ext.koin.androidContext @@ -42,7 +43,10 @@ val appModule = module { androidContext(), AppDatabase::class.java, "app_database" - ).build() + ) + .addMigrations(MIGRATION_1_2) + .build() + } single { diff --git a/app/src/main/java/com/delecrode/devhub/domain/model/Repos.kt b/app/src/main/java/com/delecrode/devhub/domain/model/Repos.kt index 588387a..593cf51 100644 --- a/app/src/main/java/com/delecrode/devhub/domain/model/Repos.kt +++ b/app/src/main/java/com/delecrode/devhub/domain/model/Repos.kt @@ -18,6 +18,6 @@ data class RepoFav( val id: Int, val name: String, val userName: String, - val description: String, + val description: String?, val url: String, ) diff --git a/app/src/main/java/com/delecrode/devhub/domain/repository/AuthRepository.kt b/app/src/main/java/com/delecrode/devhub/domain/repository/AuthRepository.kt index 56a2bb0..7ca1774 100644 --- a/app/src/main/java/com/delecrode/devhub/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/delecrode/devhub/domain/repository/AuthRepository.kt @@ -1,7 +1,7 @@ package com.delecrode.devhub.domain.repository import com.delecrode.devhub.domain.model.UserAuth -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result interface AuthRepository { diff --git a/app/src/main/java/com/delecrode/devhub/domain/repository/RepoRepository.kt b/app/src/main/java/com/delecrode/devhub/domain/repository/RepoRepository.kt index af662ae..0f346b7 100644 --- a/app/src/main/java/com/delecrode/devhub/domain/repository/RepoRepository.kt +++ b/app/src/main/java/com/delecrode/devhub/domain/repository/RepoRepository.kt @@ -3,7 +3,7 @@ package com.delecrode.devhub.domain.repository import com.delecrode.devhub.domain.model.Languages import com.delecrode.devhub.domain.model.RepoDetail import com.delecrode.devhub.domain.model.RepoFav -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.Flow interface RepoRepository { diff --git a/app/src/main/java/com/delecrode/devhub/domain/repository/UserRepository.kt b/app/src/main/java/com/delecrode/devhub/domain/repository/UserRepository.kt index 8bba190..abcf484 100644 --- a/app/src/main/java/com/delecrode/devhub/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/delecrode/devhub/domain/repository/UserRepository.kt @@ -3,7 +3,7 @@ package com.delecrode.devhub.domain.repository import com.delecrode.devhub.domain.model.Repos import com.delecrode.devhub.domain.model.UserForFirebase import com.delecrode.devhub.domain.model.UserForGit -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result interface UserRepository { suspend fun getUserForGitHub(userName: String): Result diff --git a/app/src/main/java/com/delecrode/devhub/ui/components/Button.kt b/app/src/main/java/com/delecrode/devhub/presentation/components/Button.kt similarity index 88% rename from app/src/main/java/com/delecrode/devhub/ui/components/Button.kt rename to app/src/main/java/com/delecrode/devhub/presentation/components/Button.kt index a6e25d5..4ad3e4d 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/components/Button.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/components/Button.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.components +package com.delecrode.devhub.presentation.components import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -13,8 +13,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.delecrode.devhub.ui.theme.DevHubTheme -import com.delecrode.devhub.ui.theme.PrimaryBlue +import com.delecrode.devhub.presentation.ui.theme.DevHubTheme +import com.delecrode.devhub.presentation.ui.theme.PrimaryBlue @Composable diff --git a/app/src/main/java/com/delecrode/devhub/ui/components/OutlineTextField.kt b/app/src/main/java/com/delecrode/devhub/presentation/components/OutlineTextField.kt similarity index 98% rename from app/src/main/java/com/delecrode/devhub/ui/components/OutlineTextField.kt rename to app/src/main/java/com/delecrode/devhub/presentation/components/OutlineTextField.kt index 08f124c..9678fec 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/components/OutlineTextField.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/components/OutlineTextField.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.components +package com.delecrode.devhub.presentation.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column @@ -33,8 +33,9 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.delecrode.devhub.R -import com.delecrode.devhub.ui.theme.DevHubTheme -import com.delecrode.devhub.ui.theme.PrimaryBlue +import com.delecrode.devhub.presentation.ui.theme.DevHubTheme +import com.delecrode.devhub.presentation.ui.theme.PrimaryBlue + @Composable fun EmailTextField( diff --git a/app/src/main/java/com/delecrode/devhub/presentation/components/RepoItemCard.kt b/app/src/main/java/com/delecrode/devhub/presentation/components/RepoItemCard.kt new file mode 100644 index 0000000..e3e670e --- /dev/null +++ b/app/src/main/java/com/delecrode/devhub/presentation/components/RepoItemCard.kt @@ -0,0 +1,124 @@ +package com.delecrode.devhub.presentation.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +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.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.delecrode.devhub.domain.model.RepoFav +import com.delecrode.devhub.domain.model.Repos +import com.delecrode.devhub.presentation.navigation.AppDestinations + +@Composable +fun RepoItemCard( + repo: Repos, + navController: NavController, + login: String +) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 6.dp), + shape = RoundedCornerShape(12.dp), + elevation = CardDefaults.cardElevation(2.dp), + onClick = { + navController.navigate( + AppDestinations.RepoDetail.createRoute( + login, + repo.name + ) + ) + } + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .background(Color.LightGray) + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(text = repo.name, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurfaceVariant) + } + + repo.description?.let { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = it, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onBackground + ) + } + } + } +} + +@Composable +fun RepoFavItemCard( + repo: RepoFav, + navController: NavController, + login: String +) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 6.dp), + shape = RoundedCornerShape(12.dp), + elevation = CardDefaults.cardElevation(2.dp), + onClick = { + navController.navigate( + AppDestinations.RepoDetail.createRoute( + login, + repo.name + ) + ) + } + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .background(Color.LightGray) + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text(text = repo.name, modifier = Modifier.weight(1f),fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurfaceVariant) + Icon( + imageVector = Icons.Default.Favorite, + contentDescription = "Favorito", + tint = Color.Red + ) + } + if(repo.description?.isNotBlank() == true){ + Row( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = repo.description, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onBackground + ) + } + } + } +} diff --git a/app/src/main/java/com/delecrode/devhub/presentation/components/UserProfileHeader.kt b/app/src/main/java/com/delecrode/devhub/presentation/components/UserProfileHeader.kt new file mode 100644 index 0000000..d4f890e --- /dev/null +++ b/app/src/main/java/com/delecrode/devhub/presentation/components/UserProfileHeader.kt @@ -0,0 +1,77 @@ +package com.delecrode.devhub.presentation.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment.Companion.CenterHorizontally +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage + +@Composable +fun UserProfileHeader(avatar_url: String?,name: String, login: String, bio: String ) { + if(avatar_url != null){ + Box( + modifier = Modifier + .background(Color.White, shape = CircleShape) + .wrapContentSize() + ) { + AsyncImage( + model = avatar_url, + contentDescription = "Foto de Perfil", + modifier = Modifier + .size(100.dp) + .clip(CircleShape) + ) + } + } + + Spacer(modifier = Modifier.height(16.dp)) + + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = CenterHorizontally + ) { + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = name, + fontWeight = FontWeight.Bold, + fontSize = 28.sp, + color = MaterialTheme.colorScheme.onBackground + ) + + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = login, + fontWeight = FontWeight.Bold, + fontSize = 20.sp, + color = MaterialTheme.colorScheme.onBackground + ) + + Spacer(modifier = Modifier.height(12.dp)) + + Text( + text = bio, + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onBackground + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/delecrode/devhub/navigation/AppDestinations.kt b/app/src/main/java/com/delecrode/devhub/presentation/navigation/AppDestinations.kt similarity index 91% rename from app/src/main/java/com/delecrode/devhub/navigation/AppDestinations.kt rename to app/src/main/java/com/delecrode/devhub/presentation/navigation/AppDestinations.kt index 8cbbe49..25a861b 100644 --- a/app/src/main/java/com/delecrode/devhub/navigation/AppDestinations.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/navigation/AppDestinations.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.navigation +package com.delecrode.devhub.presentation.navigation sealed class AppDestinations(val route: String) { diff --git a/app/src/main/java/com/delecrode/devhub/navigation/AppNavHost.kt b/app/src/main/java/com/delecrode/devhub/presentation/navigation/AppNavHost.kt similarity index 71% rename from app/src/main/java/com/delecrode/devhub/navigation/AppNavHost.kt rename to app/src/main/java/com/delecrode/devhub/presentation/navigation/AppNavHost.kt index 5e9cb30..a5759cd 100644 --- a/app/src/main/java/com/delecrode/devhub/navigation/AppNavHost.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/navigation/AppNavHost.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.navigation +package com.delecrode.devhub.presentation.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -8,20 +8,20 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.delecrode.devhub.domain.session.SessionViewModel -import com.delecrode.devhub.ui.favoritos.RepoFavViewModel -import com.delecrode.devhub.ui.favoritos.ReposFavScreen -import com.delecrode.devhub.ui.forgot.ForgotPasswordScreen -import com.delecrode.devhub.ui.forgot.ForgotPasswordViewModel -import com.delecrode.devhub.ui.home.HomeScreen -import com.delecrode.devhub.ui.home.HomeViewModel -import com.delecrode.devhub.ui.login.AuthViewModel -import com.delecrode.devhub.ui.login.LoginScreen -import com.delecrode.devhub.ui.profile.ProfileScreen -import com.delecrode.devhub.ui.profile.ProfileViewModel -import com.delecrode.devhub.ui.register.RegisterScreen -import com.delecrode.devhub.ui.register.RegisterViewModel -import com.delecrode.devhub.ui.repo.RepoDetailScreen -import com.delecrode.devhub.ui.repo.RepoDetailViewModel +import com.delecrode.devhub.presentation.ui.favoritos.RepoFavViewModel +import com.delecrode.devhub.presentation.ui.favoritos.ReposFavScreen +import com.delecrode.devhub.presentation.ui.forgot.ForgotPasswordScreen +import com.delecrode.devhub.presentation.ui.forgot.ForgotPasswordViewModel +import com.delecrode.devhub.presentation.ui.home.HomeScreen +import com.delecrode.devhub.presentation.ui.home.HomeViewModel +import com.delecrode.devhub.presentation.ui.login.AuthViewModel +import com.delecrode.devhub.presentation.ui.login.LoginScreen +import com.delecrode.devhub.presentation.ui.profile.ProfileScreen +import com.delecrode.devhub.presentation.ui.profile.ProfileViewModel +import com.delecrode.devhub.presentation.ui.register.RegisterScreen +import com.delecrode.devhub.presentation.ui.register.RegisterViewModel +import com.delecrode.devhub.presentation.ui.repo.RepoDetailScreen +import com.delecrode.devhub.presentation.ui.repo.RepoDetailViewModel import org.koin.androidx.compose.koinViewModel diff --git a/app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavState.kt similarity index 77% rename from app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavState.kt index 334e811..43f4382 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.favoritos +package com.delecrode.devhub.presentation.ui.favoritos import com.delecrode.devhub.domain.model.RepoFav diff --git a/app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavViewModel.kt similarity index 95% rename from app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavViewModel.kt index cf4cb41..2655360 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/favoritos/RepoFavViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/RepoFavViewModel.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.favoritos +package com.delecrode.devhub.presentation.ui.favoritos import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope diff --git a/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/ReposFavScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/ReposFavScreen.kt new file mode 100644 index 0000000..24d800a --- /dev/null +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/favoritos/ReposFavScreen.kt @@ -0,0 +1,85 @@ +package com.delecrode.devhub.presentation.ui.favoritos + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import androidx.navigation.NavController +import com.delecrode.devhub.presentation.components.RepoFavItemCard + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ReposFavScreen(navController: NavController, viewModel: RepoFavViewModel) { + + val state by viewModel.uiState.collectAsState() + val repos = state.repoFav + + + Scaffold( + topBar = { + CenterAlignedTopAppBar( + title = { Text("Meu Repositorios Favoritos") }, + colors = TopAppBarDefaults.centerAlignedTopAppBarColors( + containerColor = MaterialTheme.colorScheme.background + ), + navigationIcon = { + IconButton(onClick = { navController.popBackStack() }) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Voltar" + ) + } + }, + ) + } + + ) + { padding -> + LazyColumn(modifier = Modifier.padding(padding)) { + items(repos) { repo -> + RepoFavItemCard( + repo = repo, + navController = navController, + login = repo.userName + ) + } + } + + if (state.isLoading) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.Black.copy(0.5f)), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator( + modifier = Modifier + .size(48.dp) + .zIndex(11f) + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordScreen.kt similarity index 94% rename from app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordScreen.kt index 572e5c1..27700a0 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordScreen.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.forgot +package com.delecrode.devhub.presentation.ui.forgot import android.widget.Toast import androidx.compose.foundation.layout.Column @@ -32,9 +32,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import com.delecrode.devhub.navigation.AppDestinations -import com.delecrode.devhub.ui.components.EmailTextField -import com.delecrode.devhub.ui.components.PrimaryButton +import com.delecrode.devhub.presentation.navigation.AppDestinations +import com.delecrode.devhub.presentation.components.EmailTextField +import com.delecrode.devhub.presentation.components.PrimaryButton import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordState.kt similarity index 76% rename from app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordState.kt index 9e34c09..d4e4ece 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.forgot +package com.delecrode.devhub.presentation.ui.forgot data class ForgotPasswordState( val isLoading: Boolean = false, diff --git a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordViewModel.kt similarity index 95% rename from app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordViewModel.kt index f1a6818..e3213eb 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/forgot/ForgotPasswordViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/forgot/ForgotPasswordViewModel.kt @@ -1,9 +1,9 @@ -package com.delecrode.devhub.ui.forgot +package com.delecrode.devhub.presentation.ui.forgot import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.repository.AuthRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/delecrode/devhub/ui/home/HomeScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeScreen.kt similarity index 54% rename from app/src/main/java/com/delecrode/devhub/ui/home/HomeScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeScreen.kt index 38da238..c7ca8d5 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeScreen.kt @@ -1,7 +1,8 @@ -package com.delecrode.devhub.ui.home +package com.delecrode.devhub.presentation.ui.home import android.widget.Toast import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -12,14 +13,13 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Menu -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu @@ -46,9 +46,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -58,8 +59,11 @@ import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import coil.compose.AsyncImage import com.delecrode.devhub.R -import com.delecrode.devhub.navigation.AppDestinations -import com.delecrode.devhub.ui.theme.PrimaryBlue +import com.delecrode.devhub.presentation.navigation.AppDestinations +import com.delecrode.devhub.presentation.components.RepoItemCard +import com.delecrode.devhub.presentation.components.UserProfileHeader +import com.delecrode.devhub.presentation.ui.theme.PrimaryBlue + @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -75,25 +79,19 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { var expanded by remember { mutableStateOf(false) } val context = LocalContext.current + val keyboardController = LocalSoftwareKeyboardController.current LaunchedEffect(uiState.value.error) { if (uiState.value.error != null) { Toast.makeText(context, uiState.value.error, Toast.LENGTH_SHORT).show() homeViewModel.clearStates() + homeViewModel.clearUi() } } LaunchedEffect(Unit) { homeViewModel.getUserForFirebase() } - LaunchedEffect(userForFirebase) { - val firebaseUser = userForFirebase - if (firebaseUser != null) { - homeViewModel.getUserForGit(firebaseUser.username) - } - } - - Scaffold( topBar = { CenterAlignedTopAppBar( @@ -103,10 +101,10 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { modifier = Modifier .size(48.dp) .clip(CircleShape) - .background(Color.White) + .background(Color.LightGray) ) { AsyncImage( - model = userForGit?.avatar_url ?: R.drawable.git_logo, + model = userForGit?.avatar_url ?: R.drawable.ic_person_24, contentDescription = "Foto de Perfil", modifier = Modifier .fillMaxSize() @@ -118,12 +116,13 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { Column { Text( text = userForFirebase?.fullName ?: "", - style = MaterialTheme.typography.titleMedium + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onBackground ) Text( text = userForFirebase?.username ?: "", style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant + color = MaterialTheme.colorScheme.onBackground ) } } @@ -132,7 +131,8 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { IconButton(onClick = { expanded = true }) { Icon( imageVector = Icons.Default.Menu, - contentDescription = "Menu" + contentDescription = "Menu", + tint = MaterialTheme.colorScheme.onBackground ) } @@ -146,6 +146,16 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { expanded = false navController.navigate(AppDestinations.Profile.route) homeViewModel.clearStates() + homeViewModel.clearUi() + } + ) + DropdownMenuItem( + text = { Text("Favoritos") }, + onClick = { + expanded = false + navController.navigate(AppDestinations.ReposFav.route) + homeViewModel.clearUi() + } ) DropdownMenuItem( @@ -169,160 +179,120 @@ fun HomeScreen(navController: NavController, homeViewModel: HomeViewModel) { ) { padding -> - - Column( + LazyColumn( modifier = Modifier .fillMaxSize() .padding(padding) ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp) - ) { - OutlinedTextField( - value = uiState.value.searchText, - onValueChange = { value -> - homeViewModel.onSearchTextChange(value) - }, - modifier = Modifier - .fillMaxWidth() - .padding(end = 16.dp), - placeholder = { Text("Digite o nome do usuario") }, - singleLine = true, - colors = OutlinedTextFieldDefaults.colors( - focusedTextColor = MaterialTheme.colorScheme.onBackground, - unfocusedTextColor = MaterialTheme.colorScheme.onBackground, - focusedBorderColor = PrimaryBlue, - unfocusedBorderColor = Color.Gray - ), - trailingIcon = { - IconButton(onClick = { homeViewModel.onSearchClick() }) { - Icon( - painter = painterResource(R.drawable.ic_search_24), - contentDescription = "Search", - tint = PrimaryBlue - ) - } - } - ) + item { + Spacer(modifier = Modifier.height(16.dp)) } - - - userForSearchGit.let { user -> - Column( + item { + Row( modifier = Modifier - .padding(8.dp), - horizontalAlignment = CenterHorizontally + .fillMaxWidth() + .padding(8.dp) ) { - Spacer(modifier = Modifier.height(16.dp)) - - Box( + OutlinedTextField( + value = uiState.value.searchText, + onValueChange = { value -> + homeViewModel.onSearchTextChange(value) + }, modifier = Modifier - .background(Color.White, shape = CircleShape) - .wrapContentSize() - ) { - AsyncImage( - model = if (user?.avatar_url != null) user.avatar_url else R.drawable.git_logo, - contentDescription = "Foto de Perfil", - modifier = Modifier - .size(100.dp) - .clip(CircleShape) - ) - } - + .fillMaxWidth() + .padding(end = 16.dp), + placeholder = { Text("Digite o nome do usuario") }, + singleLine = true, + colors = OutlinedTextFieldDefaults.colors( + focusedTextColor = MaterialTheme.colorScheme.onBackground, + unfocusedTextColor = MaterialTheme.colorScheme.onBackground, + focusedBorderColor = PrimaryBlue, + unfocusedBorderColor = Color.Gray + ), + trailingIcon = { + IconButton(onClick = { + homeViewModel.onSearchClick() + keyboardController?.hide() + }) { + Icon( + painter = painterResource(R.drawable.ic_search_24), + contentDescription = "Pesquisar", + tint = PrimaryBlue + ) + } + }, + leadingIcon = { + if (uiState.value.searchText.isNotBlank()) { + Box( + modifier = Modifier + .size(24.dp) + .clickable { + homeViewModel.clearUi() + keyboardController?.hide() + }, + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(R.drawable.ic_close_24), + contentDescription = "Limpar", + tint = PrimaryBlue, + modifier = Modifier.size(16.dp) + ) + } + } + }, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Search + ), + keyboardActions = KeyboardActions( + onSearch = { + keyboardController?.hide() + homeViewModel.onSearchClick() + } + ), + ) + } + } - Spacer(modifier = Modifier.height(16.dp)) + userForSearchGit.let { user -> + item { Column( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .padding(8.dp), horizontalAlignment = CenterHorizontally ) { + Spacer(modifier = Modifier.height(16.dp)) - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = user?.name ?: "", - fontWeight = FontWeight.Bold, - fontSize = 28.sp, - color = MaterialTheme.colorScheme.onBackground - ) - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = user?.login ?: "", - fontWeight = FontWeight.Bold, - fontSize = 20.sp, - color = MaterialTheme.colorScheme.onBackground + UserProfileHeader( + user?.avatar_url, + user?.name ?: "", + user?.login ?: "", + user?.bio ?: "" ) - Spacer(modifier = Modifier.height(12.dp)) + Spacer(modifier = Modifier.height(16.dp)) - Text( - text = user?.bio ?: "", - fontWeight = FontWeight.Bold, - fontSize = 18.sp, - textAlign = TextAlign.Center, - color = MaterialTheme.colorScheme.onBackground - ) - } - Spacer(modifier = Modifier.height(16.dp)) - - if (user?.repos_url != null) { - Text( - "Repositórios", fontWeight = FontWeight.Bold, - fontSize = 28.sp, - color = MaterialTheme.colorScheme.onBackground - ) - } - Spacer(modifier = Modifier.height(16.dp)) - - LazyColumn(modifier = Modifier.fillMaxWidth()) { - items(repos.size) { index -> - val repo = repos[index] - Card( - modifier = Modifier.padding(8.dp), - elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - shape = RoundedCornerShape(8.dp), - onClick = { - navController.navigate( - AppDestinations.RepoDetail.createRoute( - user?.login ?: "", - repo.name - ) - ) - } - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .background(Color.LightGray) - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.name) - } - - if (repo.description != null) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.description) - } - - } - } + if (user?.repos_url != null) { + Text( + "Repositórios", fontWeight = FontWeight.Bold, + fontSize = 28.sp, + color = MaterialTheme.colorScheme.onBackground + ) } + Spacer(modifier = Modifier.height(16.dp)) + } } } + items(repos) { repo -> + RepoItemCard( + repo = repo, + navController = navController, + login = userForSearchGit?.login ?: "" + ) + } } } if (uiState.value.isLoading) { diff --git a/app/src/main/java/com/delecrode/devhub/ui/home/HomeState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeState.kt similarity index 90% rename from app/src/main/java/com/delecrode/devhub/ui/home/HomeState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeState.kt index 4a8b152..cbf156c 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/home/HomeState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.home +package com.delecrode.devhub.presentation.ui.home import com.delecrode.devhub.domain.model.Repos import com.delecrode.devhub.domain.model.UserForFirebase diff --git a/app/src/main/java/com/delecrode/devhub/ui/home/HomeViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeViewModel.kt similarity index 92% rename from app/src/main/java/com/delecrode/devhub/ui/home/HomeViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeViewModel.kt index 8c23ce1..93ed70f 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/home/HomeViewModel.kt @@ -1,11 +1,11 @@ -package com.delecrode.devhub.ui.home +package com.delecrode.devhub.presentation.ui.home import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.repository.AuthRepository import com.delecrode.devhub.domain.repository.UserRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -60,19 +60,19 @@ class HomeViewModel( } } - fun getUserForGit(userName: String) { + fun getUserForFirebase() { viewModelScope.launch { _uiState.value = _uiState.value.copy( isLoading = true, error = null ) - when (val result = userRepository.getUserForGitHub(userName)) { + when (val result = userRepository.getUserForFirebase()) { is Result.Success -> { _uiState.value = _uiState.value.copy( - userForGit = result.data, - isLoading = false, + userForFirebase = result.data, error = null ) + getUserForGit(result.data.username) } is Result.Error -> { @@ -82,19 +82,20 @@ class HomeViewModel( ) } } + } } - fun getUserForFirebase() { + fun getUserForGit(userName: String) { viewModelScope.launch { _uiState.value = _uiState.value.copy( isLoading = true, error = null ) - when (val result = userRepository.getUserForFirebase()) { + when (val result = userRepository.getUserForGitHub(userName)) { is Result.Success -> { _uiState.value = _uiState.value.copy( - userForFirebase = result.data, + userForGit = result.data, isLoading = false, error = null ) @@ -107,10 +108,11 @@ class HomeViewModel( ) } } - } } + + fun getRepos(userName: String) { viewModelScope.launch { _uiState.value = _uiState.value.copy( @@ -156,5 +158,16 @@ class HomeViewModel( error = null ) } + + fun clearUi() { + _uiState.update { + it.copy( + searchText = "", + userForSearchGit = null, + repos = emptyList(), + error = null + ) + } } +} diff --git a/app/src/main/java/com/delecrode/devhub/ui/login/AuthState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthState.kt similarity index 89% rename from app/src/main/java/com/delecrode/devhub/ui/login/AuthState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthState.kt index 0f690ca..9cf109b 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/login/AuthState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.login +package com.delecrode.devhub.presentation.ui.login data class AuthState( val isLoading: Boolean = false, diff --git a/app/src/main/java/com/delecrode/devhub/ui/login/AuthViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthViewModel.kt similarity index 96% rename from app/src/main/java/com/delecrode/devhub/ui/login/AuthViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthViewModel.kt index 07da1bf..d67b16c 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/login/AuthViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/AuthViewModel.kt @@ -1,9 +1,9 @@ -package com.delecrode.devhub.ui.login +package com.delecrode.devhub.presentation.ui.login import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.repository.AuthRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/delecrode/devhub/ui/login/LoginScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/LoginScreen.kt similarity index 85% rename from app/src/main/java/com/delecrode/devhub/ui/login/LoginScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/login/LoginScreen.kt index b97dfc1..e54dcbf 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/login/LoginScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/login/LoginScreen.kt @@ -1,6 +1,7 @@ -package com.delecrode.devhub.ui.login +package com.delecrode.devhub.presentation.ui.login import android.widget.Toast +import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -10,6 +11,7 @@ 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.material3.CenterAlignedTopAppBar import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api @@ -29,6 +31,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.style.TextAlign @@ -37,10 +40,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import com.delecrode.devhub.navigation.AppDestinations -import com.delecrode.devhub.ui.components.EmailTextField -import com.delecrode.devhub.ui.components.PasswordTextField -import com.delecrode.devhub.ui.components.PrimaryButton +import com.delecrode.devhub.R +import com.delecrode.devhub.presentation.navigation.AppDestinations +import com.delecrode.devhub.presentation.components.EmailTextField +import com.delecrode.devhub.presentation.components.PasswordTextField +import com.delecrode.devhub.presentation.components.PrimaryButton import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -106,10 +110,21 @@ fun LoginScreen(navController: NavController, viewModel: AuthViewModel) { Column(modifier = Modifier.padding(padding)) { Column( modifier = Modifier - .padding(8.dp) + .padding(12.dp) .fillMaxSize(), - verticalArrangement = Arrangement.Center + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally ) { + Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center){ + Image( + painter = painterResource(R.drawable.git_logo), + contentDescription = "Logo", + modifier = Modifier.size(100.dp), + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + Text( text = "E-mail", color = MaterialTheme.colorScheme.onBackground, @@ -163,6 +178,8 @@ fun LoginScreen(navController: NavController, viewModel: AuthViewModel) { } } + Spacer(modifier = Modifier.height(16.dp)) + PrimaryButton( text = "ENTRAR", onClick = { diff --git a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileScreen.kt similarity index 51% rename from app/src/main/java/com/delecrode/devhub/ui/profile/ProfileScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileScreen.kt index 767d740..5501df3 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileScreen.kt @@ -1,25 +1,19 @@ -package com.delecrode.devhub.ui.profile +package com.delecrode.devhub.presentation.ui.profile import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer 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.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Menu -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu @@ -41,18 +35,16 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.zIndex import androidx.navigation.NavController -import coil.compose.AsyncImage -import com.delecrode.devhub.R -import com.delecrode.devhub.navigation.AppDestinations +import com.delecrode.devhub.presentation.navigation.AppDestinations +import com.delecrode.devhub.presentation.components.RepoItemCard +import com.delecrode.devhub.presentation.components.UserProfileHeader @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -97,7 +89,9 @@ fun ProfileScreen(navController: NavController, viewModel: ProfileViewModel) { IconButton(onClick = { expanded = true }) { Icon( imageVector = Icons.Default.Menu, - contentDescription = "Menu" + contentDescription = "Menu", + tint = MaterialTheme.colorScheme.onBackground + ) } @@ -129,125 +123,44 @@ fun ProfileScreen(navController: NavController, viewModel: ProfileViewModel) { ) { padding -> - - Column( + LazyColumn( modifier = Modifier .fillMaxSize() .padding(padding) ) { - Column( - modifier = Modifier - .padding(8.dp), - horizontalAlignment = CenterHorizontally - ) { - Spacer(modifier = Modifier.height(16.dp)) - - Box( - modifier = Modifier - .background(Color.White, shape = CircleShape) - .wrapContentSize() - ) { - AsyncImage( - model = if (user?.avatar_url != null) user.avatar_url else R.drawable.git_logo, - contentDescription = "Foto de Perfil", - modifier = Modifier - .size(100.dp) - .clip(CircleShape) - ) - } - - - Spacer(modifier = Modifier.height(16.dp)) - + item { Column( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .padding(8.dp), horizontalAlignment = CenterHorizontally ) { + Spacer(modifier = Modifier.height(16.dp)) - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = user?.name ?: "", - fontWeight = FontWeight.Bold, - fontSize = 28.sp, - color = MaterialTheme.colorScheme.onBackground - ) - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = user?.login ?: "", - fontWeight = FontWeight.Bold, - fontSize = 20.sp, - color = MaterialTheme.colorScheme.onBackground - ) - - Spacer(modifier = Modifier.height(12.dp)) - - Text( - text = user?.bio ?: "", - fontWeight = FontWeight.Bold, - fontSize = 18.sp, - textAlign = TextAlign.Center, - color = MaterialTheme.colorScheme.onBackground - ) - } - Spacer(modifier = Modifier.height(16.dp)) - - if (user?.repos_url != null) { - Text( - "Repositórios", fontWeight = FontWeight.Bold, - fontSize = 28.sp, - color = MaterialTheme.colorScheme.onBackground + UserProfileHeader( + avatar_url = user?.avatar_url, + name = user?.name ?: "", + login = user?.login ?: "", + bio = user?.bio ?: "" ) - } - Spacer(modifier = Modifier.height(16.dp)) - - LazyColumn(modifier = Modifier.fillMaxWidth()) { - items(repos.size) { index -> - val repo = repos[index] - Card( - modifier = Modifier.padding(8.dp), - elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - shape = RoundedCornerShape(8.dp), - onClick = { - navController.navigate( - AppDestinations.RepoDetail.createRoute( - user?.login ?: "", - repo.name - ) - ) - } - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .background(Color.LightGray) - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.name) - } + Spacer(modifier = Modifier.height(16.dp)) - if (repo.description != null) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.description) - } - - } - } + if (user?.repos_url != null) { + Text( + "Repositórios", fontWeight = FontWeight.Bold, + fontSize = 28.sp, + color = MaterialTheme.colorScheme.onBackground + ) } - } + Spacer(modifier = Modifier.height(16.dp)) + } + items(repos) { repo -> + RepoItemCard( + repo = repo, + navController = navController, + login = user?.login ?: "" + ) } - } } if (state.value.isLoading) { diff --git a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileState.kt similarity index 88% rename from app/src/main/java/com/delecrode/devhub/ui/profile/ProfileState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileState.kt index 3d9cc51..b565e48 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.profile +package com.delecrode.devhub.presentation.ui.profile import com.delecrode.devhub.domain.model.Repos import com.delecrode.devhub.domain.model.UserForFirebase diff --git a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileViewModel.kt similarity index 96% rename from app/src/main/java/com/delecrode/devhub/ui/profile/ProfileViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileViewModel.kt index 24f4925..cabfb0d 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/profile/ProfileViewModel.kt @@ -1,11 +1,11 @@ -package com.delecrode.devhub.ui.profile +package com.delecrode.devhub.presentation.ui.profile import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.repository.AuthRepository import com.delecrode.devhub.domain.repository.UserRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterScreen.kt similarity index 96% rename from app/src/main/java/com/delecrode/devhub/ui/register/RegisterScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterScreen.kt index b1054d9..ec0828e 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterScreen.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.register +package com.delecrode.devhub.presentation.ui.register import android.widget.Toast import androidx.compose.foundation.layout.Arrangement @@ -38,11 +38,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import com.delecrode.devhub.navigation.AppDestinations -import com.delecrode.devhub.ui.components.EmailTextField -import com.delecrode.devhub.ui.components.GenericOutlinedTextField -import com.delecrode.devhub.ui.components.PasswordTextField -import com.delecrode.devhub.ui.components.PrimaryButton +import com.delecrode.devhub.presentation.navigation.AppDestinations +import com.delecrode.devhub.presentation.components.EmailTextField +import com.delecrode.devhub.presentation.components.GenericOutlinedTextField +import com.delecrode.devhub.presentation.components.PasswordTextField +import com.delecrode.devhub.presentation.components.PrimaryButton import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterState.kt similarity index 90% rename from app/src/main/java/com/delecrode/devhub/ui/register/RegisterState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterState.kt index 8df8121..7e66718 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.register +package com.delecrode.devhub.presentation.ui.register data class RegisterState( val isLoading: Boolean = false, diff --git a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterViewModel.kt similarity index 97% rename from app/src/main/java/com/delecrode/devhub/ui/register/RegisterViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterViewModel.kt index 2796dfc..36b467c 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/register/RegisterViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/register/RegisterViewModel.kt @@ -1,9 +1,9 @@ -package com.delecrode.devhub.ui.register +package com.delecrode.devhub.presentation.ui.register import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.repository.AuthRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailScreen.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailScreen.kt similarity index 99% rename from app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailScreen.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailScreen.kt index ed82a47..6d6f694 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailScreen.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailScreen.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.repo +package com.delecrode.devhub.presentation.ui.repo import android.content.Intent import android.net.Uri diff --git a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailState.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailState.kt similarity index 85% rename from app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailState.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailState.kt index f919d9a..07f8a23 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailState.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailState.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.repo +package com.delecrode.devhub.presentation.ui.repo import com.delecrode.devhub.domain.model.RepoDetail diff --git a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailViewModel.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailViewModel.kt similarity index 97% rename from app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailViewModel.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailViewModel.kt index 6ce6e89..bb93480 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/repo/RepoDetailViewModel.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/repo/RepoDetailViewModel.kt @@ -1,10 +1,10 @@ -package com.delecrode.devhub.ui.repo +package com.delecrode.devhub.presentation.ui.repo import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.delecrode.devhub.domain.model.RepoFav import com.delecrode.devhub.domain.repository.RepoRepository -import com.delecrode.devhub.utils.Result +import com.delecrode.devhub.data.utils.Result import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first diff --git a/app/src/main/java/com/delecrode/devhub/ui/theme/Color.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Color.kt similarity index 83% rename from app/src/main/java/com/delecrode/devhub/ui/theme/Color.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Color.kt index af8ea42..6350916 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/theme/Color.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.theme +package com.delecrode.devhub.presentation.ui.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/delecrode/devhub/ui/theme/Theme.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Theme.kt similarity index 93% rename from app/src/main/java/com/delecrode/devhub/ui/theme/Theme.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Theme.kt index 0ac73f1..8142978 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/theme/Theme.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.theme +package com.delecrode.devhub.presentation.ui.theme import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme @@ -17,7 +17,8 @@ private val DarkColorScheme = darkColorScheme( surface = BackgroundDark, onPrimary = Color.White, onBackground = TextDark, - onSurface = TextDark + onSurface = TextDark, + onSurfaceVariant = TextLight ) private val LightColorScheme = lightColorScheme( diff --git a/app/src/main/java/com/delecrode/devhub/ui/theme/Type.kt b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Type.kt similarity index 94% rename from app/src/main/java/com/delecrode/devhub/ui/theme/Type.kt rename to app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Type.kt index 53662c1..be7d818 100644 --- a/app/src/main/java/com/delecrode/devhub/ui/theme/Type.kt +++ b/app/src/main/java/com/delecrode/devhub/presentation/ui/theme/Type.kt @@ -1,4 +1,4 @@ -package com.delecrode.devhub.ui.theme +package com.delecrode.devhub.presentation.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/app/src/main/java/com/delecrode/devhub/ui/favoritos/ReposFavScreen.kt b/app/src/main/java/com/delecrode/devhub/ui/favoritos/ReposFavScreen.kt deleted file mode 100644 index 3b8fae4..0000000 --- a/app/src/main/java/com/delecrode/devhub/ui/favoritos/ReposFavScreen.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.delecrode.devhub.ui.favoritos - -import android.util.Log -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -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.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.CenterAlignedTopAppBar -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import androidx.compose.ui.zIndex -import androidx.navigation.NavController -import com.delecrode.devhub.navigation.AppDestinations - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun ReposFavScreen(navController: NavController, viewModel: RepoFavViewModel) { - - val state by viewModel.uiState.collectAsState() - val repos = state.repoFav - - - Scaffold( - topBar = { - CenterAlignedTopAppBar( - title = { Text("Meu Repositorios Favoritos") }, - colors = TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = MaterialTheme.colorScheme.background - ), - navigationIcon = { - IconButton(onClick = { navController.popBackStack() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Voltar" - ) - } - }, - ) - } - - ) - { padding -> - Column(modifier = Modifier.padding(padding)) { - LazyColumn(modifier = Modifier.fillMaxWidth()) { - items(state.repoFav.size) { index -> - val repo = repos[index] - - Log.i("ReposFavScreen", "ReposFavScreen: ${repo.userName} e ${repo.name}") - Card( - modifier = Modifier.padding(8.dp), - elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - shape = RoundedCornerShape(8.dp), - onClick = { - navController.navigate( - AppDestinations.RepoDetail.createRoute( - state.repoFav[index].userName, - repo.name - ) - ) - } - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .background(Color.LightGray) - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.name, modifier = Modifier.weight(1f)) - Icon( - imageVector = Icons.Default.Favorite, - contentDescription = "Favorito", - tint = Color.Red - ) - } - - if (repo.description != null) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(10.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text(text = repo.description) - } - - } - } - } - - } - } - - if (state.isLoading) { - Box( - modifier = Modifier - .fillMaxSize() - .background(Color.Black.copy(0.5f)), - contentAlignment = Alignment.Center - ) { - CircularProgressIndicator( - modifier = Modifier - .size(48.dp) - .zIndex(11f) - ) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_close_24.xml b/app/src/main/res/drawable/ic_close_24.xml new file mode 100644 index 0000000..f8ca0c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_person_24.xml b/app/src/main/res/drawable/ic_person_24.xml new file mode 100644 index 0000000..f4cc418 --- /dev/null +++ b/app/src/main/res/drawable/ic_person_24.xml @@ -0,0 +1,5 @@ + + + + +