Skip to content

Commit 658dfb7

Browse files
committed
Update FavouriteRepositoryItem UI and fix localization string formats
- Refactor `FavouriteRepositoryItem` to use `ExpressiveCard` and `AssistChip` for displaying repository details like language, latest release, and date added. - Update `FavouriteRepositoryItem` layout with improved spacing, typography, and a custom-shaped favorite button. - Fix string resource formatting by changing `%d` to `%1$d` for `minutes_ago`, `hours_ago`, and `days_ago` across multiple localizations (pl, ko, hi, zh-rCN, bn, ru, tr, and default). - Clean up imports and remove redundant `Modifier.Companion` references in `FavouritesRoot`.
1 parent 82f0e7c commit 658dfb7

10 files changed

Lines changed: 117 additions & 93 deletions

File tree

core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,9 @@
279279
<string name="star_repos_hint">ইনস্টলযোগ্য রিলিজ থাকা রিপোজিটরি GitHub-এ স্টার করুন</string>
280280
<string name="last_synced">শেষ সিঙ্ক</string>
281281
<string name="just_now">এইমাত্র</string>
282-
<string name="minutes_ago">%d মিনিট আগে</string>
283-
<string name="hours_ago">%d ঘণ্টা আগে</string>
284-
<string name="days_ago">%d দিন আগে</string>
282+
<string name="minutes_ago">%1$d মিনিট আগে</string>
283+
<string name="hours_ago">%1$d ঘণ্টা আগে</string>
284+
<string name="days_ago">%1$d দিন আগে</string>
285285
<string name="dismiss">বন্ধ করুন</string>
286286
<string name="sync_starred_failed">স্টার করা রিপোজিটরি সিঙ্ক করতে ব্যর্থ হয়েছে</string>
287287

core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,9 @@
277277
<string name="star_repos_hint">उन्हें यहां देखने के लिए इंस्टॉलेबल रिलीज़ वाले GitHub पर रिपॉजिटरी को स्टार करें।</string>
278278
<string name="last_synced">अंतिम सिंक</string>
279279
<string name="just_now">अभी-अभी</string>
280-
<string name="minutes_ago">%d मिनट पहले</string>
281-
<string name="hours_ago">%d घंटे पहले</string>
282-
<string name="days_ago">%d दिन पहले</string>
280+
<string name="minutes_ago">%1$d मिनट पहले</string>
281+
<string name="hours_ago">%1$d घंटे पहले</string>
282+
<string name="days_ago">%1$d दिन पहले</string>
283283
<string name="dismiss">हटाएं</string>
284284
<string name="sync_starred_failed">तारांकित रिपॉजिटरी को सिंक करने में विफल रहा</string>
285285

core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,9 +277,9 @@
277277
<string name="star_repos_hint">설치 가능한 릴리스가 있는 저장소에 별표를 추가하세요</string>
278278
<string name="last_synced">마지막 동기화</string>
279279
<string name="just_now">방금</string>
280-
<string name="minutes_ago">%d분 전</string>
281-
<string name="hours_ago">%d시간 전</string>
282-
<string name="days_ago">%d일 전</string>
280+
<string name="minutes_ago">%1$d분 전</string>
281+
<string name="hours_ago">%1$d시간 전</string>
282+
<string name="days_ago">%1$d일 전</string>
283283
<string name="dismiss">닫기</string>
284284
<string name="sync_starred_failed">별표 저장소 동기화에 실패했습니다</string>
285285

core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@
243243
<string name="star_repos_hint">Oznacz repozytoria z instalowalnymi wydaniami na GitHubie</string>
244244
<string name="last_synced">Ostatnia synchronizacja</string>
245245
<string name="just_now">Przed chwilą</string>
246-
<string name="minutes_ago">%d min temu</string>
247-
<string name="hours_ago">%d h temu</string>
248-
<string name="days_ago">%d d temu</string>
246+
<string name="minutes_ago">%1$d min temu</string>
247+
<string name="hours_ago">%1$d h temu</string>
248+
<string name="days_ago">%1$d d temu</string>
249249
<string name="dismiss">Zamknij</string>
250250
<string name="sync_starred_failed">Nie udało się zsynchronizować oznaczonych gwiazdką repozytoriów</string>
251251

core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,9 @@
244244
<string name="star_repos_hint">Отмечайте репозитории с установочными релизами на GitHub</string>
245245
<string name="last_synced">Последняя синхронизация</string>
246246
<string name="just_now">Только что</string>
247-
<string name="minutes_ago">%d мин назад</string>
248-
<string name="hours_ago">%d ч назад</string>
249-
<string name="days_ago">%d д назад</string>
247+
<string name="minutes_ago">%1$d мин назад</string>
248+
<string name="hours_ago">%1$d ч назад</string>
249+
<string name="days_ago">%1$d д назад</string>
250250
<string name="dismiss">Закрыть</string>
251251
<string name="sync_starred_failed">Не удалось синхронизировать избранные репозитории</string>
252252

core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,9 @@
278278
<string name="star_repos_hint">Yüklenebilir sürümlü repoları görmek için GitHub'da yıldızlayın</string>
279279
<string name="last_synced">Son eşitleme</string>
280280
<string name="just_now">Şimdi</string>
281-
<string name="minutes_ago">%d dakika önce</string>
282-
<string name="hours_ago">%d saat önce</string>
283-
<string name="days_ago">%d gün önce</string>
281+
<string name="minutes_ago">%1$d dakika önce</string>
282+
<string name="hours_ago">%1$d saat önce</string>
283+
<string name="days_ago">%1$d gün önce</string>
284284
<string name="dismiss">Kapat</string>
285285
<string name="sync_starred_failed">Yıldızlı repoları eşitlerken hata</string>
286286

core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,9 @@
227227
<string name="star_repos_hint">在 GitHub 上收藏有可安装版本的仓库以在此查看</string>
228228
<string name="last_synced">上次同步</string>
229229
<string name="just_now">刚刚</string>
230-
<string name="minutes_ago">%d 分钟前</string>
231-
<string name="hours_ago">%d 小时前</string>
232-
<string name="days_ago">%d 天前</string>
230+
<string name="minutes_ago">%1$d 分钟前</string>
231+
<string name="hours_ago">%1$d 小时前</string>
232+
<string name="days_ago">%1$d 天前</string>
233233
<string name="dismiss">关闭</string>
234234
<string name="sync_starred_failed">同步收藏的仓库失败</string>
235235

core/presentation/src/commonMain/composeResources/values/strings.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,9 @@
313313
<string name="star_repos_hint">Star repositories on GitHub with installable releases to see them here</string>
314314
<string name="last_synced">Last synced</string>
315315
<string name="just_now">Just now</string>
316-
<string name="minutes_ago">%d min ago</string>
317-
<string name="hours_ago">%d h ago</string>
318-
<string name="days_ago">%d d ago</string>
316+
<string name="minutes_ago">%1$d min ago</string>
317+
<string name="hours_ago">%1$d h ago</string>
318+
<string name="days_ago">%1$d d ago</string>
319319
<string name="dismiss">Dismiss</string>
320320
<string name="sync_starred_failed">Failed to sync starred repos</string>
321321

feature/favourites/presentation/src/commonMain/kotlin/zed/rainxch/favourites/presentation/FavouritesRoot.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ fun FavouritesScreen(
109109
onDevProfileClick = {
110110
onAction(FavouritesAction.OnDeveloperProfileClick(repo.repoOwner))
111111
},
112-
modifier = Modifier.Companion.animateItem()
112+
modifier = Modifier.animateItem()
113113
)
114114
}
115115
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package zed.rainxch.favourites.presentation.components
22

3-
import androidx.compose.foundation.background
43
import androidx.compose.foundation.clickable
54
import androidx.compose.foundation.layout.Arrangement
65
import androidx.compose.foundation.layout.Box
@@ -15,16 +14,21 @@ import androidx.compose.foundation.layout.size
1514
import androidx.compose.foundation.shape.CircleShape
1615
import androidx.compose.foundation.shape.RoundedCornerShape
1716
import androidx.compose.material.icons.Icons
17+
import androidx.compose.material.icons.filled.CalendarToday
18+
import androidx.compose.material.icons.filled.Code
1819
import androidx.compose.material.icons.filled.Favorite
19-
import androidx.compose.material3.Card
20-
import androidx.compose.material3.CardDefaults
20+
import androidx.compose.material.icons.filled.NewReleases
21+
import androidx.compose.material3.AssistChip
22+
import androidx.compose.material3.AssistChipDefaults
2123
import androidx.compose.material3.CircularWavyProgressIndicator
2224
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
2325
import androidx.compose.material3.Icon
2426
import androidx.compose.material3.IconButton
2527
import androidx.compose.material3.IconButtonDefaults
28+
import androidx.compose.material3.MaterialShapes
2629
import androidx.compose.material3.MaterialTheme
2730
import androidx.compose.material3.Text
31+
import androidx.compose.material3.toShape
2832
import androidx.compose.runtime.Composable
2933
import androidx.compose.ui.Alignment
3034
import androidx.compose.ui.Modifier
@@ -35,9 +39,11 @@ import androidx.compose.ui.unit.dp
3539
import com.skydoves.landscapist.coil3.CoilImage
3640
import com.skydoves.landscapist.components.rememberImageComponent
3741
import com.skydoves.landscapist.crossfade.CrossfadePlugin
38-
import zed.rainxch.githubstore.core.presentation.res.*
3942
import org.jetbrains.compose.resources.stringResource
43+
import zed.rainxch.core.presentation.components.ExpressiveCard
4044
import zed.rainxch.favourites.presentation.model.FavouriteRepository
45+
import zed.rainxch.githubstore.core.presentation.res.Res
46+
import zed.rainxch.githubstore.core.presentation.res.remove_from_favourites
4147

4248
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
4349
@Composable
@@ -46,15 +52,11 @@ fun FavouriteRepositoryItem(
4652
onToggleFavouriteClick: () -> Unit,
4753
onItemClick: () -> Unit,
4854
onDevProfileClick: () -> Unit,
49-
modifier: Modifier = Modifier
55+
modifier: Modifier = Modifier,
5056
) {
51-
Card(
52-
modifier = modifier.fillMaxWidth(),
57+
ExpressiveCard(
58+
modifier = modifier,
5359
onClick = onItemClick,
54-
colors = CardDefaults.cardColors(
55-
containerColor = MaterialTheme.colorScheme.surfaceContainer
56-
),
57-
shape = RoundedCornerShape(24.dp)
5860
) {
5961
Column(
6062
modifier = Modifier
@@ -63,9 +65,9 @@ fun FavouriteRepositoryItem(
6365
) {
6466
Row(
6567
modifier = Modifier
66-
.clickable(onClick = {
67-
onDevProfileClick()
68-
}),
68+
.fillMaxWidth()
69+
.clickable(onClick = onDevProfileClick)
70+
.clip(RoundedCornerShape(24.dp)),
6971
verticalAlignment = Alignment.CenterVertically,
7072
horizontalArrangement = Arrangement.spacedBy(8.dp)
7173
) {
@@ -92,12 +94,12 @@ fun FavouriteRepositoryItem(
9294
style = MaterialTheme.typography.titleMedium,
9395
color = MaterialTheme.colorScheme.outline,
9496
maxLines = 1,
95-
softWrap = false,
96-
overflow = TextOverflow.Ellipsis
97+
overflow = TextOverflow.Ellipsis,
98+
modifier = Modifier.weight(1f)
9799
)
98100
}
99101

100-
Spacer(modifier = Modifier.height(4.dp))
102+
Spacer(modifier = Modifier.height(8.dp))
101103

102104
Row(
103105
modifier = Modifier.fillMaxWidth(),
@@ -113,34 +115,28 @@ fun FavouriteRepositoryItem(
113115
style = MaterialTheme.typography.titleLarge,
114116
color = MaterialTheme.colorScheme.onSurface,
115117
maxLines = 1,
116-
softWrap = false,
117118
overflow = TextOverflow.Ellipsis
118119
)
119120

120121
favouriteRepository.repoDescription?.let {
121-
Spacer(Modifier.height(4.dp))
122+
Spacer(modifier = Modifier.height(4.dp))
122123

123124
Text(
124125
text = it,
125126
fontWeight = FontWeight.Medium,
126-
style = MaterialTheme.typography.titleMedium,
127+
style = MaterialTheme.typography.bodyMedium,
127128
color = MaterialTheme.colorScheme.onSurfaceVariant,
128129
maxLines = 2,
129-
softWrap = true,
130130
overflow = TextOverflow.Ellipsis
131131
)
132132
}
133133
}
134134

135135
IconButton(
136-
onClick = {
137-
onToggleFavouriteClick()
138-
},
139-
colors = IconButtonDefaults.iconButtonColors(
140-
containerColor = MaterialTheme.colorScheme.primaryContainer,
141-
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
142-
),
143-
shapes = IconButtonDefaults.shapes()
136+
onClick = onToggleFavouriteClick,
137+
colors = IconButtonDefaults.filledTonalIconButtonColors(),
138+
modifier = Modifier.align(Alignment.CenterVertically),
139+
shape = MaterialShapes.Cookie6Sided.toShape()
144140
) {
145141
Icon(
146142
imageVector = Icons.Default.Favorite,
@@ -149,50 +145,78 @@ fun FavouriteRepositoryItem(
149145
}
150146
}
151147

152-
favouriteRepository.primaryLanguage?.let {
153-
Spacer(modifier = Modifier.height(6.dp))
148+
Spacer(modifier = Modifier.height(12.dp))
154149

155-
Text(
156-
text = it,
157-
fontWeight = FontWeight.Medium,
158-
style = MaterialTheme.typography.titleMedium,
159-
color = MaterialTheme.colorScheme.onPrimaryContainer,
160-
maxLines = 1,
161-
softWrap = false,
162-
overflow = TextOverflow.Ellipsis,
163-
modifier = Modifier
164-
.background(
165-
color = MaterialTheme.colorScheme.primaryContainer,
166-
shape = RoundedCornerShape(12.dp)
150+
Row(
151+
modifier = Modifier.fillMaxWidth(),
152+
horizontalArrangement = Arrangement.spacedBy(8.dp)
153+
) {
154+
favouriteRepository.primaryLanguage?.let { language ->
155+
AssistChip(
156+
onClick = { /* No action */ },
157+
label = {
158+
Text(
159+
text = language,
160+
style = MaterialTheme.typography.titleSmall,
161+
maxLines = 1,
162+
overflow = TextOverflow.Ellipsis
163+
)
164+
},
165+
leadingIcon = {
166+
Icon(
167+
imageVector = Icons.Default.Code,
168+
contentDescription = null,
169+
modifier = Modifier.size(AssistChipDefaults.IconSize)
170+
)
171+
},
172+
colors = AssistChipDefaults.assistChipColors(
173+
containerColor = MaterialTheme.colorScheme.primaryContainer,
174+
labelColor = MaterialTheme.colorScheme.onPrimaryContainer,
175+
leadingIconContentColor = MaterialTheme.colorScheme.onPrimaryContainer
167176
)
168-
.padding(8.dp)
169-
)
170-
}
171-
favouriteRepository.latestRelease?.let {
172-
Spacer(modifier = Modifier.height(6.dp))
177+
)
178+
}
173179

174-
Text(
175-
text = it,
176-
fontWeight = FontWeight.Medium,
177-
style = MaterialTheme.typography.titleMedium,
178-
color = MaterialTheme.colorScheme.onSurface,
179-
maxLines = 1,
180-
softWrap = false,
181-
overflow = TextOverflow.Ellipsis
180+
favouriteRepository.latestRelease?.let { release ->
181+
AssistChip(
182+
onClick = { /* No action */ },
183+
label = {
184+
Text(
185+
text = release,
186+
style = MaterialTheme.typography.titleSmall,
187+
maxLines = 1,
188+
overflow = TextOverflow.Ellipsis
189+
)
190+
},
191+
leadingIcon = {
192+
Icon(
193+
imageVector = Icons.Default.NewReleases,
194+
contentDescription = null,
195+
modifier = Modifier.size(AssistChipDefaults.IconSize)
196+
)
197+
}
198+
)
199+
}
200+
201+
AssistChip(
202+
onClick = { /* No action */ },
203+
label = {
204+
Text(
205+
text = favouriteRepository.addedAtFormatter,
206+
style = MaterialTheme.typography.titleSmall,
207+
maxLines = 1,
208+
overflow = TextOverflow.Ellipsis
209+
)
210+
},
211+
leadingIcon = {
212+
Icon(
213+
imageVector = Icons.Default.CalendarToday,
214+
contentDescription = null,
215+
modifier = Modifier.size(AssistChipDefaults.IconSize)
216+
)
217+
}
182218
)
183219
}
184-
185-
Spacer(modifier = Modifier.height(6.dp))
186-
187-
Text(
188-
text = favouriteRepository.addedAtFormatter,
189-
fontWeight = FontWeight.Medium,
190-
style = MaterialTheme.typography.titleMedium,
191-
color = MaterialTheme.colorScheme.onSurface,
192-
maxLines = 1,
193-
softWrap = false,
194-
overflow = TextOverflow.Ellipsis
195-
)
196220
}
197221
}
198222
}

0 commit comments

Comments
 (0)