mod tiles and nsfw blurring

This commit is contained in:
SpikeHD
2022-07-23 20:33:36 -07:00
parent d97e5c192f
commit 95267720a4
5 changed files with 105 additions and 25 deletions

View File

@@ -4,3 +4,16 @@
background-color: rgba(106, 105, 106, 0.6); background-color: rgba(106, 105, 106, 0.6);
} }
.ModListInner {
width: 100%;
height: 100%;
display: flex;
flex-direction: row;
flex-grow: 1;
align-items: center;
justify-content: center;
flex-wrap: wrap;
overflow-y: auto;
}

View File

@@ -1,15 +1,16 @@
import React from 'react' import React from 'react'
import { getMods } from '../../../utils/gamebanana' import { getMods, ModData } from '../../../utils/gamebanana'
import { LoadingCircle } from './LoadingCircle' import { LoadingCircle } from './LoadingCircle'
import './ModList.css' import './ModList.css'
import { ModTile } from './ModTile'
interface IProps { interface IProps {
mode: string mode: string
} }
interface IState { interface IState {
modList: string[] modList: ModData[]
} }
export class ModList extends React.Component<IProps, IState> { export class ModList extends React.Component<IProps, IState> {
@@ -22,13 +23,23 @@ export class ModList extends React.Component<IProps, IState> {
const mods = await getMods(this.props.mode) const mods = await getMods(this.props.mode)
console.log(mods) this.setState({
modList: mods,
})
} }
render() { render() {
return ( return (
<div className="ModList"> <div className="ModList">
<LoadingCircle /> {this.state && this.state.modList ? (
<div className="ModListInner">
{this.state.modList.map((mod: ModData) => (
<ModTile mod={mod} key={mod.id} />
))}
</div>
) : (
<LoadingCircle />
)}
</div> </div>
) )
} }

View File

@@ -0,0 +1,13 @@
.ModListItem {
width: 20%;
}
.ModListItem img {
object-fit: cover;
width: 80%;
height: 100px;
}
img.nsfw {
filter: blur(16px);
}

View File

@@ -1 +1,26 @@
export {} import React from 'react'
import { ModData } from '../../../utils/gamebanana'
import './ModTile.css'
interface IProps {
mod: ModData
}
export class ModTile extends React.Component<IProps, never> {
constructor(props: IProps) {
super(props)
}
render() {
const { mod } = this.props
return (
<div className="ModListItem">
<span className="ModName">{mod.name}</span>
<img src={mod.images[0]} className={mod.nsfw ? 'nsfw' : ''} />
<div className="ModInner"></div>
</div>
)
}
}

View File

@@ -62,6 +62,21 @@ export interface RootCategory {
_sIconUrl: string _sIconUrl: string
} }
export interface ModData {
id: number
name: string
images: string[]
dateadded: number
submitter: {
name: string
url: string
}
nsfw: boolean
likes: number
views: number
type: string
}
export async function getMods(mode: string) { export async function getMods(mode: string) {
const resp = JSON.parse( const resp = JSON.parse(
await invoke('list_submissions', { await invoke('list_submissions', {
@@ -75,25 +90,28 @@ export async function getMods(mode: string) {
export async function formatGamebananaData(obj: GamebananaResponse[]) { export async function formatGamebananaData(obj: GamebananaResponse[]) {
if (!obj) return [] if (!obj) return []
return obj.map((itm) => { return obj
const img = itm?._aPreviewMedia?._aImages .map((itm) => {
const img = itm?._aPreviewMedia?._aImages
return { return {
id: itm._idRow, id: itm._idRow,
name: itm._sName, name: itm._sName,
images: img images: img
? img.map((i) => { ? img.map((i) => {
return i._sBaseUrl + i._sFile return i._sBaseUrl + '/' + i._sFile220
}) })
: [], : [],
dateadded: itm._tsDateAdded, dateadded: itm._tsDateAdded,
submitter: { submitter: {
name: itm._aSubmitter._sName, name: itm._aSubmitter._sName,
url: itm._aSubmitter._sProfileUrl, url: itm._aSubmitter._sProfileUrl,
}, },
nsfw: itm._bIsNsfw, nsfw: itm._bIsNsfw,
likes: itm?._nLikeCount || 0, likes: itm?._nLikeCount || 0,
views: itm?._nViewCount || 0, views: itm?._nViewCount || 0,
} type: itm._sSingularTitle,
}) } as ModData
})
.filter((itm) => itm.type === 'Mod')
} }