22
33package io.github.amanshuraikwar.portfolio
44
5- import com.russhwolf.settings.Settings
65import io.github.amanshuraikwar.portfolio.model.AppData
76import io.github.amanshuraikwar.portfolio.model.AppLink
87import io.github.amanshuraikwar.portfolio.model.ExperienceData
98import io.github.amanshuraikwar.portfolio.model.LinkData
109import io.github.amanshuraikwar.portfolio.model.PortfolioData
11- import io.github.amanshuraikwar.portfolio.model.ThemeColorsData
12- import io.github.amanshuraikwar.portfolio.model.ThemeData
1310import io.github.amanshuraikwar.portfolio.network.PortfolioApi
14- import kotlinx.coroutines.CoroutineExceptionHandler
1511import kotlinx.coroutines.Dispatchers
16- import kotlinx.coroutines.MainScope
17- import kotlinx.coroutines.flow.MutableStateFlow
18- import kotlinx.coroutines.flow.StateFlow
19- import kotlinx.coroutines.launch
20- import kotlinx.coroutines.plus
2112import kotlinx.coroutines.withContext
22- import kotlinx.serialization.decodeFromString
23- import kotlinx.serialization.encodeToString
24- import kotlinx.serialization.json.Json
2513
2614class PortfolioRepository (
2715 private val portfolioApi : PortfolioApi = PortfolioApi (
28- client = PortfolioApi .createHttpClient(enableNetworkLogs = true)
16+ client = Factory .createHttpClient(enableNetworkLogs = true)
2917 ),
30- private val settings : Settings = Settings (),
31- private val defaultThemeColorsName : String = DEFAULT_THEME_COLORS_NAME ,
32- private val defaultThemeData : ThemeData = DEFAULT_THEME_DATA ,
3318 private val dataStore : DataStore = GeneratedDataStore (),
3419) {
35- private val errorHandler = CoroutineExceptionHandler { _, th ->
36- // do nothing
37- }
38- private val repositoryScope = MainScope () + Dispatchers .Default + errorHandler
39-
40- private var themeColorsName: String
41- get() {
42- return settings.getString(
43- PREFS_THEME_COLORS_NAME ,
44- defaultThemeColorsName.replace(" " , " " ).lowercase()
45- )
46- }
47- set(value) {
48- settings.putString(
49- PREFS_THEME_COLORS_NAME ,
50- value
51- )
52- }
53-
54- private val themeColorsNameFlow: MutableStateFlow <String >
55-
56- private var themeData: ThemeData
57- get() {
58- return try {
59- Json .decodeFromString(
60- settings.getString(
61- PREFS_THEME_DATA ,
62- Json .encodeToString(defaultThemeData)
63- )
64- )
65- } catch (e: Exception ) {
66- settings.putString(
67- PREFS_THEME_DATA ,
68- Json .encodeToString(defaultThemeData)
69- )
70- DEFAULT_THEME_DATA
71- }
72- }
73- set(value) {
74- settings.putString(
75- PREFS_THEME_DATA ,
76- Json .encodeToString(value)
77- )
78- }
79-
80- private val themeDataFlow = MutableStateFlow (themeData)
81-
82- private val themeColors: MutableStateFlow <ThemeColorsData >
83-
84- init {
85- val initThemeColors: ThemeColorsData
86-
87- while (true ) {
88- val selectedThemeColors = themeData.getThemeColors(themeColorsName)
89- if (selectedThemeColors != null ) {
90- initThemeColors = selectedThemeColors
91- break
92- }
93- val parsedName = themeData.themes[0 ]
94- .name
95- .replace(" " , " " )
96- .lowercase()
97- themeColorsName = parsedName
98- }
99-
100- themeColorsNameFlow = MutableStateFlow (themeColorsName)
101- themeColors = MutableStateFlow (initThemeColors)
102- }
103-
104- fun getSelectedThemeColorsName (): StateFlow <String > {
105- return themeColorsNameFlow
106- }
107-
108- fun setSelectedThemeColorsName (name : String ) {
109- val parsedName = name.replace(" " , " " ).lowercase()
110- val selectedThemeColors = themeData.getThemeColors(parsedName)
111- if (selectedThemeColors != null ) {
112- themeColorsName = parsedName
113- themeColorsNameFlow.value = themeColorsName
114- themeColors.value = selectedThemeColors
115- }
116- }
117-
118- fun getSelectedThemeColors (): StateFlow <ThemeColorsData > {
119- return themeColors
120- }
121-
122- fun getThemeData (): StateFlow <ThemeData > {
123- repositoryScope.launch {
124- fetchThemeDataFromRemote()
125- }
126-
127- return themeDataFlow
128- }
129-
130- private suspend fun fetchThemeDataFromRemote () {
131- portfolioApi.getThemeData()
132- .takeIf {
133- it.themes.isNotEmpty()
134- }
135- ?.let { response ->
136- val newThemeData = ThemeData (
137- response.themes.map { themeColors ->
138- ThemeColorsData (
139- name = themeColors.name,
140- isDark = themeColors.isDark,
141- primaryColor = themeColors.primaryColor,
142- onPrimaryColor = themeColors.onPrimaryColor,
143- surfaceColor = themeColors.surfaceColor,
144- onSurfaceColor = themeColors.onSurfaceColor,
145- errorColor = themeColors.errorColor,
146- onErrorColor = themeColors.onErrorColor,
147- )
148- }
149- )
150-
151- themeData = newThemeData
152- themeDataFlow.value = themeData
153-
154- while (true ) {
155- val newThemeColors = themeData.getThemeColors(themeColorsName)
156- if (newThemeColors != null ) {
157- themeColorsNameFlow.value = themeColorsName
158- themeColors.value = newThemeColors
159- break
160- }
161- val parsedName = themeData.themes[0 ]
162- .name
163- .replace(" " , " " )
164- .lowercase()
165- themeColorsName = parsedName
166- }
167- }
168- }
169-
17020 private suspend fun getPortfolioData (): PortfolioData {
17121 return withContext(Dispatchers .Default ) {
17222 portfolioApi.getPortfolioData().let { response ->
@@ -219,53 +69,4 @@ class PortfolioRepository(
21969 PageType .ABOUT_ME -> PageData .AboutMe (getPortfolioData())
22070 }
22171 }
222-
223- companion object {
224- private fun ThemeData.getThemeColors (name : String ): ThemeColorsData ? {
225- return themes.find {
226- it.name.replace(" " , " " ).lowercase() == name
227- }
228- }
229-
230- private const val PREFS_THEME_COLORS_NAME = " theme_colors_name"
231- private const val PREFS_THEME_DATA = " theme_data"
232-
233- private val DEFAULT_THEME_DATA = ThemeData (
234- listOf (
235- ThemeColorsData (
236- name = " Dark Salmon" ,
237- isDark = true ,
238- primaryColor = " #FFFFCDD2" ,
239- onPrimaryColor = " #FF4E342E" ,
240- surfaceColor = " #FF212121" ,
241- onSurfaceColor = " #FFffffff" ,
242- errorColor = " #FFE57373" ,
243- onErrorColor = " #FF4E342E" ,
244- ),
245- ThemeColorsData (
246- name = " Light Blue" ,
247- isDark = false ,
248- primaryColor = " #ffEA5C5A" ,
249- onPrimaryColor = " #FFffffff" ,
250- surfaceColor = " #ffCDECF9" ,
251- onSurfaceColor = " #FF030204" ,
252- errorColor = " #FFE57373" ,
253- onErrorColor = " #FF212121" ,
254- ),
255- ThemeColorsData (
256- name = " Matt D'av Ella" ,
257- isDark = false ,
258- primaryColor = " #ffE35638" ,
259- onPrimaryColor = " #FFFADACA" ,
260- surfaceColor = " #ffFBF8EC" ,
261- onSurfaceColor = " #FF24242C" ,
262- errorColor = " #FFE57373" ,
263- onErrorColor = " #FF212121" ,
264- )
265- )
266- )
267-
268- private val DEFAULT_THEME_COLORS_NAME =
269- DEFAULT_THEME_DATA .themes[0 ].name.replace(" " , " " ).lowercase()
270- }
27172}
0 commit comments