Skip to content
Draft
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 compose-ui/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,12 @@
<string name="bluesky_login_oauth_hint">Bluesky OAuth might not stable enough, please use password login if you encounter any issues.</string>
<string name="login_button">Login</string>
<string name="mastodon_login_verify_message">Please wait while we verify your credentials.</string>
<string name="nostr_login_title">Import Nostr account</string>
<string name="nostr_login_hint">Paste an npub or hex pubkey for read-only access, or provide an nsec to import a writable account.</string>
<string name="nostr_login_generate_button">Generate and login</string>
<string name="nostr_login_npub_hint">npub or hex pubkey (optional if nsec is set)</string>
<string name="nostr_login_nsec_hint">nsec or hex private key</string>
<string name="nostr_login_relays_hint">Relay URLs, separated by commas</string>
<string name="service_select_instance_input_placeholder">Instance URL</string>
<string name="service_select_next_button">Next</string>
<string name="service_select_empty_message">No instances found</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,8 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastForEach
import compose.icons.FontAwesomeIcons
import compose.icons.fontawesomeicons.Brands
import compose.icons.fontawesomeicons.Regular
import compose.icons.fontawesomeicons.Solid
import compose.icons.fontawesomeicons.brands.Bluesky
import compose.icons.fontawesomeicons.brands.Mastodon
import compose.icons.fontawesomeicons.brands.Weibo
import compose.icons.fontawesomeicons.brands.XTwitter
import compose.icons.fontawesomeicons.regular.Bookmark
import compose.icons.fontawesomeicons.regular.CommentDots
import compose.icons.fontawesomeicons.regular.Heart
Expand Down Expand Up @@ -125,7 +120,6 @@ import dev.dimension.flare.compose.ui.user_unmute
import dev.dimension.flare.compose.ui.vote
import dev.dimension.flare.data.datasource.microblog.ActionMenu
import dev.dimension.flare.data.model.PostActionStyle
import dev.dimension.flare.model.PlatformType
import dev.dimension.flare.ui.component.AdaptiveGrid
import dev.dimension.flare.ui.component.AvatarComponent
import dev.dimension.flare.ui.component.DateTimeText
Expand All @@ -146,13 +140,13 @@ import dev.dimension.flare.ui.component.platform.PlatformRadioButton
import dev.dimension.flare.ui.component.platform.PlatformText
import dev.dimension.flare.ui.component.platform.PlatformTextButton
import dev.dimension.flare.ui.component.platform.PlatformTextStyle
import dev.dimension.flare.ui.icons.Misskey
import dev.dimension.flare.ui.model.ClickContext
import dev.dimension.flare.ui.model.UiCard
import dev.dimension.flare.ui.model.UiIcon
import dev.dimension.flare.ui.model.UiMedia
import dev.dimension.flare.ui.model.UiPoll
import dev.dimension.flare.ui.model.UiTimelineV2
import dev.dimension.flare.ui.model.brandIcon
import dev.dimension.flare.ui.model.onError
import dev.dimension.flare.ui.model.onLoading
import dev.dimension.flare.ui.model.onSuccess
Expand Down Expand Up @@ -235,21 +229,8 @@ public fun CommonStatusComponent(
)
}
if (appearanceSettings.showPlatformLogo) {
val icon =
when (item.platformType) {
PlatformType.Mastodon ->
FontAwesomeIcons.Brands.Mastodon
PlatformType.Misskey ->
FontAwesomeIcons.Brands.Misskey
PlatformType.Bluesky ->
FontAwesomeIcons.Brands.Bluesky
PlatformType.xQt ->
FontAwesomeIcons.Brands.XTwitter
PlatformType.VVo ->
FontAwesomeIcons.Brands.Weibo
}
FAIcon(
imageVector = icon,
imageVector = item.platformType.brandIcon,
contentDescription = null,
modifier =
Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.StrokeJoin
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.addPathNodes
import androidx.compose.ui.graphics.vector.group
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.unit.dp
Expand Down Expand Up @@ -44,43 +45,127 @@ public val BrandsGroup.Misskey: ImageVector
) {
moveTo(54.63f, 120.96f)
curveToRelative(-1.97790f, 00f, -3.86180f, 0.32980f, -5.65130f, 0.98910f)
curveToRelative(-3.20230f, 1.13020f, -5.83960f, 3.15530f, -7.91170f, 6.07510f)
curveToRelative(-1.97790f, 2.82560f, -2.96670f, 5.98070f, -2.96670f, 9.46560f)
curveToRelative(
-3.20230f,
1.13020f,
-5.83960f,
3.15530f,
-7.91170f,
6.07510f,
)
curveToRelative(
-1.97790f,
2.82560f,
-2.96670f,
5.98070f,
-2.96670f,
9.46560f,
)
verticalLineToRelative(61.88f)
curveToRelative(00f, 4.52090f, 1.6010f, 8.42940f, 4.80330f, 11.7260f)
curveToRelative(3.29650f, 3.20230f, 7.20550f, 4.80380f, 11.7260f, 4.80380f)
curveToRelative(4.61510f, 00f, 8.52360f, -1.60150f, 11.7260f, -4.80380f)
curveToRelative(3.29650f, -3.29650f, 4.94490f, -7.2050f, 4.94490f, -11.7260f)
curveToRelative(
3.29650f,
-3.29650f,
4.94490f,
-7.2050f,
4.94490f,
-11.7260f,
)
verticalLineToRelative(-11.253f)
curveToRelative(0.03560f, -2.43710f, 2.5460f, -1.79770f, 3.81480f, 00f)
curveToRelative(2.37630f, 4.11530f, 7.41420f, 7.64970f, 13.280f, 7.62950f)
curveToRelative(5.86560f, -0.02020f, 10.7370f, -2.92020f, 13.280f, -7.62950f)
curveToRelative(
5.86560f,
-0.02020f,
10.7370f,
-2.92020f,
13.280f,
-7.62950f,
)
curveToRelative(0.9630f, -1.13580f, 3.67740f, -3.0710f, 3.95580f, 00f)
verticalLineToRelative(11.253f)
curveToRelative(00f, 4.52090f, 1.6010f, 8.42940f, 4.80330f, 11.7260f)
curveToRelative(3.29650f, 3.20230f, 7.20550f, 4.80380f, 11.7260f, 4.80380f)
curveToRelative(4.61510f, 00f, 8.52360f, -1.60150f, 11.7260f, -4.80380f)
curveToRelative(3.29650f, -3.29650f, 4.94490f, -7.2050f, 4.94490f, -11.7260f)
curveToRelative(
3.29650f,
-3.29650f,
4.94490f,
-7.2050f,
4.94490f,
-11.7260f,
)
verticalLineToRelative(-61.88f)
curveToRelative(00f, -3.48490f, -1.03570f, -6.640f, -3.10780f, -9.46560f)
curveToRelative(-1.97790f, -2.91980f, -4.56830f, -4.94480f, -7.77060f, -6.07510f)
curveToRelative(-1.88370f, -0.65930f, -3.76760f, -0.98910f, -5.65130f, -0.98910f)
curveToRelative(
-1.97790f,
-2.91980f,
-4.56830f,
-4.94480f,
-7.77060f,
-6.07510f,
)
curveToRelative(
-1.88370f,
-0.65930f,
-3.76760f,
-0.98910f,
-5.65130f,
-0.98910f,
)
curveToRelative(-5.0860f, 00f, -9.37120f, 1.97820f, -12.8560f, 5.9340f)
lineToRelative(-16.775f, 19.632f)
curveToRelative(-0.37670f, 0.28260f, -1.62480f, 2.44280f, -4.27570f, 2.44280f)
curveToRelative(
-0.37670f,
0.28260f,
-1.62480f,
2.44280f,
-4.27570f,
2.44280f,
)
curveToRelative(-2.65090f, 00f, -3.75740f, -2.16020f, -4.13410f, -2.44280f)
lineToRelative(-16.916f, -19.632f)
curveToRelative(-3.39070f, -3.95580f, -7.62890f, -5.9340f, -12.7150f, -5.9340f)
curveToRelative(
-3.39070f,
-3.95580f,
-7.62890f,
-5.9340f,
-12.7150f,
-5.9340f,
)
close()
moveToRelative(104.53f, 0f)
curveToRelative(-3.95580f, 00f, -7.34640f, 1.41290f, -10.1720f, 4.23850f)
curveToRelative(-2.73140f, 2.73140f, -4.09690f, 6.07510f, -4.09690f, 10.0310f)
curveToRelative(
-2.73140f,
2.73140f,
-4.09690f,
6.07510f,
-4.09690f,
10.0310f,
)
curveToRelative(00f, 3.95580f, 1.36550f, 7.34640f, 4.09690f, 10.1720f)
curveToRelative(2.82560f, 2.73140f, 6.21620f, 4.09740f, 10.1720f, 4.09740f)
curveToRelative(3.95580f, 00f, 7.34640f, -1.3660f, 10.1720f, -4.09740f)
curveToRelative(2.82560f, -2.82560f, 4.23850f, -6.21620f, 4.23850f, -10.1720f)
curveToRelative(
2.82560f,
-2.82560f,
4.23850f,
-6.21620f,
4.23850f,
-10.1720f,
)
curveToRelative(00f, -3.95580f, -1.41290f, -7.29950f, -4.23850f, -10.0310f)
curveToRelative(-2.82560f, -2.82560f, -6.21620f, -4.23850f, -10.1720f, -4.23850f)
curveToRelative(
-2.82560f,
-2.82560f,
-6.21620f,
-4.23850f,
-10.1720f,
-4.23850f,
)
close()
moveToRelative(0.14107f, 31.364f)
curveToRelative(-3.95580f, 00f, -7.34640f, 1.41290f, -10.1720f, 4.23850f)
Expand All @@ -89,11 +174,61 @@ public val BrandsGroup.Misskey: ImageVector
curveToRelative(00f, 3.95580f, 1.41240f, 7.34640f, 4.2380f, 10.1720f)
curveToRelative(2.82560f, 2.73140f, 6.21620f, 4.09740f, 10.1720f, 4.09740f)
reflectiveCurveToRelative(7.2995f, -1.366f, 10.031f, -4.0974f)
curveToRelative(2.82560f, -2.82560f, 4.23850f, -6.21620f, 4.23850f, -10.1720f)
curveToRelative(
2.82560f,
-2.82560f,
4.23850f,
-6.21620f,
4.23850f,
-10.1720f,
)
verticalLineToRelative(-34.896f)
curveToRelative(00f, -3.95580f, -1.41290f, -7.34640f, -4.23850f, -10.1720f)
curveToRelative(-2.73140f, -2.82560f, -6.07510f, -4.23850f, -10.0310f, -4.23850f)
curveToRelative(
-2.73140f,
-2.82560f,
-6.07510f,
-4.23850f,
-10.0310f,
-4.23850f,
)
close()
}
}
}.build()

@HiddenFromObjC
public val BrandsGroup.Nostr: ImageVector
get() {
return ImageVector
.Builder(
name = "NostrIcon",
defaultWidth = 256.dp,
defaultHeight = 256.dp,
viewportWidth = 256f,
viewportHeight = 256f,
).apply {
path(
fill = SolidColor(Color(0xFF000000)),
stroke = null,
strokeLineWidth = 0f,
strokeLineCap = StrokeCap.Butt,
strokeLineJoin = StrokeJoin.Miter,
strokeLineMiter = 4f,
pathFillType = PathFillType.NonZero,
pathBuilder = {
addPathNodes(
"M210.8 199.4c0 3.1-2.5 5.7-5.7 5.7h-68c-3.1 0-5.7-2.5-5.7-5." +
"7v-15.5c.3-19 2.3-37.2 6.5-45.5c2.5-5 6.7-7.7 11.5-9.1c9.1-2.7 " +
"24.9-.9 31.7-1.2c0 0 20.4.8 20.4-10.7s-9.1-8.6-9.1-8.6c-10 .3-17" +
".7-.4-22.6-2.4c-8.3-3.3-8.6-9.2-8.6-11.2c-.4-23.1-34.5-25.9-64.5-" +
"20.1c-32.8 6.2.4 53.3.4 116.1v8.4c0 3.1-2.6 5.6-5.7 5.6H57.7c-3.1" +
" 0-5.7-2.5-5.7-5.7v-144c0-3.1 2.5-5.7 5.7-5.7h31.7c3.1 0 5.7 2.5" +
" 5.7 5.7c0 4.7 5.2 7.2 9 4.5c11.4-8.2 26-12.5 42.4-12.5c36.6 0" +
" 64.4 21.4 64.4 68.7v83.2ZM150 99.3c0-6.7-5.4-12.1-12.1-12.1s-" +
"12.1 5.4-12.1 12.1s5.4 12.1 12.1 12.1S150 106 150 99.3Z",
)
},
)
}.build()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package dev.dimension.flare.ui.model

import androidx.compose.ui.graphics.vector.ImageVector
import compose.icons.FontAwesomeIcons
import compose.icons.fontawesomeicons.Brands
import compose.icons.fontawesomeicons.brands.Bluesky
import compose.icons.fontawesomeicons.brands.Mastodon
import compose.icons.fontawesomeicons.brands.Weibo
import compose.icons.fontawesomeicons.brands.XTwitter
import dev.dimension.flare.model.PlatformType
import dev.dimension.flare.ui.icons.Misskey
import dev.dimension.flare.ui.icons.Nostr

public val PlatformType.brandIcon: ImageVector
get() =
when (this) {
PlatformType.Nostr -> FontAwesomeIcons.Brands.Nostr
PlatformType.Mastodon -> FontAwesomeIcons.Brands.Mastodon
PlatformType.Misskey -> FontAwesomeIcons.Brands.Misskey
PlatformType.Bluesky -> FontAwesomeIcons.Brands.Bluesky
PlatformType.xQt -> FontAwesomeIcons.Brands.XTwitter
PlatformType.VVo -> FontAwesomeIcons.Brands.Weibo
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ import dev.dimension.flare.data.model.MixedTimelineTabItem
import dev.dimension.flare.data.model.TimelineTabItem
import dev.dimension.flare.data.repository.SettingsRepository
import dev.dimension.flare.model.AccountType
import dev.dimension.flare.model.PlatformType
import dev.dimension.flare.model.vvo
import dev.dimension.flare.model.displayName
import dev.dimension.flare.ui.model.UiState
import dev.dimension.flare.ui.model.collectAsUiState
import dev.dimension.flare.ui.presenter.home.UserPresenter
Expand Down Expand Up @@ -80,14 +79,7 @@ public class HomeTimelineWithTabsPresenter(
val tab =
HomeTimelineTabItem(
accountKey = account.accountKey,
title =
when (account.platformType) {
PlatformType.Mastodon -> "Mastodon"
PlatformType.Misskey -> "Misskey"
PlatformType.Bluesky -> "Bluesky"
PlatformType.xQt -> "X"
PlatformType.VVo -> vvo
},
title = account.platformType.displayName,
)
settingsRepository.updateTabSettings {
if (mainTabs.any { it.key == tab.key }) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package dev.dimension.flare.ui.screen.login

import androidx.compose.foundation.text.input.TextFieldState
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import dev.dimension.flare.data.network.nostr.NostrService
import dev.dimension.flare.ui.presenter.PresenterBase
import kotlin.native.HiddenFromObjC

@HiddenFromObjC
public class NostrInputPresenter : PresenterBase<NostrInputPresenter.State>() {
@Immutable
public interface State {
public val publicKey: TextFieldState
public val secretKey: TextFieldState
public val relays: TextFieldState
public val canLogin: Boolean
}

@Composable
override fun body(): State {
val publicKey = rememberTextFieldState()
val secretKey = rememberTextFieldState()
val relays =
rememberTextFieldState(
initialText = NostrService.defaultRelays.joinToString(", "),
)

val canLogin by remember(publicKey, secretKey) {
derivedStateOf {
publicKey.text.isNotEmpty() || secretKey.text.isNotEmpty()
}
}

return object : State {
override val publicKey: TextFieldState = publicKey
override val secretKey: TextFieldState = secretKey
override val relays: TextFieldState = relays
override val canLogin: Boolean = canLogin
}
}
}
Loading
Loading