Include export options for collection holder snapshots
This commit is contained in:
parent
6f403fe70a
commit
d7235264f9
@ -26,8 +26,12 @@ const Snapshots: NextPage = () => {
|
||||
defaultValue: '',
|
||||
})
|
||||
|
||||
const snapshotEndpoint = `https://metabase.constellations.zone/api/public/card/b5764fb2-9a23-4ecf-866b-dec79c4c461e/query/json?parameters=%5B%7B%22type%22%3A%22category%22%2C%22value%22%3A%22${collectionAddressState.value}%22%2C%22id%22%3A%22cb34b7a8-70cf-ba86-8d9c-360b5b2fedd3%22%2C%22target%22%3A%5B%22variable%22%2C%5B%22template-tag%22%2C%22collection_addr%22%5D%5D%7D%5D`
|
||||
// function to download .json from the endpoint
|
||||
const [includeStaked, setIncludeStaked] = useState<boolean>(true)
|
||||
const [includeListed, setIncludeListed] = useState<boolean>(true)
|
||||
const [exportIndividualTokens, setExportIndividualTokens] = useState<boolean>(false)
|
||||
|
||||
const snapshotEndpoint = `https://metabase.constellations.zone/api/public/card/4cf9550e-5eb7-4fe7-bd3b-dc33229f53dc/query/json?parameters=%5B%7B%22type%22%3A%22category%22%2C%22value%22%3A%22${collectionAddressState.value}%22%2C%22id%22%3A%22cb34b7a8-70cf-ba86-8d9c-360b5b2fedd3%22%2C%22target%22%3A%5B%22variable%22%2C%5B%22template-tag%22%2C%22collection_addr%22%5D%5D%7D%5D`
|
||||
|
||||
const download = (content: string, fileName: string, contentType: string) => {
|
||||
const a = document.createElement('a')
|
||||
const file = new Blob([content], { type: contentType })
|
||||
@ -51,6 +55,45 @@ const Snapshots: NextPage = () => {
|
||||
|
||||
<SelectCollection selectCollection={setCollectionAddress} />
|
||||
<AddressInput className="w-3/4" {...collectionAddressState} />
|
||||
<div className="flex-col mt-2 w-full form-control">
|
||||
<h1 className="underline text-lg font-bold">Snapshot Options </h1>
|
||||
<div className="flex-row w-full">
|
||||
<label className="justify-start cursor-pointer label w-2/5">
|
||||
<span className="mr-2 font-bold">Include listed tokens on Marketplace</span>
|
||||
<input
|
||||
checked={includeListed}
|
||||
className={`${includeListed ? `bg-stargaze` : `bg-gray-600`} checkbox`}
|
||||
onClick={() => {
|
||||
setIncludeListed(!includeListed)
|
||||
}}
|
||||
type="checkbox"
|
||||
/>
|
||||
</label>
|
||||
<label className="justify-start cursor-pointer label w-2/5">
|
||||
<span className="mr-2 font-bold">Include staked tokens on DAOs</span>
|
||||
<input
|
||||
checked={includeStaked}
|
||||
className={`${includeStaked ? `bg-stargaze` : `bg-gray-600`} checkbox`}
|
||||
onClick={() => {
|
||||
setIncludeStaked(!includeStaked)
|
||||
}}
|
||||
type="checkbox"
|
||||
/>
|
||||
</label>
|
||||
<label className="justify-start cursor-pointer label w-2/5">
|
||||
<span className="mr-2 font-bold">Export holders for each token individually</span>
|
||||
<input
|
||||
checked={exportIndividualTokens}
|
||||
className={`${exportIndividualTokens ? `bg-stargaze` : `bg-gray-600`} checkbox`}
|
||||
onClick={() => {
|
||||
setExportIndividualTokens(!exportIndividualTokens)
|
||||
}}
|
||||
type="checkbox"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
className="px-4 py-2 font-bold text-white bg-stargaze rounded-md"
|
||||
onClick={() => {
|
||||
@ -63,7 +106,31 @@ const Snapshots: NextPage = () => {
|
||||
})
|
||||
return
|
||||
}
|
||||
const csv = `address,amount\n${data?.map((row: any) => Object.values(row).join(',')).join('\n')}`
|
||||
if (exportIndividualTokens) {
|
||||
const csv = `address,tokenId\n${data
|
||||
?.map((row: any) => {
|
||||
if (!includeListed && row.is_listed) return ''
|
||||
if (!includeStaked && row.is_staked) return ''
|
||||
return `${row.owner_addr},${row.token_id}\n`
|
||||
})
|
||||
.join('')}`
|
||||
download(csv, 'snapshot.csv', 'text/csv')
|
||||
return
|
||||
}
|
||||
const aggregatedData: any[] = []
|
||||
data.forEach((row: any) => {
|
||||
if (!includeListed && row.is_listed) return
|
||||
if (!includeStaked && row.is_staked) return
|
||||
const existingRow = aggregatedData.find((r) => r.address === row.owner_addr)
|
||||
if (existingRow) {
|
||||
existingRow.amount += 1
|
||||
} else {
|
||||
aggregatedData.push({ address: row.owner_addr, amount: 1 })
|
||||
}
|
||||
})
|
||||
|
||||
aggregatedData.sort((a, b) => b.amount - a.amount)
|
||||
const csv = `address,amount\n${aggregatedData.map((row: any) => Object.values(row).join(',')).join('\n')}`
|
||||
download(csv, 'snapshot.csv', 'text/csv')
|
||||
})
|
||||
.catch((err) => {
|
||||
|
Loading…
Reference in New Issue
Block a user