1+ package com.texthip.thip.ui.common.alarmpage.screen
2+
3+ import androidx.compose.foundation.background
4+ import androidx.compose.foundation.layout.Arrangement
5+ import androidx.compose.foundation.layout.Column
6+ import androidx.compose.foundation.layout.PaddingValues
7+ import androidx.compose.foundation.layout.Spacer
8+ import androidx.compose.foundation.layout.fillMaxSize
9+ import androidx.compose.foundation.layout.height
10+ import androidx.compose.foundation.layout.padding
11+ import androidx.compose.foundation.lazy.LazyColumn
12+ import androidx.compose.foundation.lazy.items
13+ import androidx.compose.material3.Icon
14+ import androidx.compose.material3.Text
15+ import androidx.compose.runtime.Composable
16+ import androidx.compose.runtime.getValue
17+ import androidx.compose.runtime.mutableStateOf
18+ import androidx.compose.runtime.remember
19+ import androidx.compose.runtime.setValue
20+ import androidx.compose.ui.Alignment
21+ import androidx.compose.ui.Modifier
22+ import androidx.compose.ui.res.painterResource
23+ import androidx.compose.ui.res.stringResource
24+ import androidx.compose.ui.tooling.preview.Preview
25+ import androidx.compose.ui.unit.dp
26+ import com.texthip.thip.R
27+ import com.texthip.thip.ui.common.alarmpage.component.AlarmFilterRow
28+ import com.texthip.thip.ui.common.alarmpage.mock.AlarmItem
29+ import com.texthip.thip.ui.common.cards.CardAlarm
30+ import com.texthip.thip.ui.common.topappbar.DefaultTopAppBar
31+ import com.texthip.thip.ui.theme.ThipTheme
32+ import com.texthip.thip.ui.theme.ThipTheme.colors
33+ import com.texthip.thip.ui.theme.ThipTheme.typography
34+
35+ @Composable
36+ fun AlarmScreen (
37+ alarmItems : List <AlarmItem >, onCardClick : (AlarmItem ) -> Unit = {}
38+ ) {
39+ var selectedStates by remember { mutableStateOf(booleanArrayOf(false , false )) }
40+ var alarms by remember { mutableStateOf(alarmItems) }
41+
42+ val filteredList = when {
43+ selectedStates[0 ] && ! selectedStates[1 ] -> alarms.filter { it.badgeText == stringResource(R .string.alarm_feed) }
44+ ! selectedStates[0 ] && selectedStates[1 ] -> alarms.filter { it.badgeText == stringResource(R .string.alarm_group) }
45+ else -> alarms
46+ }
47+
48+ Column (
49+ Modifier
50+ .fillMaxSize()
51+ ) {
52+ DefaultTopAppBar (
53+ title = stringResource(R .string.alarm_string),
54+ onLeftClick = {},
55+ )
56+ Column (
57+ Modifier
58+ .fillMaxSize()
59+ .padding(horizontal = 20 .dp)
60+ ) {
61+ Spacer (modifier = Modifier .height(20 .dp))
62+ AlarmFilterRow (
63+ selectedStates = selectedStates, onToggle = { idx ->
64+ selectedStates = selectedStates.copyOf().also { it[idx] = ! it[idx] }
65+ })
66+ Spacer (modifier = Modifier .height(20 .dp))
67+
68+ if (filteredList.isEmpty()) {
69+
70+ Column (
71+ modifier = Modifier .fillMaxSize(),
72+ verticalArrangement = Arrangement .Center ,
73+ horizontalAlignment = Alignment .CenterHorizontally
74+ ) {
75+ Icon (
76+ painter = painterResource(R .drawable.ic_notification),
77+ contentDescription = null ,
78+ tint = colors.Grey02 ,
79+ )
80+ Spacer (modifier = Modifier .height(12 .dp))
81+ Text (
82+ text = stringResource(R .string.alarm_notification_comment),
83+ style = typography.smalltitle_sb600_s16_h20,
84+ color = colors.Grey01
85+ )
86+ }
87+ } else {
88+ LazyColumn (
89+ verticalArrangement = Arrangement .spacedBy(20 .dp),
90+ contentPadding = PaddingValues (bottom = 20 .dp),
91+ modifier = Modifier .fillMaxSize()
92+ ) {
93+ items(filteredList, key = { it.id }) { alarm ->
94+ CardAlarm (
95+ badgeText = alarm.badgeText,
96+ title = alarm.title,
97+ message = alarm.message,
98+ timeAgo = alarm.timeAgo,
99+ isRead = alarm.isRead,
100+ onClick = {
101+ alarms = alarms.map {
102+ if (it.id == alarm.id) it.copy(isRead = true ) else it
103+ }
104+ })
105+ }
106+ }
107+ }
108+ }
109+ }
110+ }
111+
112+
113+ @Preview(showBackground = true )
114+ @Composable
115+ fun AlarmScreenPreview () {
116+ ThipTheme {
117+ AlarmScreen (
118+ alarmItems = listOf (
119+ AlarmItem (1 , " 피드" , " 내 글을 좋아합니다." , " user123님이 내 글에 좋아요를 눌렀어요." , " 2" , false ),
120+ AlarmItem (2 , " 모임" , " 같이 읽기를 시작했어요!" , " 모임방에서 20분 동안 같이 읽기가 시작되었어요!" , " 7" , false ),
121+ AlarmItem (3 , " 피드" , " 내 글에 댓글이 달렸어요." , " user1: 진짜 공감합니다!" , " 2025.01.12" , true ),
122+ AlarmItem (4 , " 모임" , " 투표가 시작되었어요!" , " 투표지를 먼저 열람합니다." , " 17" , false )
123+ )
124+ )
125+ }
126+ }
127+
128+ @Preview(showBackground = true )
129+ @Composable
130+ fun AlarmScreenEmptyPreview () {
131+ ThipTheme {
132+ AlarmScreen (
133+ alarmItems = emptyList()
134+ )
135+ }
136+ }
0 commit comments