mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2025-12-14 16:14:48 +01:00
mod tiles and nsfw blurring
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/ui/components/mods/ModTile.css
Normal file
13
src/ui/components/mods/ModTile.css
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.ModListItem {
|
||||||
|
width: 20%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ModListItem img {
|
||||||
|
object-fit: cover;
|
||||||
|
width: 80%;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.nsfw {
|
||||||
|
filter: blur(16px);
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user