Skip to content

Commit b0f8d21

Browse files
authored
Merge pull request #361 from OpenHub-Store/search-ux-impr
2 parents 9f1d15b + c721ded commit b0f8d21

25 files changed

Lines changed: 929 additions & 39 deletions

File tree

core/data/schemas/zed.rainxch.core.data.local.db.AppDatabase/7.json

Lines changed: 586 additions & 0 deletions
Large diffs are not rendered by default.

core/data/src/commonMain/kotlin/zed/rainxch/core/data/di/SharedModule.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import zed.rainxch.core.data.local.db.AppDatabase
1515
import zed.rainxch.core.data.local.db.dao.CacheDao
1616
import zed.rainxch.core.data.local.db.dao.FavoriteRepoDao
1717
import zed.rainxch.core.data.local.db.dao.InstalledAppDao
18+
import zed.rainxch.core.data.local.db.dao.SearchHistoryDao
1819
import zed.rainxch.core.data.local.db.dao.SeenRepoDao
1920
import zed.rainxch.core.data.local.db.dao.StarredRepoDao
2021
import zed.rainxch.core.data.local.db.dao.UpdateHistoryDao
@@ -27,6 +28,7 @@ import zed.rainxch.core.data.repository.FavouritesRepositoryImpl
2728
import zed.rainxch.core.data.repository.InstalledAppsRepositoryImpl
2829
import zed.rainxch.core.data.repository.ProxyRepositoryImpl
2930
import zed.rainxch.core.data.repository.RateLimitRepositoryImpl
31+
import zed.rainxch.core.data.repository.SearchHistoryRepositoryImpl
3032
import zed.rainxch.core.data.repository.SeenReposRepositoryImpl
3133
import zed.rainxch.core.data.repository.StarredRepositoryImpl
3234
import zed.rainxch.core.data.repository.TweaksRepositoryImpl
@@ -39,6 +41,7 @@ import zed.rainxch.core.domain.repository.FavouritesRepository
3941
import zed.rainxch.core.domain.repository.InstalledAppsRepository
4042
import zed.rainxch.core.domain.repository.ProxyRepository
4143
import zed.rainxch.core.domain.repository.RateLimitRepository
44+
import zed.rainxch.core.domain.repository.SearchHistoryRepository
4245
import zed.rainxch.core.domain.repository.SeenReposRepository
4346
import zed.rainxch.core.domain.repository.StarredRepository
4447
import zed.rainxch.core.domain.repository.TweaksRepository
@@ -103,6 +106,12 @@ val coreModule =
103106
)
104107
}
105108

109+
single<SearchHistoryRepository> {
110+
SearchHistoryRepositoryImpl(
111+
searchHistoryDao = get(),
112+
)
113+
}
114+
106115
single<ProxyRepository> {
107116
ProxyRepositoryImpl(
108117
preferences = get(),
@@ -216,4 +225,8 @@ val databaseModule =
216225
single<SeenRepoDao> {
217226
get<AppDatabase>().seenRepoDao
218227
}
228+
229+
single<SearchHistoryDao> {
230+
get<AppDatabase>().searchHistoryDao
231+
}
219232
}

core/data/src/commonMain/kotlin/zed/rainxch/core/data/local/db/AppDatabase.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import androidx.room.RoomDatabase
55
import zed.rainxch.core.data.local.db.dao.CacheDao
66
import zed.rainxch.core.data.local.db.dao.FavoriteRepoDao
77
import zed.rainxch.core.data.local.db.dao.InstalledAppDao
8+
import zed.rainxch.core.data.local.db.dao.SearchHistoryDao
89
import zed.rainxch.core.data.local.db.dao.SeenRepoDao
910
import zed.rainxch.core.data.local.db.dao.StarredRepoDao
1011
import zed.rainxch.core.data.local.db.dao.UpdateHistoryDao
1112
import zed.rainxch.core.data.local.db.entities.CacheEntryEntity
1213
import zed.rainxch.core.data.local.db.entities.FavoriteRepoEntity
1314
import zed.rainxch.core.data.local.db.entities.InstalledAppEntity
15+
import zed.rainxch.core.data.local.db.entities.SearchHistoryEntity
1416
import zed.rainxch.core.data.local.db.entities.SeenRepoEntity
1517
import zed.rainxch.core.data.local.db.entities.StarredRepositoryEntity
1618
import zed.rainxch.core.data.local.db.entities.UpdateHistoryEntity
@@ -23,8 +25,9 @@ import zed.rainxch.core.data.local.db.entities.UpdateHistoryEntity
2325
StarredRepositoryEntity::class,
2426
CacheEntryEntity::class,
2527
SeenRepoEntity::class,
28+
SearchHistoryEntity::class,
2629
],
27-
version = 6,
30+
version = 7,
2831
exportSchema = true,
2932
)
3033
abstract class AppDatabase : RoomDatabase() {
@@ -34,4 +37,5 @@ abstract class AppDatabase : RoomDatabase() {
3437
abstract val starredReposDao: StarredRepoDao
3538
abstract val cacheDao: CacheDao
3639
abstract val seenRepoDao: SeenRepoDao
40+
abstract val searchHistoryDao: SearchHistoryDao
3741
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package zed.rainxch.core.data.local.db.dao
2+
3+
import androidx.room.Dao
4+
import androidx.room.Insert
5+
import androidx.room.OnConflictStrategy
6+
import androidx.room.Query
7+
import kotlinx.coroutines.flow.Flow
8+
import zed.rainxch.core.data.local.db.entities.SearchHistoryEntity
9+
10+
@Dao
11+
interface SearchHistoryDao {
12+
@Query("SELECT * FROM search_history ORDER BY searchedAt DESC LIMIT 20")
13+
fun getRecentSearches(): Flow<List<SearchHistoryEntity>>
14+
15+
@Insert(onConflict = OnConflictStrategy.REPLACE)
16+
suspend fun insert(entity: SearchHistoryEntity)
17+
18+
@Query("DELETE FROM search_history WHERE `query` = :query")
19+
suspend fun deleteByQuery(query: String)
20+
21+
@Query("DELETE FROM search_history")
22+
suspend fun clearAll()
23+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package zed.rainxch.core.data.local.db.entities
2+
3+
import androidx.room.Entity
4+
import androidx.room.PrimaryKey
5+
6+
@Entity(tableName = "search_history")
7+
data class SearchHistoryEntity(
8+
@PrimaryKey
9+
val query: String,
10+
val searchedAt: Long,
11+
)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package zed.rainxch.core.data.repository
2+
3+
import kotlinx.coroutines.flow.Flow
4+
import kotlinx.coroutines.flow.map
5+
import kotlin.time.Clock
6+
import zed.rainxch.core.data.local.db.dao.SearchHistoryDao
7+
import zed.rainxch.core.data.local.db.entities.SearchHistoryEntity
8+
import zed.rainxch.core.domain.repository.SearchHistoryRepository
9+
10+
class SearchHistoryRepositoryImpl(
11+
private val searchHistoryDao: SearchHistoryDao,
12+
) : SearchHistoryRepository {
13+
override fun getRecentSearches(): Flow<List<String>> =
14+
searchHistoryDao.getRecentSearches().map { entities ->
15+
entities.map { it.query }
16+
}
17+
18+
override suspend fun addSearch(query: String) {
19+
val trimmed = query.trim()
20+
if (trimmed.isBlank()) return
21+
searchHistoryDao.insert(
22+
SearchHistoryEntity(
23+
query = trimmed,
24+
searchedAt = Clock.System.now().toEpochMilliseconds(),
25+
),
26+
)
27+
}
28+
29+
override suspend fun removeSearch(query: String) {
30+
searchHistoryDao.deleteByQuery(query)
31+
}
32+
33+
override suspend fun clearAll() {
34+
searchHistoryDao.clearAll()
35+
}
36+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package zed.rainxch.core.domain.repository
2+
3+
import kotlinx.coroutines.flow.Flow
4+
5+
interface SearchHistoryRepository {
6+
fun getRecentSearches(): Flow<List<String>>
7+
8+
suspend fun addSearch(query: String)
9+
10+
suspend fun removeSearch(query: String)
11+
12+
suspend fun clearAll()
13+
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,4 +614,8 @@
614614
<string name="delete_downloads_confirmation_message">سيؤدي هذا إلى حذف جميع ملفات APK والمثبتات نهائيًا (%1$s). يمكنك إعادة تنزيلها في أي وقت.</string>
615615
<string name="downloads_cleared">تم حذف جميع الحزم التي تم تنزيلها.</string>
616616
<string name="unable_to_verify_attestation">تعذر التحقق</string>
617+
618+
<string name="recent_searches">عمليات البحث الأخيرة</string>
619+
<string name="clear_all_history">مسح الكل</string>
620+
<string name="remove_search_history_item">إزالة</string>
617621
</resources>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,4 +613,8 @@
613613
<string name="delete_downloads_confirmation_message">এটি সব APK এবং ইনস্টলার স্থায়ীভাবে মুছে ফেলবে (%1$s)। আপনি যেকোনো সময় আবার ডাউনলোড করতে পারবেন।</string>
614614
<string name="downloads_cleared">সব ডাউনলোড করা প্যাকেজ মুছে ফেলা হয়েছে।</string>
615615
<string name="unable_to_verify_attestation">যাচাই করা যায়নি</string>
616+
617+
<string name="recent_searches">সাম্প্রতিক অনুসন্ধান</string>
618+
<string name="clear_all_history">সব মুছুন</string>
619+
<string name="remove_search_history_item">সরান</string>
616620
</resources>

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,4 +574,8 @@
574574
<string name="delete_downloads_confirmation_message">Esto eliminará permanentemente todos los APKs e instaladores (%1$s). Puedes volver a descargarlos en cualquier momento.</string>
575575
<string name="downloads_cleared">Todos los paquetes descargados han sido eliminados.</string>
576576
<string name="unable_to_verify_attestation">No se pudo verificar</string>
577+
578+
<string name="recent_searches">Búsquedas recientes</string>
579+
<string name="clear_all_history">Borrar todo</string>
580+
<string name="remove_search_history_item">Eliminar</string>
577581
</resources>

0 commit comments

Comments
 (0)