mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-12 20:14:15 +00:00
140 lines
2.9 KiB
JavaScript
140 lines
2.9 KiB
JavaScript
import React from "react"
|
|
import * as antd from "antd"
|
|
import { Translation } from "react-i18next"
|
|
|
|
import { Icons } from "components/Icons"
|
|
import { Skeleton, PostsFeed, FollowButton } from "components"
|
|
import { Session, User } from "models"
|
|
|
|
import "./index.less"
|
|
|
|
export default class Account extends React.Component {
|
|
static bindApp = ["userController", "sessionController"]
|
|
|
|
state = {
|
|
isSelf: false,
|
|
isFollowed: false,
|
|
user: null,
|
|
requestedUser: null,
|
|
}
|
|
|
|
api = window.app.request
|
|
|
|
componentDidMount = async () => {
|
|
const token = await Session.decodedToken()
|
|
const location = window.app.history.location
|
|
const query = new URLSearchParams(location.search)
|
|
|
|
const requestedUser = location.state?.username ?? query.get("username") ?? token?.username
|
|
const hasAdmin = await User.hasRole("admin")
|
|
|
|
let isSelf = false
|
|
let user = null
|
|
let isFollowed = false
|
|
|
|
if (requestedUser != null) {
|
|
if (token.username === requestedUser) {
|
|
isSelf = true
|
|
}
|
|
|
|
user = await this.fetchData(requestedUser)
|
|
|
|
if (!isSelf) {
|
|
const result = await this.api.get.isFollowed(undefined, { user_id: user._id }).catch(() => false)
|
|
console.log(result)
|
|
|
|
if (result) {
|
|
isFollowed = result.isFollowed
|
|
}
|
|
}
|
|
}
|
|
|
|
await this.setState({
|
|
isSelf,
|
|
user,
|
|
hasAdmin,
|
|
requestedUser,
|
|
isFollowed,
|
|
})
|
|
}
|
|
|
|
fetchData = async (username) => {
|
|
return await this.api.get.user(undefined, {
|
|
username: username
|
|
}).catch((error) => {
|
|
console.error(error)
|
|
antd.message.error(error.message)
|
|
return false
|
|
})
|
|
}
|
|
|
|
onClickFollow = async () => {
|
|
const result = await this.api.put.followUser({
|
|
username: this.state.requestedUser,
|
|
})
|
|
.catch((error) => {
|
|
console.error(error)
|
|
antd.message.error(error.message)
|
|
return false
|
|
})
|
|
|
|
console.log(result)
|
|
|
|
await this.setState({
|
|
isFollowed: result.following,
|
|
})
|
|
}
|
|
|
|
render() {
|
|
const user = this.state.user
|
|
|
|
if (!user) {
|
|
return <Skeleton />
|
|
}
|
|
|
|
return (
|
|
<div className="accountProfile">
|
|
<div className="card">
|
|
<div className="header">
|
|
<div className="user">
|
|
<img src={user.avatar} />
|
|
<div style={{ margin: "0 15px" }}>
|
|
{Boolean(user.fullName) ?
|
|
<>
|
|
<h1>{user.fullName}</h1>
|
|
<span>@{user.username}#{user._id}</span>
|
|
</> :
|
|
<>
|
|
<h1>@{user.username}</h1>
|
|
<span>#{user._id}</span>
|
|
</>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
{!this.state.isSelf && <div>
|
|
<FollowButton
|
|
onClick={this.onClickFollow}
|
|
followed={this.state.isFollowed}
|
|
/>
|
|
</div>}
|
|
</div>
|
|
|
|
<div className="extension">
|
|
<div className="badgesList">
|
|
{user.badges.map((role, index) => {
|
|
return <antd.Tag>{role}</antd.Tag>
|
|
})}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="posts">
|
|
<PostsFeed
|
|
fromUserId={user._id}
|
|
/>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|
|
} |