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
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@
<string name="multiapp_hint">This file is required to ensure Pixiv-MultiPlatform running correctly. Please do not delete this file!</string>
<string name="multiapp_not_allowed">Pixiv-MultiPlatform allows only one instance to run. Please close the existing instance</string>
<string name="my_bookmark">My Bookmarks</string>
<string name="my_follow">My Following</string>
<string name="network_settings">Network</string>
<string name="custom_share_domain">Custom Share Domain</string>
<string name="custom_share_domain_description">Telegram and Discord cannot properly display preview cards for artwork links from pixiv.com. If you change this setting, the domain of the shared link will no longer be pixiv.com. \nIt is recommended to change it to </string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,7 @@
<string name="multiapp_hint">此檔案用於確保 Pixiv-MultiPlatform 正常運行,請勿刪除此檔案!</string>
<string name="multiapp_not_allowed">Pixiv-MultiPlatform 只允許一個實例運行,請先關閉已存在的實例</string>
<string name="my_bookmark">我的收藏</string>
<string name="my_follow">我的追蹤</string>
<string name="network_settings">網路設定</string>
<string name="next_page">下一章</string>
<string name="next_step">下一步</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@
<string name="multiapp_hint">该文件用于确保Pixiv-MultiPlatform正常运行,请不要删除此文件!</string>
<string name="multiapp_not_allowed">Pixiv-MultiPlatform只允许一个实例运行,请关闭已有的实例。</string>
<string name="my_bookmark">我的收藏</string>
<string name="my_follow">我的关注</string>
<string name="network_settings">网络设置</string>
<string name="custom_share_domain">自定义分享域名</string>
<string name="custom_share_domain_description">对于telegram和discord,它们无法正常展示pixiv.com下的作品链接预览。如果修改此设置,分享链接的域名将不会是pixiv.com。 \n推荐修改为 </string>
Expand Down
7 changes: 7 additions & 0 deletions composeApp/src/commonMain/kotlin/top/kagg886/pmf/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ import top.kagg886.pmf.ui.route.main.detail.novel.NovelSimilarScreen
import top.kagg886.pmf.ui.route.main.detail.novel.NovelSimilarViewModel
import top.kagg886.pmf.ui.route.main.download.DownloadScreenModel
import top.kagg886.pmf.ui.route.main.download.DownloadScreenSideEffect
import top.kagg886.pmf.ui.route.main.follow.FollowRoute
import top.kagg886.pmf.ui.route.main.follow.FollowScreen
import top.kagg886.pmf.ui.route.main.follow.FollowViewModel
import top.kagg886.pmf.ui.route.main.history.HistoryIllustViewModel
import top.kagg886.pmf.ui.route.main.history.HistoryNovelViewModel
import top.kagg886.pmf.ui.route.main.later.ViewLaterModel
Expand Down Expand Up @@ -224,6 +227,7 @@ private val config = SavedStateConfiguration {
subclass(serializer = RankRoute.serializer())
subclass(serializer = ProfileRoute.serializer())
subclass(serializer = BookmarkRoute.serializer())
subclass(serializer = FollowRoute.serializer())
subclass(serializer = AboutRoute.serializer())
subclass(serializer = IllustDetailRoute.serializer())
subclass(serializer = IllustDetailPreFetchRoute.serializer())
Expand Down Expand Up @@ -511,6 +515,9 @@ fun setupEnv() {
viewModelOf(::BookmarkNovelViewModel)
navigation<BookmarkRoute> { BookmarkScreen() }

viewModelOf(::FollowViewModel)
navigation<FollowRoute> { FollowScreen() }

navigation<AboutRoute> { AboutScreen() }

viewModelOf(::IllustDetailViewModel)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package top.kagg886.pmf.ui.component.icon

import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PathFillType.Companion.NonZero
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.StrokeCap.Companion.Butt
import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.ImageVector.Builder
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.unit.dp

val ViewOff: ImageVector by lazy {
Builder(
name = "ViewOff",
defaultWidth = 24.0.dp,
defaultHeight = 24.0.dp,
viewportWidth = 24.0f,
viewportHeight = 24.0f,
).apply {
path(
fill = SolidColor(Color(0xFF5f6368)),
stroke = null,
strokeLineWidth = 0.0f,
strokeLineCap = Butt,
strokeLineJoin = Miter,
strokeLineMiter = 4.0f,
pathFillType = NonZero,
) {
moveTo(12.0f, 6.5f)
curveToRelative(3.79f, 0.0f, 7.17f, 2.13f, 8.82f, 5.5f)
curveToRelative(-0.7f, 1.43f, -1.79f, 2.61f, -3.07f, 3.46f)
lineToRelative(1.43f, 1.43f)
curveTo(20.72f, 15.8f, 21.95f, 14.13f, 23.0f, 12.0f)
curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f)
curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f)
lineToRelative(1.68f, 1.68f)
curveToRelative(0.73f, -0.24f, 1.5f, -0.38f, 2.3f, -0.38f)
close()
moveTo(2.01f, 4.87f)
lineToRelative(2.68f, 2.68f)
curveTo(3.06f, 8.83f, 1.77f, 10.36f, 1.0f, 12.0f)
curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f)
curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f)
lineToRelative(3.42f, 3.42f)
lineToRelative(1.27f, -1.27f)
lineTo(3.28f, 3.6f)
lineTo(2.01f, 4.87f)
close()
moveTo(7.53f, 10.39f)
lineToRelative(1.55f, 1.55f)
curveToRelative(-0.05f, 0.28f, -0.08f, 0.56f, -0.08f, 0.86f)
curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f)
curveToRelative(0.3f, 0.0f, 0.58f, -0.03f, 0.86f, -0.08f)
lineToRelative(1.55f, 1.55f)
curveToRelative(-0.74f, 0.46f, -1.6f, 0.73f, -2.41f, 0.73f)
curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f)
curveToRelative(0.0f, -0.81f, 0.27f, -1.67f, 0.73f, -2.41f)
close()
moveTo(11.84f, 9.02f)
lineToRelative(3.15f, 3.15f)
lineToRelative(0.02f, -0.16f)
curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f)
lineToRelative(-0.17f, 0.01f)
close()
}
}.build()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package top.kagg886.pmf.ui.route.main.follow

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.navigation3.runtime.NavKey
import kotlinx.serialization.Serializable
import org.koin.compose.viewmodel.koinViewModel
import org.koin.core.parameter.parametersOf
import top.kagg886.pixko.module.user.UserLikePublicity
import top.kagg886.pmf.LocalNavBackStack
import top.kagg886.pmf.res.*
import top.kagg886.pmf.ui.component.icon.View
import top.kagg886.pmf.ui.component.icon.ViewOff
import top.kagg886.pmf.ui.util.AuthorFetchScreen
import top.kagg886.pmf.ui.util.removeLastOrNullWorkaround
import top.kagg886.pmf.util.stringResource

@Serializable
data object FollowRoute : NavKey

@Composable
fun FollowScreen() {
val stack = LocalNavBackStack.current
var restrict by rememberSaveable { mutableStateOf(UserLikePublicity.PUBLIC) }
val model = koinViewModel<FollowViewModel>(key = "follow_$restrict") {
parametersOf(restrict)
}

Scaffold(
topBar = {
TopAppBar(
title = {
Text(stringResource(Res.string.my_follow))
},
navigationIcon = {
IconButton(
onClick = {
stack.removeLastOrNullWorkaround()
},
) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = null,
)
}
},
actions = {
val isPublic = restrict == UserLikePublicity.PUBLIC
IconButton(
onClick = {
restrict = if (isPublic) UserLikePublicity.PRIVATE else UserLikePublicity.PUBLIC
},
) {
Icon(
imageVector = if (isPublic) View else ViewOff,
contentDescription = stringResource(
if (isPublic) Res.string.public else Res.string.private,
),
)
}
},
)
},
) {
Box(Modifier.padding(it).fillMaxSize()) {
AuthorFetchScreen(model)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package top.kagg886.pmf.ui.route.main.follow

import top.kagg886.pixko.module.user.UserLikePublicity
import top.kagg886.pixko.module.user.getFollowingList
import top.kagg886.pmf.backend.pixiv.PixivConfig
import top.kagg886.pmf.ui.util.AuthorFetchViewModel
import top.kagg886.pmf.ui.util.flowOf
import top.kagg886.pmf.ui.util.page

class FollowViewModel(
private val restrict: UserLikePublicity = UserLikePublicity.PUBLIC,
) : AuthorFetchViewModel() {
private val id = PixivConfig.pixiv_user!!.userId

override fun source() = flowOf(30) { params ->
params.page { page ->
client.getFollowingList(id) {
this.page = page
publicity = restrict
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import top.kagg886.pmf.res.*
import top.kagg886.pmf.ui.route.main.bookmark.BookmarkRoute
import top.kagg886.pmf.ui.route.main.detail.author.AuthorScreenWithoutCollapse
import top.kagg886.pmf.ui.route.main.download.DownloadScreen
import top.kagg886.pmf.ui.route.main.follow.FollowRoute
import top.kagg886.pmf.ui.route.main.history.HistoryScreen
import top.kagg886.pmf.ui.route.main.later.ViewLaterScreen
import top.kagg886.pmf.ui.route.main.profile.ProfileItem.Download
Expand Down Expand Up @@ -156,6 +157,24 @@ fun ProfileScreen(route: ProfileRoute) {
},
)

Spacer(Modifier.height(8.dp))
NavigationDrawerItem(
modifier = Modifier.padding(horizontal = 8.dp),
label = {
Text(stringResource(Res.string.my_follow))
},
icon = {
Icon(top.kagg886.pmf.ui.component.icon.View, "")
},
selected = false,
onClick = {
stack += FollowRoute
scope.launch {
drawer.close()
}
},
)

Spacer(Modifier.height(8.dp))
NavigationDrawerItem(
modifier = Modifier.padding(horizontal = 8.dp),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@ abstract class AuthorFetchViewModel : ContainerHost<AuthorFetchViewState, Author
val result = runCatching { client.unFollowUser(author.id) }

if (result.isFailure) {
postSideEffect(AuthorFetchSideEffect.Toast(getString(Res.string.un_bookmark_failed)))
postSideEffect(AuthorFetchSideEffect.Toast(getString(Res.string.unfollow_fail)))
return@runOn
}
postSideEffect(AuthorFetchSideEffect.Toast(getString(Res.string.un_bookmark_success)))
postSideEffect(AuthorFetchSideEffect.Toast(getString(Res.string.unfollow_success)))
userRouter.push { u -> if (u.id == author.id) u.copy(isFollowed = false) else u }
}
}
Expand Down
Loading