mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
117 lines
2.8 KiB
TypeScript
117 lines
2.8 KiB
TypeScript
import React, { ReactElement, useEffect, useState } from 'react'
|
|
import get3BoxProfile from '../../../utils/profile'
|
|
import { Profile } from '../../../models/Profile'
|
|
import { accountTruncate } from '../../../utils/web3'
|
|
import axios from 'axios'
|
|
import PublisherLinks from './PublisherLinks'
|
|
import Markdown from '../../atoms/Markdown'
|
|
import Stats from './Stats'
|
|
import Account from './Account'
|
|
import styles from './Header.module.css'
|
|
|
|
const isDescriptionTextClamped = () => {
|
|
const el = document.getElementById('description')
|
|
if (el) return el.scrollHeight > el.clientHeight
|
|
}
|
|
|
|
const clearedProfile: Profile = {
|
|
name: null,
|
|
image: null,
|
|
description: null,
|
|
links: null
|
|
}
|
|
|
|
const Link3Box = ({ accountId, text }: { accountId: string; text: string }) => {
|
|
return (
|
|
<a
|
|
href={`https://www.3box.io/${accountId}`}
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
>
|
|
{text}
|
|
</a>
|
|
)
|
|
}
|
|
|
|
export default function AccountHeader({
|
|
accountId
|
|
}: {
|
|
accountId: string
|
|
}): ReactElement {
|
|
const [profile, setProfile] = useState<Profile>({
|
|
name: accountTruncate(accountId),
|
|
image: null,
|
|
description: null,
|
|
links: null
|
|
})
|
|
const [isShowMore, setIsShowMore] = useState(false)
|
|
|
|
const toogleShowMore = () => {
|
|
setIsShowMore(!isShowMore)
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (!accountId) {
|
|
setProfile(clearedProfile)
|
|
return
|
|
}
|
|
|
|
const source = axios.CancelToken.source()
|
|
|
|
async function getInfoFrom3Box() {
|
|
const profile3Box = await get3BoxProfile(accountId, source.token)
|
|
if (profile3Box) {
|
|
const { name, emoji, description, image, links } = profile3Box
|
|
const newName = `${emoji || ''} ${name || accountTruncate(accountId)}`
|
|
const newProfile = {
|
|
name: newName,
|
|
image,
|
|
description,
|
|
links
|
|
}
|
|
setProfile(newProfile)
|
|
} else {
|
|
setProfile(clearedProfile)
|
|
}
|
|
}
|
|
getInfoFrom3Box()
|
|
|
|
return () => {
|
|
source.cancel()
|
|
}
|
|
}, [accountId])
|
|
|
|
return (
|
|
<div className={styles.grid}>
|
|
<div>
|
|
<Account
|
|
accountId={accountId}
|
|
image={profile.image}
|
|
name={profile.name}
|
|
/>
|
|
<Stats accountId={accountId} />
|
|
</div>
|
|
|
|
<div>
|
|
<Markdown text={profile.description} className={styles.description} />
|
|
{isDescriptionTextClamped() ? (
|
|
<span className={styles.more} onClick={toogleShowMore}>
|
|
<Link3Box accountId={accountId} text="Read more on 3box" />
|
|
</span>
|
|
) : (
|
|
''
|
|
)}
|
|
{profile.links?.length > 0 && (
|
|
<PublisherLinks
|
|
links={profile.links}
|
|
className={styles.publisherLinks}
|
|
/>
|
|
)}
|
|
</div>
|
|
<div className={styles.meta}>
|
|
Profile data from <Link3Box accountId={accountId} text="3Box Hub" />
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|