Skip to content

Commit 4678357

Browse files
Merge pull request #115 from Naoki-Hidaka/change-ui-event
Change UI event
2 parents fbc2493 + 2fa2c21 commit 4678357

17 files changed

Lines changed: 181 additions & 422 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
/.idea/workspace.xml
88
/.idea/navEditor.xml
99
/.idea/assetWizardSettings.xml
10+
/.idea/misc.xml
1011
.DS_Store
1112
/build
1213
/captures

.idea/misc.xml

Lines changed: 0 additions & 54 deletions
This file was deleted.
Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,12 @@
11
package jp.dosukoi.ui.view.common
22

3-
import android.app.Activity
4-
import android.content.Intent
5-
import android.net.Uri
3+
import android.content.Context
64
import android.widget.Toast
7-
import androidx.annotation.StringRes
85
import jp.dosukoi.ui.view.R
96
import retrofit2.HttpException
107
import java.io.IOException
118

12-
fun Activity.showToast(message: String) {
13-
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
14-
}
15-
16-
fun Activity.showToast(@StringRes messageResId: Int) {
17-
val message = getString(messageResId)
18-
19-
showToast(message)
20-
}
21-
22-
fun Activity.showErrorToast(throwable: Throwable) {
9+
fun Context.showErrorToast(throwable: Throwable) {
2310
val message = when (throwable) {
2411
is IOException -> getString(R.string.io_exception)
2512
is HttpException -> when (throwable.code()) {
@@ -30,8 +17,3 @@ fun Activity.showErrorToast(throwable: Throwable) {
3017
}
3118
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
3219
}
33-
34-
fun Activity.navigateChrome(url: String) {
35-
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
36-
startActivity(intent)
37-
}

ui/view/src/main/java/jp/dosukoi/ui/view/myPage/MyPageComponent.kt

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package jp.dosukoi.ui.view.myPage
22

3+
import android.content.Intent
4+
import android.net.Uri
35
import androidx.compose.foundation.Image
46
import androidx.compose.foundation.background
57
import androidx.compose.foundation.clickable
@@ -18,11 +20,13 @@ import androidx.compose.material.Card
1820
import androidx.compose.material.Divider
1921
import androidx.compose.material.Text
2022
import androidx.compose.runtime.Composable
23+
import androidx.compose.runtime.remember
2124
import androidx.compose.ui.Alignment
2225
import androidx.compose.ui.Modifier
2326
import androidx.compose.ui.draw.clip
2427
import androidx.compose.ui.graphics.Color
2528
import androidx.compose.ui.layout.ContentScale
29+
import androidx.compose.ui.platform.LocalContext
2630
import androidx.compose.ui.text.TextStyle
2731
import androidx.compose.ui.text.font.FontWeight
2832
import androidx.compose.ui.tooling.preview.Preview
@@ -40,34 +44,35 @@ import jp.dosukoi.ui.view.common.whiteGray
4044
fun MyPageComponent(
4145
user: User,
4246
repositoryList: List<Repository>,
43-
onCardClick: (String) -> Unit,
44-
onRepositoryItemClick: (String) -> Unit,
4547
isRefreshing: Boolean?,
4648
onRefresh: () -> Unit
4749
) {
4850
SwipeRefresh(state = rememberSwipeRefreshState(isRefreshing ?: false), onRefresh = onRefresh) {
4951
LazyColumn(
5052
contentPadding = PaddingValues(vertical = 20.dp)
5153
) {
52-
item { UserInfoCard(user, onCardClick) }
54+
item { UserInfoCard(user) }
5355
itemsIndexed(repositoryList) { index, repository ->
5456
RepositoryItem(
5557
repository = repository,
56-
isLastItem = index == repositoryList.size,
57-
onRepositoryItemClick = onRepositoryItemClick
58+
isLastItem = index == repositoryList.size
5859
)
5960
}
6061
}
6162
}
6263
}
6364

6465
@Composable
65-
fun UserInfoCard(user: User, onCardClick: (String) -> Unit) {
66+
fun UserInfoCard(user: User) {
67+
val context = LocalContext.current
68+
val intent = remember {
69+
Intent(Intent.ACTION_VIEW, Uri.parse(user.htmlUrl))
70+
}
6671
Card(
6772
modifier = Modifier
6873
.padding(vertical = 10.dp, horizontal = 16.dp)
6974
.fillMaxWidth()
70-
.clickable { onCardClick(user.htmlUrl) },
75+
.clickable { context.startActivity(intent) },
7176
shape = RoundedCornerShape(10.dp),
7277
elevation = 4.dp
7378
) {
@@ -122,14 +127,17 @@ fun UserInfo(user: User) {
122127
@Composable
123128
fun RepositoryItem(
124129
repository: Repository,
125-
isLastItem: Boolean,
126-
onRepositoryItemClick: (String) -> Unit
130+
isLastItem: Boolean
127131
) {
132+
val context = LocalContext.current
133+
val intent = remember {
134+
Intent(Intent.ACTION_VIEW, Uri.parse(repository.htmlUrl))
135+
}
128136
Column(
129137
modifier = Modifier
130138
.fillMaxWidth()
131139
.clickable {
132-
onRepositoryItemClick(repository.htmlUrl)
140+
context.startActivity(intent)
133141
}
134142
) {
135143
Text(
@@ -160,8 +168,7 @@ private fun UserInfoCardPreview() {
160168
null,
161169
null,
162170
null
163-
),
164-
onCardClick = {}
171+
)
165172
)
166173
}
167174
//endregion

ui/view/src/main/java/jp/dosukoi/ui/view/myPage/MyPageScreen.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,34 @@ package jp.dosukoi.ui.view.myPage
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.collectAsState
55
import androidx.compose.runtime.getValue
6+
import androidx.compose.ui.platform.LocalContext
67
import jp.dosukoi.data.entity.myPage.UserStatus
78
import jp.dosukoi.ui.view.common.LoadingAndErrorScreen
9+
import jp.dosukoi.ui.view.common.showErrorToast
810
import jp.dosukoi.ui.viewmodel.myPage.MyPageViewModel
911

1012
@Composable
1113
fun MyPageScreen(
1214
viewModel: MyPageViewModel,
1315
) {
1416
val myPageUiState by viewModel.myPageState.collectAsState()
17+
if (myPageUiState.errors.isNotEmpty()) {
18+
val context = LocalContext.current
19+
val throwable = myPageUiState.errors.first()
20+
context.showErrorToast(throwable)
21+
viewModel.onConsumeErrors(throwable)
22+
}
1523
LoadingAndErrorScreen(
16-
state = myPageUiState,
24+
state = myPageUiState.screenState,
1725
loadedContent = { data ->
1826
when (val state = data.userStatus) {
1927
is UserStatus.Authenticated -> MyPageComponent(
2028
state.user,
2129
data.repositoryList,
22-
viewModel::onCardClick,
23-
viewModel::onRepositoryItemClick,
24-
data.isRefreshing,
30+
myPageUiState.isRefreshing,
2531
viewModel::onRefresh
2632
)
27-
UserStatus.UnAuthenticated -> UnAuthenticatedUserComponent(
28-
viewModel::onLoginButtonClick
29-
)
33+
UserStatus.UnAuthenticated -> UnAuthenticatedUserComponent()
3034
}
3135
},
3236
onRetryClick = viewModel::onRetryClick

ui/view/src/main/java/jp/dosukoi/ui/view/myPage/UnAuthenticatedUserComponent.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package jp.dosukoi.ui.view.myPage
22

3+
import android.content.Intent
4+
import android.net.Uri
35
import androidx.compose.foundation.background
46
import androidx.compose.foundation.layout.Arrangement
57
import androidx.compose.foundation.layout.Column
@@ -8,22 +10,30 @@ import androidx.compose.material.Button
810
import androidx.compose.material.ButtonDefaults
911
import androidx.compose.material.Text
1012
import androidx.compose.runtime.Composable
13+
import androidx.compose.runtime.remember
1114
import androidx.compose.ui.Alignment.Companion.CenterHorizontally
1215
import androidx.compose.ui.Modifier
16+
import androidx.compose.ui.platform.LocalContext
1317
import androidx.compose.ui.unit.dp
1418
import jp.dosukoi.ui.view.common.white
1519

20+
private const val CLIENT_ID = "52b65f6025ea1e4264cd"
21+
private const val VERIFY_URL =
22+
"https://github.com/login/oauth/authorize?client_id=$CLIENT_ID&scope=user repo"
23+
1624
@Composable
17-
fun UnAuthenticatedUserComponent(
18-
onLoginButtonClick: () -> Unit
19-
) {
25+
fun UnAuthenticatedUserComponent() {
26+
val context = LocalContext.current
27+
val intent = remember {
28+
Intent(Intent.ACTION_VIEW, Uri.parse(VERIFY_URL))
29+
}
2030
Column(
2131
modifier = Modifier.fillMaxSize(),
2232
horizontalAlignment = CenterHorizontally,
2333
verticalArrangement = Arrangement.Center
2434
) {
2535
Button(
26-
onClick = onLoginButtonClick,
36+
onClick = { context.startActivity(intent) },
2737
Modifier.background(white),
2838
elevation = ButtonDefaults.elevation(defaultElevation = 8.dp)
2939
) {

ui/view/src/main/java/jp/dosukoi/ui/view/search/SearchComponent.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,28 +38,25 @@ import jp.dosukoi.ui.viewmodel.search.SearchUiState
3838
@Composable
3939
fun SearchComponent(
4040
uiState: SearchUiState,
41-
isTextError: Boolean?,
4241
listState: LazyListState,
4342
onValueChanged: (String) -> Unit,
4443
onSearchButtonClick: () -> Unit,
45-
onRetryClick: () -> Unit,
46-
onItemClick: (String) -> Unit
44+
onRetryClick: () -> Unit
4745
) {
4846
Column(
4947
modifier = Modifier
5048
.fillMaxSize()
5149
) {
5250
SearchTextField(
5351
searchText = uiState.searchWord,
54-
isTextError = isTextError,
52+
isTextError = uiState.isSearchWordError,
5553
onValueChanged = onValueChanged,
5654
onSearchButtonClick = onSearchButtonClick
5755
)
5856
SearchList(
5957
uiState = uiState,
6058
listState = listState,
61-
onRetryClick = onRetryClick,
62-
onItemClick = onItemClick
59+
onRetryClick = onRetryClick
6360
)
6461
}
6562
}
@@ -114,8 +111,7 @@ fun SearchTextField(
114111
fun SearchList(
115112
uiState: SearchUiState,
116113
listState: LazyListState,
117-
onRetryClick: () -> Unit,
118-
onItemClick: (String) -> Unit,
114+
onRetryClick: () -> Unit
119115
) {
120116
LoadingAndErrorScreen(
121117
state = uiState.searchState,
@@ -127,8 +123,7 @@ fun SearchList(
127123
SearchedListComponent(
128124
it.repositoryList,
129125
it.hasMore,
130-
listState,
131-
onItemClick
126+
listState
132127
)
133128
}
134129
},
@@ -140,8 +135,7 @@ fun SearchList(
140135
fun SearchedListComponent(
141136
repositoryList: List<Repository>,
142137
hasMore: Boolean,
143-
listState: LazyListState,
144-
onItemClick: (String) -> Unit
138+
listState: LazyListState
145139
) {
146140
LazyColumn(
147141
contentPadding = PaddingValues(top = 10.dp, bottom = 16.dp),
@@ -150,8 +144,7 @@ fun SearchedListComponent(
150144
itemsIndexed(repositoryList) { index, repository ->
151145
RepositoryItem(
152146
repository = repository,
153-
isLastItem = index == repositoryList.size && !hasMore,
154-
onRepositoryItemClick = onItemClick
147+
isLastItem = index == repositoryList.size && !hasMore
155148
)
156149
}
157150
if (hasMore) item { LoadingFooter() }

ui/view/src/main/java/jp/dosukoi/ui/view/search/SearchPageScreen.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,29 @@ import androidx.compose.foundation.lazy.rememberLazyListState
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.collectAsState
66
import androidx.compose.runtime.getValue
7-
import androidx.compose.runtime.livedata.observeAsState
7+
import androidx.compose.ui.platform.LocalContext
88
import jp.dosukoi.ui.view.common.OnScrollEnd
9+
import jp.dosukoi.ui.view.common.showErrorToast
910
import jp.dosukoi.ui.viewmodel.search.SearchViewModel
1011

1112
@Composable
1213
fun SearchScreen(
1314
viewModel: SearchViewModel
1415
) {
1516
val uiState by viewModel.searchUiState.collectAsState()
16-
val isTextError by viewModel.isError.observeAsState()
17+
if (uiState.errors.isNotEmpty()) {
18+
val context = LocalContext.current
19+
val throwable = uiState.errors.first()
20+
context.showErrorToast(throwable)
21+
viewModel.onConsumeErrors(throwable)
22+
}
1723
val listState = rememberLazyListState()
1824
OnScrollEnd(lazyListState = listState, onAppearLastItem = viewModel::onScrollEnd)
1925
SearchComponent(
2026
uiState,
21-
isTextError,
2227
listState,
2328
viewModel::onSearchWordChanged,
2429
viewModel::onSearchButtonClick,
25-
viewModel::onRetryClick,
26-
viewModel::onSearchedItemClick
30+
viewModel::onRetryClick
2731
)
2832
}

0 commit comments

Comments
 (0)