Skip to content

Commit 7b591b6

Browse files
committed
Add home feed configuration
Make home feed customizable via configs teia-community#301
1 parent ab43ff8 commit 7b591b6

File tree

6 files changed

+115
-37
lines changed

6 files changed

+115
-37
lines changed

src/components/header/feed_toolbar/FeedToolbar.jsx

+24-33
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ import { DropDown, DropdownButton } from '@atoms/dropdown'
55
import { IconToggle } from '@atoms/toggles'
66
import { SingleViewIcon, MasonryIcon, ChevronIcon } from '@icons'
77

8-
import { useState } from 'react'
98
import { Button } from '@atoms/button'
109

1110
import { useLocalSettings } from '@context/localSettingsStore'
1211
import { useLocation, useNavigate } from 'react-router'
13-
import { useEffect } from 'react'
1412
import { Line } from '@atoms/line'
1513
import { shallow } from 'zustand/shallow'
14+
import { FEED_MAP, DEFAULT_START_FEED } from '@constants'
1615

1716
// const MediaFilter = ({ label, tagline }) => {
1817
// return (
@@ -24,54 +23,46 @@ import { shallow } from 'zustand/shallow'
2423
// }
2524

2625
const locationMap = new Map([
27-
['/', 'Recent Sales'],
28-
['/feed/random', 'Random'],
29-
['/feed/newobjkts', 'New OBJKTs'],
30-
['/feed/friends', 'Friends'],
26+
['/feed/sales', FEED_MAP['Recent Sales']],
27+
['/feed/random', FEED_MAP['Random']],
28+
['/feed/newobjkts', FEED_MAP['New OBJKTs']],
29+
['/feed/friends', FEED_MAP['Friends']],
3130
// separator
3231
['---fund_feeds', 'fund_feeds'],
33-
['/feed/quake-aid', 'Quake Aid'],
34-
['/feed/ukraine', '🇺🇦 Ukraine'],
35-
['/feed/pakistan', '🇵🇰 Pakistan'],
36-
['/feed/iran', '🇮🇷 Iran'],
37-
['/feed/tezospride', '🏳️‍🌈 Tezospride'],
32+
['/feed/quake-aid', FEED_MAP['Quake Aid']],
33+
['/feed/ukraine', FEED_MAP['🇺🇦 Ukraine']],
34+
['/feed/pakistan', FEED_MAP['🇵🇰 Pakistan']],
35+
['/feed/iran', FEED_MAP['🇮🇷 Iran']],
36+
['/feed/tezospride', FEED_MAP['🏳️‍🌈 Tezospride']],
3837
// separator
3938
['---mime_feeds', 'mime_feeds'],
40-
['/feed/image', 'Image'],
41-
['/feed/video', 'Video'],
42-
['/feed/audio', 'Audio'],
43-
['/feed/glb', '3D'],
44-
['/feed/html-svg', 'HTML & SVG'],
45-
['/feed/gif', 'GIF'],
46-
['/feed/pdf', 'PDF'],
47-
['/feed/md', 'Markdown'],
39+
['/feed/image', FEED_MAP['Image']],
40+
['/feed/video', FEED_MAP['Video']],
41+
['/feed/audio', FEED_MAP['Audio']],
42+
['/feed/glb', FEED_MAP['3D']],
43+
['/feed/html-svg', FEED_MAP['HTML & SVG']],
44+
['/feed/gif', FEED_MAP['GIF']],
45+
['/feed/pdf', FEED_MAP['PDF']],
46+
['/feed/md', FEED_MAP['Markdown']],
4847
])
4948

5049
const locationNeedSync = ['/feed/friends']
51-
const locationPaths = [...locationMap.keys()]
5250

5351
export const FeedToolbar = ({ feeds_menu = false }) => {
5452
// const [price, setPrice] = useState({ from: 0, to: 0 })
5553

56-
const [viewMode, setViewMode] = useLocalSettings(
57-
(st) => [st.viewMode, st.setViewMode],
54+
const [viewMode, setViewMode, startFeed] = useLocalSettings(
55+
(st) => [st.viewMode, st.setViewMode, st.startFeed],
5856
shallow
5957
)
6058
const location = useLocation()
61-
const [feedLabel, setFeedLabel] = useState('Recent Sales')
59+
const feedLabel =
60+
locationMap.get(location.pathname) ||
61+
startFeed ||
62+
FEED_MAP[DEFAULT_START_FEED]
6263

6364
const navigate = useNavigate()
6465

65-
useEffect(() => {
66-
for (const pth of locationPaths.slice(1)) {
67-
if (location.pathname.includes(pth)) {
68-
setFeedLabel(locationMap.get(pth))
69-
}
70-
}
71-
72-
// return locationMap[location]
73-
}, [location])
74-
7566
// TODO: finish the filtering logic
7667
// const filters = false
7768
return (

src/constants.ts

+21
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@ export const ALLOWED_FILETYPES_LABEL = Object.entries(MIMETYPE)
6868
.map((e) => (e[0] === 'ZIP' ? 'HTML (ZIP ARCHIVE)' : e[0]))
6969
.join(', ')
7070

71+
export const FEED_MAP = {
72+
'Recent Sales': 'Recent Sales',
73+
'Random': 'Random',
74+
'New OBJKTs': 'New OBJKTs',
75+
'Friends': 'Friends',
76+
'Quake Aid': 'Quake Aid',
77+
'🇺🇦 Ukraine': '🇺🇦 Ukraine',
78+
'🇵🇰 Pakistan': '🇵🇰 Pakistan',
79+
'🇮🇷 Iran': '🇮🇷 Iran',
80+
'🏳️‍🌈 Tezospride': '🏳️‍🌈 Tezospride',
81+
'Image': 'Image',
82+
'Video': 'Video',
83+
'Audio': 'Audio',
84+
'3D': '3D',
85+
'HTML & SVG': 'HTML & SVG',
86+
'GIF': 'GIF',
87+
'PDF': 'PDF',
88+
'Markdown': 'Markdown',
89+
} as const
90+
export const DEFAULT_START_FEED: keyof typeof FEED_MAP = 'Recent Sales'
91+
7192
//- Mint stuff
7293

7394
export const ALLOWED_COVER_MIMETYPES = [

src/context/localSettingsStore.ts

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
subscribeWithSelector,
66
} from 'zustand/middleware'
77
// import { useModalStore } from './modalStore'
8+
import { FEED_MAP, DEFAULT_START_FEED } from '@constants'
89

910
type ViewMode = 'single' | 'masonry'
1011

@@ -20,20 +21,24 @@ export const rpc_nodes = [
2021
'custom',
2122
] as const
2223

24+
type StartFeed = keyof typeof FEED_MAP
25+
2326
export type RPC_NODES = typeof rpc_nodes[number]
2427

2528
interface LocalSettingsState {
2629
applyTheme: (theme: Theme) => void
2730
has_seen_banner: boolean
2831
nsfwFriendly: boolean
2932
photosensitiveFriendly: boolean
33+
startFeed: StartFeed
3034
rpcNode: RPC_NODES
3135
/** Use this to query the current rpc url since it will also resolve the custom one.*/
3236
getRpcNode: () => RPC_NODES | string
3337
customRpcNode: string
3438
setCustomRpcNode: (v: string) => void
3539
setNsfwFriendly: (v: boolean) => void
3640
setPhotosensitiveFriendly: (v: boolean) => void
41+
setStartFeed: (v: StartFeed | undefined) => void
3742
setRpcNode: (rpcNode?: RPC_NODES) => Promise<void>
3843
setTheme: (theme: Theme, apply?: boolean) => void
3944
setTilted: (tilted: boolean) => void
@@ -55,6 +60,7 @@ const defaultValues = {
5560
viewMode: 'single' as ViewMode,
5661
nsfwFriendly: false,
5762
photosensitiveFriendly: false,
63+
startFeed: DEFAULT_START_FEED,
5864
zen: false,
5965
theme: 'dark' as Theme,
6066
themeDark: 'dark' as Theme,
@@ -125,6 +131,7 @@ export const useLocalSettings = create<LocalSettingsState>()(
125131
setNsfwFriendly: (nsfwFriendly) => set({ nsfwFriendly }),
126132
setPhotosensitiveFriendly: (photosensitiveFriendly) =>
127133
set({ photosensitiveFriendly }),
134+
setStartFeed: (startFeed) => set({ startFeed }),
128135
}),
129136
{
130137
name: 'settings',

src/index.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ const router = createBrowserRouter(
7777
<Route path="*" errorElement={<RootErrorBoundary />} element={<App />}>
7878
<Route path="/*" index element={<Home />} />
7979
<Route path="feed/*" element={<Home />}>
80-
<Route index element={<RecentSalesFeed />} />
80+
<Route path="sales" element={<RecentSalesFeed />} />
8181
<Route path="lists" element={<ListsFeed />} />
8282

8383
<Route

src/pages/config/Settings.jsx

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Page } from '@atoms/layout'
33
import { Checkbox, Input } from '@atoms/input'
44
import styles from '@style'
55
import { rpc_nodes, useLocalSettings } from '@context/localSettingsStore'
6+
import { FEED_MAP } from '@constants'
67
import { Select, ThemeSelection } from '@atoms/select'
78
import { Line } from '@atoms/line'
89
import { useEffect, useState } from 'react'
@@ -31,6 +32,8 @@ export const Settings = () => {
3132
setNsfwFriendly,
3233
photosensitiveFriendly,
3334
setPhotosensitiveFriendly,
35+
startFeed,
36+
setStartFeed,
3437
rpcNode,
3538
setRpcNode,
3639
customRpcNode,
@@ -44,6 +47,8 @@ export const Settings = () => {
4447
st.setNsfwFriendly,
4548
st.photosensitiveFriendly,
4649
st.setPhotosensitiveFriendly,
50+
st.startFeed,
51+
st.setStartFeed,
4752
st.rpcNode,
4853
st.setRpcNode,
4954
st.customRpcNode,
@@ -85,6 +90,17 @@ export const Settings = () => {
8590
onCheck={setPhotosensitiveFriendly}
8691
label={'Allow Photosensitive on feeds'}
8792
/>
93+
<Select
94+
label={'Start Feed'}
95+
value={{ value: startFeed, label: FEED_MAP[startFeed] }}
96+
options={Object.entries(FEED_MAP).map(([key, value]) => ({
97+
label: value,
98+
value: key,
99+
}))}
100+
onChange={(e) => {
101+
setStartFeed(e.value)
102+
}}
103+
/>
88104

89105
<Line />
90106
<ThemeSelection label={'Theme'} />

src/pages/home/index.jsx

+46-3
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,58 @@ import {
88
useOutlet,
99
useSearchParams,
1010
} from 'react-router-dom'
11-
12-
import { RecentSalesFeed, SearchFeed } from './feeds'
11+
import { FEED_MAP } from '@constants'
12+
import { useLocalSettings } from '@context/localSettingsStore'
13+
import {
14+
RecentSalesFeed,
15+
SearchFeed,
16+
IranFeed,
17+
PakistanFeed,
18+
UkraineFeed,
19+
AudioFeed,
20+
GifFeed,
21+
GlbFeed,
22+
HtmlSvgFeed,
23+
ImageFeed,
24+
VideoFeed,
25+
NewObjktsFeed,
26+
RandomFeed,
27+
TagFeed,
28+
PdfFeed,
29+
MarkdownFeed,
30+
QuakeFeed,
31+
FriendsFeed,
32+
} from './feeds'
1333
import SubjktsSearchResults from './subjkts-search-results'
1434

35+
const DefaultFeedComponent = RecentSalesFeed
36+
export const feedComponentMap = {
37+
[FEED_MAP['Recent Sales']]: RecentSalesFeed,
38+
[FEED_MAP['🏳️‍🌈 Tezospride']]: TagFeed,
39+
[FEED_MAP['🇮🇷 Iran']]: IranFeed,
40+
[FEED_MAP['Quake Aid']]: QuakeFeed,
41+
[FEED_MAP['🇵🇰 Pakistan']]: PakistanFeed,
42+
[FEED_MAP['🇺🇦 Ukraine']]: UkraineFeed,
43+
[FEED_MAP['Random']]: RandomFeed,
44+
[FEED_MAP['New OBJKTs']]: NewObjktsFeed,
45+
[FEED_MAP['3D']]: GlbFeed,
46+
[FEED_MAP['Video']]: VideoFeed,
47+
[FEED_MAP['Image']]: ImageFeed,
48+
[FEED_MAP['Audio']]: AudioFeed,
49+
[FEED_MAP['HTML & SVG']]: HtmlSvgFeed,
50+
[FEED_MAP['PDF']]: PdfFeed,
51+
[FEED_MAP['Markdown']]: MarkdownFeed,
52+
[FEED_MAP['GIF']]: GifFeed,
53+
[FEED_MAP['Friends']]: FriendsFeed,
54+
}
55+
1556
export function Home({ isSearch = false }) {
1657
const outlet = useOutlet()
1758
const [searchParams] = useSearchParams()
1859
const [searchTerm, setSearchTerm] = useState(searchParams.get('term') || '')
1960
const navigate = useNavigate()
61+
const [startFeed] = useLocalSettings((st) => [st.startFeed])
62+
const FeedComponent = feedComponentMap[startFeed] || DefaultFeedComponent
2063

2164
return (
2265
<Page feed={!isSearch} title="Home">
@@ -53,7 +96,7 @@ export function Home({ isSearch = false }) {
5396
<h1>Enter a search term</h1>
5497
)
5598
) : (
56-
outlet || <RecentSalesFeed />
99+
outlet || <FeedComponent />
57100
)}
58101
</Page>
59102
)

0 commit comments

Comments
 (0)