Merge pull request #97 from public-awesome/html-file-support
Upload support for .html files during collection creation
This commit is contained in:
commit
af3aba109b
@ -1,4 +1,4 @@
|
|||||||
APP_VERSION=0.4.1
|
APP_VERSION=0.4.2
|
||||||
|
|
||||||
NEXT_PUBLIC_PINATA_ENDPOINT_URL=https://api.pinata.cloud/pinning/pinFileToIPFS
|
NEXT_PUBLIC_PINATA_ENDPOINT_URL=https://api.pinata.cloud/pinning/pinFileToIPFS
|
||||||
NEXT_PUBLIC_SG721_CODE_ID=793
|
NEXT_PUBLIC_SG721_CODE_ID=793
|
||||||
|
@ -96,6 +96,18 @@ export const AssetsPreview = ({ assetFilesArray, updateMetadataFileIndex }: Asse
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{getAssetType(assetSource.name) === 'html' && (
|
||||||
|
<div className="flex absolute flex-col items-center mt-4 ml-2">
|
||||||
|
<img
|
||||||
|
key={`html-${index}`}
|
||||||
|
alt="html_icon"
|
||||||
|
className={clsx('mb-2 ml-1 w-10 h-10 thumbnail')}
|
||||||
|
src="/html.png"
|
||||||
|
/>
|
||||||
|
<span className="flex self-center">{assetSource.name.toLowerCase()}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</label>
|
</label>
|
||||||
</button>
|
</button>
|
||||||
))
|
))
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* eslint-disable eslint-comments/disable-enable-pair */
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
||||||
/* eslint-disable jsx-a11y/media-has-caption */
|
/* eslint-disable jsx-a11y/media-has-caption */
|
||||||
import type { ReactNode } from 'react'
|
import type { ReactNode } from 'react'
|
||||||
import { useMemo } from 'react'
|
import { useEffect, useMemo, useState } from 'react'
|
||||||
import { getAssetType } from 'utils/getAssetType'
|
import { getAssetType } from 'utils/getAssetType'
|
||||||
|
|
||||||
export interface MetadataFormGroupProps {
|
export interface MetadataFormGroupProps {
|
||||||
@ -13,6 +13,7 @@ export interface MetadataFormGroupProps {
|
|||||||
|
|
||||||
export const MetadataFormGroup = (props: MetadataFormGroupProps) => {
|
export const MetadataFormGroup = (props: MetadataFormGroupProps) => {
|
||||||
const { title, subtitle, relatedAsset, children } = props
|
const { title, subtitle, relatedAsset, children } = props
|
||||||
|
const [htmlContents, setHtmlContents] = useState<string>('')
|
||||||
|
|
||||||
const videoPreview = useMemo(
|
const videoPreview = useMemo(
|
||||||
() => (
|
() => (
|
||||||
@ -40,6 +41,17 @@ export const MetadataFormGroup = (props: MetadataFormGroupProps) => {
|
|||||||
[relatedAsset],
|
[relatedAsset],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (getAssetType(relatedAsset?.name as string) !== 'html') return
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.onload = (e) => {
|
||||||
|
if (typeof e.target?.result === 'string') {
|
||||||
|
setHtmlContents(e.target.result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.readAsText(new Blob([relatedAsset as File]))
|
||||||
|
}, [relatedAsset])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex p-4 pt-0 space-x-4 w-full">
|
<div className="flex p-4 pt-0 space-x-4 w-full">
|
||||||
<div className="flex flex-col w-1/3">
|
<div className="flex flex-col w-1/3">
|
||||||
@ -54,6 +66,9 @@ export const MetadataFormGroup = (props: MetadataFormGroupProps) => {
|
|||||||
{getAssetType(relatedAsset.name) === 'image' && (
|
{getAssetType(relatedAsset.name) === 'image' && (
|
||||||
<img alt="preview" src={URL.createObjectURL(relatedAsset)} />
|
<img alt="preview" src={URL.createObjectURL(relatedAsset)} />
|
||||||
)}
|
)}
|
||||||
|
{getAssetType(relatedAsset.name) === 'html' && (
|
||||||
|
<iframe allowFullScreen height="420px" srcDoc={htmlContents} title="Preview" width="100%" />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* eslint-disable eslint-comments/disable-enable-pair */
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
||||||
/* eslint-disable jsx-a11y/media-has-caption */
|
/* eslint-disable jsx-a11y/media-has-caption */
|
||||||
import type { ReactNode } from 'react'
|
import type { ReactNode } from 'react'
|
||||||
import { useMemo } from 'react'
|
import { useEffect, useMemo, useState } from 'react'
|
||||||
import { getAssetType } from 'utils/getAssetType'
|
import { getAssetType } from 'utils/getAssetType'
|
||||||
|
|
||||||
export interface SingleAssetPreviewProps {
|
export interface SingleAssetPreviewProps {
|
||||||
@ -13,6 +13,7 @@ export interface SingleAssetPreviewProps {
|
|||||||
|
|
||||||
export const SingleAssetPreview = (props: SingleAssetPreviewProps) => {
|
export const SingleAssetPreview = (props: SingleAssetPreviewProps) => {
|
||||||
const { subtitle, relatedAsset, updateMetadataFileIndex, children } = props
|
const { subtitle, relatedAsset, updateMetadataFileIndex, children } = props
|
||||||
|
const [htmlContents, setHtmlContents] = useState<string>('')
|
||||||
|
|
||||||
const videoPreview = useMemo(
|
const videoPreview = useMemo(
|
||||||
() => (
|
() => (
|
||||||
@ -40,6 +41,17 @@ export const SingleAssetPreview = (props: SingleAssetPreviewProps) => {
|
|||||||
[relatedAsset],
|
[relatedAsset],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (getAssetType(relatedAsset?.name as string) !== 'html') return
|
||||||
|
const reader = new FileReader()
|
||||||
|
reader.onload = (e) => {
|
||||||
|
if (typeof e.target?.result === 'string') {
|
||||||
|
setHtmlContents(e.target.result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.readAsText(new Blob([relatedAsset as File]))
|
||||||
|
}, [relatedAsset])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex p-4 pt-0 mt-11 ml-24 space-x-4 w-full">
|
<div className="flex p-4 pt-0 mt-11 ml-24 space-x-4 w-full">
|
||||||
<div className="flex flex-col w-full">
|
<div className="flex flex-col w-full">
|
||||||
@ -53,6 +65,9 @@ export const SingleAssetPreview = (props: SingleAssetPreviewProps) => {
|
|||||||
{getAssetType(relatedAsset.name) === 'image' && (
|
{getAssetType(relatedAsset.name) === 'image' && (
|
||||||
<img alt="preview" src={URL.createObjectURL(relatedAsset)} />
|
<img alt="preview" src={URL.createObjectURL(relatedAsset)} />
|
||||||
)}
|
)}
|
||||||
|
{getAssetType(relatedAsset.name) === 'html' && (
|
||||||
|
<iframe allowFullScreen height="300px" srcDoc={htmlContents} title="Preview" width="100%" />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -441,7 +441,7 @@ export const UploadDetails = ({ onChange, minterType, baseMinterAcquisitionMetho
|
|||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
accept="image/*, audio/*, video/*"
|
accept="image/*, audio/*, video/*, .html"
|
||||||
className={clsx(
|
className={clsx(
|
||||||
'file:py-2 file:px-4 file:mr-4 file:bg-plumbus-light file:rounded file:border-0 cursor-pointer',
|
'file:py-2 file:px-4 file:mr-4 file:bg-plumbus-light file:rounded file:border-0 cursor-pointer',
|
||||||
'before:absolute before:inset-0 before:hover:bg-white/5 before:transition',
|
'before:absolute before:inset-0 before:hover:bg-white/5 before:transition',
|
||||||
@ -488,7 +488,7 @@ export const UploadDetails = ({ onChange, minterType, baseMinterAcquisitionMetho
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<Conditional test={assetFilesArray.length > 1}>
|
<Conditional test={assetFilesArray.length >= 1}>
|
||||||
<MetadataModal
|
<MetadataModal
|
||||||
assetFile={assetFilesArray[metadataFileArrayIndex]}
|
assetFile={assetFilesArray[metadataFileArrayIndex]}
|
||||||
metadataFile={metadataFilesArray[metadataFileArrayIndex]}
|
metadataFile={metadataFilesArray[metadataFileArrayIndex]}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "stargaze-studio",
|
"name": "stargaze-studio",
|
||||||
"version": "0.4.1",
|
"version": "0.4.2",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/*"
|
"packages/*"
|
||||||
],
|
],
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* eslint-disable eslint-comments/disable-enable-pair */
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
|
||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
@ -576,12 +576,13 @@ const CollectionCreationPage: NextPage = () => {
|
|||||||
|
|
||||||
if (
|
if (
|
||||||
getAssetType(uploadDetails.assetFiles[i].name) === 'audio' ||
|
getAssetType(uploadDetails.assetFiles[i].name) === 'audio' ||
|
||||||
getAssetType(uploadDetails.assetFiles[i].name) === 'video'
|
getAssetType(uploadDetails.assetFiles[i].name) === 'video' ||
|
||||||
|
getAssetType(uploadDetails.assetFiles[i].name) === 'html'
|
||||||
) {
|
) {
|
||||||
data.animation_url = `ipfs://${assetUri}/${uploadDetails.assetFiles[i].name}`
|
data.animation_url = `ipfs://${assetUri}/${uploadDetails.assetFiles[i].name}`
|
||||||
}
|
}
|
||||||
|
if (getAssetType(uploadDetails.assetFiles[i].name) !== 'html')
|
||||||
data.image = `ipfs://${assetUri}/${uploadDetails.assetFiles[i].name}`
|
data.image = `ipfs://${assetUri}/${uploadDetails.assetFiles[i].name}`
|
||||||
|
|
||||||
const metadataFileBlob = new Blob([JSON.stringify(data)], {
|
const metadataFileBlob = new Blob([JSON.stringify(data)], {
|
||||||
type: 'application/json',
|
type: 'application/json',
|
||||||
|
BIN
public/html.png
Normal file
BIN
public/html.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
@ -1,6 +1,6 @@
|
|||||||
/* eslint-disable eslint-comments/disable-enable-pair */
|
/* eslint-disable eslint-comments/disable-enable-pair */
|
||||||
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
||||||
export type AssetType = 'image' | 'audio' | 'video' | 'unknown'
|
export type AssetType = 'image' | 'audio' | 'video' | 'html' | 'unknown'
|
||||||
|
|
||||||
export const getAssetType = (assetFileName: string): AssetType => {
|
export const getAssetType = (assetFileName: string): AssetType => {
|
||||||
const assetType = assetFileName?.split('.').pop() || 'unknown'
|
const assetType = assetFileName?.split('.').pop() || 'unknown'
|
||||||
@ -8,5 +8,6 @@ export const getAssetType = (assetFileName: string): AssetType => {
|
|||||||
return 'image'
|
return 'image'
|
||||||
if (assetType === 'mp3' || assetType === 'wav') return 'audio'
|
if (assetType === 'mp3' || assetType === 'wav') return 'audio'
|
||||||
if (assetType === 'mp4') return 'video'
|
if (assetType === 'mp4') return 'video'
|
||||||
|
if (assetType === 'html') return 'html'
|
||||||
return 'unknown'
|
return 'unknown'
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user