Skip to content

Commit 9a5471d

Browse files
authored
[FEAT/#1633] SP3 앰플리튜드 개선 -솝탬프 (#1637)
* [FEAT/#1633] 솝탬프 앰플리튜드 구조 * [FEAT/#1633] 솝탬프 네비게이션 수종 * [FEAT/#1633] 솝탬프 앰플리튜드 적용 * [FEAT/#1633] 코드리뷰 반영
1 parent 0a99d2b commit 9a5471d

9 files changed

Lines changed: 99 additions & 54 deletions

File tree

feature/main/src/main/java/org/sopt/official/feature/main/MainScreen.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ fun MainScreen(
343343
soptampNavGraph(
344344
navController = navigator.navController,
345345
tracker = tracker,
346+
userStatus = userStatus,
346347
currentIntent = intentState
347348
)
348349

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.sopt.official.stamp
2+
3+
import org.sopt.official.analytics.AnalyticsEvent
4+
import org.sopt.official.analytics.EventType
5+
6+
enum class SoptampAnalyticsEvent(
7+
override val type: EventType,
8+
override val eventName: String
9+
) : AnalyticsEvent {
10+
VIEW_SOPTAMP(EventType.VIEW, "soptamp"),
11+
CLICK_UPDATE_CLAP(EventType.CLICK, "update_clap"),
12+
CLICK_GET_IMAGE_ZOOM(EventType.CLICK, "get_image_zoom"),
13+
CLICK_FEED_MISSION(EventType.CLICK, "feed_mission"),
14+
VIEW_ALLRANKING(EventType.VIEW, "allranking"),
15+
VIEW_PARTRANKING(EventType.VIEW, "partranking"),
16+
CLICK_ALLRANKING_MYRANKING(EventType.CLICK, "allranking_myranking"),
17+
CLICK_PARTRANKING_MYRANKING(EventType.CLICK, "partranking_myranking"),
18+
CLICK_CLAPPERLIST(EventType.CLICK, "clapperlist"),
19+
}

feature/soptamp/src/main/java/org/sopt/official/stamp/SoptampEntryRoute.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.firstOrNull
3535
import org.sopt.official.analytics.Tracker
3636
import org.sopt.official.analytics.compose.ProvideTracker
3737
import org.sopt.official.designsystem.SoptTheme
38+
import org.sopt.official.model.UserStatus
3839
import org.sopt.official.stamp.feature.navigation.MissionDetail
3940
import org.sopt.official.stamp.feature.navigation.PartRanking
4041
import org.sopt.official.stamp.feature.navigation.Ranking

feature/soptamp/src/main/java/org/sopt/official/stamp/feature/mission/detail/MissionDetailScreen.kt

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,18 @@ import com.airbnb.lottie.compose.animateLottieCompositionAsState
6565
import com.airbnb.lottie.compose.rememberLottieComposition
6666
import kotlinx.collections.immutable.persistentListOf
6767
import kotlinx.coroutines.delay
68-
import org.sopt.official.analytics.EventType
6968
import org.sopt.official.analytics.compose.LocalTracker
69+
import org.sopt.official.analytics.trackViewType
7070
import org.sopt.official.designsystem.SoptTheme
7171
import org.sopt.official.designsystem.component.dialog.NetworkErrorDialog
7272
import org.sopt.official.domain.soptamp.MissionLevel
7373
import org.sopt.official.domain.soptamp.fake.FakeImageUploaderRepository
7474
import org.sopt.official.domain.soptamp.fake.FakeStampRepository
7575
import org.sopt.official.domain.soptamp.fake.FakeUserRepository
76+
import org.sopt.official.model.UserStatus
77+
import org.sopt.official.model.toViewType
7678
import org.sopt.official.stamp.R
79+
import org.sopt.official.stamp.SoptampAnalyticsEvent
7780
import org.sopt.official.stamp.designsystem.component.button.SoptampButton
7881
import org.sopt.official.stamp.designsystem.component.dialog.DoubleOptionDialog
7982
import org.sopt.official.stamp.designsystem.component.toolbar.Toolbar
@@ -98,6 +101,7 @@ import org.sopt.official.stamp.util.DefaultPreview
98101
internal fun MissionDetailScreen(
99102
args: MissionNavArgs,
100103
navController: NavController,
104+
userStatus: UserStatus,
101105
modifier: Modifier = Modifier,
102106
viewModel: MissionDetailViewModel = hiltViewModel(),
103107
) {
@@ -140,6 +144,7 @@ internal fun MissionDetailScreen(
140144
val scrollState = rememberScrollState()
141145

142146
val tracker = LocalTracker.current
147+
val viewType = userStatus.toViewType()
143148
val snackBarHostState = remember { SnackbarHostState() }
144149

145150
LaunchedEffect(Unit) {
@@ -256,16 +261,7 @@ internal fun MissionDetailScreen(
256261
onClickZoomIn = { url ->
257262
isZoomInDialogOpen = true
258263
selectedZoomInImage = url
259-
tracker.track(
260-
type = EventType.CLICK,
261-
name = "get_image_zoom",
262-
properties = mapOf(
263-
"image" to url,
264-
"stampId" to uiState.stampId,
265-
"missionId" to id,
266-
"nickname" to myNickname
267-
)
268-
)
264+
tracker.trackViewType(SoptampAnalyticsEvent.CLICK_GET_IMAGE_ZOOM, viewType)
269265
},
270266
)
271267
Spacer(modifier = Modifier.height(8.dp))
@@ -315,6 +311,7 @@ internal fun MissionDetailScreen(
315311
SoptampButton(
316312
text = "누가 박수쳤을까요?",
317313
onClicked = {
314+
tracker.trackViewType(SoptampAnalyticsEvent.CLICK_CLAPPERLIST, viewType)
318315
isClapUserListOpen = true
319316
viewModel.getStampClappers(stampId = uiState.stampId)
320317
},
@@ -330,18 +327,7 @@ internal fun MissionDetailScreen(
330327
myClapCount = myClapCount,
331328
isBadgeVisible = isBadgeVisible,
332329
onPressClap = {
333-
tracker.track(
334-
type = EventType.CLICK,
335-
name = "update_clap",
336-
properties = mapOf(
337-
"stampId" to uiState.stampId,
338-
"missionId" to id,
339-
"appliedCount" to appliedCount,
340-
"totalClapCount" to totalClapCount,
341-
"clappersNick" to myNickname,
342-
"receiverNick" to nickname
343-
)
344-
)
330+
tracker.trackViewType(SoptampAnalyticsEvent.CLICK_UPDATE_CLAP, viewType)
345331
viewModel.onPressClap()
346332
},
347333
)
@@ -435,7 +421,8 @@ fun MissionDetailPreview() {
435421
MissionDetailScreen(
436422
args = args,
437423
navController = PreviewNavController(context),
438-
viewModel = fakeViewModel
424+
viewModel = fakeViewModel,
425+
userStatus = UserStatus.ACTIVE
439426
)
440427
}
441428
}

feature/soptamp/src/main/java/org/sopt/official/stamp/feature/mission/list/MissionListScreen.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,16 @@ import kotlinx.collections.immutable.persistentListOf
7474
import kotlinx.collections.immutable.toImmutableList
7575
import org.sopt.official.analytics.EventType
7676
import org.sopt.official.analytics.compose.LocalTracker
77+
import org.sopt.official.analytics.trackViewType
7778
import org.sopt.official.common.navigator.DeepLinkType
7879
import org.sopt.official.designsystem.SoptTheme
7980
import org.sopt.official.designsystem.component.dialog.NetworkErrorDialog
8081
import org.sopt.official.domain.soptamp.MissionLevel
8182
import org.sopt.official.domain.soptamp.error.Error
83+
import org.sopt.official.model.UserStatus
84+
import org.sopt.official.model.toViewType
8285
import org.sopt.official.stamp.R
86+
import org.sopt.official.stamp.SoptampAnalyticsEvent
8387
import org.sopt.official.stamp.designsystem.component.button.SoptampIconButton
8488
import org.sopt.official.stamp.designsystem.component.button.SoptampSegmentedFloatingButton
8589
import org.sopt.official.stamp.designsystem.component.layout.LoadingScreen
@@ -100,6 +104,7 @@ import org.sopt.official.webview.view.WebViewActivity
100104
fun MissionListScreen(
101105
nickname: String,
102106
generation: Int,
107+
userStatus: UserStatus,
103108
missionListUiModel: MissionListUiModel,
104109
menuTexts: ImmutableList<String>,
105110
onMenuClick: (String) -> Unit = {},
@@ -154,7 +159,8 @@ fun MissionListScreen(
154159
onMissionItemClick = onMissionItemClick,
155160
isMe = true,
156161
nickname = nickname,
157-
myName = "" // 나의 미션인 경우 nickName = myNam
162+
myName = "" ,// 나의 미션인 경우 nickName = myNam
163+
userStatus = userStatus
158164
)
159165
}
160166
}
@@ -164,13 +170,18 @@ fun MissionListScreen(
164170
@Composable
165171
fun MissionsGridComponent(
166172
missions: ImmutableList<MissionUiModel>,
173+
userStatus: UserStatus,
167174
onMissionItemClick: (item: MissionNavArgs) -> Unit = {},
168175
isMe: Boolean = true,
169176
myName: String,
170177
entrySource: String? = null,
171178
nickname: String
172179
) {
173180
val tracker = LocalTracker.current
181+
val viewType = userStatus.toViewType()
182+
183+
184+
174185

175186
LazyVerticalGrid(
176187
columns = GridCells.Fixed(2),
@@ -185,18 +196,7 @@ fun MissionsGridComponent(
185196
onMissionItemClick(missionUiModel.toArgs(isMe, nickname))
186197
},
187198
onMissionItemClickTricked = {
188-
tracker.track(
189-
type = EventType.CLICK,
190-
name = "click_feed_mission",
191-
properties = mapOf(
192-
"entrySource" to entrySource,
193-
"feedOwnerNick" to nickname,
194-
"viewerNick" to myName,
195-
"missionId" to missionUiModel.id,
196-
"missionTitle" to missionUiModel.title,
197-
"missionLevel" to missionUiModel.level
198-
)
199-
)
199+
tracker.trackViewType(SoptampAnalyticsEvent.CLICK_FEED_MISSION, viewType)
200200
}
201201
)
202202
}
@@ -400,7 +400,8 @@ fun PreviewMissionListScreen() {
400400
MissionListScreen(
401401
nickname = "Nunu",
402402
generation = 35,
403-
missionListUiModel,
403+
userStatus = UserStatus.ACTIVE,
404+
missionListUiModel = missionListUiModel,
404405
persistentListOf("전체 미션", "완료 미션", "미완료 미션"),
405406
)
406407
}
@@ -440,6 +441,7 @@ fun MissionListScreenNew(
440441
val missionListUiModel = (state as MissionsState.Success).missionListUiModel
441442
MissionListScreen(
442443
nickname = nickname,
444+
userStatus = userStatus,
443445
generation = generation,
444446
missionListUiModel = missionListUiModel,
445447
menuTexts = persistentListOf("전체 미션", "완료 미션", "미완료 미션"),

feature/soptamp/src/main/java/org/sopt/official/stamp/feature/mission/list/UserMissionListScreen.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import kotlinx.collections.immutable.toImmutableList
4848
import org.sopt.official.common.util.throttledNoRippleClickable
4949
import org.sopt.official.designsystem.SoptTheme
5050
import org.sopt.official.domain.soptamp.MissionLevel
51+
import org.sopt.official.model.UserStatus
5152
import org.sopt.official.stamp.R
5253
import org.sopt.official.stamp.designsystem.component.topappbar.SoptTopAppBar
5354
import org.sopt.official.stamp.feature.mission.model.MissionListUiModel
@@ -62,6 +63,7 @@ fun UserMissionListScreen(
6263
description: String,
6364
missionListUiModel: MissionListUiModel,
6465
isMe: Boolean,
66+
userStatus: UserStatus,
6567
onMissionItemClick: (item: MissionNavArgs) -> Unit = {},
6668
onClickBack: () -> Unit = {},
6769
) {
@@ -97,6 +99,7 @@ fun UserMissionListScreen(
9799
myName = myName,
98100
entrySource = entrySource,
99101
nickname = userName,
102+
userStatus = userStatus
100103
)
101104
}
102105
}
@@ -218,6 +221,7 @@ fun PreviewUserMissionListScreen() {
218221
),
219222
),
220223
isMe = false,
224+
userStatus = UserStatus.ACTIVE
221225
)
222226
}
223227
}

feature/soptamp/src/main/java/org/sopt/official/stamp/feature/navigation/SoptampNavGraph.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.navigation.toRoute
3333
import kotlinx.serialization.Serializable
3434
import org.sopt.official.analytics.Tracker
3535
import org.sopt.official.core.navigation.MainTabRoute
36+
import org.sopt.official.model.UserStatus
3637
import org.sopt.official.stamp.SoptampEntryRoute
3738

3839
@Serializable
@@ -53,6 +54,7 @@ data class SoptampMissionArgs(
5354
fun NavGraphBuilder.soptampNavGraph(
5455
navController: NavController,
5556
tracker: Tracker,
57+
userStatus: UserStatus,
5658
currentIntent: Intent?,
5759
) {
5860
navigation<SoptampGraph>(
@@ -64,32 +66,32 @@ fun NavGraphBuilder.soptampNavGraph(
6466
tracker = tracker,
6567
currentIntent = currentIntent,
6668
content = {
67-
MissionListScreenRoute(navController)
69+
MissionListScreenRoute(navController, userStatus)
6870
}
6971
)
7072
}
7173

7274
composable<MissionDetail> { backStackEntry ->
7375
val args = backStackEntry.toRoute<MissionDetail>()
74-
MissionDetailScreenRoute(args, navController)
76+
MissionDetailScreenRoute(args, userStatus,navController)
7577
}
7678

7779
composable<Ranking> { backStackEntry ->
7880
val args = backStackEntry.toRoute<Ranking>()
79-
RankingScreenRoute(args, navController)
81+
RankingScreenRoute(args, navController, userStatus)
8082
}
8183

8284
composable<PartRanking> {
83-
PartRankingScreenRoute(navController)
85+
PartRankingScreenRoute(navController, userStatus)
8486
}
8587

8688
composable<UserMissionList> { backStackEntry ->
8789
val args = backStackEntry.toRoute<UserMissionList>()
88-
UserMissionListScreenRoute(args, navController)
90+
UserMissionListScreenRoute(args, userStatus, navController)
8991
}
9092

9193
composable<Onboarding> {
9294
OnboardingScreenRoute(navController)
9395
}
9496
}
95-
}
97+
}

0 commit comments

Comments
 (0)