Skip to content

Commit

Permalink
refactor: cleanup types
Browse files Browse the repository at this point in the history
  • Loading branch information
guanbinrui committed Mar 9, 2024
1 parent e8bbafd commit 0d8282a
Show file tree
Hide file tree
Showing 16 changed files with 48 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -162,12 +162,7 @@ export const ProfileBar = memo<ProfileBarProps>(function ProfileBar({
},
}}
/>
<AvatarDecoration
className={classes.avatarDecoration}
clipPathId={avatarClipPathId}
userId={identity.identifier?.userId}
size={40}
/>
<AvatarDecoration className={classes.avatarDecoration} userId={identity.identifier?.userId} size={40} />
</div>
<Box className={classes.description}>
<Typography className={classes.nickname} title={identity.nickname}>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,17 @@
import { useCallback, useState } from 'react'
import { useMount } from 'react-use'
import { useMaskSharedTrans } from '../../../../../shared-ui/index.js'
import { useCurrentVisitingIdentity } from '../../../../components/DataSource/useActivatedUI.js'
import {
toPNG,
NFTAvatar,
type NextIDAvatarMeta,
type SelectTokenInfo,
useSaveStringStorage,
} from '@masknet/plugin-avatar'
import { getAvatarId } from '../../utils/user.js'
import { toPNG, NFTAvatar, type SelectTokenInfo, useSaveStringStorage } from '@masknet/plugin-avatar'
import { InjectedDialog, SelectProviderModal } from '@masknet/shared'
import { Button, DialogContent } from '@mui/material'
import { makeStyles } from '@masknet/theme'
import { Instagram } from '@masknet/web3-providers'
import { useChainContext } from '@masknet/web3-hooks-base'

import { MaskMessages, NetworkPluginID } from '@masknet/shared-base'
import { ChainId, SchemaType } from '@masknet/web3-shared-evm'
import type { AvatarNextID } from '@masknet/web3-providers/types'
import { useMaskSharedTrans } from '../../../../../shared-ui/index.js'
import { useCurrentVisitingIdentity } from '../../../../components/DataSource/useActivatedUI.js'
import { getAvatarId } from '../../utils/user.js'

const useStyles = makeStyles()(() => ({
root: {},
Expand All @@ -42,8 +36,10 @@ export function NFTAvatarSettingDialog() {
try {
if (!info.token.metadata?.imageURL || !info.token.contract?.address) return
if (!identity.identifier) return

const image = await toPNG(info.token.metadata.imageURL)
if (!image || !account) return

const { profile_pic_url_hd } = await Instagram.uploadUserAvatar(image, identity.identifier.userId)
const avatarId = getAvatarId(profile_pic_url_hd)
const avatarInfo = await saveNFTAvatar(identity.identifier.userId, account, {
Expand All @@ -54,7 +50,7 @@ export function NFTAvatarSettingDialog() {
chainId: (info.token.chainId ?? ChainId.Mainnet) as ChainId,
schema: (info.token.schema ?? SchemaType.ERC721) as SchemaType,
pluginId: info.pluginID,
} as NextIDAvatarMeta)
} as AvatarNextID<NetworkPluginID.PLUGIN_EVM>)

if (!avatarInfo) {
setOpen(false)
Expand Down
6 changes: 3 additions & 3 deletions packages/plugins/Avatar/src/Application/NFTAvatar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ const useStyles = makeStyles()({
})

interface NFTAvatarProps {
isOwner?: boolean
hasBorder: boolean
platform?: string
avatar?: string
owner?: boolean
}

export function NFTAvatar(props: NFTAvatarProps) {
const { avatar, hasBorder, owner = false } = props
const { avatar, hasBorder, isOwner = false } = props
const { classes } = useStyles()

return (
Expand All @@ -50,7 +50,7 @@ export function NFTAvatar(props: NFTAvatarProps) {
}}>
<Icons.TwitterXRound size={14} />
</Stack>
{owner ?
{isOwner ?
<div className={classes.indicator} />
: null}
</Stack>
Expand Down
8 changes: 4 additions & 4 deletions packages/plugins/Avatar/src/Application/PersonaItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const useStyles = makeStyles()((theme) => ({
}))

interface PersonaItemProps {
owner?: boolean
isOwner?: boolean
avatarUrl?: string
userId: string
nickname?: string
Expand All @@ -41,7 +41,7 @@ interface PersonaItemProps {
}

export const PersonaItem = memo(function PersonaItem(props: PersonaItemProps) {
const { userId, onSelect, owner = false, proof, avatarUrl, nickname = '', persona = '' } = props
const { userId, onSelect, isOwner = false, proof, avatarUrl, nickname = '', persona = '' } = props
const t = useAvatarTrans()
const { classes } = useStyles()

Expand Down Expand Up @@ -75,12 +75,12 @@ export const PersonaItem = memo(function PersonaItem(props: PersonaItemProps) {
onSelect(proof, tokenDetailed)
}, [avatar, proof, onSelect])

const inactive = !owner || !proof
const inactive = !isOwner || !proof

return (
<ListItemButton className={classes.root} onClick={handleSelect} disabled={inactive}>
<NFTAvatar
owner={owner}
isOwner={isOwner}
avatar={avatarUrl || avatar?.imageUrl}
hasBorder={!!avatar}
platform={proof?.platform}
Expand Down
16 changes: 5 additions & 11 deletions packages/plugins/Avatar/src/Application/PersonaPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,9 @@ export function PersonaPage() {
<PersonaItem
persona={binding?.persona}
key={`avatar${i}`}
avatarUrl={socialIdentity!.avatar ?? ''}
owner
nickname={socialIdentity!.nickname}
isOwner
avatarUrl={socialIdentity?.avatar}
nickname={socialIdentity?.nickname}
proof={x}
userId={userId ?? x.identity}
onSelect={handleSelect}
Expand All @@ -99,18 +99,12 @@ export function PersonaPage() {
)
) ?
null
: <PersonaItem avatarUrl="" key={`persona${i}`} userId={x.identifier.userId} />,
: <PersonaItem key={`persona${i}`} userId={x.identifier.userId} />,
)}
{bindingProofs
.filter((x) => x.identity.toLowerCase() !== userId?.toLowerCase())
.map((x, i) => (
<PersonaItem
key={i}
persona={binding?.persona}
avatarUrl=""
userId={x.identity}
proof={x}
/>
<PersonaItem key={i} persona={binding?.persona} userId={x.identity} proof={x} />
))}
</>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ import { Twitter } from '@masknet/web3-providers'
import { usePersonaConnectStatus } from '@masknet/shared'
import { isSameAddress } from '@masknet/web3-shared-base'
import { useNetworkContext } from '@masknet/web3-hooks-base'
import { useLastRecognizedIdentity } from '@masknet/plugin-infra/content-script'
import { currentVisitingProfile } from '@masknet/plugin-infra/content-script/context'
import { useAvatarTrans } from '../locales/i18n_generated.js'
import { type AvatarInfo, useSave } from '../hooks/useSave.js'
import { useAvatarManagement } from '../contexts/AvatarManagement.js'
import { RoutePaths } from './Routes.js'
import { useLastRecognizedIdentity } from '@masknet/plugin-infra/content-script'

const useStyles = makeStyles()((theme) => ({
actions: {
Expand Down
6 changes: 0 additions & 6 deletions packages/plugins/Avatar/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ export const PLUGIN_ID = PluginID.Avatar
export const PLUGIN_NAME = 'Avatar'
export const PLUGIN_DESCRIPTION = 'NFT Avatar'

export enum RSS3_KEY_SITE {
TWITTER = '_nfts',
FACEBOOK = '_facebook_nfts',
INSTAGRAM = '_instagram_nfts',
}

export const SUPPORTED_CHAIN_IDS: ChainId[] = [ChainId.Mainnet, ChainId.Matic, ChainId.BSC]

export const supportPluginIds = [NetworkPluginID.PLUGIN_EVM, NetworkPluginID.PLUGIN_FLOW, NetworkPluginID.PLUGIN_SOLANA]
Expand Down
8 changes: 4 additions & 4 deletions packages/plugins/Avatar/src/hooks/useSave.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { useAsyncFn } from 'react-use'
import { NetworkPluginID, type BindingProof, type ECKeyIdentifier } from '@masknet/shared-base'
import type { TwitterBaseAPI } from '@masknet/web3-providers/types'
import type { AvatarNextID, TwitterBaseAPI } from '@masknet/web3-providers/types'
import { ChainId, SchemaType } from '@masknet/web3-shared-evm'
import type { AllChainsNonFungibleToken, NextIDAvatarMeta } from '../types.js'
import type { AllChainsNonFungibleToken } from '../types.js'
import { useSaveKV } from './useSaveKV.js'
import { useSaveToNextID } from './useSaveToNextID.js'
import { useSaveStringStorage } from './useSaveStringStorage.js'
import { useSaveKV } from './useSaveKV.js'

export type AvatarInfo = TwitterBaseAPI.AvatarInfo & {
avatarId: string
Expand All @@ -26,7 +26,7 @@ export function useSave(pluginID: NetworkPluginID) {
proof?: BindingProof,
) => {
if (!token.contract?.address) return
const info: NextIDAvatarMeta = {
const info: AvatarNextID<NetworkPluginID> = {
pluginId: pluginID,
nickname: data.nickname,
userId: data.userId,
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/Avatar/src/hooks/useSaveAddress.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { useAsyncFn } from 'react-use'
import { Web3Storage } from '@masknet/web3-providers'
import type { AddressStorageV2 } from '@masknet/web3-providers/types'
import { type NetworkPluginID, EnhanceableSite } from '@masknet/shared-base'
import { NFT_AVATAR_DB_NAME } from '../constants.js'
import type { AddressStorageV2 } from '../types.js'

export function useSaveAddress() {
return useAsyncFn(async (userId: string, pluginID: NetworkPluginID, account: string, network?: EnhanceableSite) => {
Expand Down
10 changes: 5 additions & 5 deletions packages/plugins/Avatar/src/hooks/useSaveAvatar.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { useAsyncFn } from 'react-use'
import { Web3Storage } from '@masknet/web3-providers'
import { type AvatarNextID } from '@masknet/web3-providers/types'
import { NetworkPluginID, type EnhanceableSite } from '@masknet/shared-base'
import { useSaveAddress } from './useSaveAddress.js'
import type { NextIDAvatarMeta, AvatarMeta } from '../types.js'
import { NFT_AVATAR_METADATA_STORAGE } from '../constants.js'

export function useSaveAvatar(pluginID?: NetworkPluginID) {
const [, saveAddress] = useSaveAddress()

return useAsyncFn(
async (account: string, network: EnhanceableSite, avatar: NextIDAvatarMeta, sign: string) => {
async (siteType: EnhanceableSite, account: string, avatar: AvatarNextID<NetworkPluginID>, sign: string) => {
if (avatar.userId === '$unknown') return
await saveAddress(avatar.userId, avatar.pluginId ?? NetworkPluginID.PLUGIN_EVM, account, network)
const avatarStorage = Web3Storage.createKVStorage(`${NFT_AVATAR_METADATA_STORAGE}_${network}`)
avatarStorage?.set<AvatarMeta>(avatar.userId, {
await saveAddress(avatar.userId, avatar.pluginId ?? NetworkPluginID.PLUGIN_EVM, account, siteType)
const avatarStorage = Web3Storage.createKVStorage(`${NFT_AVATAR_METADATA_STORAGE}_${siteType}`)
await avatarStorage?.set<AvatarNextID<NetworkPluginID>>(avatar.userId, {
...avatar,
sign,
})
Expand Down
7 changes: 3 additions & 4 deletions packages/plugins/Avatar/src/hooks/useSaveKV.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,22 @@ import {
type NetworkPluginID,
getEnhanceableSiteType,
} from '@masknet/shared-base'
import type { NextIDAvatarMeta } from '../types.js'
import type { AvatarNextID } from '@masknet/web3-providers/types'
import { useSaveAvatar } from './useSaveAvatar.js'

export function useSaveKV(pluginID: NetworkPluginID) {
const Web3 = useWeb3Connection(pluginID)
const [, saveAvatar] = useSaveAvatar(pluginID)

return useAsyncFn(
async (info: NextIDAvatarMeta, account: string, persona: ECKeyIdentifier, proof: BindingProof) => {
async (info: AvatarNextID<NetworkPluginID>, account: string, persona: ECKeyIdentifier, proof: BindingProof) => {
const siteType = getEnhanceableSiteType()
if (!siteType) return

const sign = await Web3.signMessage('message', JSON.stringify(info), {
account,
})

return saveAvatar(account, siteType, info, sign)
return saveAvatar(siteType, account, info, sign)
},
[Web3, saveAvatar],
)
Expand Down
8 changes: 4 additions & 4 deletions packages/plugins/Avatar/src/hooks/useSaveStringStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ export function useSaveStringStorage(pluginID: NetworkPluginID) {
const [, saveAddress] = useSaveAddress()

return useAsyncFn(
async (userId: string, address: string, nft: AvatarNextID<NetworkPluginID>) => {
async (userId: string, address: string, avatar: AvatarNextID<NetworkPluginID>) => {
const stringStorage = Web3Storage.createFireflyStorage(
`${PLUGIN_NAME}-${(getEnhanceableSiteType() || EnhanceableSite.Twitter).replace('.com', '')}`,
address,
)
await stringStorage.set?.(userId, nft)
await saveAddress(nft.userId, pluginID, address, getEnhanceableSiteType())
await stringStorage.set?.(userId, avatar)
await saveAddress(avatar.userId, pluginID, address, getEnhanceableSiteType())

return nft
return avatar
},
[saveAddress],
)
Expand Down
9 changes: 7 additions & 2 deletions packages/plugins/Avatar/src/hooks/useSaveToNextID.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import { useAsyncFn } from 'react-use'
import { type BindingProof, type ECKeyIdentifier, NetworkPluginID, getEnhanceableSiteType } from '@masknet/shared-base'
import { Web3Storage } from '@masknet/web3-providers'
import type { AvatarNextID } from '@masknet/web3-providers/types'
import { signWithPersona } from '@masknet/plugin-infra/dom/context'
import { useSaveAddress } from './useSaveAddress.js'
import type { NextIDAvatarMeta } from '../types.js'
import { PLUGIN_ID } from '../constants.js'

export function useSaveToNextID() {
const [, saveAddress] = useSaveAddress()
return useAsyncFn(
async (info: NextIDAvatarMeta, account: string, persona?: ECKeyIdentifier, proof?: BindingProof) => {
async (
info: AvatarNextID<NetworkPluginID>,
account: string,
persona?: ECKeyIdentifier,
proof?: BindingProof,
) => {
if (!proof?.identity || !persona) return

const siteType = getEnhanceableSiteType()
Expand Down
38 changes: 0 additions & 38 deletions packages/plugins/Avatar/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
import type { Web3Helper } from '@masknet/web3-helpers'
import type { NetworkPluginID } from '@masknet/shared-base'
import type { ChainId, SchemaType } from '@masknet/web3-shared-evm'

export interface AvatarMetaDB {
userId: string
tokenId: string
address: string
avatarId: string
chainId?: ChainId
schema?: SchemaType
pluginId?: NetworkPluginID
ownerAddress?: string
}

export interface NFT {
amount: string
Expand All @@ -31,33 +19,7 @@ export interface SelectTokenInfo {
pluginID: NetworkPluginID
}

export interface NextIDAvatarMeta extends AvatarMetaDB {
nickname: string
imageUrl: string
}

export interface NFTRSS3Node {
signature: string
nft: AvatarMetaDB
}

export interface NFTInfo {
amount: string
name: string
symbol: string
image?: string
owner?: string
slug?: string
permalink?: string
tokenId: string
}

export enum PFP_TYPE {
BACKGROUND = 'background',
PFP = 'pfp',
}

export type AvatarMeta = NextIDAvatarMeta & { sign: string }

export type AddressStorageV1 = { address: string; networkPluginID: NetworkPluginID }
export type AddressStorageV2 = Record<string, AddressStorageV1> & Record<NetworkPluginID, string>
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export async function getAvatar<T extends NetworkPluginID>(
siteType: EnhanceableSite,
userId: string,
): Promise<AvatarNextID<T> | null> {
const storage = await getAddress(userId)
const storage = await getAddress(siteType, userId)
if (!storage?.address) return null

if (storage.networkPluginID !== NetworkPluginID.PLUGIN_EVM) {
Expand Down
1 change: 1 addition & 0 deletions packages/web3-providers/src/AvatarStore/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface AvatarNextID<T extends NetworkPluginID> {
ownerAddress?: string
nickname?: string
imageUrl?: string
sign?: string
}

export interface AvatarToken {
Expand Down

0 comments on commit 0d8282a

Please sign in to comment.