Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<queries>
<package android:name="com.kakao.talk" />
</queries>

<application
android:name=".MyApp"
android:allowBackup="true"
Expand All @@ -33,6 +37,8 @@
<data
android:host="oauth"
android:scheme="kakao${NATIVE_APP_KEY}" />

<data android:host="kakaolink" />
</intent-filter>
</activity>

Expand Down
1 change: 1 addition & 0 deletions core/designsystem/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ dependencies {
implementation(libs.lottie)
implementation(libs.coil.compose)
implementation(libs.coil.network.okhttp)
implementation(libs.kakao.share)
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ import com.terning.core.designsystem.theme.White
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TerningBasicTopAppBar(
modifier: Modifier = Modifier,
title: String = "",
modifier: Modifier,
showBackButton: Boolean = false,
actions: List<@Composable () -> Unit> = emptyList(),
onBackButtonClick: () -> Unit = {},
) {
CenterAlignedTopAppBar(
modifier = modifier,
title = {
Text(
text = title,
Expand Down Expand Up @@ -56,7 +57,7 @@ fun TerningBasicTopAppBar(
}
},
actions = {
actions.drop(1).forEach { action ->
actions.forEach { action ->
action()
}
},
Expand Down

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

멋있따!

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.terning.core.designsystem.util

import android.content.Context
import android.content.Intent
import androidx.browser.customtabs.CustomTabsIntent
import com.kakao.sdk.share.ShareClient
import com.kakao.sdk.share.WebSharerClient
import dagger.hilt.android.qualifiers.ApplicationContext
import timber.log.Timber
import javax.inject.Inject

class KakaoUtil @Inject constructor(
@ApplicationContext private val context: Context
) {
private val templateId = 118600L

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 templateId는 무슨 기준으로 넣는건가요?? 단순 궁금증ㅎ

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

카카오 공유하기 메시지를 커스텀으로 만들때 식별하는 ID인데 일단 임의로 넣어둔 값이고 지금은 의미가 없어서 ㅜㅜ 다음 feature에서 유동적으로 수정하려고 합니당!


fun shareToKakaoTalk(templateArgs: Map<String, String>) {
if (ShareClient.instance.isKakaoTalkSharingAvailable(context)) {
ShareClient.instance.shareCustom(
context,
templateId,
templateArgs
) { sharingResult, error ->
if (error != null) {
Timber.e("카카오톡 공유 실패: ${error.message}")
} else if (sharingResult != null) {
context.startActivity(sharingResult.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
}
}
} else {
val sharerUrl = WebSharerClient.instance.makeCustomUrl(templateId, templateArgs)
try {
val intent = CustomTabsIntent.Builder().build().intent
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.data = sharerUrl
context.startActivity(intent)
} catch (e: Exception) {
Timber.e("웹 공유 실패: ${e.message}")
}

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
Expand All @@ -27,16 +29,14 @@ import androidx.navigation.NavHostController
import com.terning.core.analytics.EventType
import com.terning.core.analytics.LocalTracker
import com.terning.core.designsystem.component.topappbar.BackButtonTopAppBar
import com.terning.core.designsystem.extension.customShadow
import com.terning.core.designsystem.extension.noRippleClickable
import com.terning.core.designsystem.extension.toast
import com.terning.core.designsystem.state.UiState
import com.terning.core.designsystem.theme.CalRed
import com.terning.core.designsystem.theme.Grey200
import com.terning.core.designsystem.theme.Grey400
import com.terning.core.designsystem.theme.TerningTheme
import com.terning.core.designsystem.theme.White
import com.terning.domain.intern.entity.InternInfo
import com.terning.domain.intern.entity.InternInfo.Companion.EMPTY_INTERN
import com.terning.feature.dialog.cancel.ScrapCancelDialog
import com.terning.feature.dialog.detail.ScrapDialog
import com.terning.feature.intern.component.InternBottomBar
Expand Down Expand Up @@ -68,42 +68,51 @@ fun InternRoute(
viewModel.sideEffect.flowWithLifecycle(lifecycle = lifecycleOwner.lifecycle)
.collect { sideEffect ->
when (sideEffect) {
is InternViewSideEffect.ShowToast -> context.toast(sideEffect.message)
is InternSideEffect.Toast -> context.toast(sideEffect.message)
}
}
}


val internInfo = (internState.loadState as? UiState.Success<InternInfo>)?.data ?: EMPTY_INTERN

InternScreen(
announcementId = announcementId,
internUiState = internState,
internInfo = internInfo,
navController = navController,
onDismissCancelDialog = {
with(viewModel) {
updateScrapCancelDialogVisibility(false)
getInternInfo(announcementId)
}
},
onDismissScrapDialog = {
with(viewModel) {
updateInternDialogVisibility(false)
getInternInfo(announcementId)
}
},
onClickCancelButton = {
viewModel.updateScrapCancelDialogVisibility(true)
},
onClickScrapButton = {
amplitudeTracker.track(
type = EventType.CLICK,
name = "detail_scrap"
when (internState.loadState) {
UiState.Loading -> {}
UiState.Empty -> {}
is UiState.Failure -> {}
is UiState.Success -> {
InternScreen(
announcementId = announcementId,
internUiState = internState,
internInfo = (internState.loadState as UiState.Success).data,
navController = navController,
onClickShareButton = {
viewModel.onKakaoShareClicked(
(internState.loadState as UiState.Success).data
)
},
onDismissCancelDialog = {
with(viewModel) {
updateScrapCancelDialogVisibility(false)
getInternInfo(announcementId)
}
},
onDismissScrapDialog = {
with(viewModel) {
updateInternDialogVisibility(false)
getInternInfo(announcementId)
}
},
onClickCancelButton = {
viewModel.updateScrapCancelDialogVisibility(true)
},
onClickScrapButton = {
amplitudeTracker.track(
type = EventType.CLICK,
name = "detail_scrap"
)
viewModel.updateInternDialogVisibility(true)
}
)
viewModel.updateInternDialogVisibility(true)
}
)
}
}

@Composable
Expand All @@ -113,6 +122,7 @@ fun InternScreen(
navController: NavHostController,
internUiState: InternUiState,
internInfo: InternInfo,
onClickShareButton: () -> Unit,
onDismissCancelDialog: (Boolean) -> Unit,
onDismissScrapDialog: (Boolean) -> Unit,
onClickCancelButton: (InternInfo) -> Unit,
Expand Down Expand Up @@ -151,13 +161,20 @@ fun InternScreen(
) {
BackButtonTopAppBar(
title = stringResource(id = R.string.intern_top_app_bar_title),
modifier = Modifier.customShadow(
color = Grey200,
offsetY = 2.dp
),
onBackButtonClick = {
navController.popBackStack()
},
actions = listOf {
Icon(
painter = painterResource(id = R.drawable.ic_share_32),
contentDescription = null,
modifier = Modifier
.padding(end = 8.dp)
.noRippleClickable(
onClick = onClickShareButton
)
)
}
)

LazyColumn(
Expand Down Expand Up @@ -289,4 +306,4 @@ fun InternScreen(
)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.terning.feature.intern

import androidx.annotation.StringRes

sealed class InternSideEffect {
data class Toast(@StringRes val message: Int) :
InternSideEffect()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package com.terning.feature.intern
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.terning.core.designsystem.state.UiState
import com.terning.core.designsystem.util.KakaoUtil
import com.terning.domain.intern.entity.InternInfo
import com.terning.domain.intern.repository.InternRepository
import com.terning.feature.intern.model.InternUiState
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -17,12 +19,13 @@ import javax.inject.Inject
@HiltViewModel
class InternViewModel @Inject constructor(
private val internRepository: InternRepository,
private val kakaoUtil: KakaoUtil
) : ViewModel() {

private val _internUiState = MutableStateFlow(InternUiState())
val internUiState get() = _internUiState.asStateFlow()

private val _sideEffect: MutableSharedFlow<InternViewSideEffect> = MutableSharedFlow()
private val _sideEffect: MutableSharedFlow<InternSideEffect> = MutableSharedFlow()
val sideEffect = _sideEffect.asSharedFlow()

fun getInternInfo(id: Long) {
Expand All @@ -37,7 +40,7 @@ class InternViewModel @Inject constructor(
_internUiState.value = _internUiState.value.copy(
loadState = UiState.Failure(exception.toString())
)
_sideEffect.emit(InternViewSideEffect.ShowToast(R.string.server_failure))
_sideEffect.emit(InternSideEffect.Toast(R.string.server_failure))
}
}
}
Expand All @@ -63,4 +66,18 @@ class InternViewModel @Inject constructor(
it.copy(showWeb = show)
}
}

fun onKakaoShareClicked(
internInfo: InternInfo
) {
val templateArgs = mapOf(
"COMPANY_IMG" to internInfo.companyImage,
"TITLE" to internInfo.title,
"DEADLINE" to internInfo.deadline,
"START_DATE" to internInfo.startYearMonth,
"PERIOD" to internInfo.workingPeriod,
"REGI_WEB_DOMAIN" to internInfo.url
)
kakaoUtil.shareToKakaoTalk(templateArgs)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.terning.feature.intern

import androidx.annotation.StringRes

sealed class InternViewSideEffect {
data class ShowToast(@StringRes val message: Int) :
data class Toast(@StringRes val message: Int) :
InternViewSideEffect()
}
10 changes: 0 additions & 10 deletions feature/intern/src/main/res/drawable/ic_intern_share_22.xml

This file was deleted.

9 changes: 9 additions & 0 deletions feature/intern/src/main/res/drawable/ic_share_32.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M12.71,11.71L15,9.41V19C15,19.265 15.105,19.52 15.293,19.707C15.48,19.895 15.735,20 16,20C16.265,20 16.52,19.895 16.707,19.707C16.895,19.52 17,19.265 17,19V9.41L19.29,11.71C19.383,11.804 19.494,11.878 19.615,11.929C19.737,11.98 19.868,12.006 20,12.006C20.132,12.006 20.263,11.98 20.385,11.929C20.506,11.878 20.617,11.804 20.71,11.71C20.804,11.617 20.878,11.506 20.929,11.385C20.98,11.263 21.006,11.132 21.006,11C21.006,10.868 20.98,10.737 20.929,10.615C20.878,10.494 20.804,10.383 20.71,10.29L16.71,6.29C16.615,6.199 16.503,6.128 16.38,6.08C16.136,5.98 15.863,5.98 15.62,6.08C15.497,6.128 15.385,6.199 15.29,6.29L11.29,10.29C11.197,10.383 11.123,10.494 11.072,10.616C11.022,10.738 10.996,10.868 10.996,11C10.996,11.132 11.022,11.262 11.072,11.384C11.123,11.506 11.197,11.617 11.29,11.71C11.383,11.803 11.494,11.877 11.616,11.928C11.738,11.978 11.868,12.004 12,12.004C12.132,12.004 12.262,11.978 12.384,11.928C12.506,11.877 12.617,11.803 12.71,11.71ZM25,16C24.735,16 24.48,16.105 24.293,16.293C24.105,16.48 24,16.735 24,17V23C24,23.265 23.895,23.52 23.707,23.707C23.52,23.895 23.265,24 23,24H9C8.735,24 8.48,23.895 8.293,23.707C8.105,23.52 8,23.265 8,23V17C8,16.735 7.895,16.48 7.707,16.293C7.52,16.105 7.265,16 7,16C6.735,16 6.48,16.105 6.293,16.293C6.105,16.48 6,16.735 6,17V23C6,23.796 6.316,24.559 6.879,25.121C7.441,25.684 8.204,26 9,26H23C23.796,26 24.559,25.684 25.121,25.121C25.684,24.559 26,23.796 26,23V17C26,16.735 25.895,16.48 25.707,16.293C25.52,16.105 25.265,16 25,16Z"
android:fillColor="#373737"/>
</vector>
1 change: 1 addition & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
lottie = { group = "com.airbnb.android", name = "lottie-compose", version.ref = "lottieVersion" }

kakao-user = { group = "com.kakao.sdk", name = "v2-user", version.ref = "kakaoVersion" }
kakao-share = { group = "com.kakao.sdk", name = "v2-share", version.ref = "kakaoVersion" }

process-phoenix = { group = "com.jakewharton", name = "process-phoenix", version.ref = "processPhoenix" }
accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanistSystemuicontroller" }
Expand Down