Skip to content

Commit

Permalink
알림 페이지 리팩토링 (#380)
Browse files Browse the repository at this point in the history
  • Loading branch information
plgafhd authored Feb 4, 2025
1 parent b6a8eb9 commit 104a59f
Show file tree
Hide file tree
Showing 9 changed files with 231 additions and 110 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.wafflestudio.snutt2.data.notifications

import androidx.paging.PagingData
import com.wafflestudio.snutt2.lib.network.dto.core.NotificationDto
import com.wafflestudio.snutt2.domainmodel.Notification
import kotlinx.coroutines.flow.Flow

interface NotificationRepository {

suspend fun getNotificationResultStream(): Flow<PagingData<NotificationDto>>
fun getNotificationListStream(): Flow<PagingData<Notification>>

suspend fun getNotificationCount(): Long
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,30 @@ package com.wafflestudio.snutt2.data.notifications
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.map
import com.wafflestudio.snutt2.domainmodel.Notification
import com.wafflestudio.snutt2.domainmodel.domainModel
import com.wafflestudio.snutt2.lib.network.SNUTTRestApi
import com.wafflestudio.snutt2.lib.network.dto.core.NotificationDto
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class NotificationRepositoryImpl @Inject constructor(private val api: SNUTTRestApi) :
NotificationRepository {
override suspend fun getNotificationResultStream(): Flow<PagingData<NotificationDto>> {
override fun getNotificationListStream(): Flow<PagingData<Notification>> {
return Pager(
config = PagingConfig(
pageSize = NOTIFICATIONS_LOAD_PAGE_SIZE,
enablePlaceholders = false,
),
pagingSourceFactory = { NotificationPagingSource(api) },
).flow
).flow.map { pagingData ->
pagingData.map { notification ->
notification.domainModel()
}
}
}

override suspend fun getNotificationCount(): Long {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.wafflestudio.snutt2.domainmodel

import com.wafflestudio.snutt2.lib.data.SNUTTStringUtils
import com.wafflestudio.snutt2.lib.network.dto.core.NotificationDto
import java.util.Date

data class Notification(
val title: String,
val message: String,
val createdAt: Date,
val type: NotificationType,
val deeplink: String?,
)

enum class NotificationType {
Warning,
Calendar,
RefreshTime,
Trash,
Vacancy,
Friend,
Megaphone,
}

fun NotificationDto.domainModel() = Notification(
title = title,
message = message,
createdAt = SNUTTStringUtils.getDateFromString(createdAt),
type = when (type) {
0 -> NotificationType.Warning
1 -> NotificationType.Calendar
2 -> NotificationType.RefreshTime
3 -> NotificationType.Trash
4 -> NotificationType.Vacancy
5 -> NotificationType.Friend
else -> NotificationType.Megaphone
},
deeplink = deeplink,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.wafflestudio.snutt2.lib.data

import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

object DateFormatter {
// Full Pattern: 서버 응답 형태로, ms 단위까지 표현되어 있는 패턴
private const val FULLPATTERN: String = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

private val threadLocalFullFormatter = object : ThreadLocal<SimpleDateFormat>() {
override fun initialValue(): SimpleDateFormat {
return SimpleDateFormat(FULLPATTERN, Locale.getDefault())
}
}

fun parseFull(dateString: String): Date {
return threadLocalFullFormatter.get()?.parse(dateString) ?: Date()
}

// Date Pattern: UI 표현 중 하나로, 날짜만 표기되어 있는 패턴
private const val DATEPATTERN: String = "yyyy/MM/dd"

private val threadLocalDateFormatter = object : ThreadLocal<SimpleDateFormat>() {
override fun initialValue(): SimpleDateFormat {
return SimpleDateFormat(DATEPATTERN, Locale.getDefault())
}
}

fun formatDate(date: Date): String {
return threadLocalDateFormatter.get()?.format(date) ?: ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@ import com.wafflestudio.snutt2.R
import com.wafflestudio.snutt2.SNUTTUtils
import com.wafflestudio.snutt2.lib.network.dto.core.ClassTimeDto
import com.wafflestudio.snutt2.lib.network.dto.core.LectureDto
import com.wafflestudio.snutt2.lib.network.dto.core.NotificationDto
import com.wafflestudio.snutt2.lib.network.dto.core.TableDto
import com.wafflestudio.snutt2.model.SearchTimeDto
import timber.log.Timber
import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.TimeUnit

object SNUTTStringUtils {
fun getFullSemester(tableDto: TableDto): String {
Expand Down Expand Up @@ -77,34 +75,36 @@ object SNUTTStringUtils {
return text.toString()
}

fun getNotificationTime(context: Context, info: NotificationDto): String {
fun getDateFromString(data: String): Date {
try {
val format: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
format.timeZone = TimeZone.getTimeZone("UTC")
val date1 = format.parse(info.createdAt) ?: Date()
val date2 = Date()

val diff = date2.time - date1.time
val hours = diff / (1000 * 60 * 60)
val minutes = diff / (1000 * 60)
val days = hours / 24
return when {
days > 0 -> {
SimpleDateFormat("yyyy/MM/dd").format(date1)
}
hours > 0 -> {
context.getString(R.string.time_hours_ago, hours)
}
minutes > 0 -> {
context.getString(R.string.time_minutes_ago, minutes)
}
else -> {
context.getString(R.string.time_now)
}
}
return DateFormatter.parseFull(data)
} catch (e: ParseException) {
Timber.e("notification created time parse error!")
return ""
return Date()
}
}

fun getNotificationTimeFromDate(context: Context, date: Date): String {
val now = Date()

val diffInMillis = now.time - date.time
val minutes = TimeUnit.MILLISECONDS.toMinutes(diffInMillis)
val hours = TimeUnit.MILLISECONDS.toHours(diffInMillis)
val days = TimeUnit.MILLISECONDS.toDays(diffInMillis)

return when {
days > 0 -> {
DateFormatter.formatDate(date)
}
hours > 0 -> {
context.getString(R.string.time_hours_ago, hours)
}
minutes > 0 -> {
context.getString(R.string.time_minutes_ago, minutes)
}
else -> {
context.getString(R.string.time_now)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ import com.wafflestudio.snutt2.views.logged_in.lecture_detail.LectureColorSelect
import com.wafflestudio.snutt2.views.logged_in.lecture_detail.LectureDetailPage
import com.wafflestudio.snutt2.views.logged_in.lecture_detail.LectureDetailViewModel
import com.wafflestudio.snutt2.views.logged_in.lecture_detail.deeplink.TimetableLectureDetailPage
import com.wafflestudio.snutt2.views.logged_in.notifications.NotificationPage
import com.wafflestudio.snutt2.views.logged_in.notifications.NotificationRoute
import com.wafflestudio.snutt2.views.logged_in.table_lectures.LecturesOfTablePage
import com.wafflestudio.snutt2.views.logged_in.vacancy_noti.VacancyPage
import com.wafflestudio.snutt2.views.logged_in.vacancy_noti.VacancyViewModel
Expand Down Expand Up @@ -258,7 +258,7 @@ class RootActivity : AppCompatActivity() {

composable2(NavigationDestination.ImportantNotice) { ImportantNoticePage() }

composable2(NavigationDestination.Notification) { NotificationPage() }
composable2(NavigationDestination.Notification) { NotificationRoute() }

composable2(NavigationDestination.LecturesOfTable) { LecturesOfTablePage() }

Expand Down
Loading

0 comments on commit 104a59f

Please sign in to comment.