Merge pull request #68 from Permissionless-Software-Foundation/dh-categories-ui

feat(NFTs): Added categories dropdown to nfts page
This commit is contained in:
Chris Troutner
2025-10-12 16:42:04 -07:00
committed by GitHub
4 changed files with 85 additions and 23 deletions
@@ -0,0 +1,41 @@
import React from 'react'
import { Dropdown } from 'react-bootstrap'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faFilter } from '@fortawesome/free-solid-svg-icons'
function FilterDropdown (props) {
const { selectedFilter, setSelectedFilter } = props
return (
<Dropdown>
<Dropdown.Toggle
variant='outline-secondary'
className='d-flex align-items-center justify-content-around gap-2 mt-3'
style={{ minWidth: '150px' }}
>
<FontAwesomeIcon icon={faFilter} />
<span>{selectedFilter}</span>
</Dropdown.Toggle>
<Dropdown.Menu>
<Dropdown.Item onClick={() => setSelectedFilter('Art')}>
Art
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Video')}>
Video
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Writing')}>
Writing
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Download')}>
Download
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Misc')}>
Misc
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default FilterDropdown
@@ -20,6 +20,7 @@ import { faRedo } from '@fortawesome/free-solid-svg-icons'
// Local libraries // Local libraries
import config from '../../../config' import config from '../../../config'
import TokenCard from './token-card' import TokenCard from './token-card'
import FilterDropdown from './filter-dropdown'
// Global variables and constants // Global variables and constants
const SERVER = config.dexServer const SERVER = config.dexServer
@@ -35,6 +36,7 @@ function NftsForSale (props) {
const [dataAreLoaded, setDataAreLoaded] = useState(false) const [dataAreLoaded, setDataAreLoaded] = useState(false)
const [currentPage, setCurrentPage] = useState(0) const [currentPage, setCurrentPage] = useState(0)
const [totalPages, setTotalPages] = useState(0) const [totalPages, setTotalPages] = useState(0)
const [selectedFilter, setSelectedFilter] = useState('Art')
// Handler for previous page // Handler for previous page
const handlePreviousPage = () => { const handlePreviousPage = () => {
@@ -304,6 +306,9 @@ function NftsForSale (props) {
<Col> <Col>
<h1>NFTs for Sale</h1> <h1>NFTs for Sale</h1>
</Col> </Col>
<Col className='d-flex justify-content-end'>
<FilterDropdown selectedFilter={selectedFilter} setSelectedFilter={setSelectedFilter} />
</Col>
</Row> </Row>
<Row> <Row>
<Col xs={12} style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}> <Col xs={12} style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
@@ -339,7 +344,7 @@ function NftsForSale (props) {
{/* Pagination Controls */} {/* Pagination Controls */}
{offersAreLoaded && totalPages > 1 && ( {offersAreLoaded && totalPages > 1 && (
<div <div
style={{ style={{
position: 'fixed', position: 'fixed',
bottom: '70px', bottom: '70px',
@@ -395,7 +400,7 @@ function NftsForSale (props) {
Previous Previous
</Button> </Button>
<div <div
style={{ style={{
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
@@ -11,14 +11,13 @@
*/ */
import React, { useState, useEffect, useCallback } from 'react' import React, { useState, useEffect, useCallback } from 'react'
import { Container, Spinner, Dropdown } from 'react-bootstrap' import { Container, Spinner } from 'react-bootstrap'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faFilter } from '@fortawesome/free-solid-svg-icons'
import axios from 'axios' import axios from 'axios'
// Local libraries // Local libraries
import config from '../../../../config' import config from '../../../../config'
import ContentCard from './content-card' import ContentCard from './content-card'
import FilterDropdown from './filter-dropdown'
// Global variables and constants // Global variables and constants
const SERVER = config.dexServer const SERVER = config.dexServer
@@ -101,24 +100,10 @@ function ContentCreators (props) {
</div> </div>
<div className='mb-4 d-flex justify-content-end'> <div className='mb-4 d-flex justify-content-end'>
<Dropdown> <FilterDropdown
<Dropdown.Toggle variant='outline-secondary' className='d-flex align-items-center gap-2'> selectedFilter={selectedFilter}
<FontAwesomeIcon icon={faFilter} /> setSelectedFilter={setSelectedFilter}
<span>{selectedFilter}</span> />
</Dropdown.Toggle>
<Dropdown.Menu>
<Dropdown.Item onClick={() => setSelectedFilter('Most Followers')}>
Most Followers
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Most Tokens')}>
Most Tokens
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Most Likes')}>
Most Likes
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
</div> </div>
{!loaded && ( {!loaded && (
@@ -0,0 +1,31 @@
import React from 'react'
import { Dropdown } from 'react-bootstrap'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faFilter } from '@fortawesome/free-solid-svg-icons'
function FilterDropdown (props) {
const { selectedFilter, setSelectedFilter } = props
return (
<Dropdown>
<Dropdown.Toggle variant='outline-secondary' className='d-flex align-items-center gap-2'>
<FontAwesomeIcon icon={faFilter} />
<span>{selectedFilter}</span>
</Dropdown.Toggle>
<Dropdown.Menu>
<Dropdown.Item onClick={() => setSelectedFilter('Most Followers')}>
Most Followers
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Most Tokens')}>
Most Tokens
</Dropdown.Item>
<Dropdown.Item onClick={() => setSelectedFilter('Most Likes')}>
Most Likes
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
)
}
export default FilterDropdown