in shared/src/commonMain/kotlin/org/jetbrains/kotlinconf/screens/AppPrivacyNoticePrompt.kt [56:170]
fun AppPrivacyNoticePrompt(
onRejectNotice: () -> Unit,
onAcceptNotice: () -> Unit,
onAppTermsOfUse: () -> Unit,
confirmationRequired: Boolean,
viewModel: PrivacyNoticeViewModel = koinViewModel(),
) {
var detailsVisible by rememberSaveable { mutableStateOf(false) }
val noticeState by viewModel.state.collectAsStateWithLifecycle()
LaunchedEffect(noticeState) {
if (noticeState is PrivacyNoticeState.Done) {
onAcceptNotice()
}
}
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.background(color = KotlinConfTheme.colors.mainBackground)
.windowInsetsPadding(WindowInsets.safeDrawing)
) {
AnimatedContent(
targetState = detailsVisible,
modifier = Modifier.weight(1f),
transitionSpec = { FadingAnimationSpec }
) { detailsVis ->
if (detailsVis) {
Column {
MainHeaderTitleBar(
stringResource(Res.string.privacy_notice_title),
startContent = {
TopMenuButton(
icon = UiRes.drawable.arrow_left_24,
contentDescription = stringResource(Res.string.privacy_notice_back),
onClick = { detailsVisible = false },
)
}
)
Divider(
thickness = 1.dp,
color = KotlinConfTheme.colors.strokePale,
)
val scrollState = rememberScrollState()
ScrollToTopHandler(scrollState)
MarkdownView(
loadText = {
@OptIn(ExperimentalResourceApi::class)
Res.readBytes("files/app-privacy-notice.md")
},
modifier = Modifier.padding(horizontal = 12.dp).verticalScroll(scrollState),
onCustomUriClick = { uri ->
if (uri == "app-terms.md") {
onAppTermsOfUse()
}
},
)
Spacer(Modifier.weight(1f))
Divider(
thickness = 1.dp,
color = KotlinConfTheme.colors.strokePale,
)
}
} else {
Column(
verticalArrangement = Arrangement.spacedBy(24.dp),
modifier = Modifier
.padding(horizontal = 12.dp, vertical = 16.dp)
.verticalScroll(rememberScrollState())
) {
Image(
imageVector = vectorResource(Res.drawable.kodee_privacy),
contentDescription = null,
modifier = Modifier.fillMaxWidth()
.size(160.dp)
)
Text(
stringResource(Res.string.privacy_notice_title),
style = KotlinConfTheme.typography.h1
)
Text(
stringResource(Res.string.privacy_notice_description),
color = KotlinConfTheme.colors.longText,
)
Action(
stringResource(Res.string.privacy_notice_read_action),
icon = UiRes.drawable.arrow_right_24,
size = ActionSize.Large,
enabled = true,
onClick = { detailsVisible = true }
)
}
Spacer(Modifier.weight(1f))
}
}
Row(
horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.padding(horizontal = 12.dp, vertical = 16.dp)
) {
Button(
label = stringResource(Res.string.privacy_notice_reject),
onClick = { onRejectNotice() },
enabled = noticeState !is PrivacyNoticeState.Loading,
)
Button(
label = stringResource(Res.string.privacy_notice_accept),
onClick = { viewModel.acceptPrivacyNotice(confirmationRequired) },
modifier = Modifier.weight(1f),
primary = true,
enabled = noticeState !is PrivacyNoticeState.Loading,
)
}
}
}