web/front/user.tsx
import React from 'react'
import { defaultUserScoreTitle } from 'front/config'
import { UserType } from 'front/types/UserType'
import CustomLink from 'front/CustomLink'
import { LikeIcon } from 'front'
import routes from 'front/routes'
export function displayAndUsernameText(user) {
let ret = ''
if (user?.displayName) {
ret += `${user?.displayName} (`
}
ret += `@${user.username}`
if (user?.displayName) {
ret += ')'
}
return ret
}
export function UserLink({ children, user }) {
return <CustomLink
href={routes.user(user.username)}
className="author username"
>
{children}
</CustomLink>
}
export function UserScore({ space=false, user }) {
return <span title={defaultUserScoreTitle}>{user.score}{space ? ' ' : ''}<LikeIcon /></span>
}
export type DisplayAndUsernameProps = {
user: UserType,
showScore?: boolean,
showUsername?: boolean,
showUsernameMobile?: boolean,
}
export function DisplayAndUsername(
{
user,
showScore=true,
showUsername,
showUsernameMobile,
}
: DisplayAndUsernameProps
) {
let mobileMandatoryPart = ''
let mobileOptionalPart: React.ReactNode = ''
if (showUsername === undefined) {
showUsername = true
}
if (showUsernameMobile === undefined) {
showUsernameMobile = true
}
if (user.displayName) {
mobileMandatoryPart += `${user.displayName} `
} else {
mobileOptionalPart += `${user.username} `
}
const showParenthesis = user.displayName && showUsername
if (showParenthesis) {
mobileOptionalPart += `(`
}
if (showUsername) {
mobileOptionalPart += `@${user.username}`
// TODO https://stackoverflow.com/questions/33710833/how-do-i-conditionally-wrap-a-react-component
//if (showUsernameMobile) {
// ret += `@${user.username}`
//} else {
// ret += <span className="mobile-hide">`@${user.username}`</span>
//}
}
if (showParenthesis) {
if (user.displayName) {
mobileOptionalPart += ', '
} else {
mobileOptionalPart += ' ('
}
}
let mobileOptionalPartPost: React.ReactNode = showParenthesis ? ')' : ''
if (!showUsernameMobile) {
mobileOptionalPart = <span className="mobile-hide">{mobileOptionalPart}</span>
mobileOptionalPartPost = <span className="mobile-hide">{mobileOptionalPartPost}</span>
}
return <>
{mobileMandatoryPart}
{mobileOptionalPart}
{showScore && <UserScore user={user} />}
{mobileOptionalPartPost}
</>
}