fun AppPrivacyNoticePrompt()

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,
            )
        }
    }
}