-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature/#52 mypage followlist #65
Closed
Closed
Changes from 8 commits
Commits
Show all changes
33 commits
Select commit
Hold shift + click to select a range
8369831
[feat] #52 add large, medium button
seohee0925 3e3da7f
[mod] #52 modify corner radius
seohee0925 506c415
[feat] #52 custom item
seohee0925 1083f43
[feat] #52 mypage followlist
seohee0925 e8a000e
[chore] #52 ktlint format
seohee0925 09d95f6
[mod] #52 delete preview
seohee0925 cbe8690
[mod] #52 delete import
seohee0925 2289fec
[mod] #52 resolve name conflict
seohee0925 b2ce561
[add] #55 add Icon
seohee0925 e9d9421
[mod] #55 change to vector asset
seohee0925 623b09e
[add] #56 add bubble graphic Typography
nagaeng 9a84322
[chore] #56 ktlintformat (for add bubble graphic typo)
nagaeng d4289e2
add: add infinite scroll
lsakee f11075a
add: launched effect with lifecycle
lsakee b8da2b8
design: add component small text field
lsakee 2e048ce
misc: kotlin format & reorder the parameters
lsakee 0624c2d
design: add chip button component
lsakee 49d6fd6
feat: custom click able
lsakee cf74710
feat: apply chip button custom clickable
lsakee 5c341d6
[add] #47 add black alpha color
Sangwook123 bfa1dc7
[add] #47 add graphic asset resource
Sangwook123 d0c31dd
[feat] #47 feat recordy location badge
Sangwook123 865ebd2
[feat] #47 feat recordy dialog
Sangwook123 41a66eb
[feat] #47 recordy video thumbnail
Sangwook123 99ce8b3
[feat] #47 recordy snackbar
Sangwook123 7f491e3
[feat] #47 shadow icon
Sangwook123 640f724
[feat] #47 recordy video text
Sangwook123 2ae2b1f
[feat] #47 main navigation tab
Sangwook123 5934950
[feat] #47 video screen example code
Sangwook123 c19179a
[feat] #47 home screen example code
Sangwook123 8268879
[feat] #52 add large, medium button
seohee0925 bbd80b2
[chore] #52 ktlint format
seohee0925 5c83353
[mod] #52 resolve name conflict
seohee0925 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
55 changes: 55 additions & 0 deletions
55
core/designsystem/src/main/java/com/record/designsystem/component/button/FollowButton.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package com.record.designsystem.component.button | ||
|
||
import androidx.compose.foundation.layout.PaddingValues | ||
import androidx.compose.foundation.shape.RoundedCornerShape | ||
import androidx.compose.material3.Button | ||
import androidx.compose.material3.ButtonDefaults | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.ui.graphics.Color | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import com.record.designsystem.theme.RecordyTheme | ||
|
||
@Composable | ||
fun FollowButton( | ||
isFollowing: Boolean, | ||
onClick: () -> Unit, | ||
) { | ||
val colors = getButtonAndTextColor(isFollowing) | ||
|
||
Button( | ||
onClick = onClick, | ||
colors = ButtonDefaults.buttonColors( | ||
containerColor = colors.first, | ||
), | ||
shape = RoundedCornerShape(8.dp), | ||
contentPadding = PaddingValues(horizontal = 20.dp, vertical = 8.dp), | ||
) { | ||
Text( | ||
text = if (isFollowing) "ํ๋ก์" else "ํ๋ก์ฐ", | ||
color = colors.second, | ||
style = RecordyTheme.typography.button2, | ||
) | ||
} | ||
} | ||
|
||
@Composable | ||
fun getButtonAndTextColor(isFollowed: Boolean): Pair<Color, Color> { | ||
return if (isFollowed) { | ||
Pair(RecordyTheme.colors.gray08, RecordyTheme.colors.white) | ||
} else { | ||
Pair(RecordyTheme.colors.white, RecordyTheme.colors.gray08) | ||
} | ||
} | ||
Comment on lines
+38
to
+44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ํ ์คํธ์ ๋ฒํผ์ ์ปฌ๋ฌ๋ฅผ ํ๋๋ก Pair ๋ฅผ ํ์ฉํด์ ๋ฐ๋๊ฑด ์๊ฐ ๋ชปํด๋ดค๋๋ฐ ์ ์ดํด๋ณด๊ณ ๊ฐ์ |
||
|
||
@Preview(showBackground = true) | ||
@Composable | ||
fun FollowButtonPreview() { | ||
RecordyTheme { | ||
FollowButton( | ||
isFollowing = false, | ||
onClick = {}, | ||
) | ||
} | ||
} |
21 changes: 12 additions & 9 deletions
21
core/designsystem/src/main/java/com/record/designsystem/component/button/RecordyButton.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,42 +1,45 @@ | ||
package com.record.designsystem.component.button | ||
|
||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.shape.RoundedCornerShape | ||
import androidx.compose.material3.Button | ||
import androidx.compose.material3.ButtonDefaults | ||
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.TextStyle | ||
import androidx.compose.ui.unit.Dp | ||
import androidx.compose.ui.unit.dp | ||
import com.record.designsystem.theme.RecordyTheme | ||
|
||
@Composable | ||
fun RecordyButton( | ||
text: String, | ||
containerColor: Color = RecordyTheme.colors.main, | ||
contentColor: Color = RecordyTheme.colors.gray09, | ||
textStyle: TextStyle = RecordyTheme.typography.button1, | ||
cornerShape: Dp = 12.dp, | ||
enabled: Boolean, | ||
onClick: () -> Unit, | ||
modifier: Modifier = Modifier, | ||
) { | ||
Button( | ||
onClick = onClick, | ||
enabled = enabled, | ||
|
||
colors = ButtonDefaults.buttonColors( | ||
containerColor = RecordyTheme.colors.main, | ||
contentColor = RecordyTheme.colors.gray09, | ||
containerColor = containerColor, | ||
contentColor = contentColor, | ||
disabledContainerColor = RecordyTheme.colors.gray08, | ||
disabledContentColor = RecordyTheme.colors.gray04, | ||
), | ||
|
||
shape = RoundedCornerShape(12.dp), | ||
shape = RoundedCornerShape(cornerShape), | ||
modifier = modifier | ||
.fillMaxWidth() | ||
.padding(horizontal = 16.dp), | ||
.fillMaxWidth(), | ||
) { | ||
Text( | ||
text = text, | ||
style = RecordyTheme.typography.button1, | ||
style = textStyle, | ||
) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.record.model | ||
|
||
data class UserData( | ||
val id: Int, | ||
val profileImage: String, | ||
val name: String, | ||
val isFollowing: Boolean, | ||
) |
78 changes: 78 additions & 0 deletions
78
feature/mypage/src/main/java/com/record/mypage/FollowScreen.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
package com.record.mypage | ||
|
||
import android.util.Log | ||
import androidx.compose.foundation.background | ||
import androidx.compose.foundation.layout.Box | ||
import androidx.compose.foundation.layout.PaddingValues | ||
import androidx.compose.foundation.layout.fillMaxSize | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.lazy.LazyColumn | ||
import androidx.compose.foundation.lazy.items | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.runtime.LaunchedEffect | ||
import androidx.compose.runtime.getValue | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.hilt.navigation.compose.hiltViewModel | ||
import androidx.lifecycle.compose.collectAsStateWithLifecycle | ||
import com.record.designsystem.theme.RecordyTheme | ||
import com.record.model.UserData | ||
import kotlinx.coroutines.flow.collectLatest | ||
|
||
@Composable | ||
fun FollowRoute( | ||
padding: PaddingValues, | ||
modifier: Modifier = Modifier, | ||
viewModel: FollowViewModel = hiltViewModel(), | ||
) { | ||
val uiState by viewModel.uiState.collectAsStateWithLifecycle() | ||
|
||
LaunchedEffect(Unit) { | ||
viewModel.sideEffect.collectLatest { sideEffect -> | ||
when (sideEffect) { | ||
is FollowSideEffect.Following -> { | ||
Log.d("FollowRoute", "$sideEffect") | ||
} | ||
|
||
is FollowSideEffect.UnFollowing -> { | ||
Log.d("FollowRoute", "$sideEffect") | ||
} | ||
} | ||
} | ||
} | ||
|
||
Box( | ||
modifier = modifier | ||
.fillMaxSize() | ||
.background(RecordyTheme.colors.background) | ||
.padding(padding), | ||
) { | ||
FollowScreen( | ||
state = uiState, | ||
onClick = { user -> viewModel.toggleFollow(user) }, | ||
) | ||
} | ||
} | ||
|
||
@Composable | ||
fun FollowScreen(state: FollowState, onClick: (UserData) -> Unit) { | ||
LazyColumn( | ||
modifier = Modifier.fillMaxSize(), | ||
) { | ||
items(state.userList) { user -> | ||
UserDataContainer( | ||
user = user, | ||
onClick = onClick, | ||
) | ||
} | ||
} | ||
} | ||
|
||
@Preview(showBackground = true) | ||
@Composable | ||
private fun PreviewFollowScreen() { | ||
val sampleState = FollowState() | ||
RecordyTheme { | ||
FollowScreen(state = sampleState, onClick = {}) | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
feature/mypage/src/main/java/com/record/mypage/FollowState.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package com.record.mypage | ||
|
||
import com.record.model.UserData | ||
import com.record.ui.base.SideEffect | ||
import com.record.ui.base.UiState | ||
|
||
data class FollowState( | ||
val userList: List<UserData> = listOf( | ||
UserData(id = 1, profileImage = "https://via.placeholder.com/150", name = "John Doe", isFollowing = false), | ||
UserData(id = 2, profileImage = "https://via.placeholder.com/150", name = "Jane Smith", isFollowing = false), | ||
UserData(id = 3, profileImage = "https://via.placeholder.com/150", name = "Alice Johnson", isFollowing = false), | ||
UserData(id = 4, profileImage = "https://via.placeholder.com/150", name = "Bob Brown", isFollowing = false), | ||
), | ||
) : UiState | ||
|
||
sealed interface FollowSideEffect : SideEffect { | ||
data object Following : FollowSideEffect | ||
data object UnFollowing : FollowSideEffect | ||
} |
33 changes: 33 additions & 0 deletions
33
feature/mypage/src/main/java/com/record/mypage/FollowViewModel.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package com.record.mypage | ||
|
||
import androidx.lifecycle.viewModelScope | ||
import com.record.model.UserData | ||
import com.record.ui.base.BaseViewModel | ||
import dagger.hilt.android.lifecycle.HiltViewModel | ||
import kotlinx.coroutines.launch | ||
import javax.inject.Inject | ||
|
||
@HiltViewModel | ||
class FollowViewModel @Inject constructor() : BaseViewModel<FollowState, FollowSideEffect>(FollowState()) { | ||
|
||
fun toggleFollow(user: UserData) { | ||
intent { | ||
val newList = uiState.value.userList.toMutableList() | ||
val index = newList.indexOfFirst { it.id == user.id } | ||
if (index >= 0) { | ||
val updatedUser = newList[index].copy(isFollowing = !newList[index].isFollowing) | ||
newList[index] = updatedUser | ||
} | ||
|
||
copy(userList = newList) | ||
} | ||
|
||
viewModelScope.launch { | ||
if (user.isFollowing) { | ||
postSideEffect(FollowSideEffect.Following) | ||
} else { | ||
postSideEffect(FollowSideEffect.UnFollowing) | ||
} | ||
} | ||
} | ||
} |
66 changes: 66 additions & 0 deletions
66
feature/mypage/src/main/java/com/record/mypage/UserDataContainer.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
package com.record.mypage | ||
|
||
import androidx.compose.foundation.Image | ||
import androidx.compose.foundation.background | ||
import androidx.compose.foundation.layout.Row | ||
import androidx.compose.foundation.layout.Spacer | ||
import androidx.compose.foundation.layout.fillMaxWidth | ||
import androidx.compose.foundation.layout.padding | ||
import androidx.compose.foundation.layout.size | ||
import androidx.compose.foundation.shape.CircleShape | ||
import androidx.compose.material3.Text | ||
import androidx.compose.runtime.Composable | ||
import androidx.compose.ui.Alignment | ||
import androidx.compose.ui.Modifier | ||
import androidx.compose.ui.draw.clip | ||
import androidx.compose.ui.tooling.preview.Preview | ||
import androidx.compose.ui.unit.dp | ||
import coil.compose.AsyncImagePainter.State.Empty.painter | ||
import coil.compose.rememberAsyncImagePainter | ||
import com.record.designsystem.component.button.FollowButton | ||
import com.record.designsystem.theme.RecordyTheme | ||
import com.record.model.UserData | ||
|
||
@Composable | ||
fun UserDataContainer(user: UserData, onClick: (UserData) -> Unit) { | ||
Row( | ||
modifier = Modifier | ||
.background(RecordyTheme.colors.background) | ||
.fillMaxWidth(), | ||
verticalAlignment = Alignment.CenterVertically, | ||
) { | ||
Image( | ||
painter = rememberAsyncImagePainter(user.profileImage), | ||
contentDescription = null, | ||
modifier = Modifier | ||
.padding(vertical = 10.dp, horizontal = 16.dp) | ||
.size(54.dp) | ||
.clip(CircleShape), | ||
) | ||
Text( | ||
text = user.name, | ||
style = RecordyTheme.typography.body1M, | ||
color = RecordyTheme.colors.white, | ||
) | ||
Spacer(modifier = Modifier.weight(1f)) | ||
FollowButton( | ||
isFollowing = user.isFollowing, | ||
onClick = { onClick(user) }, | ||
) | ||
Spacer(modifier = Modifier.size(16.dp)) | ||
} | ||
} | ||
|
||
@Preview(showBackground = true) | ||
@Composable | ||
fun UserDataContainerPreview() { | ||
val sampleUser = UserData( | ||
id = 1, | ||
profileImage = "https://via.placeholder.com/150", | ||
name = "John Doe", | ||
isFollowing = false, | ||
) | ||
RecordyTheme { | ||
UserDataContainer(user = sampleUser, onClick = {}) | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
์๋ฌํ ๋ถ๋ถ๋ค stalessํ๊ฒ ํธ์ด์คํ ํด๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
๊ฐ์ฌํฉ๋๋ค!!!