@@ -2,6 +2,7 @@ package com.revolgenx.anilib.common.data.store
22
33import android.content.Context
44import androidx.compose.runtime.Composable
5+ import androidx.compose.runtime.mutableStateOf
56import androidx.datastore.core.DataStore
67import androidx.datastore.preferences.core.Preferences
78import androidx.datastore.preferences.core.booleanPreferencesKey
@@ -12,26 +13,29 @@ import androidx.datastore.preferences.core.longPreferencesKey
1213import androidx.datastore.preferences.core.stringPreferencesKey
1314import anilib.i18n.R
1415import com.auth0.android.jwt.JWT
15- import com.revolgenx.anilib.common.util.OnClick
16- import com.revolgenx.anilib.media.ui.model.MediaCoverImageModel
17- import com.revolgenx.anilib.media.ui.model.MediaTitleModel
18- import com.revolgenx.anilib.notification.data.store.NotificationDataStore
19- import com.revolgenx.anilib.common.data.constant.InterstitialAdsInterval
2016import com.revolgenx.anilib.common.data.constant.ExploreSectionOrder
17+ import com.revolgenx.anilib.common.data.constant.InterstitialAdsInterval
2118import com.revolgenx.anilib.common.data.constant.MainPageOrder
2219import com.revolgenx.anilib.common.data.constant.RewardedInterstitialAdsInterval
2320import com.revolgenx.anilib.common.ext.get
21+ import com.revolgenx.anilib.common.util.OnClick
22+ import com.revolgenx.anilib.media.ui.model.MediaCoverImageModel
23+ import com.revolgenx.anilib.media.ui.model.MediaTitleModel
24+ import com.revolgenx.anilib.notification.data.store.NotificationDataStore
2425import com.revolgenx.anilib.setting.ui.component.ListPreferenceEntry
2526import com.revolgenx.anilib.type.AiringSort
2627import kotlinx.coroutines.CoroutineScope
2728import kotlinx.coroutines.flow.map
2829import kotlinx.coroutines.launch
30+ import java.time.Instant
31+ import java.time.temporal.ChronoUnit
2932
3033class AppPreferencesDataStore (val dataStore : DataStore <Preferences >) {
3134 val data get() = dataStore.data
3235
3336 companion object {
3437 val authTokenKey = stringPreferencesKey(" auth_token_key" )
38+ val authTokenExpiresAtKey = longPreferencesKey(" auth_token_expires_at_key" )
3539 val userIdKey = intPreferencesKey(" user_id_key" )
3640 val notificationRefreshIntervalKey = intPreferencesKey(" notification_refresh_interval_key" )
3741 val mediaCoverImageTypeKey = intPreferencesKey(" media_cover_image_type_key" )
@@ -43,10 +47,14 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
4347 val displayAdultContentKey = booleanPreferencesKey(" display_adult_content_key" )
4448 val mediaListDisplayModeKey = intPreferencesKey(" media_list_display_mode_key" )
4549 val otherMediaListDisplayModeKey = intPreferencesKey(" other_media_list_display_mode_key" )
46- val displayInterstitialAdsIntervalKey = intPreferencesKey(" display_interstitial_ads_interval_key" )
47- val displayRewardedInterstitialAdsIntervalKey = intPreferencesKey(" display_rewarded_interstitial_ads_interval_key" )
48- val interstitialAdsDisplayedDateTimeKey = longPreferencesKey(" interstitial_ads_displayed_date_time_key" )
49- val rewardedInterstitialAdsDisplayedDateTimeKey = longPreferencesKey(" rewarded_interstitial_ads_displayed_date_time_key" )
50+ val displayInterstitialAdsIntervalKey =
51+ intPreferencesKey(" display_interstitial_ads_interval_key" )
52+ val displayRewardedInterstitialAdsIntervalKey =
53+ intPreferencesKey(" display_rewarded_interstitial_ads_interval_key" )
54+ val interstitialAdsDisplayedDateTimeKey =
55+ longPreferencesKey(" interstitial_ads_displayed_date_time_key" )
56+ val rewardedInterstitialAdsDisplayedDateTimeKey =
57+ longPreferencesKey(" rewarded_interstitial_ads_displayed_date_time_key" )
5058 val autoPlayGifKey = booleanPreferencesKey(" auto_play_gif_key" )
5159 val showUserAboutKey = booleanPreferencesKey(" show_user_about_key" )
5260 val exploreAiringOrderKey = intPreferencesKey(" explore_airing_order_key" )
@@ -76,7 +84,8 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
7684 val widgetOnlyWatchingKey = booleanPreferencesKey(" widget_only_watching_key" )
7785 val widgetOnlyPlanningKey = booleanPreferencesKey(" widget_only_planning_key" )
7886 val widgetAiringSortKey = intPreferencesKey(" widget_airing_sort_key" )
79- val widgetBackgroundSameAsAppKey = booleanPreferencesKey(" widget_background_same_as_app_key" )
87+ val widgetBackgroundSameAsAppKey =
88+ booleanPreferencesKey(" widget_background_same_as_app_key" )
8089
8190 val currentAppVersionKey = stringPreferencesKey(" current_app_version_key" )
8291 val displayScaleKey = floatPreferencesKey(" display_scale_key" )
@@ -95,6 +104,11 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
95104 prefKey = authTokenKey
96105 )
97106
107+ val tokenExpiresAt = PreferencesDataStore (
108+ dataStore = dataStore,
109+ prefKey = authTokenExpiresAtKey
110+ )
111+
98112 val userId = PreferencesDataStore (
99113 dataStore = dataStore,
100114 prefKey = userIdKey
@@ -277,24 +291,26 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
277291 )
278292
279293 val isLoggedIn = userId.data.map { it != null }
294+ val tokenHasExpired =
295+ mutableStateOf(tokenExpiresAt.get().let { it != null && it < System .currentTimeMillis() })
280296
281297 @Composable
282298 fun isLoggedIn (): Boolean {
283299 return userId.collectAsState().value != null
284300 }
285301
286302 fun getMainPageOrder (mainPageOrder : MainPageOrder ): Int {
287- return when (mainPageOrder){
303+ return when (mainPageOrder) {
288304 MainPageOrder .HOME -> data.map { it[homePageOrderKey] ? : 0 }.get()
289305 MainPageOrder .ANIME -> data.map { it[animePageOrderKey] ? : 1 }.get()
290306 MainPageOrder .MANGA -> data.map { it[mangaPageOrderKey] ? : 2 }.get()
291307 MainPageOrder .ACTIVITY -> data.map { it[activityPageOrderKey] ? : 3 }.get()
292308 }
293309 }
294310
295- suspend fun setMainPageOrder (mainPageOrder : MainPageOrder , order : Int ){
311+ suspend fun setMainPageOrder (mainPageOrder : MainPageOrder , order : Int ) {
296312 dataStore.edit {
297- when (mainPageOrder){
313+ when (mainPageOrder) {
298314 MainPageOrder .HOME -> it[homePageOrderKey] = order
299315 MainPageOrder .ANIME -> it[animePageOrderKey] = order
300316 MainPageOrder .MANGA -> it[mangaPageOrderKey] = order
@@ -305,7 +321,7 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
305321
306322
307323 fun getExploreSectionOrder (exploreSectionOrder : ExploreSectionOrder ): Int {
308- return when (exploreSectionOrder){
324+ return when (exploreSectionOrder) {
309325 ExploreSectionOrder .AIRING -> data.map { it[exploreAiringOrderKey] ? : 0 }.get()
310326 ExploreSectionOrder .TRENDING -> data.map { it[exploreTrendingOrderKey] ? : 1 }.get()
311327 ExploreSectionOrder .POPULAR -> data.map { it[explorePopularOrderKey] ? : 2 }.get()
@@ -315,9 +331,9 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
315331 }
316332 }
317333
318- suspend fun setExploreSectionOrder (exploreSectionOrder : ExploreSectionOrder , order : Int ){
334+ suspend fun setExploreSectionOrder (exploreSectionOrder : ExploreSectionOrder , order : Int ) {
319335 dataStore.edit {
320- when (exploreSectionOrder){
336+ when (exploreSectionOrder) {
321337 ExploreSectionOrder .AIRING -> it[exploreAiringOrderKey] = order
322338 ExploreSectionOrder .TRENDING -> it[exploreTrendingOrderKey] = order
323339 ExploreSectionOrder .POPULAR -> it[explorePopularOrderKey] = order
@@ -329,19 +345,24 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
329345 }
330346
331347 fun isExploreSectionEnabled (exploreSectionOrder : ExploreSectionOrder ): Boolean {
332- return when (exploreSectionOrder){
348+ return when (exploreSectionOrder) {
333349 ExploreSectionOrder .AIRING -> data.map { it[exploreAiringEnabledKey] ? : true }.get()
334350 ExploreSectionOrder .TRENDING -> data.map { it[exploreTrendingEnabledKey] ? : true }.get()
335351 ExploreSectionOrder .POPULAR -> data.map { it[explorePopularEnabledKey] ? : true }.get()
336- ExploreSectionOrder .NEWLY_ADDED -> data.map { it[exploreNewlyAddedEnabledKey] ? : true }.get()
352+ ExploreSectionOrder .NEWLY_ADDED -> data.map { it[exploreNewlyAddedEnabledKey] ? : true }
353+ .get()
354+
337355 ExploreSectionOrder .WATCHING -> data.map { it[exploreWatchingEnabledKey] ? : true }.get()
338356 ExploreSectionOrder .READING -> data.map { it[exploreReadingEnabledKey] ? : true }.get()
339357 }
340358 }
341359
342- suspend fun setExploreSectionEnabled (exploreSectionOrder : ExploreSectionOrder ,enabled : Boolean ){
360+ suspend fun setExploreSectionEnabled (
361+ exploreSectionOrder : ExploreSectionOrder ,
362+ enabled : Boolean
363+ ) {
343364 dataStore.edit {
344- when (exploreSectionOrder){
365+ when (exploreSectionOrder) {
345366 ExploreSectionOrder .AIRING -> it[exploreAiringEnabledKey] = enabled
346367 ExploreSectionOrder .TRENDING -> it[exploreTrendingEnabledKey] = enabled
347368 ExploreSectionOrder .POPULAR -> it[explorePopularEnabledKey] = enabled
@@ -367,16 +388,26 @@ class AppPreferencesDataStore(val dataStore: DataStore<Preferences>) {
367388 }
368389
369390 suspend fun login (mToken : String ) {
370- val userId = JWT (mToken).subject!! .trim().toInt()
391+ val jwtToken = JWT (mToken)
392+ val userId = jwtToken.subject!! .trim().toInt()
393+ val expiresAt =
394+ jwtToken.expiresAt?.time ? : Instant .now().plus(364 , ChronoUnit .DAYS ).toEpochMilli()
395+
371396 dataStore.edit { pref ->
372397 pref[authTokenKey] = mToken
373398 pref[userIdKey] = userId
399+ pref[authTokenExpiresAtKey] = expiresAt
374400 }
375401 }
376402
403+ suspend fun setTokenExpiresAt (token : String ){
404+ tokenExpiresAt.set(JWT (token).expiresAt?.time ? : Instant .now().plus(364 , ChronoUnit .DAYS ).toEpochMilli())
405+ }
406+
377407 suspend fun logout () {
378408 dataStore.edit { pref ->
379409 pref.remove(authTokenKey)
410+ pref.remove(authTokenExpiresAtKey)
380411 pref.remove(userIdKey)
381412 pref.remove(NotificationDataStore .lastShownNotificationIdKey)
382413 pref.remove(displayAdultContentKey)
0 commit comments