From a94169bf8817ce00de8b2361c0c084648618ec55 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 24 May 2026 14:12:33 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[nick/#81]=20mission/=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/AndroidManifest.xml | 2 +- .../{ui => presentation}/cart/CartScreen.kt | 8 +------ .../{ui => presentation}/home/HomeScreen.kt | 5 +---- .../{ => presentation/main}/MainActivity.kt | 21 +++++++------------ .../profile/ProfileScreen.kt | 2 +- .../purchase/PurchaseScreen.kt | 2 +- .../{ui => presentation}/theme/Color.kt | 2 +- .../{ui => presentation}/theme/Theme.kt | 3 +-- .../{ui => presentation}/theme/Type.kt | 2 +- .../{ui => presentation}/wish/WishScreen.kt | 2 +- 10 files changed, 17 insertions(+), 32 deletions(-) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/cart/CartScreen.kt (86%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/home/HomeScreen.kt (88%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ => presentation/main}/MainActivity.kt (87%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/profile/ProfileScreen.kt (84%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/purchase/PurchaseScreen.kt (84%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/theme/Color.kt (82%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/theme/Theme.kt (96%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/theme/Type.kt (94%) rename Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/{ui => presentation}/wish/WishScreen.kt (93%) diff --git a/Nick/Nike_compose/app/src/main/AndroidManifest.xml b/Nick/Nike_compose/app/src/main/AndroidManifest.xml index 43641432..ae9749b8 100644 --- a/Nick/Nike_compose/app/src/main/AndroidManifest.xml +++ b/Nick/Nike_compose/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:supportsRtl="true" android:theme="@style/Theme.Nike_compose"> diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/cart/CartScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt similarity index 86% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/cart/CartScreen.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt index 9e0c931e..85f85693 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/cart/CartScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt @@ -1,10 +1,8 @@ -package com.clone.nike_compose.ui.cart +package com.clone.nike_compose.presentation.ui.cart import androidx.compose.foundation.Image -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 @@ -21,11 +19,7 @@ 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 androidx.navigation.NavController -import androidx.navigation.compose.rememberNavController -import com.clone.nike_compose.AppDestination import com.clone.nike_compose.R -import com.clone.nike_compose.ui.home.HomeScreen @Preview(showBackground = true) @Composable diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/home/HomeScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt similarity index 88% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/home/HomeScreen.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt index 24d90d89..ebe89081 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/home/HomeScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.home +package com.clone.nike_compose.presentation.ui.home import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column @@ -6,17 +6,14 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.clone.nike_compose.R -import com.clone.nike_compose.ui.theme.Nike_composeTheme @Preview(showBackground = true) @Composable diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/MainActivity.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt similarity index 87% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/MainActivity.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt index fafdad29..577aa1f7 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/MainActivity.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt @@ -1,13 +1,10 @@ -package com.clone.nike_compose +package com.clone.nike_compose.presentation.main -import android.graphics.drawable.Drawable import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem @@ -15,23 +12,21 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.NavController -import androidx.navigation.NavHost import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.clone.nike_compose.ui.cart.CartScreen -import com.clone.nike_compose.ui.home.HomeScreen -import com.clone.nike_compose.ui.profile.ProfileScreen -import com.clone.nike_compose.ui.purchase.PurchaseScreen -import com.clone.nike_compose.ui.theme.Nike_composeTheme -import com.clone.nike_compose.ui.wish.WishScreen +import com.clone.nike_compose.R +import com.clone.nike_compose.presentation.ui.cart.CartScreen +import com.clone.nike_compose.presentation.ui.home.HomeScreen +import com.clone.nike_compose.presentation.ui.profile.ProfileScreen +import com.clone.nike_compose.presentation.ui.purchase.PurchaseScreen +import com.clone.nike_compose.presentation.ui.theme.Nike_composeTheme +import com.clone.nike_compose.presentation.ui.wish.WishScreen import kotlinx.serialization.Serializable -import kotlinx.serialization.Serializer class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/profile/ProfileScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt similarity index 84% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/profile/ProfileScreen.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt index 9b37eb20..1ce7d7d3 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/profile/ProfileScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.profile +package com.clone.nike_compose.presentation.ui.profile import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/purchase/PurchaseScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt similarity index 84% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/purchase/PurchaseScreen.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt index 5130419b..482dacf4 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/purchase/PurchaseScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.purchase +package com.clone.nike_compose.presentation.ui.purchase import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Color.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt similarity index 82% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Color.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt index b8151759..c347f86d 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Color.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.theme +package com.clone.nike_compose.presentation.ui.theme import androidx.compose.ui.graphics.Color diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Theme.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt similarity index 96% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Theme.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt index 0b6503a4..66b6a353 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Theme.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt @@ -1,6 +1,5 @@ -package com.clone.nike_compose.ui.theme +package com.clone.nike_compose.presentation.ui.theme -import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Type.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt similarity index 94% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Type.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt index dfcf104a..c6b1967a 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/theme/Type.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.theme +package com.clone.nike_compose.presentation.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/wish/WishScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt similarity index 93% rename from Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/wish/WishScreen.kt rename to Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt index 8133574f..c771a6e5 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/ui/wish/WishScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.ui.wish +package com.clone.nike_compose.presentation.ui.wish import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize From 1fedccf0009a11cdfea509ed0d6a7692f1780492 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 24 May 2026 16:31:52 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[nick/#81]=20mission/HomeScreen=20List=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/clone/nike_compose/core/data/Goods.kt | 11 ++ .../presentation/cart/CartScreen.kt | 2 +- .../presentation/detail/DetailScreen.kt | 21 +++ .../presentation/home/HomeScreen.kt | 153 ++++++++++++++++-- .../presentation/main/MainActivity.kt | 113 ++++++++++++- .../presentation/profile/ProfileScreen.kt | 11 +- .../presentation/purchase/PurchaseScreen.kt | 139 +++++++++++++++- .../nike_compose/presentation/theme/Color.kt | 2 +- .../nike_compose/presentation/theme/Theme.kt | 2 +- .../nike_compose/presentation/theme/Type.kt | 2 +- .../presentation/wish/WishScreen.kt | 2 +- 11 files changed, 423 insertions(+), 35 deletions(-) create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/data/Goods.kt create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/detail/DetailScreen.kt diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/data/Goods.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/data/Goods.kt new file mode 100644 index 00000000..1eaf0438 --- /dev/null +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/data/Goods.kt @@ -0,0 +1,11 @@ +package com.clone.nike_compose.core.data + +data class Goods( + val goodsId: Int, + val goodsImgResId: Int, + val goodsName: String, + val category: String, + val numberOfColour: String, + val goodsPrice: String, + var isWished: Boolean +) \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt index 85f85693..6435513a 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/cart/CartScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.presentation.ui.cart +package com.clone.nike_compose.presentation.cart import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/detail/DetailScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/detail/DetailScreen.kt new file mode 100644 index 00000000..3f01bd42 --- /dev/null +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/detail/DetailScreen.kt @@ -0,0 +1,21 @@ +package com.clone.nike_compose.presentation.detail + +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview + +@Preview(showBackground = true) +@Composable +fun PreviewDetailScreen() { + MaterialTheme { + DetailScreen() + } +} + +@Composable +fun DetailScreen( + modifier: Modifier = Modifier +) { + +} \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt index ebe89081..b7d30951 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/home/HomeScreen.kt @@ -1,50 +1,171 @@ -package com.clone.nike_compose.presentation.ui.home +package com.clone.nike_compose.presentation.home import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement 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.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.clone.nike_compose.R +import com.clone.nike_compose.core.data.Goods @Preview(showBackground = true) @Composable fun PreviewHomeScreen() { MaterialTheme { - HomeScreen() + val sampleGoods = listOf( + Goods( + goodsId = 1, + goodsName = "Nike Air Max", + goodsPrice = "199,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 2, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ) + ) + + HomeScreen(sampleGoods) + } +} + +@Composable +fun HomeScreen( + newGoodsList: List +) { + LazyColumn( + modifier = Modifier + .padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(40.dp) + ) { + item { + HomeHeader() + } + + item { + HomeBanner() + } + + item { + HomeGoodsRow(newGoodsList) + } } } @Composable -fun HomeScreen() { +fun HomeHeader() { Column( modifier = Modifier - .fillMaxSize() - .padding(16.dp) + .fillMaxWidth() + .padding( + start = 24.dp, + end = 24.dp, + top = 24.dp) ) { - Column( - modifier = Modifier - .padding(24.dp) - ) { - Text( - text = "Discover" - ) - Text("9월 4일 목요일") + Text( + text = "Discover", + fontSize = 28.sp + ) + + Text( + text = "9월 4일 목요일", + fontSize = 16.sp + ) + } +} + +@Composable +fun HomeBanner() { + Image( + painter = painterResource(id = R.drawable.image_home_banner), + contentDescription = "홈 배너", + modifier = Modifier + .fillMaxWidth() + .height(500.dp), + contentScale = ContentScale.Crop + ) +} + +@Composable +fun HomeGoodsRow( + newGoodsList: List +) { + Text( + text = "What's new?", + fontSize = 16.sp + ) + + Text( + text = "나이키 최신 상품", + fontSize = 28.sp + ) + + + LazyRow( + modifier = Modifier.padding(top = 22.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(newGoodsList) { goods -> + HomeGoodsItem(goods) } + } +} + + +@Composable +fun HomeGoodsItem( + goods: Goods +) { + Column( + modifier = Modifier.width(314.dp) + ) { Image( - painter = painterResource(id = R.drawable.image_home_banner), - contentDescription = "홈 배너", + painter = painterResource(goods.goodsImgResId), + contentDescription = goods.goodsName, modifier = Modifier .fillMaxWidth() - .height(500.dp) + .height(314.dp), + contentScale = ContentScale.Crop + ) + + Spacer(modifier = Modifier.height(20.dp)) + + Text( + text = goods.goodsName, + fontSize = 20.sp + ) + + Spacer(modifier = Modifier.height(16.dp)) + + Text( + text = goods.goodsPrice, + fontSize = 18.sp ) } } \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt index 577aa1f7..af851885 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt @@ -20,12 +20,13 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.clone.nike_compose.R -import com.clone.nike_compose.presentation.ui.cart.CartScreen -import com.clone.nike_compose.presentation.ui.home.HomeScreen -import com.clone.nike_compose.presentation.ui.profile.ProfileScreen -import com.clone.nike_compose.presentation.ui.purchase.PurchaseScreen -import com.clone.nike_compose.presentation.ui.theme.Nike_composeTheme -import com.clone.nike_compose.presentation.ui.wish.WishScreen +import com.clone.nike_compose.core.data.Goods +import com.clone.nike_compose.presentation.cart.CartScreen +import com.clone.nike_compose.presentation.home.HomeScreen +import com.clone.nike_compose.presentation.profile.ProfileScreen +import com.clone.nike_compose.presentation.purchase.PurchaseScreen +import com.clone.nike_compose.presentation.theme.Nike_composeTheme +import com.clone.nike_compose.presentation.wish.WishScreen import kotlinx.serialization.Serializable class MainActivity : ComponentActivity() { @@ -38,6 +39,102 @@ class MainActivity : ComponentActivity() { } } +val sampleNewGoods = listOf( + Goods( + goodsId = 1, + goodsName = "Nike Air Max", + goodsPrice = "199,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 2, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ) +) + +val sampleGoods = listOf( + Goods( + goodsId = 1, + goodsName = "Nike Air Max", + goodsPrice = "199,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 2, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 3, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 4, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 5, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 6, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 7, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 8, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ) +) + sealed interface AppDestination { @Serializable data object Home: AppDestination @@ -76,7 +173,7 @@ fun MainScreen() { modifier = Modifier.padding(padding) ) { composable { - HomeScreen() + HomeScreen(newGoodsList = sampleNewGoods) } composable { CartScreen(moveToPurchase = { navController.navigate(AppDestination.Purchase)}) @@ -88,7 +185,7 @@ fun MainScreen() { ProfileScreen() } composable { - PurchaseScreen() + PurchaseScreen(goodsList = sampleGoods) } } } diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt index 1ce7d7d3..77d1b1db 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt @@ -1,8 +1,14 @@ -package com.clone.nike_compose.presentation.ui.profile +package com.clone.nike_compose.presentation.profile +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.clone.nike_compose.core.data.Goods @Preview(showBackground = true) @Composable @@ -15,4 +21,5 @@ fun PreviewProfileScreen() { @Composable fun ProfileScreen() { -} \ No newline at end of file +} + diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt index 482dacf4..54368bc1 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt @@ -1,18 +1,149 @@ -package com.clone.nike_compose.presentation.ui.purchase +package com.clone.nike_compose.presentation.purchase +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.clone.nike_compose.R +import com.clone.nike_compose.core.data.Goods @Preview(showBackground = true) @Composable fun PreviewPurchaseScreen() { MaterialTheme { - PurchaseScreen() + PurchaseScreen(goodsList = sampleGoods) } } @Composable -fun PurchaseScreen() { +fun PurchaseScreen(goodsList: List) { + PurchaseGridList(goodsList) +} + +@Composable +fun PurchaseGridList(goodsList: List) { + LazyVerticalGrid( + columns = GridCells.Fixed(2), + modifier = Modifier.padding(7.dp) + ) { + items(goodsList) { goods -> + PurchaseGoodsItem(goods) + } + } +} + +@Composable +fun PurchaseGoodsItem(goods: Goods) { + Column { + Image( + painter = painterResource(goods.goodsImgResId), + contentDescription = goods.goodsName, + modifier = Modifier.size(184.dp) + ) + Column( + verticalArrangement = Arrangement.spacedBy(5.dp) + ) { + Text( + text = goods.goodsName + ) + + Text( + text = goods.category + ) + + Text( + text = goods.numberOfColour + ) + + Text( + text = goods.goodsPrice + ) + } + } +} -} \ No newline at end of file +val sampleGoods = listOf( + Goods( + goodsId = 1, + goodsName = "Nike Air Max", + goodsPrice = "199,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 2, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 3, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 4, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 5, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 6, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 7, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 8, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ) +) \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt index c347f86d..5beeb27c 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Color.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.presentation.ui.theme +package com.clone.nike_compose.presentation.theme import androidx.compose.ui.graphics.Color diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt index 66b6a353..2e77cb31 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.presentation.ui.theme +package com.clone.nike_compose.presentation.theme import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt index c6b1967a..2658e18f 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/theme/Type.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.presentation.ui.theme +package com.clone.nike_compose.presentation.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt index c771a6e5..dc6727bb 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt @@ -1,4 +1,4 @@ -package com.clone.nike_compose.presentation.ui.wish +package com.clone.nike_compose.presentation.wish import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize From 13b20ccc0bea5f3a62a41def3f6f21c7df49459c Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 24 May 2026 17:15:22 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[nick/#81]=20mission/PurchaseScreen=20List?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/purchase/PurchaseScreen.kt | 94 ++++++++++++++++--- 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt index 54368bc1..0acf8e3b 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt @@ -1,8 +1,12 @@ package com.clone.nike_compose.presentation.purchase import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.grid.GridCells @@ -11,10 +15,16 @@ import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +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.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.clone.nike_compose.R import com.clone.nike_compose.core.data.Goods @@ -28,46 +38,102 @@ fun PreviewPurchaseScreen() { @Composable fun PurchaseScreen(goodsList: List) { - PurchaseGridList(goodsList) + var purchaseGoodsList by remember { mutableStateOf(goodsList) } + + PurchaseGridList( + goodsList = purchaseGoodsList, + wishOnClick = { goodsId -> + + purchaseGoodsList = + purchaseGoodsList.map { goods -> + + if (goods.goodsId == goodsId) { + + goods.copy( + isWished = !goods.isWished + ) + + } else { + goods + } + } + } + ) } @Composable -fun PurchaseGridList(goodsList: List) { +fun PurchaseGridList( + goodsList: List, + wishOnClick: (Int) -> Unit, +) { LazyVerticalGrid( columns = GridCells.Fixed(2), modifier = Modifier.padding(7.dp) ) { items(goodsList) { goods -> - PurchaseGoodsItem(goods) + PurchaseGoodsItem( + goods, + wishOnClick + ) } } } @Composable -fun PurchaseGoodsItem(goods: Goods) { +fun PurchaseGoodsItem( + goods: Goods, + wishOnClick: (Int) -> Unit) { Column { - Image( - painter = painterResource(goods.goodsImgResId), - contentDescription = goods.goodsName, - modifier = Modifier.size(184.dp) - ) + Box { + Image( + painter = painterResource(goods.goodsImgResId), + contentDescription = goods.goodsName, + modifier = Modifier.size(184.dp) + ) + Image( + painter = painterResource( + if(goods.isWished) { + R.drawable.icon_wish_on + } else { + R.drawable.icon_wish_off + }), + contentDescription = "위시 버튼", + modifier = Modifier + .align(Alignment.TopEnd) + .padding(12.dp) + .size(34.dp) + .clickable { + wishOnClick(goods.goodsId) + } + ) + } + Column( - verticalArrangement = Arrangement.spacedBy(5.dp) + verticalArrangement = Arrangement.spacedBy(5.dp), + modifier = Modifier.padding(horizontal = 14.dp) ) { Text( - text = goods.goodsName + text = goods.goodsName, + fontSize = 14.sp ) Text( - text = goods.category + text = goods.category, + fontSize = 14.sp ) Text( - text = goods.numberOfColour + text = goods.numberOfColour, + fontSize = 14.sp ) Text( - text = goods.goodsPrice + text = goods.goodsPrice, + fontSize = 14.sp + ) + + Spacer( + modifier = Modifier.height(41.dp) ) } } From b3ebaaf009888e3cfb45fc57e881c3497866d4a6 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 24 May 2026 17:35:31 +0900 Subject: [PATCH 4/7] =?UTF-8?q?[nick/#81]=20mission/WishScreen=20List=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/main/MainActivity.kt | 15 ++- .../presentation/wish/WishScreen.kt | 114 +++++++++++++++++- 2 files changed, 122 insertions(+), 7 deletions(-) diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt index af851885..fa2ad583 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt @@ -11,6 +11,11 @@ import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview @@ -159,6 +164,10 @@ fun PreviewMainScreen() @Composable fun MainScreen() { + var purchaseGoodsList by remember { mutableStateOf(sampleGoods) } + var homeNewGoodsList by remember { mutableStateOf(sampleNewGoods) } + var wishGoodsList by remember { mutableStateOf(sampleNewGoods) } + val navController = rememberNavController() Scaffold( @@ -173,19 +182,19 @@ fun MainScreen() { modifier = Modifier.padding(padding) ) { composable { - HomeScreen(newGoodsList = sampleNewGoods) + HomeScreen(newGoodsList = homeNewGoodsList) } composable { CartScreen(moveToPurchase = { navController.navigate(AppDestination.Purchase)}) } composable { - WishScreen() + WishScreen(wishGoodsList = wishGoodsList) } composable { ProfileScreen() } composable { - PurchaseScreen(goodsList = sampleGoods) + PurchaseScreen(goodsList = purchaseGoodsList) } } } diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt index dc6727bb..310eb49a 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt @@ -1,32 +1,138 @@ package com.clone.nike_compose.presentation.wish +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.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.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.clone.nike_compose.R +import com.clone.nike_compose.core.data.Goods +import com.clone.nike_compose.presentation.purchase.PurchaseGoodsItem @Preview(showBackground = true) @Composable fun PreviewWishScreen() { MaterialTheme { - WishScreen() + val sampleGoods = listOf( + Goods( + goodsId = 1, + goodsName = "Nike Air Max", + goodsPrice = "199,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ), + Goods( + goodsId = 2, + goodsName = "Nike Jordan", + goodsPrice = "239,000원", + category = "", + numberOfColour = "", + isWished = false, + goodsImgResId = R.drawable.image_home_banner + ) + ) + + WishScreen(sampleGoods) } } @Composable -fun WishScreen() { +fun WishScreen(wishGoodsList: List) { Column( modifier = Modifier .fillMaxSize() - .padding(horizontal = 24.dp, vertical = 44.dp) + .padding(vertical = 44.dp), + verticalArrangement = Arrangement.spacedBy(40.dp) ) { Text( - text = "위시리스트" + text = "위시리스트", + fontSize = 28.sp, + modifier = Modifier.padding(horizontal = 24.dp) ) + + WishGridList(wishGoodsList) + } +} + +@Composable +fun WishGridList( + wishGoodsList: List +) { + LazyVerticalGrid( + columns = GridCells.Fixed(2), + modifier = Modifier.padding(7.dp) + ) { + items(wishGoodsList) { goods -> + WishGoodsItem(goods) + } + } +} + +@Composable +fun WishGoodsItem(goods: Goods) { + Column() { + Box { + Image( + painter = painterResource(goods.goodsImgResId), + contentDescription = goods.goodsName, + modifier = Modifier.size(184.dp) + ) + Image( + painter = painterResource(R.drawable.icon_wish_on), + contentDescription = "위시 버튼", + modifier = Modifier + .align(Alignment.TopEnd) + .padding(12.dp) + .size(34.dp) + ) + } + + Column( + verticalArrangement = Arrangement.spacedBy(5.dp), + modifier = Modifier.padding(horizontal = 14.dp) + ) { + Text( + text = goods.goodsName, + fontSize = 14.sp + ) + + Text( + text = goods.category, + fontSize = 14.sp + ) + + Text( + text = goods.numberOfColour, + fontSize = 14.sp + ) + + Text( + text = goods.goodsPrice, + fontSize = 14.sp + ) + + Spacer( + modifier = Modifier.height(41.dp) + ) + } } } \ No newline at end of file From 26db07391cb5ffcc21020c755d7ca6ed62446621 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 24 May 2026 23:30:24 +0900 Subject: [PATCH 5/7] =?UTF-8?q?[nick/#81]=20mission/8=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/main/MainActivity.kt | 67 ++++++++++-------- .../presentation/purchase/PurchaseScreen.kt | 29 +++----- .../presentation/wish/WishScreen.kt | 2 +- .../main/res/drawable/image_jordan_enike.png | Bin 0 -> 26135 bytes 4 files changed, 48 insertions(+), 50 deletions(-) create mode 100644 Nick/Nike_compose/app/src/main/res/drawable/image_jordan_enike.png diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt index fa2ad583..6705de8c 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/main/MainActivity.kt @@ -47,60 +47,60 @@ class MainActivity : ComponentActivity() { val sampleNewGoods = listOf( Goods( goodsId = 1, - goodsName = "Nike Air Max", - goodsPrice = "199,000원", + goodsName = "Jordan XXXVI", + goodsPrice = "US$185", category = "", numberOfColour = "", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_jordan_xxxvi ), Goods( goodsId = 2, - goodsName = "Nike Jordan", - goodsPrice = "239,000원", + goodsName = "Air Force 1", + goodsPrice = "US$115", category = "", numberOfColour = "", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_air_force_1 ) ) val sampleGoods = listOf( Goods( goodsId = 1, - goodsName = "Nike Air Max", - goodsPrice = "199,000원", - category = "", - numberOfColour = "", + goodsName = "Nike Everyday Plus Cushioned", + goodsPrice = "US$10", + category = "Training Ankle Socks (6 Pairs)", + numberOfColour = "5 Colours", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_nike_everyday_plus_cushioned ), Goods( goodsId = 2, - goodsName = "Nike Jordan", - goodsPrice = "239,000원", - category = "", - numberOfColour = "", + goodsName = "Jordan ENike Air Force 1 '07ssentials", + goodsPrice = "US$115", + category = "Men's shoes", + numberOfColour = "2 Colours", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_jordan_enike ), Goods( goodsId = 3, - goodsName = "Nike Jordan", - goodsPrice = "239,000원", - category = "", - numberOfColour = "", + goodsName = "Jordan XXXVI", + goodsPrice = "US$185", + category = "Men's shoes", + numberOfColour = "1 Colour", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_jordan_xxxvi ), Goods( goodsId = 4, - goodsName = "Nike Jordan", - goodsPrice = "239,000원", - category = "", - numberOfColour = "", + goodsName = "Air Force 1", + goodsPrice = "US$115", + category = "Men's shoes", + numberOfColour = "2 Colours", isWished = false, - goodsImgResId = R.drawable.image_home_banner + goodsImgResId = R.drawable.image_air_force_1 ), Goods( goodsId = 5, @@ -166,7 +166,7 @@ fun PreviewMainScreen() fun MainScreen() { var purchaseGoodsList by remember { mutableStateOf(sampleGoods) } var homeNewGoodsList by remember { mutableStateOf(sampleNewGoods) } - var wishGoodsList by remember { mutableStateOf(sampleNewGoods) } + val wishGoodsList = purchaseGoodsList.filter { it.isWished } val navController = rememberNavController() @@ -194,7 +194,18 @@ fun MainScreen() { ProfileScreen() } composable { - PurchaseScreen(goodsList = purchaseGoodsList) + PurchaseScreen( + goodsList = purchaseGoodsList, + wishOnClick = { goodsId -> + purchaseGoodsList = purchaseGoodsList.map { goods -> + if (goods.goodsId == goodsId) { + goods.copy(isWished = !goods.isWished) + } else { + goods + } + } + } + ) } } } diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt index 0acf8e3b..423381a9 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/purchase/PurchaseScreen.kt @@ -32,32 +32,19 @@ import com.clone.nike_compose.core.data.Goods @Composable fun PreviewPurchaseScreen() { MaterialTheme { - PurchaseScreen(goodsList = sampleGoods) + PurchaseScreen( + goodsList = sampleGoods, + wishOnClick = {}) } } @Composable -fun PurchaseScreen(goodsList: List) { - var purchaseGoodsList by remember { mutableStateOf(goodsList) } - +fun PurchaseScreen( + goodsList: List, + wishOnClick: (Int) -> Unit) { PurchaseGridList( - goodsList = purchaseGoodsList, - wishOnClick = { goodsId -> - - purchaseGoodsList = - purchaseGoodsList.map { goods -> - - if (goods.goodsId == goodsId) { - - goods.copy( - isWished = !goods.isWished - ) - - } else { - goods - } - } - } + goodsList = goodsList, + wishOnClick = wishOnClick ) } diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt index 310eb49a..c272e8cd 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/wish/WishScreen.kt @@ -89,7 +89,7 @@ fun WishGridList( @Composable fun WishGoodsItem(goods: Goods) { - Column() { + Column { Box { Image( painter = painterResource(goods.goodsImgResId), diff --git a/Nick/Nike_compose/app/src/main/res/drawable/image_jordan_enike.png b/Nick/Nike_compose/app/src/main/res/drawable/image_jordan_enike.png new file mode 100644 index 0000000000000000000000000000000000000000..fc41659b7b2d0c047dea0dfc6b0a5d210ac94bc2 GIT binary patch literal 26135 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 UrpDZ_dt2T> Date: Sun, 31 May 2026 23:43:54 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[nick/#81]=20mission/9=EC=A3=BC=EC=B0=A8=20?= =?UTF-8?q?=EB=AF=B8=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Nick/Nike_compose/app/build.gradle.kts | 3 + .../app/src/main/AndroidManifest.xml | 3 +- .../nike_compose/core/api/NetworkModule.kt | 14 ++ .../clone/nike_compose/core/api/ReqresApi.kt | 29 +++ .../core/repository/ProfileRepository.kt | 15 ++ .../presentation/profile/ProfileScreen.kt | 213 +++++++++++++++++- .../presentation/profile/ProfileViewModel.kt | 55 +++++ 7 files changed, 327 insertions(+), 5 deletions(-) create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/api/NetworkModule.kt create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/api/ReqresApi.kt create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/repository/ProfileRepository.kt create mode 100644 Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileViewModel.kt diff --git a/Nick/Nike_compose/app/build.gradle.kts b/Nick/Nike_compose/app/build.gradle.kts index 104965f2..320b2846 100644 --- a/Nick/Nike_compose/app/build.gradle.kts +++ b/Nick/Nike_compose/app/build.gradle.kts @@ -58,4 +58,7 @@ dependencies { debugImplementation(libs.androidx.compose.ui.test.manifest) implementation("androidx.navigation:navigation-compose:2.9.8") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0") + implementation("io.coil-kt:coil-compose:2.7.0") + implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation("com.squareup.retrofit2:converter-gson:2.11.0") } \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/AndroidManifest.xml b/Nick/Nike_compose/app/src/main/AndroidManifest.xml index ae9749b8..5082e780 100644 --- a/Nick/Nike_compose/app/src/main/AndroidManifest.xml +++ b/Nick/Nike_compose/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + + +) + +data class UserDto( + val id: Int, + val email: String, + val first_name: String, + val last_name: String, + val avatar: String +) + +interface ReqresApi { + @GET("api/users") + suspend fun getUsers( + @Query("page") page: Int = 1, + @Header("x-api-key") apiKey: String + ): ReqresUsersResponse +} diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/repository/ProfileRepository.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/repository/ProfileRepository.kt new file mode 100644 index 00000000..c35e74ce --- /dev/null +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/core/repository/ProfileRepository.kt @@ -0,0 +1,15 @@ +package com.clone.nike_compose.core.repository + +import com.clone.nike_compose.core.api.ReqresApi +import com.clone.nike_compose.core.api.UserDto + +class ProfileRepository( + private val api: ReqresApi +) { + suspend fun loadUsers(): List { + return api.getUsers( + page = 1, + apiKey = "reqres_08962a9022be4a3499d4dbe5e1bbc482" + ).data + } +} \ No newline at end of file diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt index 77d1b1db..fc1b2c7d 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt @@ -1,25 +1,230 @@ package com.clone.nike_compose.presentation.profile +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.PaddingValues +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.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.clone.nike_compose.core.data.Goods +import androidx.lifecycle.viewmodel.compose.viewModel +import coil.compose.AsyncImage +import com.clone.nike_compose.R @Preview(showBackground = true) @Composable fun PreviewProfileScreen() { MaterialTheme { - ProfileScreen() + ProfileScreenContent( + profileName = "George Bluth", + profileAvatar = "https://reqres.in/img/faces/1-image.jpg", + following = listOf( + "https://reqres.in/img/faces/2-image.jpg", + "https://reqres.in/img/faces/3-image.jpg", + "https://reqres.in/img/faces/4-image.jpg", + "https://reqres.in/img/faces/5-image.jpg" + ) + ) } } @Composable fun ProfileScreen() { + val vm: ProfileViewModel = viewModel() + val state by vm.uiState.collectAsState() + val profileName = state.profileUser?.let { "${it.first_name} ${it.last_name}" } ?: "닉네임" + val profileAvatar = state.profileUser?.avatar + val followingAvatars = state.following.map { it.avatar } + + ProfileScreenContent( + profileName = profileName, + profileAvatar = profileAvatar, + following = followingAvatars + ) +} + +@Composable +private fun ProfileScreenContent( + profileName: String, + profileAvatar: String?, + following: List +) { + Column( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFFF3F3F3)) + ) { + Surface( + modifier = Modifier.fillMaxWidth(), + color = Color.White + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(vertical = 20.dp) + ) { + if (!profileAvatar.isNullOrBlank()) { + AsyncImage( + model = profileAvatar, + contentDescription = "프로필", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(86.dp) + .clip(CircleShape) + ) + } else { + Box( + modifier = Modifier + .size(86.dp) + .clip(CircleShape) + .background(Color(0xFFD0D0D0)) + ) + } + + Spacer(Modifier.height(14.dp)) + Text( + text = profileName, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + Spacer(Modifier.height(14.dp)) + + OutlinedButton( + onClick = {}, + shape = RoundedCornerShape(28.dp), + colors = ButtonDefaults.outlinedButtonColors(contentColor = Color.Black) + ) { + Text("프로필 수정") + } + + Spacer(Modifier.height(18.dp)) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + MidIcon("주문", R.drawable.ic_archive) + MidIcon("패스", R.drawable.ic_identificationcard) + MidIcon("이벤트", R.drawable.ic_calendarblank) + MidIcon("설정", R.drawable.ic_gear) + } + } + } + + Spacer(Modifier.height(8.dp)) + + Surface(color = Color.White, modifier = Modifier.fillMaxWidth()) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text("나이키 멤버 혜택", fontWeight = FontWeight.SemiBold) + Text("0개 사용 가능", color = Color.Gray, style = MaterialTheme.typography.bodySmall) + } + Spacer(Modifier.weight(1f)) + Icon( + painter = painterResource(id = R.drawable.ic_arrow_right), + contentDescription = "right arrow", + modifier = Modifier.size(15.dp) + ) + } + } + + Spacer(Modifier.height(8.dp)) + + Surface(color = Color.White, modifier = Modifier.fillMaxWidth()) { + Column(modifier = Modifier.padding(vertical = 14.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text("팔로잉 (${following.size})", fontWeight = FontWeight.SemiBold) + Spacer(Modifier.weight(1f)) + Text("편집", color = Color.Gray, style = MaterialTheme.typography.bodySmall) + } + + Spacer(Modifier.height(12.dp)) + + LazyRow( + modifier = Modifier.fillMaxWidth(), + contentPadding = PaddingValues(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + items(following) { avatarUrl -> + AsyncImage( + model = avatarUrl, + contentDescription = "following", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(width = 82.dp, height = 82.dp) + .clip(RoundedCornerShape(2.dp)) + .background(Color(0xFFD0D0D0)) + ) + } + } + + } + } + + Surface(color = Color.White, modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier.padding(vertical = 14.dp), + verticalArrangement = Arrangement.Bottom) { + Text( + text = "회원 가입일: 2025년 9월", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + } + } + } +} + +@Composable +private fun MidIcon(label: String, iconRes: Int) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Icon( + painter = painterResource(id = iconRes), + contentDescription = label, + tint = Color(0xFF9A9A9A), + modifier = Modifier.size(20.dp) + ) + Spacer(Modifier.height(6.dp)) + Text(label, style = MaterialTheme.typography.bodySmall) + } } diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileViewModel.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileViewModel.kt new file mode 100644 index 00000000..e34bd4d2 --- /dev/null +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileViewModel.kt @@ -0,0 +1,55 @@ +package com.clone.nike_compose.presentation.profile + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.clone.nike_compose.core.api.NetworkModule +import com.clone.nike_compose.core.api.UserDto +import com.clone.nike_compose.core.repository.ProfileRepository +import kotlinx.coroutines.launch +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update + +data class ProfileUiState( + val isLoading: Boolean = true, + val profileUser: UserDto? = null, // id=1 + val following: List = emptyList(), + val error: String? = null +) + +class ProfileViewModel : ViewModel() { + private val repo = ProfileRepository(NetworkModule.api) + + private val _uiState = MutableStateFlow(ProfileUiState()) + val uiState: StateFlow = _uiState + + init { + load() + } + + private fun load() { + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true, error = null) } + runCatching { repo.loadUsers() } + .onSuccess { users -> + val p = users.firstOrNull { it.id == 1 } + val f = users.filter { it.id != 1 } + _uiState.update { + it.copy( + isLoading = false, + profileUser = p, + following = f + ) + } + } + .onFailure { e -> + _uiState.update { + it.copy( + isLoading = false, + error = e.message ?: "불러오기 실패" + ) + } + } + } + } +} \ No newline at end of file From fb4b67120a6fb2e42279a5eb7c43bb2b9b5b12c1 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 31 May 2026 23:59:10 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[nick#81]=20mission/horizontalPager=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/profile/ProfileScreen.kt | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt index fc1b2c7d..8506d8bd 100644 --- a/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt +++ b/Nick/Nike_compose/app/src/main/java/com/clone/nike_compose/presentation/profile/ProfileScreen.kt @@ -14,6 +14,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.PageSize +import androidx.compose.foundation.pager.PagerState +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonDefaults @@ -178,24 +182,31 @@ private fun ProfileScreenContent( Spacer(Modifier.height(12.dp)) - LazyRow( + val pagerState = rememberPagerState( + initialPage = 0, + pageCount = { following.size } + ) + + HorizontalPager( + state = pagerState, modifier = Modifier.fillMaxWidth(), contentPadding = PaddingValues(horizontal = 16.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - items(following) { avatarUrl -> - AsyncImage( - model = avatarUrl, - contentDescription = "following", - contentScale = ContentScale.Crop, - modifier = Modifier - .size(width = 82.dp, height = 82.dp) - .clip(RoundedCornerShape(2.dp)) - .background(Color(0xFFD0D0D0)) - ) - } + pageSpacing = 8.dp, + pageSize = PageSize.Fixed(82.dp) + ) { page -> + val avatarUrl = following[page] + AsyncImage( + model = avatarUrl, + contentDescription = "following", + contentScale = ContentScale.Crop, + modifier = Modifier + .size(82.dp) + .clip(RoundedCornerShape(2.dp)) + .background(Color(0xFFD0D0D0)) + ) } + } }