From 434605cd282aa4eb6985a19346d6381634d32b26 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sat, 27 Apr 2024 16:04:28 +0530 Subject: [PATCH 1/6] API fetched successfully --- .../datasource/api/GetRandomRecipeResponse.kt | 8 ++ .../data/datasource/api/RetrofitApi.kt | 3 +- .../randomrecipemodel/AnalyzedInstruction.kt | 4 +- .../models/randomrecipemodel/Equipment.kt | 10 +-- .../randomrecipemodel/ExtendedIngredient.kt | 24 +++--- .../models/randomrecipemodel/Ingredient.kt | 8 +- .../data/models/randomrecipemodel/Length.kt | 4 +- .../data/models/randomrecipemodel/Measures.kt | 4 +- .../data/models/randomrecipemodel/Metric.kt | 6 +- .../randomrecipemodel/RandomRecipeResponse.kt | 2 +- .../data/models/randomrecipemodel/Recipe.kt | 74 +++++++++---------- .../data/models/randomrecipemodel/Step.kt | 10 +-- .../models/randomrecipemodel/Temperature.kt | 4 +- .../data/models/randomrecipemodel/Us.kt | 6 +- .../reposiitory/RandomRecipeRepository.kt | 3 +- .../reposiitory/RandomRecipeRepositoryImpl.kt | 37 +++------- .../view/homescreen/HomeScreen.kt | 2 +- .../viewmodel/HomeScreenViewModel.kt | 7 +- app/src/main/res/values/strings.xml | 2 +- 19 files changed, 105 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt diff --git a/app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt b/app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt new file mode 100644 index 0000000..67637eb --- /dev/null +++ b/app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt @@ -0,0 +1,8 @@ +package com.example.cookbook.data.datasource.api + +import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse + +sealed class GetRandomRecipeResult { + data class Success(val data: RandomRecipeResponse) : GetRandomRecipeResult() + data class Error(val throwable: Throwable) : GetRandomRecipeResult() +} diff --git a/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt b/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt index 2ad6b73..9e5c683 100644 --- a/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt +++ b/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt @@ -18,6 +18,7 @@ interface RetrofitApi { */ @GET("random") fun getRandomRecipe( - @Query("api_key") apiKey: String + @Query("apiKey") apiKey: String, + @Query("number") number: Int ): Call } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt index 9a1144a..eebe2e7 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt @@ -1,6 +1,6 @@ package com.example.cookbook.data.models.randomrecipemodel data class AnalyzedInstruction( - val name: String, - val steps: List + val name : String, + val steps : List ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt index 83868da..e588eff 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt @@ -1,9 +1,9 @@ package com.example.cookbook.data.models.randomrecipemodel data class Equipment( - val id: Int, - val image: String, - val localizedName: String, - val name: String, - val temperature: Temperature + val id : Int, + val image : String, + val localizedName : String, + val name : String, + val temperature : Temperature ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt index b9cdac6..58a8de0 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt @@ -1,16 +1,16 @@ package com.example.cookbook.data.models.randomrecipemodel data class ExtendedIngredient( - val aisle: String, - val amount: Double, - val consistency: String, - val id: Int, - val image: String, - val measures: Measures, - val meta: List, - val name: String, - val nameClean: String, - val original: String, - val originalName: String, - val unit: String + val aisle : String, + val amount : Double, + val consistency : String, + val id : Int, + val image : String, + val measures : Measures, + val meta : List, + val name : String, + val nameClean : String, + val original : String, + val originalName : String, + val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt index 19dd0ea..a55d02f 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt @@ -1,8 +1,8 @@ package com.example.cookbook.data.models.randomrecipemodel data class Ingredient( - val id: Int, - val image: String, - val localizedName: String, - val name: String + val id : Int, + val image : String, + val localizedName : String, + val name : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt index e1f30d3..26a38b8 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt @@ -1,6 +1,6 @@ package com.example.cookbook.data.models.randomrecipemodel data class Length( - val number: Int, - val unit: String + val number : Int, + val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt index 8fb3260..d5bfb9e 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt @@ -1,6 +1,6 @@ package com.example.cookbook.data.models.randomrecipemodel data class Measures( - val metric: Metric, - val us: Us + val metric : Metric, + val us : Us ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt index cbd9efb..caba404 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt @@ -1,7 +1,7 @@ package com.example.cookbook.data.models.randomrecipemodel data class Metric( - val amount: Double, - val unitLong: String, - val unitShort: String + val amount : Double, + val unitLong : String, + val unitShort : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt index 59b6c3b..dc6b5de 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt @@ -1,5 +1,5 @@ package com.example.cookbook.data.models.randomrecipemodel data class RandomRecipeResponse( - val recipes: List + val recipes : List ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt index 1e30dc5..a746b1f 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt @@ -1,41 +1,41 @@ package com.example.cookbook.data.models.randomrecipemodel data class Recipe( - val aggregateLikes: Int, - val analyzedInstructions: List, - val cheap: Boolean, - val cookingMinutes: Int, - val creditsText: String, - val cuisines: List, - val dairyFree: Boolean, - val diets: List, - val dishTypes: List, - val extendedIngredients: List, - val gaps: String, - val glutenFree: Boolean, - val healthScore: Int, - val id: Int, - val image: String, - val imageType: String, - val instructions: String, - val license: String, - val lowFodmap: Boolean, - val occasions: List, - val originalId: Any, - val preparationMinutes: Int, - val pricePerServing: Double, - val readyInMinutes: Int, - val servings: Int, - val sourceName: String, - val sourceUrl: String, - val spoonacularScore: Double, - val spoonacularSourceUrl: String, - val summary: String, - val sustainable: Boolean, - val title: String, - val vegan: Boolean, - val vegetarian: Boolean, - val veryHealthy: Boolean, - val veryPopular: Boolean, - val weightWatcherSmartPoints: Int + val aggregateLikes : Int, + val analyzedInstructions : List, + val cheap : Boolean, + val cookingMinutes : Int, + val creditsText : String, + val cuisines : List, + val dairyFree : Boolean, + val diets : List, + val dishTypes : List, + val extendedIngredients : List, + val gaps : String, + val glutenFree : Boolean, + val healthScore : Int, + val id : Int, + val image : String, + val imageType : String, + val instructions : String, + val license : String, + val lowFodmap : Boolean, + val occasions : List, + val originalId : Any, + val preparationMinutes : Int, + val pricePerServing : Double, + val readyInMinutes : Int, + val servings : Int, + val sourceName : String, + val sourceUrl : String, + val spoonacularScore : Double, + val spoonacularSourceUrl : String, + val summary : String, + val sustainable : Boolean, + val title : String, + val vegan : Boolean, + val vegetarian : Boolean, + val veryHealthy : Boolean, + val veryPopular : Boolean, + val weightWatcherSmartPoints : Int ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt index 0c674fd..28ca3d3 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt @@ -1,9 +1,9 @@ package com.example.cookbook.data.models.randomrecipemodel data class Step( - val equipment: List, - val ingredients: List, - val length: Length, - val number: Int, - val step: String + val equipment : List, + val ingredients : List, + val length : Length, + val number : Int, + val step : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt index e0182fe..38675ce 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt @@ -1,6 +1,6 @@ package com.example.cookbook.data.models.randomrecipemodel data class Temperature( - val number: Double, - val unit: String + val number : Double, + val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt index c326744..f554029 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt @@ -1,7 +1,7 @@ package com.example.cookbook.data.models.randomrecipemodel data class Us( - val amount: Double, - val unitLong: String, - val unitShort: String + val amount : Double, + val unitLong : String, + val unitShort : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt index 8bd1264..276655d 100644 --- a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt +++ b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt @@ -1,7 +1,8 @@ package com.example.cookbook.data.reposiitory +import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse interface RandomRecipeRepository { - suspend fun getRandomRecipe(apiKey: String) : Result + suspend fun getRandomRecipe(apiKey: String, number: Int) : Result } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt index a5d79f9..7dfbe5f 100644 --- a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt +++ b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt @@ -1,21 +1,22 @@ package com.example.cookbook.data.reposiitory +import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.datasource.api.RetrofitApi import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse +import retrofit2.HttpException import retrofit2.awaitResponse +import java.io.IOException class RandomRecipeRepositoryImpl( private val retrofitApi: RetrofitApi ) : RandomRecipeRepository { - /* - override suspend fun getRandomRecipe(apiKey: String): Result { + override suspend fun getRandomRecipe(apiKey: String, number: Int): + Result { return try { - val response = retrofitApi.getRandomRecipe(apiKey).awaitResponse() - Log.d("RepoImpl", "getRandomRecipe is called of retrofitApi") - Log.d("RepoImpl", "Request Parameters: apiKey - $apiKey") - Log.d("RepoImpl", "response : ${response.body()}") + val response = retrofitApi.getRandomRecipe(apiKey, number) + .awaitResponse() + if (response.isSuccessful) { - Log.d("ResponseStatus", "response status is : ${response.message()}") val data = response.body() if (data != null) { Result.success(data) @@ -23,36 +24,18 @@ class RandomRecipeRepositoryImpl( Result.failure(Exception("Response body is null")) } } else { - Result.failure(Exception("Failed to fetch the network data with status code: ${response.code()}")) + Result.failure(Exception("Failed to fetch the network " + + "data with status code: ${response.code()}")) } } catch (e: Exception) { e.printStackTrace() - Log.e("RandomRecipeRepository", "Exception occurred: ${e.message}") Result.failure(e) } catch (ioException: IOException) { ioException.printStackTrace() - Log.e("RandomRecipeRepository", "Exception occurred: ${ioException.message}") Result.failure(ioException) } catch (httpException: HttpException) { httpException.printStackTrace() - Log.e("RandomRecipeRepository", "Exception occurred: ${httpException.message}") Result.failure(httpException) } } - - */ - override suspend fun getRandomRecipe(apiKey: String): Result { - return try { - val response = retrofitApi.getRandomRecipe(apiKey).awaitResponse() // Await the asynchronous response - if (response.isSuccessful) { - Result.success(response.body()!!) - } else { - Result.failure(Exception("Failed to fetch recipe (code: ${response.code()})")) // Include error code - } - } catch (e: Exception) { - Result.failure(e) // Handle other exceptions - } - } - - } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt index e8428da..83d4b94 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt @@ -64,7 +64,7 @@ fun HomeScreen( val apiKey = stringResource(id = R.string.api_key) LaunchedEffect(key1 = Unit) { - homeScreenViewModel.getRandomRecipe(apiKey = apiKey) + homeScreenViewModel.getRandomRecipe(apiKey = apiKey, number = 20) Log.d("HomeScreen", "Calling the viewmodel getRandomRecipe with apiKey : $apiKey") } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt index 2ce4d04..efc664e 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt @@ -3,6 +3,7 @@ package com.example.cookbook.presentation.viewmodel import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.models.randomrecipemodel.Recipe import com.example.cookbook.data.reposiitory.RandomRecipeRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -25,16 +26,14 @@ class HomeScreenViewModel @Inject constructor( val popularItems: StateFlow> get() = _popularItems - fun getRandomRecipe(apiKey: String) { + fun getRandomRecipe(apiKey: String, number: Int) { _isLoading.value = true viewModelScope.launch(Dispatchers.IO) { try { - val result = randomRecipeRepository.getRandomRecipe(apiKey) - Log.d("HomeScreenViewModel", "getRandomRecipe of repository is being called with apiKey : $apiKey") + val result = randomRecipeRepository.getRandomRecipe(apiKey, number) if (result.isSuccess) { val recipes = result.getOrNull()?.recipes ?: emptyList() _popularItems.value = recipes - Log.d("HomeScreenViewModel", "_popularItems.value : ${_popularItems.value}") } else { // Handle error (you can expose this via another state or event) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d05afc3..0e8987b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ CookBook - e0157e0d0d574cefb354163aff9f9056 + 2e5c9be439954d3ab2abeab958080246 // Home screen Hello, From ade4fd9b90193be54085ccc828789c4a73046184 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sat, 27 Apr 2024 17:24:02 +0530 Subject: [PATCH 2/6] Successfully Built the RecipeDetailsScreen --- .../java/com/example/cookbook/MainActivity.kt | 4 +- .../presentation/view/RegisterScreen.kt | 6 +- .../view/homescreen/HeaderText.kt | 16 +- .../view/homescreen/HomeScreen.kt | 54 ++-- .../view/homescreen/PopularItems.kt | 27 +- .../view/navigation/Navigation.kt | 14 +- .../view/recipedetailsscreen/Header.kt | 103 ++++++++ .../view/recipedetailsscreen/ImageViewer.kt | 41 ++++ .../view/recipedetailsscreen/Informations.kt | 231 ++++++++++++++++++ .../view/recipedetailsscreen/Instructions.kt | 37 +++ .../recipedetailsscreen/RecipeDetailScreen.kt | 25 ++ .../viewmodel/RecipeDetailScreenViewModel.kt | 24 ++ .../com/example/cookbook/ui/theme/Color.kt | 4 +- 13 files changed, 541 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/RecipeDetailScreen.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt diff --git a/app/src/main/java/com/example/cookbook/MainActivity.kt b/app/src/main/java/com/example/cookbook/MainActivity.kt index 689b3ac..e4653b5 100644 --- a/app/src/main/java/com/example/cookbook/MainActivity.kt +++ b/app/src/main/java/com/example/cookbook/MainActivity.kt @@ -11,6 +11,7 @@ import androidx.navigation.compose.rememberNavController import com.example.cookbook.presentation.view.navigation.Navigation import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel import com.example.cookbook.presentation.viewmodel.LogInScreenViewModel +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel import com.example.cookbook.presentation.viewmodel.RegisterScreenViewModel import com.example.cookbook.ui.theme.CookBookTheme import dagger.hilt.android.AndroidEntryPoint @@ -28,6 +29,7 @@ class MainActivity : ComponentActivity() { val registerScreenViewModel = hiltViewModel() val logInScreenViewModel = hiltViewModel() val homeScreenViewModel = hiltViewModel() + val recipeDetailScreenViewModel = hiltViewModel() logInScreenViewModel.setNavController(navController) @@ -35,9 +37,9 @@ class MainActivity : ComponentActivity() { navController = navController, registerScreenViewModel = registerScreenViewModel, logInScreenViewModel = logInScreenViewModel, + recipeDetailScreenViewModel, homeScreenViewModel ) - } } } diff --git a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt index 5ded101..2539de5 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.Observer +import androidx.navigation.NavBackStackEntry import androidx.navigation.NavHostController import com.example.cookbook.presentation.view.components.CustomButton import com.example.cookbook.presentation.view.components.CustomTextField @@ -31,7 +32,8 @@ import com.example.cookbook.ui.theme.ButtonColor @Composable fun RegisterScreen( registerScreenViewModel: RegisterScreenViewModel, - navController: NavHostController + navController: NavHostController, + backStackEntry: NavBackStackEntry ) { val context = LocalContext.current @@ -46,7 +48,7 @@ fun RegisterScreen( val observer = Observer { result -> when(result) { is RegistrationResult.Success -> { - navController.navigate("HomeScreen") + navController.navigate("HomeScreen/${name}") } is RegistrationResult.Failure -> { Toast.makeText(context, result.errorMessage, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt index 6b073dd..f641931 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt @@ -21,7 +21,7 @@ import com.example.cookbook.ui.theme.ButtonColor @Composable fun HeaderText( - name: String + name: String? ) { Column( modifier = Modifier @@ -37,12 +37,14 @@ fun HeaderText( fontSize = 30.sp ) Spacer(modifier = Modifier.width(12.dp)) - Text( - text = name, - fontWeight = FontWeight.ExtraBold, - fontSize = 30.sp, - color = ButtonColor - ) + if (name != null) { + Text( + text = name, + fontWeight = FontWeight.ExtraBold, + fontSize = 30.sp, + color = ButtonColor + ) + } } Text( text = stringResource(id = R.string.header_text2), diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt index 83d4b94..8126330 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt @@ -2,6 +2,7 @@ package com.example.cookbook.presentation.view.homescreen import android.util.Log import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -20,44 +21,44 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.res.stringResource +import androidx.navigation.NavBackStackEntry import com.example.cookbook.R import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel @Composable fun HomeScreen( navController: NavHostController, - homeScreenViewModel: HomeScreenViewModel + homeScreenViewModel: HomeScreenViewModel, + recipeDetailScreenViewModel: RecipeDetailScreenViewModel, + backStackEntry: NavBackStackEntry ) { val isLoading by homeScreenViewModel.isLoading.collectAsState(initial = false) - Log.d("HomeScreen", "isLoading status : $isLoading") val popularItems by homeScreenViewModel.popularItems.collectAsState(emptyList()) - Log.d("HomeScreen", "list of recipes : $popularItems") - Column( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - HeaderText(name = "Rohan") - Spacer(modifier = Modifier.height(10.dp)) - Text( - text = "Recipes", - modifier = Modifier.padding(horizontal = 30.dp), - fontWeight = FontWeight.Bold, - fontSize = 20.sp - ) + val name = backStackEntry.arguments?.getString("name") - if (isLoading) { - CircularProgressIndicator(modifier = Modifier.padding(16.dp)) - } else { - if (popularItems.isNotEmpty()) { - PopularItems(popularItems = popularItems) + Box(modifier = Modifier.fillMaxSize()) { + if (isLoading) { + CircularProgressIndicator(modifier = Modifier.padding(16.dp).align(Alignment.Center)) } else { - Text( - text = "No recipes found", - modifier = Modifier.padding(horizontal = 30.dp), - fontSize = 16.sp - ) + Column( + modifier = Modifier.fillMaxSize(), + ) { + if (popularItems.isNotEmpty()) { + PopularItems( + popularItems = popularItems, + recipeDetailScreenViewModel, + navController, + name + ) + } else { + Text( + text = "No recipes found", + modifier = Modifier.padding(horizontal = 30.dp), + fontSize = 16.sp + ) + } } } } @@ -65,6 +66,5 @@ fun HomeScreen( val apiKey = stringResource(id = R.string.api_key) LaunchedEffect(key1 = Unit) { homeScreenViewModel.getRandomRecipe(apiKey = apiKey, number = 20) - Log.d("HomeScreen", "Calling the viewmodel getRandomRecipe with apiKey : $apiKey") } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt index 8ec30a0..3909800 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt @@ -3,6 +3,7 @@ package com.example.cookbook.presentation.view.homescreen import android.util.Log import androidx.compose.foundation.Image 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 @@ -28,23 +29,42 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale +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.navigation.NavController +import androidx.navigation.NavHostController import coil.compose.rememberImagePainter import com.example.cookbook.data.models.randomrecipemodel.Recipe +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel @Composable fun PopularItems( - popularItems: List + popularItems: List, + recipeDetailScreenViewModel: RecipeDetailScreenViewModel, + navController: NavHostController, + name: String? ) { LazyColumn( modifier = Modifier.padding(horizontal = 16.dp) ){ + item {HeaderText(name = name)} + item { + Text( + text = "Recipes", + modifier = Modifier.padding(horizontal = 30.dp), + fontWeight = FontWeight.Bold, + fontSize = 30.sp + ) + } items(popularItems) { recipe -> - Log.d("PopularItems", "recipe : $recipe") DishCard( recipe = recipe, - onClick = {/* Handle on click here */} + onClick = { + recipeDetailScreenViewModel.setRecipe(recipe) + navController.navigate("RecipeDetailScreen") + } ) } } @@ -60,6 +80,7 @@ fun DishCard( .fillMaxWidth() .padding(horizontal = 4.dp, vertical = 8.dp) .background(Color.White, shape = RoundedCornerShape(16.dp)) + .clickable { onClick() } ) { Column( modifier = Modifier.fillMaxSize() diff --git a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt index e521aa3..caef3b3 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt @@ -10,8 +10,10 @@ import com.example.cookbook.presentation.utils.PreferenceManager import com.example.cookbook.presentation.view.homescreen.HomeScreen import com.example.cookbook.presentation.view.LogInScreen import com.example.cookbook.presentation.view.RegisterScreen +import com.example.cookbook.presentation.view.recipedetailsscreen.RecipeDetailScreen import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel import com.example.cookbook.presentation.viewmodel.LogInScreenViewModel +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel import com.example.cookbook.presentation.viewmodel.RegisterScreenViewModel @Composable @@ -19,6 +21,7 @@ fun Navigation( navController: NavHostController, registerScreenViewModel: RegisterScreenViewModel, logInScreenViewModel: LogInScreenViewModel, + recipeDetailScreenViewModel: RecipeDetailScreenViewModel, homeScreenViewModel: HomeScreenViewModel ) { @@ -37,11 +40,14 @@ fun Navigation( composable("logInScreen") { LogInScreen(logInScreenViewModel, navController) } - composable("RegisterScreen") { - RegisterScreen(registerScreenViewModel, navController) + composable("RegisterScreen/{name}") {backStackEntry -> + RegisterScreen(registerScreenViewModel, navController, backStackEntry) } - composable("HomeScreen") { - HomeScreen(navController, homeScreenViewModel) + composable("HomeScreen") {backStackEntry -> + HomeScreen(navController, homeScreenViewModel, recipeDetailScreenViewModel, backStackEntry) + } + composable("RecipeDetailScreen") {backStackEntry -> + RecipeDetailScreen(recipeDetailScreenViewModel, backStackEntry, navController) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt new file mode 100644 index 0000000..11b426f --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt @@ -0,0 +1,103 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import android.graphics.drawable.Icon +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarColors +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +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.compose.ui.unit.sp +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel +import com.example.cookbook.ui.theme.ButtonColor + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun Header( + recipeDetailsScreenViewModel: RecipeDetailScreenViewModel, + onBackClick: () -> Unit +) { + val selectedRecipe = recipeDetailsScreenViewModel.selectedRecipe.collectAsState().value + + Scaffold( + topBar = { + TopAppBar( + navigationIcon = { + IconButton(onClick = { onBackClick() }) { + androidx.compose.material3.Icon( + Icons.Default.ArrowBack, + contentDescription = null + ) + } + }, + title = { Text(text = "Details") }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = ButtonColor, + titleContentColor = Color.White + ) + ) + } + ) { innerPadding -> + if (selectedRecipe != null) { + Column(modifier = Modifier + .padding(innerPadding) + .fillMaxSize() + .verticalScroll( + rememberScrollState() + )) { + ScrollContent(innerPadding) + Name(recipeDetailsScreenViewModel) + ImageViewer(recipeDetailsScreenViewModel) + Informations(recipeDetailsScreenViewModel) + Instructions(recipeDetailsScreenViewModel) + } + } else { + // Show loading indicator while fetching data + Text("Loading recipe details...") + } + } +} + +@Composable +fun ScrollContent(padding: PaddingValues) {} + +@Composable +fun Name(recipeDetailsScreenViewModel: RecipeDetailScreenViewModel) { + val selectedRecipe = recipeDetailsScreenViewModel.selectedRecipe.collectAsState().value + val title = selectedRecipe?.title + + Column( + modifier = Modifier.padding(20.dp) + ) { + Text( + text = "Name", + fontSize = 30.sp, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = title.toString(), + fontSize = 20.sp, + color = Color.Gray + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt new file mode 100644 index 0000000..082addd --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt @@ -0,0 +1,41 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +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.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import coil.compose.rememberImagePainter +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel + +@Composable +fun ImageViewer( + recipeDetailScreenViewModel: RecipeDetailScreenViewModel +) { + val selectedRecipe = recipeDetailScreenViewModel.selectedRecipe.collectAsState().value + val image = selectedRecipe?.image + + Box( + modifier = Modifier + .fillMaxWidth() + .height(300.dp) + .padding(20.dp) + .clip(RoundedCornerShape(16.dp)) + ) { + Image( + painter = rememberImagePainter(image), + contentDescription = null, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt new file mode 100644 index 0000000..9295e11 --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt @@ -0,0 +1,231 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import androidx.compose.foundation.background +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.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.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel +import com.example.cookbook.ui.theme.BoxColor +import com.example.cookbook.ui.theme.BoxTextColor + +@Composable +fun Informations( + recipeDetailScreenViewModel: RecipeDetailScreenViewModel +) { + val selectedRecipe = recipeDetailScreenViewModel.selectedRecipe.collectAsState().value + + Box( + modifier = Modifier.fillMaxSize() + .clip(RoundedCornerShape(16.dp)) + .background(BoxColor) + ) { + Column ( + modifier = Modifier + .fillMaxWidth() + .padding(20.dp) + ) { + Text( + text = "Information", + fontSize = 30.sp, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Number of Servings", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.servings.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Price Per Servings", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.pricePerServing.toString() + "$", + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Cooking Minutes", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.cookingMinutes.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Dairy Free ?", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.dairyFree.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Gluten Free ?", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.glutenFree.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Health Score", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.healthScore.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Preparation Minutes", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.preparationMinutes.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Ready in Minutes", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.servings.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Vegan", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.vegan.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Vegetarian", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.vegetarian.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Very Healthy ?", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.veryHealthy.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Very Popular", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.veryPopular.toString(), + color = BoxTextColor + ) + } + Spacer(modifier = Modifier.height(10.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "Read more", + color = BoxTextColor + ) + Text( + text = selectedRecipe?.sourceUrl.toString(), + color = BoxTextColor + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt new file mode 100644 index 0000000..78df3de --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt @@ -0,0 +1,37 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +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.compose.ui.unit.sp +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel + +@Composable +fun Instructions( + recipeDetailScreenViewModel: RecipeDetailScreenViewModel +) { + val selectedRecipe = recipeDetailScreenViewModel.selectedRecipe.collectAsState().value + + Column( + modifier = Modifier.padding(20.dp) + ) { + Text( + text = "Instructions", + fontSize = 30.sp, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(10.dp)) + Text( + text = selectedRecipe?.instructions.toString(), + color = Color.Gray + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/RecipeDetailScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/RecipeDetailScreen.kt new file mode 100644 index 0000000..cdb2b52 --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/RecipeDetailScreen.kt @@ -0,0 +1,25 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavHostController +import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel + +@Composable +fun RecipeDetailScreen( + recipeDetailScreenViewModel: RecipeDetailScreenViewModel, + navBackStackEntry: NavBackStackEntry, + navController: NavHostController +) { + Column( + modifier = Modifier + .fillMaxSize() + ) { + Header(recipeDetailScreenViewModel) {navController.popBackStack()} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt new file mode 100644 index 0000000..111671d --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt @@ -0,0 +1,24 @@ +package com.example.cookbook.presentation.viewmodel + +import androidx.lifecycle.ViewModel +import com.example.cookbook.data.models.randomrecipemodel.Recipe +import com.example.cookbook.data.reposiitory.RandomRecipeRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject + +@HiltViewModel +class RecipeDetailScreenViewModel @Inject constructor( + val randomRecipeRepository: RandomRecipeRepository +): ViewModel() { + + private val _selectedRecipe = MutableStateFlow(null) + val selectedRecipe: StateFlow = _selectedRecipe.asStateFlow() + + fun setRecipe(recipe: Recipe) { + _selectedRecipe.value = recipe + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/ui/theme/Color.kt b/app/src/main/java/com/example/cookbook/ui/theme/Color.kt index 636f0f4..cb87158 100644 --- a/app/src/main/java/com/example/cookbook/ui/theme/Color.kt +++ b/app/src/main/java/com/example/cookbook/ui/theme/Color.kt @@ -10,4 +10,6 @@ val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) val Pink40 = Color(0xFF7D5260) -val ButtonColor = Color(0xFFDE6D4B) \ No newline at end of file +val ButtonColor = Color(0xFFDE6D4B) +val BoxTextColor = Color(0xFF1A4752) +val BoxColor = Color(0xFFE5F8FC) \ No newline at end of file From 12c4e3f3ef8aae3d1162cca977dd6bc0566b5484 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sun, 28 Apr 2024 09:06:21 +0530 Subject: [PATCH 3/6] Little changes with code structure --- .../reposiitory/RandomRecipeRepository.kt | 1 - .../reposiitory/RandomRecipeRepositoryImpl.kt | 1 - .../com/example/cookbook/di/MainModule.kt | 5 --- .../utils}/GetRandomRecipeResponse.kt | 2 +- .../presentation/utils/LogInResult.kt | 6 ++++ .../presentation/utils/RegistrationResult.kt | 6 ++++ .../cookbook/presentation/view/LogInScreen.kt | 21 ++++++------ .../presentation/view/RegisterScreen.kt | 12 ++++--- .../view/homescreen/HeaderText.kt | 34 ++++--------------- .../view/navigation/Navigation.kt | 4 +-- .../view/recipedetailsscreen/Header.kt | 1 - .../view/recipedetailsscreen/ImageViewer.kt | 1 - .../view/recipedetailsscreen/Informations.kt | 2 +- .../viewmodel/HomeScreenViewModel.kt | 2 -- .../viewmodel/LogInScreenViewModel.kt | 7 +--- .../viewmodel/RecipeDetailScreenViewModel.kt | 2 -- .../viewmodel/RegisterScreenViewModel.kt | 15 +++----- 17 files changed, 46 insertions(+), 76 deletions(-) rename app/src/main/java/com/example/cookbook/{data/datasource/api => presentation/utils}/GetRandomRecipeResponse.kt (84%) create mode 100644 app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt create mode 100644 app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt diff --git a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt index 276655d..478bdae 100644 --- a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt +++ b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepository.kt @@ -1,6 +1,5 @@ package com.example.cookbook.data.reposiitory -import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse interface RandomRecipeRepository { diff --git a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt index 7dfbe5f..651eb8e 100644 --- a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt +++ b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt @@ -1,6 +1,5 @@ package com.example.cookbook.data.reposiitory -import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.datasource.api.RetrofitApi import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse import retrofit2.HttpException diff --git a/app/src/main/java/com/example/cookbook/di/MainModule.kt b/app/src/main/java/com/example/cookbook/di/MainModule.kt index 9a91fa3..0f51d14 100644 --- a/app/src/main/java/com/example/cookbook/di/MainModule.kt +++ b/app/src/main/java/com/example/cookbook/di/MainModule.kt @@ -1,6 +1,5 @@ package com.example.cookbook.di -import android.util.Log import com.example.cookbook.data.datasource.api.RetrofitApi import com.example.cookbook.data.reposiitory.RandomRecipeRepository import com.example.cookbook.data.reposiitory.RandomRecipeRepositoryImpl @@ -26,8 +25,6 @@ class MainModule { .addConverterFactory(GsonConverterFactory.create()) .build() } catch (e: IllegalArgumentException) { - // Handle IllegalArgumentException - Log.e("MainModule", "Error creating Retrofit instance: ${e.message}") throw e } } @@ -38,8 +35,6 @@ class MainModule { return try { retrofit.create(RetrofitApi::class.java) } catch (e: IllegalArgumentException) { - // Handle IllegalArgumentException - Log.e("MainModule", "Error creating RetrofitApi instance: ${e.message}") throw e } } diff --git a/app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt b/app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt similarity index 84% rename from app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt rename to app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt index 67637eb..3de0b91 100644 --- a/app/src/main/java/com/example/cookbook/data/datasource/api/GetRandomRecipeResponse.kt +++ b/app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt @@ -1,4 +1,4 @@ -package com.example.cookbook.data.datasource.api +package com.example.cookbook.presentation.utils import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt b/app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt new file mode 100644 index 0000000..f949fc4 --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt @@ -0,0 +1,6 @@ +package com.example.cookbook.presentation.utils + +sealed class LogInResult { + object Success: LogInResult() + data class Failure(val errorMessage: String): LogInResult() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt b/app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt new file mode 100644 index 0000000..a3d40c8 --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt @@ -0,0 +1,6 @@ +package com.example.cookbook.presentation.utils + +sealed class RegistrationResult { + object Success: RegistrationResult() + data class Failure(val errorMessage: String): RegistrationResult() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt index 0dc8e70..9f8457e 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt @@ -1,6 +1,7 @@ package com.example.cookbook.presentation.view import android.util.Log +import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material3.Divider @@ -21,10 +22,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.Observer import androidx.navigation.NavHostController +import com.example.cookbook.presentation.utils.LogInResult import com.example.cookbook.presentation.utils.PreferenceManager import com.example.cookbook.presentation.view.components.CustomButton import com.example.cookbook.presentation.view.components.CustomTextField -import com.example.cookbook.presentation.viewmodel.LogInResult import com.example.cookbook.presentation.viewmodel.LogInScreenViewModel import com.example.cookbook.ui.theme.ButtonColor @@ -34,17 +35,11 @@ fun LogInScreen( navController: NavHostController ) { val context = LocalContext.current - var email by remember { mutableStateOf("") } var password by remember { mutableStateOf("") } - var passwordLengthError by remember { mutableStateOf("") } - val preferenceManager = remember { PreferenceManager(context) } - var loggedIn by remember { - mutableStateOf( preferenceManager.getBoolean("loggedIn", false)) - } - Log.d("LogInScreen", "loggedIn value : $loggedIn") + var loggedIn by remember { mutableStateOf( preferenceManager.getBoolean("loggedIn", false))} DisposableEffect(Unit) { val observer = Observer { logInResult -> @@ -52,7 +47,7 @@ fun LogInScreen( is LogInResult.Success -> { loggedIn = true preferenceManager.saveBoolean("loggedIn", true) - navController.navigate("HomeScreen") + navController.navigate("HomeScreen/${email}") } is LogInResult.Failure -> { loggedIn = false @@ -118,7 +113,11 @@ fun LogInScreen( CustomButton( onClick = { - logInScreenViewModel.logInUser(context, email, password) + try { + logInScreenViewModel.logInUser(context, email, password) + } catch (e : Exception) { + Toast.makeText(context, "Wrong credentials", Toast.LENGTH_LONG).show() + } }, text = "Sign In" ) @@ -141,7 +140,7 @@ fun LogInScreen( text = "Sign Up", fontWeight = FontWeight.Bold, color = ButtonColor, - modifier = Modifier.clickable { navController.navigate("RegisterScreen") } + modifier = Modifier.clickable { navController.navigate("RegisterScreen/{name}") } ) } } diff --git a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt index 2539de5..a627ee6 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt @@ -3,7 +3,6 @@ package com.example.cookbook.presentation.view import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Divider import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -23,10 +22,10 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.Observer import androidx.navigation.NavBackStackEntry import androidx.navigation.NavHostController +import com.example.cookbook.presentation.utils.RegistrationResult import com.example.cookbook.presentation.view.components.CustomButton import com.example.cookbook.presentation.view.components.CustomTextField import com.example.cookbook.presentation.viewmodel.RegisterScreenViewModel -import com.example.cookbook.presentation.viewmodel.RegistrationResult import com.example.cookbook.ui.theme.ButtonColor @Composable @@ -138,9 +137,12 @@ fun RegisterScreen( CustomButton( onClick = { - if (confirmPassword == password) { - - registerScreenViewModel.registerUser(context, name, email, password) + try { + if (confirmPassword == password) { + registerScreenViewModel.registerUser(context, name, email, password) + } + } catch (e: Exception) { + Toast.makeText(context, "Fill all the credentials", Toast.LENGTH_LONG).show() } }, text = "Sign Up" diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt index f641931..5e43ef7 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt @@ -20,32 +20,18 @@ import com.example.cookbook.R import com.example.cookbook.ui.theme.ButtonColor @Composable -fun HeaderText( - name: String? -) { +fun HeaderText(name: String?) { Column( modifier = Modifier .fillMaxWidth() .padding(10.dp) ) { - Row( - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = stringResource(id = R.string.header_text1), - fontWeight = FontWeight.ExtraBold, - fontSize = 30.sp - ) - Spacer(modifier = Modifier.width(12.dp)) - if (name != null) { - Text( - text = name, - fontWeight = FontWeight.ExtraBold, - fontSize = 30.sp, - color = ButtonColor - ) - } - } + + Text( + text = stringResource(id = R.string.header_text1), + fontWeight = FontWeight.ExtraBold, + fontSize = 30.sp + ) Text( text = stringResource(id = R.string.header_text2), color = Color.Gray, @@ -58,9 +44,3 @@ fun HeaderText( ) } } - -@Preview(showBackground = true) -@Composable -fun PreviewHeaderText() { - HeaderText("Rohan") -} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt index caef3b3..e930f47 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt @@ -35,7 +35,7 @@ fun Navigation( NavHost( navController = navController, - startDestination = if (loggedIn) "HomeScreen" else "logInScreen" + startDestination = if (loggedIn) "HomeScreen/{name}" else "logInScreen" ) { composable("logInScreen") { LogInScreen(logInScreenViewModel, navController) @@ -43,7 +43,7 @@ fun Navigation( composable("RegisterScreen/{name}") {backStackEntry -> RegisterScreen(registerScreenViewModel, navController, backStackEntry) } - composable("HomeScreen") {backStackEntry -> + composable("HomeScreen/{name}") {backStackEntry -> HomeScreen(navController, homeScreenViewModel, recipeDetailScreenViewModel, backStackEntry) } composable("RecipeDetailScreen") {backStackEntry -> diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt index 11b426f..d01f936 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt @@ -99,5 +99,4 @@ fun Name(recipeDetailsScreenViewModel: RecipeDetailScreenViewModel) { color = Color.Gray ) } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt index 082addd..8ac0b2f 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/ImageViewer.kt @@ -37,5 +37,4 @@ fun ImageViewer( contentScale = ContentScale.Crop ) } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt index 9295e11..dab74f5 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Informations.kt @@ -225,7 +225,7 @@ fun Informations( text = selectedRecipe?.sourceUrl.toString(), color = BoxTextColor ) + } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt index efc664e..ffc66ef 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt @@ -1,9 +1,7 @@ package com.example.cookbook.presentation.viewmodel -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.example.cookbook.data.datasource.api.GetRandomRecipeResult import com.example.cookbook.data.models.randomrecipemodel.Recipe import com.example.cookbook.data.reposiitory.RandomRecipeRepository import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt index 183c3ca..956f19f 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.navigation.NavController import androidx.navigation.NavHostController +import com.example.cookbook.presentation.utils.LogInResult import com.google.firebase.auth.FirebaseAuth import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -36,15 +37,9 @@ class LogInScreenViewModel @Inject constructor( .addOnCompleteListener { task -> if (task.isSuccessful) { _logInResult.value = LogInResult.Success - Log.d("LogInScreenViewModel", "_logInResult : $_logInResult") } else { _logInResult.value = LogInResult.Failure("Sign In Failed ") } } } } - -sealed class LogInResult { - object Success: LogInResult() - data class Failure(val errorMessage: String): LogInResult() -} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt index 111671d..d2c85b4 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt @@ -11,7 +11,6 @@ import javax.inject.Inject @HiltViewModel class RecipeDetailScreenViewModel @Inject constructor( - val randomRecipeRepository: RandomRecipeRepository ): ViewModel() { private val _selectedRecipe = MutableStateFlow(null) @@ -20,5 +19,4 @@ class RecipeDetailScreenViewModel @Inject constructor( fun setRecipe(recipe: Recipe) { _selectedRecipe.value = recipe } - } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt index 30172a6..739d91e 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt @@ -1,12 +1,10 @@ package com.example.cookbook.presentation.viewmodel import android.content.Context -import android.widget.Toast import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController +import com.example.cookbook.presentation.utils.RegistrationResult import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.UserProfileChangeRequest import dagger.hilt.android.lifecycle.HiltViewModel @@ -40,17 +38,14 @@ class RegisterScreenViewModel @Inject constructor( if (displayNameUpdateTask.isSuccessful) { _registrationResult.value = RegistrationResult.Success } else { - _registrationResult.value = RegistrationResult.Failure("Failed to update display name") + _registrationResult.value = RegistrationResult + .Failure("Failed to update display name") } } } else { - _registrationResult.value = RegistrationResult.Failure("Registration Failed") + _registrationResult.value = RegistrationResult + .Failure("Registration Failed") } } } -} - -sealed class RegistrationResult { - object Success: RegistrationResult() - data class Failure(val errorMessage: String): RegistrationResult() } \ No newline at end of file From 31a5e7c9b6024819e7c5b2f56cfc6ab4ea52a7f4 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sun, 28 Apr 2024 14:52:57 +0530 Subject: [PATCH 4/6] First commit --- .../randomrecipemodel/AnalyzedInstruction.kt | 6 +- .../models/randomrecipemodel/Equipment.kt | 12 ++- .../randomrecipemodel/ExtendedIngredient.kt | 26 ++--- .../models/randomrecipemodel/Ingredient.kt | 10 +- .../data/models/randomrecipemodel/Length.kt | 6 +- .../data/models/randomrecipemodel/Measures.kt | 6 +- .../data/models/randomrecipemodel/Metric.kt | 8 +- .../randomrecipemodel/RandomRecipeResponse.kt | 4 +- .../data/models/randomrecipemodel/Recipe.kt | 79 +++++++-------- .../data/models/randomrecipemodel/Step.kt | 12 ++- .../models/randomrecipemodel/Temperature.kt | 6 +- .../data/models/randomrecipemodel/Us.kt | 8 +- .../cookbook/presentation/view/LogInScreen.kt | 4 +- .../presentation/view/RegisterScreen.kt | 2 +- .../view/components/SideNavDrawer.kt | 73 ++++++++++++++ .../view/homescreen/HeaderText.kt | 7 -- .../view/homescreen/HomeScreen.kt | 96 ++++++++++++++----- .../view/navigation/Navigation.kt | 2 +- .../viewmodel/LogInScreenViewModel.kt | 2 +- .../viewmodel/RecipeDetailScreenViewModel.kt | 2 +- .../viewmodel/RegisterScreenViewModel.kt | 2 +- .../utils/GetRandomRecipeResponse.kt | 2 +- .../com/example/cookbook/utils/JsonParsing.kt | 14 +++ .../{presentation => }/utils/LogInResult.kt | 2 +- .../utils/PreferenceManager.kt | 2 +- .../utils/RegistrationResult.kt | 2 +- 26 files changed, 276 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt rename app/src/main/java/com/example/cookbook/{presentation => }/utils/GetRandomRecipeResponse.kt (85%) create mode 100644 app/src/main/java/com/example/cookbook/utils/JsonParsing.kt rename app/src/main/java/com/example/cookbook/{presentation => }/utils/LogInResult.kt (72%) rename app/src/main/java/com/example/cookbook/{presentation => }/utils/PreferenceManager.kt (92%) rename app/src/main/java/com/example/cookbook/{presentation => }/utils/RegistrationResult.kt (75%) diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt index eebe2e7..1d36ac2 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/AnalyzedInstruction.kt @@ -1,6 +1,8 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class AnalyzedInstruction( - val name : String, - val steps : List + @SerializedName("name") val name : String, + @SerializedName("steps") val steps : List ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt index e588eff..10c83c1 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Equipment.kt @@ -1,9 +1,11 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Equipment( - val id : Int, - val image : String, - val localizedName : String, - val name : String, - val temperature : Temperature + @SerializedName("id" ) val id : Int, + @SerializedName("image" ) val image : String, + @SerializedName("localizedName") val localizedName : String, + @SerializedName("name" ) val name : String, + @SerializedName("temperature" ) val temperature : Temperature ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt index 58a8de0..4040809 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/ExtendedIngredient.kt @@ -1,16 +1,18 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class ExtendedIngredient( - val aisle : String, - val amount : Double, - val consistency : String, - val id : Int, - val image : String, - val measures : Measures, - val meta : List, - val name : String, - val nameClean : String, - val original : String, - val originalName : String, - val unit : String + @SerializedName("aisle" ) val aisle : String, + @SerializedName("amount" ) val amount : Double, + @SerializedName("consistency" ) val consistency : String, + @SerializedName("id" ) val id : Int, + @SerializedName("image" ) val image : String, + @SerializedName("measures" ) val measures : Measures, + @SerializedName("meta" ) val meta : List, + @SerializedName("name" ) val name : String, + @SerializedName("nameClean" ) val nameClean : String, + @SerializedName("original" ) val original : String, + @SerializedName("originalName" ) val originalName : String, + @SerializedName("unit" ) val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt index a55d02f..faea3ce 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Ingredient.kt @@ -1,8 +1,10 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Ingredient( - val id : Int, - val image : String, - val localizedName : String, - val name : String + @SerializedName("id" ) val id : Int, + @SerializedName("image" ) val image : String, + @SerializedName("localizedName" ) val localizedName : String, + @SerializedName("name" ) val name : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt index 26a38b8..97424d9 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Length.kt @@ -1,6 +1,8 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Length( - val number : Int, - val unit : String + @SerializedName("number" ) val number : Int, + @SerializedName("unit" ) val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt index d5bfb9e..3cd8c1d 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Measures.kt @@ -1,6 +1,8 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Measures( - val metric : Metric, - val us : Us + @SerializedName("metric" ) val metric : Metric, + @SerializedName("us" ) val us : Us ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt index caba404..998098b 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Metric.kt @@ -1,7 +1,9 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Metric( - val amount : Double, - val unitLong : String, - val unitShort : String + @SerializedName("amount" ) val amount : Double, + @SerializedName("unitLong" ) val unitLong : String, + @SerializedName("unitShort" ) val unitShort : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt index dc6b5de..218355d 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/RandomRecipeResponse.kt @@ -1,5 +1,7 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class RandomRecipeResponse( - val recipes : List + @SerializedName("recipes") val recipes : List ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt index a746b1f..12efcea 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Recipe.kt @@ -1,41 +1,44 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.Gson +import com.google.gson.annotations.SerializedName + data class Recipe( - val aggregateLikes : Int, - val analyzedInstructions : List, - val cheap : Boolean, - val cookingMinutes : Int, - val creditsText : String, - val cuisines : List, - val dairyFree : Boolean, - val diets : List, - val dishTypes : List, - val extendedIngredients : List, - val gaps : String, - val glutenFree : Boolean, - val healthScore : Int, - val id : Int, - val image : String, - val imageType : String, - val instructions : String, - val license : String, - val lowFodmap : Boolean, - val occasions : List, - val originalId : Any, - val preparationMinutes : Int, - val pricePerServing : Double, - val readyInMinutes : Int, - val servings : Int, - val sourceName : String, - val sourceUrl : String, - val spoonacularScore : Double, - val spoonacularSourceUrl : String, - val summary : String, - val sustainable : Boolean, - val title : String, - val vegan : Boolean, - val vegetarian : Boolean, - val veryHealthy : Boolean, - val veryPopular : Boolean, - val weightWatcherSmartPoints : Int -) \ No newline at end of file + @SerializedName("aggregateLikes" ) val aggregateLikes : Int, + @SerializedName("analyzedInstructions" ) val analyzedInstructions : List, + @SerializedName("cheap" ) val cheap : Boolean, + @SerializedName("cookingMinutes" ) val cookingMinutes : Int, + @SerializedName("creditsText" ) val creditsText : String, + @SerializedName("cuisines" ) val cuisines : List, + @SerializedName("dairyFree" ) val dairyFree : Boolean, + @SerializedName("diets" ) val diets : List, + @SerializedName("dishTypes" ) val dishTypes : List, + @SerializedName("extendedIngredients" ) val extendedIngredients : List, + @SerializedName("gaps" ) val gaps : String, + @SerializedName("glutenFree" ) val glutenFree : Boolean, + @SerializedName("healthScore" ) val healthScore : Int, + @SerializedName("id" ) val id : Int, + @SerializedName("image" ) val image : String, + @SerializedName("imageType" ) val imageType : String, + @SerializedName("instructions" ) val instructions : String, + @SerializedName("license" ) val license : String, + @SerializedName("lowFodmap" ) val lowFodmap : Boolean, + @SerializedName("occasions" ) val occasions : List, + @SerializedName("originalId" ) val originalId : Any, + @SerializedName("preparationMinutes" ) val preparationMinutes : Int, + @SerializedName("pricePerServing" ) val pricePerServing : Double, + @SerializedName("readyInMinutes" ) val readyInMinutes : Int, + @SerializedName("servings" ) val servings : Int, + @SerializedName("sourceName" ) val sourceName : String, + @SerializedName("sourceUrl" ) val sourceUrl : String, + @SerializedName("spoonacularScore" ) val spoonacularScore : Double, + @SerializedName("spoonacularSourceUrl" ) val spoonacularSourceUrl : String, + @SerializedName("summary" ) val summary : String, + @SerializedName("sustainable" ) val sustainable : Boolean, + @SerializedName("title" ) val title : String, + @SerializedName("vegan" ) val vegan : Boolean, + @SerializedName("vegetarian" ) val vegetarian : Boolean, + @SerializedName("veryHealthy" ) val veryHealthy : Boolean, + @SerializedName("veryPopular" ) val veryPopular : Boolean, + @SerializedName("weightWatcherSmartPoints" ) val weightWatcherSmartPoints : Int +) diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt index 28ca3d3..97aa080 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Step.kt @@ -1,9 +1,11 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Step( - val equipment : List, - val ingredients : List, - val length : Length, - val number : Int, - val step : String + @SerializedName("equipment" ) val equipment : List, + @SerializedName("ingredients" ) val ingredients : List, + @SerializedName("length" ) val length : Length, + @SerializedName("number" ) val number : Int, + @SerializedName("step" ) val step : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt index 38675ce..2c329d2 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Temperature.kt @@ -1,6 +1,8 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Temperature( - val number : Double, - val unit : String + @SerializedName("number" ) val number : Double, + @SerializedName("unit" ) val unit : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt index f554029..19a10cd 100644 --- a/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt +++ b/app/src/main/java/com/example/cookbook/data/models/randomrecipemodel/Us.kt @@ -1,7 +1,9 @@ package com.example.cookbook.data.models.randomrecipemodel +import com.google.gson.annotations.SerializedName + data class Us( - val amount : Double, - val unitLong : String, - val unitShort : String + @SerializedName("amount" ) val amount : Double, + @SerializedName("unitLong" ) val unitLong : String, + @SerializedName("unitShort" ) val unitShort : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt index 9f8457e..bbeb5c8 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.Observer import androidx.navigation.NavHostController -import com.example.cookbook.presentation.utils.LogInResult -import com.example.cookbook.presentation.utils.PreferenceManager +import com.example.cookbook.utils.LogInResult +import com.example.cookbook.utils.PreferenceManager import com.example.cookbook.presentation.view.components.CustomButton import com.example.cookbook.presentation.view.components.CustomTextField import com.example.cookbook.presentation.viewmodel.LogInScreenViewModel diff --git a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt index a627ee6..6d33fd2 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/RegisterScreen.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.Observer import androidx.navigation.NavBackStackEntry import androidx.navigation.NavHostController -import com.example.cookbook.presentation.utils.RegistrationResult +import com.example.cookbook.utils.RegistrationResult import com.example.cookbook.presentation.view.components.CustomButton import com.example.cookbook.presentation.view.components.CustomTextField import com.example.cookbook.presentation.viewmodel.RegisterScreenViewModel diff --git a/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt b/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt new file mode 100644 index 0000000..512c05e --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt @@ -0,0 +1,73 @@ +package com.example.cookbook.presentation.view.components + +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material3.Divider +import androidx.compose.material3.DrawerState +import androidx.compose.material3.DrawerValue +import androidx.compose.material3.ExtendedFloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.material3.ModalDrawerSheet +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.NavigationDrawerItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.rememberDrawerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.navigation.NavHostController +import com.example.cookbook.presentation.view.recipedetailsscreen.ScrollContent +import com.example.cookbook.utils.PreferenceManager +import kotlinx.coroutines.launch + +@Composable +fun SideNavDrawer( + isDrawerOpen: Boolean, + modifier: Modifier = Modifier, + navController: NavHostController, + onDrawerStateChange: (Boolean) -> Unit, +) { + val context = LocalContext.current + val preferenceManager = remember { PreferenceManager(context) } + + val drawerState = + rememberDrawerState( + initialValue = + if (isDrawerOpen) DrawerValue.Open + else DrawerValue.Closed) + + LaunchedEffect(isDrawerOpen) { + if (isDrawerOpen) { + drawerState.open() + } else { + drawerState.close() + } + } + + ModalNavigationDrawer( + drawerState = drawerState, + modifier = modifier, + drawerContent = { + ModalDrawerSheet { + Text("Menu", modifier = Modifier.padding(16.dp)) + Divider() + NavigationDrawerItem( + label = { Text(text = "Log Out") }, + selected = false, + onClick = { + preferenceManager.saveBoolean("loggedIn", false) + navController.navigate("logInScreen") + } + ) + } + } + ) { + onDrawerStateChange(drawerState.isOpen) + } +} diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt index 5e43ef7..6dbe04a 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HeaderText.kt @@ -1,23 +1,17 @@ package com.example.cookbook.presentation.view.homescreen 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.padding -import androidx.compose.foundation.layout.width import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource 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.example.cookbook.R -import com.example.cookbook.ui.theme.ButtonColor @Composable fun HeaderText(name: String?) { @@ -26,7 +20,6 @@ fun HeaderText(name: String?) { .fillMaxWidth() .padding(10.dp) ) { - Text( text = stringResource(id = R.string.header_text1), fontWeight = FontWeight.ExtraBold, diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt index 8126330..b63e1c2 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt @@ -1,31 +1,43 @@ package com.example.cookbook.presentation.view.homescreen -import android.util.Log -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavHostController import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.navigation.NavBackStackEntry import com.example.cookbook.R +import com.example.cookbook.presentation.view.components.SideNavDrawer +import com.example.cookbook.presentation.view.recipedetailsscreen.ScrollContent import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel +import com.example.cookbook.ui.theme.ButtonColor +@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( navController: NavHostController, @@ -38,26 +50,66 @@ fun HomeScreen( val name = backStackEntry.arguments?.getString("name") - Box(modifier = Modifier.fillMaxSize()) { + var isDrawerOpen by remember { mutableStateOf(false) } + Scaffold( + topBar = { + TopAppBar( + navigationIcon = { + IconButton(onClick = { + isDrawerOpen = !isDrawerOpen + }) { + Icon( + Icons.Default.Menu, + contentDescription = null, + tint = Color.White, + modifier = Modifier.size(40.dp) + ) + } + }, + title = { Text(text = "CookBook") }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = ButtonColor, + titleContentColor = Color.White + ) + ) + }, + ) { innerPadding -> + ScrollContent(padding = innerPadding) + Box(modifier = Modifier.fillMaxSize()) { if (isLoading) { - CircularProgressIndicator(modifier = Modifier.padding(16.dp).align(Alignment.Center)) + CircularProgressIndicator(modifier = Modifier + .padding(16.dp) + .align(Alignment.Center)) } else { Column( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .padding(innerPadding), ) { - if (popularItems.isNotEmpty()) { - PopularItems( - popularItems = popularItems, - recipeDetailScreenViewModel, - navController, - name - ) - } else { - Text( - text = "No recipes found", - modifier = Modifier.padding(horizontal = 30.dp), - fontSize = 16.sp - ) + + if (popularItems.isNotEmpty()) { + PopularItems( + popularItems = popularItems, + recipeDetailScreenViewModel, + navController, + name + ) + } else { + Text( + text = "No recipes found", + modifier = Modifier.padding(horizontal = 30.dp), + fontSize = 16.sp + ) + } + } + } + if (isDrawerOpen) { + SideNavDrawer( + isDrawerOpen = isDrawerOpen, + modifier = Modifier.padding(innerPadding), + navController + ) { drawerState -> + isDrawerOpen = drawerState } } } @@ -67,4 +119,4 @@ fun HomeScreen( LaunchedEffect(key1 = Unit) { homeScreenViewModel.getRandomRecipe(apiKey = apiKey, number = 20) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt index e930f47..75da0a2 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/navigation/Navigation.kt @@ -6,7 +6,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import com.example.cookbook.presentation.utils.PreferenceManager +import com.example.cookbook.utils.PreferenceManager import com.example.cookbook.presentation.view.homescreen.HomeScreen import com.example.cookbook.presentation.view.LogInScreen import com.example.cookbook.presentation.view.RegisterScreen diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt index 956f19f..0eb4fed 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.navigation.NavController import androidx.navigation.NavHostController -import com.example.cookbook.presentation.utils.LogInResult +import com.example.cookbook.utils.LogInResult import com.google.firebase.auth.FirebaseAuth import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt index d2c85b4..0823538 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt @@ -2,11 +2,11 @@ package com.example.cookbook.presentation.viewmodel import androidx.lifecycle.ViewModel import com.example.cookbook.data.models.randomrecipemodel.Recipe -import com.example.cookbook.data.reposiitory.RandomRecipeRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt index 739d91e..34e8e63 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RegisterScreenViewModel.kt @@ -4,7 +4,7 @@ import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.example.cookbook.presentation.utils.RegistrationResult +import com.example.cookbook.utils.RegistrationResult import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.UserProfileChangeRequest import dagger.hilt.android.lifecycle.HiltViewModel diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt b/app/src/main/java/com/example/cookbook/utils/GetRandomRecipeResponse.kt similarity index 85% rename from app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt rename to app/src/main/java/com/example/cookbook/utils/GetRandomRecipeResponse.kt index 3de0b91..ee9f204 100644 --- a/app/src/main/java/com/example/cookbook/presentation/utils/GetRandomRecipeResponse.kt +++ b/app/src/main/java/com/example/cookbook/utils/GetRandomRecipeResponse.kt @@ -1,4 +1,4 @@ -package com.example.cookbook.presentation.utils +package com.example.cookbook.utils import com.example.cookbook.data.models.randomrecipemodel.RandomRecipeResponse diff --git a/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt b/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt new file mode 100644 index 0000000..16e76ae --- /dev/null +++ b/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt @@ -0,0 +1,14 @@ +package com.example.cookbook.utils + +import com.example.cookbook.data.models.randomrecipemodel.Recipe +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +fun parseRecipe(jsonString: String) : List { + val gson = Gson() + return gson.fromJson(jsonString, object : TypeToken>() {}.type) +} + +// Fetch the recipe in the viewmodel from the repository +// Parse that recipe +// and then use it using lazyColumn \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt b/app/src/main/java/com/example/cookbook/utils/LogInResult.kt similarity index 72% rename from app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt rename to app/src/main/java/com/example/cookbook/utils/LogInResult.kt index f949fc4..15b8858 100644 --- a/app/src/main/java/com/example/cookbook/presentation/utils/LogInResult.kt +++ b/app/src/main/java/com/example/cookbook/utils/LogInResult.kt @@ -1,4 +1,4 @@ -package com.example.cookbook.presentation.utils +package com.example.cookbook.utils sealed class LogInResult { object Success: LogInResult() diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/PreferenceManager.kt b/app/src/main/java/com/example/cookbook/utils/PreferenceManager.kt similarity index 92% rename from app/src/main/java/com/example/cookbook/presentation/utils/PreferenceManager.kt rename to app/src/main/java/com/example/cookbook/utils/PreferenceManager.kt index 1a6bc65..7de020e 100644 --- a/app/src/main/java/com/example/cookbook/presentation/utils/PreferenceManager.kt +++ b/app/src/main/java/com/example/cookbook/utils/PreferenceManager.kt @@ -1,4 +1,4 @@ -package com.example.cookbook.presentation.utils +package com.example.cookbook.utils import android.content.Context import android.content.SharedPreferences diff --git a/app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt b/app/src/main/java/com/example/cookbook/utils/RegistrationResult.kt similarity index 75% rename from app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt rename to app/src/main/java/com/example/cookbook/utils/RegistrationResult.kt index a3d40c8..efe6b12 100644 --- a/app/src/main/java/com/example/cookbook/presentation/utils/RegistrationResult.kt +++ b/app/src/main/java/com/example/cookbook/utils/RegistrationResult.kt @@ -1,4 +1,4 @@ -package com.example.cookbook.presentation.utils +package com.example.cookbook.utils sealed class RegistrationResult { object Success: RegistrationResult() From 4c88a75465e2fd39e4681b955daec954a7b3cde0 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sun, 28 Apr 2024 17:18:03 +0530 Subject: [PATCH 5/6] Final Push of the day --- app/build.gradle.kts | 1 + .../java/com/example/cookbook/MainActivity.kt | 3 -- .../reposiitory/RandomRecipeRepositoryImpl.kt | 3 +- .../cookbook/presentation/view/LogInScreen.kt | 13 +++-- .../presentation/view/components/Buttons.kt | 1 - .../view/components/SideNavDrawer.kt | 9 ---- .../view/components/TextFields.kt | 1 - .../view/homescreen/Categories.kt | 4 -- .../view/homescreen/CustomSearchBar.kt | 8 --- .../view/homescreen/HomeScreen.kt | 43 ++++++++++++--- .../view/homescreen/PopularItems.kt | 29 +++++------ .../view/recipedetailsscreen/Header.kt | 27 +++++----- .../view/recipedetailsscreen/Ingredients.kt | 52 +++++++++++++++++++ .../view/recipedetailsscreen/Instructions.kt | 22 +++++++- .../viewmodel/HomeScreenViewModel.kt | 5 +- .../viewmodel/LogInScreenViewModel.kt | 5 -- .../viewmodel/RecipeDetailScreenViewModel.kt | 2 +- .../com/example/cookbook/utils/JsonParsing.kt | 14 ----- gradle/libs.versions.toml | 2 + 19 files changed, 151 insertions(+), 93 deletions(-) create mode 100644 app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Ingredients.kt delete mode 100644 app/src/main/java/com/example/cookbook/utils/JsonParsing.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d33f45e..905dfd0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -87,6 +87,7 @@ dependencies { implementation(libs.sharedpreferences) implementation(libs.lifecycle.compose) implementation(libs.runtime.livedata) + implementation(libs.swipe.refresh) // Dagger-hilt implementation("com.google.dagger:hilt-android:2.48") diff --git a/app/src/main/java/com/example/cookbook/MainActivity.kt b/app/src/main/java/com/example/cookbook/MainActivity.kt index e4653b5..a698efe 100644 --- a/app/src/main/java/com/example/cookbook/MainActivity.kt +++ b/app/src/main/java/com/example/cookbook/MainActivity.kt @@ -4,9 +4,6 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.example.cookbook.presentation.view.navigation.Navigation import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel diff --git a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt index 651eb8e..4b74f0b 100644 --- a/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt +++ b/app/src/main/java/com/example/cookbook/data/reposiitory/RandomRecipeRepositoryImpl.kt @@ -12,7 +12,8 @@ class RandomRecipeRepositoryImpl( override suspend fun getRandomRecipe(apiKey: String, number: Int): Result { return try { - val response = retrofitApi.getRandomRecipe(apiKey, number) + val response = retrofitApi + .getRandomRecipe(apiKey, number) .awaitResponse() if (response.isSuccessful) { diff --git a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt index bbeb5c8..4b2a646 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/LogInScreen.kt @@ -1,6 +1,5 @@ package com.example.cookbook.presentation.view -import android.util.Log import android.widget.Toast import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -39,7 +38,15 @@ fun LogInScreen( var password by remember { mutableStateOf("") } var passwordLengthError by remember { mutableStateOf("") } val preferenceManager = remember { PreferenceManager(context) } - var loggedIn by remember { mutableStateOf( preferenceManager.getBoolean("loggedIn", false))} + var loggedIn by remember { + mutableStateOf( + preferenceManager + .getBoolean( + "loggedIn", + false + ) + ) + } DisposableEffect(Unit) { val observer = Observer { logInResult -> @@ -94,7 +101,7 @@ fun LogInScreen( value = password, onValueChange = { password = it - passwordLengthError = if (password.length < 6) "Password should atleast be of 6 characters" else "" + passwordLengthError = if (password.length < 6) "Password should at least be of 6 characters" else "" }, placeHolder = "Password", keyboardType = KeyboardType.Password diff --git a/app/src/main/java/com/example/cookbook/presentation/view/components/Buttons.kt b/app/src/main/java/com/example/cookbook/presentation/view/components/Buttons.kt index 191ed0a..dd85e42 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/components/Buttons.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/components/Buttons.kt @@ -12,7 +12,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.example.cookbook.ui.theme.ButtonColor - @Composable fun CustomButton( onClick: () -> Unit, diff --git a/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt b/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt index 512c05e..db5a7ff 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/components/SideNavDrawer.kt @@ -1,30 +1,21 @@ package com.example.cookbook.presentation.view.components import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add import androidx.compose.material3.Divider -import androidx.compose.material3.DrawerState import androidx.compose.material3.DrawerValue -import androidx.compose.material3.ExtendedFloatingActionButton -import androidx.compose.material3.Icon import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.NavigationDrawerItem -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController -import com.example.cookbook.presentation.view.recipedetailsscreen.ScrollContent import com.example.cookbook.utils.PreferenceManager -import kotlinx.coroutines.launch @Composable fun SideNavDrawer( diff --git a/app/src/main/java/com/example/cookbook/presentation/view/components/TextFields.kt b/app/src/main/java/com/example/cookbook/presentation/view/components/TextFields.kt index 0e7c18a..ae0bfc3 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/components/TextFields.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/components/TextFields.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp - @OptIn(ExperimentalMaterial3Api::class) @Composable fun CustomTextField( diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/Categories.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/Categories.kt index 2a74c7f..e665a3a 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/Categories.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/Categories.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -18,11 +17,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.example.cookbook.R @Composable fun CategoriesList( diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/CustomSearchBar.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/CustomSearchBar.kt index f8fd34e..52c42a0 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/CustomSearchBar.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/CustomSearchBar.kt @@ -3,22 +3,16 @@ package com.example.cookbook.presentation.view.homescreen import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box -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.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Search -import androidx.compose.material3.Card -import androidx.compose.material3.CardElevation import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -32,8 +26,6 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.navigation.NavController import androidx.navigation.NavHostController import com.example.cookbook.R diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt index b63e1c2..f210e73 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/HomeScreen.kt @@ -25,6 +25,8 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color @@ -36,6 +38,9 @@ import com.example.cookbook.presentation.view.recipedetailsscreen.ScrollContent import com.example.cookbook.presentation.viewmodel.HomeScreenViewModel import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel import com.example.cookbook.ui.theme.ButtonColor +import com.google.accompanist.swiperefresh.SwipeRefresh +import com.google.accompanist.swiperefresh.rememberSwipeRefreshState +import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -45,12 +50,16 @@ fun HomeScreen( recipeDetailScreenViewModel: RecipeDetailScreenViewModel, backStackEntry: NavBackStackEntry ) { + val apiKey = stringResource(id = R.string.api_key) + val isLoading by homeScreenViewModel.isLoading.collectAsState(initial = false) val popularItems by homeScreenViewModel.popularItems.collectAsState(emptyList()) - + var isDrawerOpen by remember { mutableStateOf(false)} + val pullRefreshState = rememberSwipeRefreshState(isRefreshing = false) + var isInitialFetchedCompleted by rememberSaveable { mutableStateOf(false) } + val scope = rememberCoroutineScope() val name = backStackEntry.arguments?.getString("name") - var isDrawerOpen by remember { mutableStateOf(false) } Scaffold( topBar = { TopAppBar( @@ -74,12 +83,27 @@ fun HomeScreen( ) }, ) { innerPadding -> + SwipeRefresh( + state = pullRefreshState, + onRefresh = { + scope.launch { + homeScreenViewModel + .getRandomRecipe( + apiKey = apiKey, + number = 20 + ) + } + } + ) { + ScrollContent(padding = innerPadding) Box(modifier = Modifier.fillMaxSize()) { if (isLoading) { - CircularProgressIndicator(modifier = Modifier - .padding(16.dp) - .align(Alignment.Center)) + CircularProgressIndicator( + modifier = Modifier + .padding(16.dp) + .align(Alignment.Center) + ) } else { Column( modifier = Modifier @@ -113,10 +137,13 @@ fun HomeScreen( } } } + } } - val apiKey = stringResource(id = R.string.api_key) - LaunchedEffect(key1 = Unit) { - homeScreenViewModel.getRandomRecipe(apiKey = apiKey, number = 20) + if (!isInitialFetchedCompleted) { + LaunchedEffect(Unit) { + homeScreenViewModel.getRandomRecipe(apiKey = apiKey, number = 20) + isInitialFetchedCompleted = true + } } } diff --git a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt index 3909800..d7d1dc8 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/homescreen/PopularItems.kt @@ -1,6 +1,5 @@ package com.example.cookbook.presentation.view.homescreen -import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -33,7 +32,6 @@ 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.navigation.NavController import androidx.navigation.NavHostController import coil.compose.rememberImagePainter import com.example.cookbook.data.models.randomrecipemodel.Recipe @@ -85,7 +83,7 @@ fun DishCard( Column( modifier = Modifier.fillMaxSize() ) { - // Background image of dish + Box( modifier = Modifier .fillMaxWidth() @@ -93,30 +91,28 @@ fun DishCard( .clip(RoundedCornerShape(16.dp)) ) { Image( - painter = rememberImagePainter(recipe.image), // Use Coil or other image loading library + painter = rememberImagePainter(recipe.image), contentDescription = null, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } - recipe.title?.let { - Text( - text = it, - modifier = Modifier - .padding(vertical = 8.dp) - .fillMaxWidth(), - textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyMedium - ) - } + Text( + text = recipe.title, + modifier = Modifier + .padding(vertical = 8.dp) + .fillMaxWidth(), + textAlign = TextAlign.Center, + style = MaterialTheme.typography.bodyMedium + ) Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp) ) { - // Display vegetarian icon if recipe is vegetarian - if (recipe.vegetarian == true) { + + if (recipe.vegetarian) { Icon( imageVector = Icons.Default.CheckCircle, contentDescription = null, @@ -134,7 +130,6 @@ fun DishCard( Spacer(modifier = Modifier.width(4.dp)) } - // Display time to make Icon( imageVector = Icons.Default.DateRange, contentDescription = null, diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt index d01f936..8a99244 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Header.kt @@ -1,6 +1,5 @@ package com.example.cookbook.presentation.view.recipedetailsscreen -import android.graphics.drawable.Icon import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer @@ -17,7 +16,6 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarColors import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -35,21 +33,26 @@ fun Header( recipeDetailsScreenViewModel: RecipeDetailScreenViewModel, onBackClick: () -> Unit ) { - val selectedRecipe = recipeDetailsScreenViewModel.selectedRecipe.collectAsState().value + val selectedRecipe = + recipeDetailsScreenViewModel + .selectedRecipe + .collectAsState() + .value Scaffold( topBar = { TopAppBar( navigationIcon = { - IconButton(onClick = { onBackClick() }) { - androidx.compose.material3.Icon( - Icons.Default.ArrowBack, - contentDescription = null - ) - } + IconButton(onClick = { onBackClick() }) { + Icon( + Icons.Default.ArrowBack, + contentDescription = null + ) + } }, title = { Text(text = "Details") }, - colors = TopAppBarDefaults.topAppBarColors( + colors = TopAppBarDefaults + .topAppBarColors( containerColor = ButtonColor, titleContentColor = Color.White ) @@ -67,11 +70,9 @@ fun Header( Name(recipeDetailsScreenViewModel) ImageViewer(recipeDetailsScreenViewModel) Informations(recipeDetailsScreenViewModel) + Ingredients(selectedRecipe = selectedRecipe) Instructions(recipeDetailsScreenViewModel) } - } else { - // Show loading indicator while fetching data - Text("Loading recipe details...") } } } diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Ingredients.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Ingredients.kt new file mode 100644 index 0000000..7473085 --- /dev/null +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Ingredients.kt @@ -0,0 +1,52 @@ +package com.example.cookbook.presentation.view.recipedetailsscreen + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +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.compose.ui.unit.sp +import com.example.cookbook.data.models.randomrecipemodel.Recipe + +@Composable +fun Ingredients( + selectedRecipe: Recipe +) { + val ingredients = selectedRecipe.extendedIngredients + Column( + modifier = Modifier.padding(20.dp) + ) { + Text( + text = "Ingredients", + fontSize = 30.sp, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(20.dp)) + ingredients.forEach {ingredient -> + val quantity = if (ingredient.meta.isNotEmpty()) ingredient.meta[0] else "" + Row ( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp), + horizontalArrangement = Arrangement.SpaceBetween + ){ + Text( + text = "$quantity ${ingredient.name}", + color = Color.Gray + ) + Text( + text = "- $quantity ${ingredient.amount}", + color = Color.Gray + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt index 78df3de..3e6e4a4 100644 --- a/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt +++ b/app/src/main/java/com/example/cookbook/presentation/view/recipedetailsscreen/Instructions.kt @@ -18,7 +18,11 @@ import com.example.cookbook.presentation.viewmodel.RecipeDetailScreenViewModel fun Instructions( recipeDetailScreenViewModel: RecipeDetailScreenViewModel ) { - val selectedRecipe = recipeDetailScreenViewModel.selectedRecipe.collectAsState().value + val selectedRecipe = recipeDetailScreenViewModel + .selectedRecipe + .collectAsState() + .value + Column( modifier = Modifier.padding(20.dp) @@ -33,5 +37,21 @@ fun Instructions( text = selectedRecipe?.instructions.toString(), color = Color.Gray ) + Spacer(modifier = Modifier.height(20.dp)) + Text( + text = "Steps", + fontSize = 30.sp, + fontWeight = FontWeight.Bold + ) + val analyzedInstructions = selectedRecipe?.analyzedInstructions + analyzedInstructions?.forEach { analyzedInstruction -> + val steps = analyzedInstruction.steps + steps.forEach { step -> + Text( + text = step.step, + color = Color.Gray + ) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt index ffc66ef..3c17f0d 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/HomeScreenViewModel.kt @@ -24,6 +24,7 @@ class HomeScreenViewModel @Inject constructor( val popularItems: StateFlow> get() = _popularItems + fun getRandomRecipe(apiKey: String, number: Int) { _isLoading.value = true viewModelScope.launch(Dispatchers.IO) { @@ -32,11 +33,7 @@ class HomeScreenViewModel @Inject constructor( if (result.isSuccess) { val recipes = result.getOrNull()?.recipes ?: emptyList() _popularItems.value = recipes - } else { - // Handle error (you can expose this via another state or event) } - } catch (e: Exception) { - // Handle network or other errors } finally { _isLoading.value = false } diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt index 0eb4fed..372aaab 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/LogInScreenViewModel.kt @@ -1,12 +1,9 @@ package com.example.cookbook.presentation.viewmodel import android.content.Context -import android.util.Log -import android.widget.Toast import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.navigation.NavController import androidx.navigation.NavHostController import com.example.cookbook.utils.LogInResult import com.google.firebase.auth.FirebaseAuth @@ -18,13 +15,11 @@ class LogInScreenViewModel @Inject constructor( ) : ViewModel() { private val auth: FirebaseAuth = FirebaseAuth.getInstance() - private lateinit var navController: NavHostController private val _logInResult = MutableLiveData() val logInResult: LiveData = _logInResult - fun setNavController(navController: NavHostController) { this.navController = navController } diff --git a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt index 0823538..4b9a26d 100644 --- a/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt +++ b/app/src/main/java/com/example/cookbook/presentation/viewmodel/RecipeDetailScreenViewModel.kt @@ -1,12 +1,12 @@ package com.example.cookbook.presentation.viewmodel + import androidx.lifecycle.ViewModel import com.example.cookbook.data.models.randomrecipemodel.Recipe import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt b/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt deleted file mode 100644 index 16e76ae..0000000 --- a/app/src/main/java/com/example/cookbook/utils/JsonParsing.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.cookbook.utils - -import com.example.cookbook.data.models.randomrecipemodel.Recipe -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken - -fun parseRecipe(jsonString: String) : List { - val gson = Gson() - return gson.fromJson(jsonString, object : TypeToken>() {}.type) -} - -// Fetch the recipe in the viewmodel from the repository -// Parse that recipe -// and then use it using lazyColumn \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8d1393..a775cca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,6 +22,7 @@ shared-preferences = "1.1.0" lifecycle-compose = "2.7.0" runtime-livedata = "1.6.1" retrofit-adapter-coroutines = "2.6.0.pom" +swiperefresh = "0.27.0" @@ -54,6 +55,7 @@ activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref coil = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } sharedpreferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "shared-preferences" } +swipe-refresh = { group = "com.google.accompanist", name = "accompanist-swiperefresh", version.ref = "swiperefresh" } [plugins] From c05844d88974916744f02d78f7ab38f61ed00ff4 Mon Sep 17 00:00:00 2001 From: Rohanraj123 Date: Sat, 4 May 2024 13:47:09 +0530 Subject: [PATCH 6/6] Development day-6 branch --- .../com/example/cookbook/data/datasource/api/RetrofitApi.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt b/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt index 9e5c683..c2e4c0a 100644 --- a/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt +++ b/app/src/main/java/com/example/cookbook/data/datasource/api/RetrofitApi.kt @@ -21,4 +21,6 @@ interface RetrofitApi { @Query("apiKey") apiKey: String, @Query("number") number: Int ): Call + + @GET("complexSearch") } \ No newline at end of file