mirror of
https://github.com/oceanprotocol/market.git
synced 2024-11-14 09:14:52 +01:00
Owner/publisher search (#187)
* make owner search work * owner/publisher search from asset details * copy & cleanup * style tweaks * timing * make search combinations work again * remove account search highjacking * switch owner source * search route fixes * eth address truncation in text search titles
This commit is contained in:
parent
3974e4a9a3
commit
3505db21da
8
package-lock.json
generated
8
package-lock.json
generated
@ -15058,6 +15058,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"ethereum-address": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/ethereum-address/-/ethereum-address-0.0.4.tgz",
|
||||
"integrity": "sha1-kXKbK8igBEu+4sBcz20EF5U+X5U=",
|
||||
"requires": {
|
||||
"crypto-js": "^3.1.6"
|
||||
}
|
||||
},
|
||||
"ethereum-blockies": {
|
||||
"version": "github:MyEtherWallet/blockies#d36f87e50149aacafb34f099fe0bea1df76e010c",
|
||||
"from": "github:MyEtherWallet/blockies"
|
||||
|
@ -37,6 +37,7 @@
|
||||
"decimal.js": "^10.2.1",
|
||||
"dom-confetti": "^0.2.2",
|
||||
"dotenv": "^8.2.0",
|
||||
"ethereum-address": "0.0.4",
|
||||
"ethereum-blockies": "github:MyEtherWallet/blockies",
|
||||
"filesize": "^6.1.0",
|
||||
"formik": "^2.2.1",
|
||||
|
4
src/@types/node_modules.d.ts
vendored
4
src/@types/node_modules.d.ts
vendored
@ -3,3 +3,7 @@ declare module 'intersection-observer'
|
||||
declare module 'ethereum-blockies' {
|
||||
export function toDataUrl(address: string): string
|
||||
}
|
||||
|
||||
declare module 'ethereum-address' {
|
||||
export function isAddress(address: string): boolean
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ export default function Seo({
|
||||
return (
|
||||
<Helmet
|
||||
defaultTitle={`${siteTitle} — ${siteTagline}`}
|
||||
titleTemplate="%s — Ocean Protocol"
|
||||
titleTemplate={`%s — ${siteTitle}`}
|
||||
title={title}
|
||||
>
|
||||
<html lang="en" />
|
||||
|
@ -26,7 +26,7 @@ export default function SearchBar({
|
||||
function startSearch(e: FormEvent<HTMLButtonElement>) {
|
||||
e.preventDefault()
|
||||
if (value === '') return
|
||||
navigate(`/search?text=${value}`)
|
||||
navigate(`/search/?text=${value}`)
|
||||
}
|
||||
|
||||
return (
|
||||
|
@ -9,7 +9,7 @@ import AssetActions from '../AssetActions'
|
||||
import { DDO } from '@oceanprotocol/lib'
|
||||
import { useUserPreferences } from '../../../providers/UserPreferences'
|
||||
import Pricing from './Pricing'
|
||||
import { useOcean, usePricing } from '@oceanprotocol/react'
|
||||
import { useMetadata, useOcean, usePricing } from '@oceanprotocol/react'
|
||||
import EtherscanLink from '../../atoms/EtherscanLink'
|
||||
import Bookmark from './Bookmark'
|
||||
import { accountTruncate } from '../../../utils/wallet'
|
||||
@ -26,9 +26,10 @@ export default function AssetContent({
|
||||
}: AssetContentProps): ReactElement {
|
||||
const { debug } = useUserPreferences()
|
||||
const { accountId, networkId } = useOcean()
|
||||
const { owner } = useMetadata(ddo)
|
||||
const { dtSymbol, dtName } = usePricing(ddo)
|
||||
|
||||
const isOwner = accountId === ddo.publicKey[0].owner
|
||||
const isOwner = accountId === owner
|
||||
const hasNoPrice = ddo.price.datatoken === 0 && ddo.price.value === 0
|
||||
const showPricing = isOwner && hasNoPrice
|
||||
|
||||
@ -49,20 +50,24 @@ export default function AssetContent({
|
||||
path={`token/${ddo.dataToken}`}
|
||||
>
|
||||
{dtName ? (
|
||||
`${dtName} - ${dtSymbol}`
|
||||
`${dtName} — ${dtSymbol}`
|
||||
) : (
|
||||
<code>{ddo.dataToken}</code>
|
||||
)}
|
||||
</EtherscanLink>
|
||||
</p>
|
||||
|
||||
<p className={styles.datatoken} title={ddo.publicKey[0].owner}>
|
||||
<p>
|
||||
Published by{' '}
|
||||
<EtherscanLink
|
||||
networkId={networkId}
|
||||
path={`address/${ddo.publicKey[0].owner}`}
|
||||
<Link
|
||||
to={`/search/?owner=${owner}`}
|
||||
title="Show all data sets created by this account."
|
||||
>
|
||||
{accountTruncate(ddo.publicKey[0].owner)}
|
||||
{owner && accountTruncate(owner)}
|
||||
</Link>
|
||||
{' — '}
|
||||
<EtherscanLink networkId={networkId} path={`address/${owner}`}>
|
||||
Etherscan
|
||||
</EtherscanLink>
|
||||
</p>
|
||||
|
||||
|
@ -15,7 +15,7 @@ export default function SearchPage({
|
||||
}): ReactElement {
|
||||
const { config } = useOcean()
|
||||
const parsed = queryString.parse(location.search)
|
||||
const { text, tags, page } = parsed
|
||||
const { text, owner, tags, page } = parsed
|
||||
const [queryResult, setQueryResult] = useState<QueryResult>()
|
||||
const [loading, setLoading] = useState<boolean>()
|
||||
|
||||
@ -27,12 +27,14 @@ export default function SearchPage({
|
||||
setLoading(false)
|
||||
}
|
||||
initSearch()
|
||||
}, [text, tags, page, config.metadataCacheUri])
|
||||
}, [text, owner, tags, page, config.metadataCacheUri])
|
||||
|
||||
return (
|
||||
<section className={styles.grid}>
|
||||
<div className={styles.search}>
|
||||
{text && <SearchBar initialValue={text as string} />}
|
||||
{(text || owner) && (
|
||||
<SearchBar initialValue={(text || owner) as string} />
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className={styles.results}>
|
||||
|
@ -5,19 +5,21 @@ import {
|
||||
import { MetadataCache, Logger } from '@oceanprotocol/lib'
|
||||
|
||||
export function getSearchQuery(
|
||||
page?: string | string[],
|
||||
offset?: string | string[],
|
||||
text?: string | string[],
|
||||
tags?: string | string[],
|
||||
categories?: string | string[]
|
||||
text?: string,
|
||||
owner?: string,
|
||||
tags?: string,
|
||||
categories?: string,
|
||||
page?: string,
|
||||
offset?: string
|
||||
): SearchQuery {
|
||||
return {
|
||||
page: Number(page) || 1,
|
||||
offset: Number(offset) || 21,
|
||||
query: {
|
||||
text,
|
||||
tags: tags ? [tags] : undefined,
|
||||
categories: categories ? [categories] : undefined
|
||||
...(owner && { 'publicKey.owner': [owner] }),
|
||||
...(tags && { tags: [tags] }),
|
||||
...(categories && { categories: [categories] })
|
||||
},
|
||||
sort: {
|
||||
created: -1
|
||||
@ -33,6 +35,7 @@ export function getSearchQuery(
|
||||
export async function getResults(
|
||||
params: {
|
||||
text?: string
|
||||
owner?: string
|
||||
tags?: string
|
||||
categories?: string
|
||||
page?: string
|
||||
@ -40,11 +43,11 @@ export async function getResults(
|
||||
},
|
||||
metadataCacheUri: string
|
||||
): Promise<QueryResult> {
|
||||
const { text, tags, page, offset, categories } = params
|
||||
const { text, owner, tags, page, offset, categories } = params
|
||||
|
||||
const metadataCache = new MetadataCache(metadataCacheUri, Logger)
|
||||
const queryResult = await metadataCache.queryMetadata(
|
||||
getSearchQuery(page, offset, text, tags, categories)
|
||||
getSearchQuery(text, owner, tags, categories, page, offset)
|
||||
)
|
||||
|
||||
return queryResult
|
||||
|
@ -3,17 +3,24 @@ import PageSearch from '../components/templates/Search'
|
||||
import { PageProps } from 'gatsby'
|
||||
import Layout from '../components/Layout'
|
||||
import queryString from 'query-string'
|
||||
import { accountTruncate } from '../utils/wallet'
|
||||
import ethereumAddress from 'ethereum-address'
|
||||
|
||||
export default function PageGatsbySearch(props: PageProps): ReactElement {
|
||||
const parsed = queryString.parse(props.location.search)
|
||||
const { text, tags, categories } = parsed
|
||||
const searchValue = text || tags || categories
|
||||
const { text, owner, tags, categories } = parsed
|
||||
|
||||
const isETHAddress = ethereumAddress.isAddress(text as string)
|
||||
const searchValue =
|
||||
(isETHAddress ? accountTruncate(text as string) : text) ||
|
||||
tags ||
|
||||
categories
|
||||
const title = owner
|
||||
? `Published by ${accountTruncate(owner as string)}`
|
||||
: `Search for ${searchValue || 'all data sets'}`
|
||||
|
||||
return (
|
||||
<Layout
|
||||
title={`Search for ${searchValue || 'all data sets'}`}
|
||||
uri={props.uri}
|
||||
>
|
||||
<Layout title={title} uri={props.uri}>
|
||||
<PageSearch location={props.location} />
|
||||
</Layout>
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user