Skip to content

Commit

Permalink
Merge pull request #11 from aritra-tech/news_screen
Browse files Browse the repository at this point in the history
News screen impl.
  • Loading branch information
aritra-tech authored Aug 17, 2024
2 parents 821b9c1 + f671a40 commit 55650a7
Show file tree
Hide file tree
Showing 34 changed files with 627 additions and 85 deletions.
1 change: 1 addition & 0 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ kotlin {
implementation(libs.androidx.data.store.core)
implementation(libs.kotlin.coroutines)
implementation(libs.kotlinx.serialization.json)
implementation(libs.kotlinx.datetime)
implementation(libs.chart)
implementation(libs.bignum)

Expand Down
2 changes: 1 addition & 1 deletion composeApp/src/commonMain/kotlin/component/CoinChart.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.aay.compose.baseComponents.model.LegendPosition
import com.aay.compose.lineChart.LineChart
import com.aay.compose.lineChart.model.LineParameters
import com.aay.compose.lineChart.model.LineType
import domain.model.Data
import domain.model.crypto.Data
import org.jetbrains.compose.resources.Font
import kotlin.math.abs
import kotlin.random.Random
Expand Down
2 changes: 1 addition & 1 deletion composeApp/src/commonMain/kotlin/component/CryptoCard.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import coil3.compose.AsyncImage
import coinify.composeapp.generated.resources.Res
import coinify.composeapp.generated.resources.poppins_medium
import coinify.composeapp.generated.resources.poppins_regular
import domain.model.Data
import domain.model.crypto.Data
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.jetbrains.compose.resources.Font
Expand Down
2 changes: 1 addition & 1 deletion composeApp/src/commonMain/kotlin/component/StatsCard.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import androidx.compose.ui.unit.dp
import coinify.composeapp.generated.resources.Res
import coinify.composeapp.generated.resources.poppins_medium
import coinify.composeapp.generated.resources.poppins_regular
import domain.model.Data
import domain.model.crypto.Data
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.jetbrains.compose.resources.Font
Expand Down
52 changes: 8 additions & 44 deletions composeApp/src/commonMain/kotlin/data/remote/ApiClient.kt
Original file line number Diff line number Diff line change
@@ -1,56 +1,20 @@
package data.remote

import com.aritra.coinify.BuildKonfig.API_KEY
import domain.model.Listings
import domain.model.crypto.Listings
import domain.model.news.News
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.logging.LogLevel
import io.ktor.client.plugins.logging.Logger
import io.ktor.client.plugins.logging.Logging
import io.ktor.client.request.get
import io.ktor.client.request.headers
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import utils.Constants.BASE_URL
import utils.Constants.REQUEST_TIME_OUT
import utils.Constants.NEWS_URL

object ApiClient {
private val client = HttpClient {
install(ContentNegotiation) {
json(
json = Json {
prettyPrint = true
isLenient = false
ignoreUnknownKeys = true
coerceInputValues = true
explicitNulls = true
}
)
}
install(Logging) {
level = LogLevel.ALL
logger = object : Logger {
override fun log(message: String) {
println(message)
}
}
}
install(HttpTimeout) {
requestTimeoutMillis = REQUEST_TIME_OUT
connectTimeoutMillis = REQUEST_TIME_OUT
socketTimeoutMillis = REQUEST_TIME_OUT
}
defaultRequest {
headers {
append("X-CMC_PRO_API_KEY", API_KEY)
}
}
}
class ApiClient(private val client: HttpClient) {

suspend fun getListings(): Listings {
return client.get(BASE_URL + "cryptocurrency/listings/latest").body()
}

suspend fun getAllNews(): News {
return client.get(NEWS_URL + "v2/news/?lang=EN").body()
}
}
59 changes: 56 additions & 3 deletions composeApp/src/commonMain/kotlin/di/Koin.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,72 @@
package di

import domain.repository.ListingRepository
import com.aritra.coinify.BuildKonfig.API_KEY
import data.remote.ApiClient
import domain.repository.CoinifyRepository
import io.ktor.client.HttpClient
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.logging.LogLevel
import io.ktor.client.plugins.logging.Logger
import io.ktor.client.plugins.logging.Logging
import io.ktor.client.request.headers
import io.ktor.http.HttpHeaders
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
import org.koin.dsl.module
import presentation.home.HomeViewModel
import presentation.news.NewsViewModel
import presentation.settings.SettingsViewModel
import utils.Constants.REQUEST_TIME_OUT
import utils.ThemeViewModel
import utils.coreComponent
import utils.viewModelDefinition

@OptIn(ExperimentalSerializationApi::class)
val appModule = module {

single { ListingRepository() }
single {
HttpClient {
install(ContentNegotiation) {
json(
json = Json {
prettyPrint = true
isLenient = false
ignoreUnknownKeys = true
coerceInputValues = true
explicitNulls = true
}
)
}
install(Logging) {
level = LogLevel.ALL
logger = object : Logger {
override fun log(message: String) {
println(message)
}
}
// filter { filter-> filter.url.host.contains("coinmarketcap.com") }
// sanitizeHeader { header-> header == HttpHeaders.Authorization }
}
install(HttpTimeout) {
requestTimeoutMillis = REQUEST_TIME_OUT
connectTimeoutMillis = REQUEST_TIME_OUT
socketTimeoutMillis = REQUEST_TIME_OUT
}
defaultRequest {
headers {
append("X-CMC_PRO_API_KEY", API_KEY)
}
}
}
}
single { CoinifyRepository(get()) }
single { ApiClient(get()) }
single { coreComponent.appPreferences }

viewModelDefinition { HomeViewModel(get()) }
viewModelDefinition { SettingsViewModel(get()) }
viewModelDefinition { ThemeViewModel(get()) }
viewModelDefinition { NewsViewModel(get()) }
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package domain.model
package domain.model.crypto
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
37 changes: 37 additions & 0 deletions composeApp/src/commonMain/kotlin/domain/model/news/Data.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package domain.model.news


import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class Data(
@SerialName("body")
val body: String = "",
@SerialName("categories")
val categories: String = "",
@SerialName("downvotes")
val downvotes: String = "",
@SerialName("guid")
val guid: String = "",
@SerialName("id")
val id: String = "",
@SerialName("imageurl")
val imageurl: String = "",
@SerialName("lang")
val lang: String = "",
@SerialName("published_on")
val publishedOn: Int = 0,
@SerialName("source")
val source: String = "",
@SerialName("source_info")
val sourceInfo: SourceInfo = SourceInfo(),
@SerialName("tags")
val tags: String = "",
@SerialName("title")
val title: String = "",
@SerialName("upvotes")
val upvotes: String = "",
@SerialName("url")
val url: String = ""
)
20 changes: 20 additions & 0 deletions composeApp/src/commonMain/kotlin/domain/model/news/News.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package domain.model.news

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class News (
@SerialName("Data")
val `data`: List<Data> = listOf(),
@SerialName("HasWarning")
val hasWarning: Boolean = false,
@SerialName("Message")
val message: String = "",
@SerialName("Promoted")
val promoted: List<String> = listOf(),
@SerialName("RateLimit")
val rateLimit: RateLimit = RateLimit(),
@SerialName("Type")
val type: Int = 0
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package domain.model.news

import kotlinx.serialization.Serializable

@Serializable
class RateLimit
14 changes: 14 additions & 0 deletions composeApp/src/commonMain/kotlin/domain/model/news/SourceInfo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package domain.model.news

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class SourceInfo (
@SerialName("img")
val img: String = "",
@SerialName("lang")
val lang: String = "",
@SerialName("name")
val name: String = ""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package domain.repository

import data.remote.ApiClient
import domain.model.crypto.Listings
import domain.model.news.News

class CoinifyRepository(
private val apiClient: ApiClient
): CryptoAPI {

override suspend fun getListing(): Listings {
return apiClient.getListings()
}

override suspend fun getAllNews(): News {
return apiClient.getAllNews()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package domain.repository

import domain.model.crypto.Listings
import domain.model.news.News

interface CryptoAPI {
suspend fun getListing(): Listings
suspend fun getAllNews(): News
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ package navigation

import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Newspaper
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.outlined.StackedLineChart
import androidx.compose.ui.graphics.vector.ImageVector

sealed class BottomNavScreens(val route: String, val icon: ImageVector, val title: String) {
data object Home: BottomNavScreens(Screens.Home.route, Icons.Default.Home,"Home")
data object Statistics: BottomNavScreens(Screens.Statistics.route, Icons.Outlined.StackedLineChart, "Statistics")
data object News: BottomNavScreens(Screens.Settings.route, Icons.Default.Settings, "Settings")
data object Settings: BottomNavScreens(Screens.Settings.route, Icons.Default.Settings, "Settings")
data object News: BottomNavScreens(Screens.News.route, Icons.Default.Newspaper, "News")
}
Loading

0 comments on commit 55650a7

Please sign in to comment.