Разработана двусторонняя интеграция Kotlin и JavaScript

Этот коммит содержится в:
Глеб Иваницкий 2024-12-19 12:51:14 +03:00
родитель dad92a5a45
Коммит ac3dfa49b8
6 изменённых файлов: 40 добавлений и 59 удалений

Просмотреть файл

@ -22,6 +22,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.unit.dp
import corp_tularegion_extension.composeapp.generated.resources.Res
import corp_tularegion_extension.composeapp.generated.resources.logo_48
@ -31,6 +32,9 @@ import corp_tularegion_extension.composeapp.generated.resources.round_settings_2
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.painterResource
import ru.tularegion.corp.backend.JsCallbacks
import ru.tularegion.corp.backend.setAutoAuthLogin
import ru.tularegion.corp.backend.setAutoAuthMode
import ru.tularegion.corp.backend.setAutoAuthPassword
import ru.tularegion.corp.backend.setCopyMode
import ru.tularegion.corp.backend.setRedirectMode
import ru.tularegion.corp.ui.components.CopyMode
@ -152,6 +156,11 @@ fun App() {
val copyModeState = remember {
mutableStateOf(CopyMode.NO_REPLACE)
}
JsCallbacks.copyMode = { value ->
copyModeState.value = CopyMode.entries.find {
it.id == value
} ?: CopyMode.NO_REPLACE
}
DropdownSelect(
title = "Замена ссылок при копировании",
caption = "Заменять все ссылки при копировании на RU, либо на LOCAL",
@ -163,13 +172,19 @@ fun App() {
)
}
val autoLogInState = remember {
val autoAuthModeState = remember {
mutableStateOf(false)
}
JsCallbacks.autoAuthMode = {
autoAuthModeState.value = it
}
SwitchSpoiler(
title = "Автоматический вход",
caption = "Выполнять вход на портал автоматически",
enabledState = autoLogInState,
enabledState = autoAuthModeState,
onValueChange = {
setAutoAuthMode(it)
},
) {
Column(
modifier = Modifier
@ -179,9 +194,13 @@ fun App() {
val loginState = remember {
mutableStateOf("")
}
JsCallbacks.autoAuthLogin = {
loginState.value = it
}
OutlinedTextField(
value = loginState.value,
onValueChange = {
setAutoAuthLogin(it)
loginState.value = it
},
modifier = Modifier
@ -191,14 +210,19 @@ fun App() {
text = "Логин",
)
},
singleLine = true,
)
val passwordState = remember {
mutableStateOf("")
}
JsCallbacks.autoAuthPassword = {
passwordState.value = it
}
OutlinedTextField(
value = passwordState.value,
onValueChange = {
setAutoAuthPassword(it)
passwordState.value = it
},
modifier = Modifier
@ -208,6 +232,8 @@ fun App() {
text = "Пароль",
)
},
visualTransformation = PasswordVisualTransformation(),
singleLine = true,
)
}
}

Просмотреть файл

@ -9,7 +9,7 @@ object JsCallbacks {
var copyMode: ((Int) -> Unit)? = null
var autoAuthMode: ((Boolean) -> Unit)? = null
var autoAuthLogin: ((String) -> Unit)? = null
var autoAuthLPassword: ((String) -> Unit)? = null
var autoAuthPassword: ((String) -> Unit)? = null
}
@OptIn(ExperimentalJsExport::class)
@ -54,7 +54,7 @@ fun autoAuthModeCallback(
@JsName("setAutoAuthMode")
external fun setAutoAuthMode(
value: Int,
value: Boolean,
)
@OptIn(ExperimentalJsExport::class)
@ -74,15 +74,15 @@ external fun setAutoAuthLogin(
@OptIn(ExperimentalJsExport::class)
@JsExport
fun autoAuthLPasswordCallback(
fun autoAuthPasswordCallback(
value: String,
) {
JsCallbacks.autoAuthLPassword?.let {
JsCallbacks.autoAuthPassword?.let {
it(value)
}
}
@JsName("setAutoAuthLPassword")
external fun setAutoAuthLPassword(
@JsName("setAutoAuthPassword")
external fun setAutoAuthPassword(
value: String,
)

Просмотреть файл

@ -36,6 +36,7 @@ fun SwitchSpoiler(
title: String,
caption: String,
enabledState: MutableState<Boolean>,
onValueChange: (Boolean) -> Unit,
content: @Composable ColumnScope.() -> Unit,
) {
val backgroundColor = animateColorAsState(
@ -104,6 +105,7 @@ fun SwitchSpoiler(
Switch(
checked = enabledState.value,
onCheckedChange = {
onValueChange(it)
enabledState.value = it
},
)
@ -121,51 +123,4 @@ fun SwitchSpoiler(
}
}
}
// Column {
// Row(
// modifier = Modifier
// .fillMaxWidth()
// .clickable(
// onClick = {
// enabledState.value = !enabledState.value
// },
// )
// .padding(16.dp),
// verticalAlignment = Alignment.CenterVertically,
// ) {
// Column(
// modifier = Modifier
// .weight(1f),
// ) {
// Text(
// text = title,
// style = MaterialTheme.typography.titleLarge,
// )
// Spacer(
// modifier = Modifier.height(4.dp),
// )
// Text(
// text = caption,
// style = MaterialTheme.typography.bodyMedium,
// )
// }
// Spacer(
// modifier = Modifier
// .width(16.dp),
// )
// Switch(
// checked = enabledState.value,
// onCheckedChange = {
// enabledState.value = it
// },
// )
// }
//
// when {
// enabledState.value -> {
// content()
// }
// }
// }
}

Просмотреть файл

@ -22,6 +22,6 @@ function setAutoAuthLogin(value) {
chrome.storage.local.set({ autoAuthLogin: value })
}
function setAutoAuthLPassword(value) {
chrome.storage.local.set({ autoAuthLPassword: value })
function setAutoAuthPassword(value) {
chrome.storage.local.set({ autoAuthPassword: value })
}

Просмотреть файл

@ -7,7 +7,7 @@ html, body {
html {
position: relative;
width: 48rem;
height: 32rem;
height: 27rem;
}
body {

Просмотреть файл

@ -3,5 +3,5 @@ composeApp.then(module => {
getValueByKey('copyMode').then(value => module.copyModeCallback(value))
getValueByKey('autoAuthMode').then(value => module.autoAuthModeCallback(value))
getValueByKey('autoAuthLogin').then(value => module.autoAuthLoginCallback(value))
getValueByKey('autoAuthLPassword').then(value => module.autoAuthLPasswordCallback(value))
getValueByKey('autoAuthPassword').then(value => module.autoAuthPasswordCallback(value))
})