Add texture filters to sidebar

This commit is contained in:
2024-10-16 20:01:12 +01:00
parent 0b770c05e3
commit ff271d15bd
6 changed files with 49 additions and 4 deletions
+26 -1
View File
@@ -7,9 +7,11 @@ import { Sidebar, SidebarProps } from 'primereact/sidebar';
import { Slider } from 'primereact/slider';
import { useEffect, useMemo, useReducer } from 'react';
import { useRouter } from 'next/router';
import { useShowcaseStore } from '@/components/showcase/store';
type Props = SidebarProps & {
filterBanknotes?: boolean;
filterTextures?: boolean;
query: ParsedUrlQuery;
};
@@ -188,8 +190,12 @@ const getDefaultParams = (query: ParsedUrlQuery) => {
};
};
export const Filters = ({ filterBanknotes, query, ...sidebarProps }: Props) => {
export const Filters = ({ filterBanknotes, filterTextures, query, ...sidebarProps }: Props) => {
const router = useRouter();
const setTextureBase = useShowcaseStore(state => state.setTextureBase);
const setTextureBump = useShowcaseStore(state => state.setTextureBump);
const textureBase = useShowcaseStore(state => state.textureBase);
const textureBump = useShowcaseStore(state => state.textureBump);
const [state, dispatch] = useReducer(reducer, getDefaultParams(query));
const [validFaceValue, stringifiedState] = useMemo(() => {
@@ -211,6 +217,25 @@ export const Filters = ({ filterBanknotes, query, ...sidebarProps }: Props) => {
return (
<Sidebar position={'right'} {...sidebarProps}>
<div style={{ display: 'flex', flexDirection: 'column', gap: 24 }}>
{filterTextures && (
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
<MultiToggleFilter
baseName={'texture'}
items={[
{
name: 'base',
set: payload => setTextureBase(!!payload),
value: textureBase
},
{
name: 'bump',
set: payload => setTextureBump(!!payload),
value: textureBump
}
]}
/>
</div>
)}
{!filterBanknotes && (
<div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
<MultiToggleFilter
+4 -1
View File
@@ -7,6 +7,7 @@ import { Physics, PlaneProps, usePlane } from '@react-three/cannon';
import { StageLightModel } from './stage-light-model';
import { Suspense, useMemo, useRef } from 'react';
import { useNumistaTypes } from '@/core/hooks/use-types';
import { useShowcaseStore } from '@/components/showcase/store';
import styles from './index.module.css';
const Plane = (props: PlaneProps) => {
@@ -40,6 +41,8 @@ const StageLight = (
};
export const Pile = () => {
const hasTextureBase = useShowcaseStore(state => state.textureBase);
const hasTextureBump = useShowcaseStore(state => state.textureBump);
const coins = useNumistaTypes({ filterBanknotes: true });
const count = useMemo(() => {
return coins?.reduce((total, coin) => total + (coin.count ?? 1), 0) ?? 0;
@@ -83,7 +86,7 @@ export const Pile = () => {
<Plane position={[0, -2, 0]} rotation={[-Math.PI / 2, 0, 0]} />
{count < 200 &&
coins?.map(coinProps => (
<Suspense fallback={null} key={coinProps.id}>
<Suspense fallback={null} key={`${coinProps.id}-${hasTextureBase}-${hasTextureBump}`}>
<CoinInstances {...coinProps} />
</Suspense>
))}
+3 -2
View File
@@ -14,6 +14,8 @@ export const Showcase = () => {
const previousIndex = useShowcaseStore(state => state.previousIndex);
const toggleSpin = useShowcaseStore(state => state.toggleSpin);
const setOrbitControlsRef = useShowcaseStore(state => state.setOrbitControlsRef);
const hasTextureBase = useShowcaseStore(state => state.textureBase);
const hasTextureBump = useShowcaseStore(state => state.textureBump);
useNumistaTypes({ onSuccess: setTypes });
@@ -44,8 +46,7 @@ export const Showcase = () => {
<Canvas className={styles.canvas}>
<ambientLight />
<directionalLight position={[0, 0.125, 1]} />
<directionalLight position={[0, 0.125, -1]} />
<Row />
<Row key={`${hasTextureBase}-${hasTextureBump}`} />
<OrbitControls
enablePan={false}
enableRotate={!isSpinning}
+14
View File
@@ -14,7 +14,11 @@ interface ShowcaseStore {
orbitControlsRef: MutableRefObject<OrbitControls | null>;
previousIndex: () => void;
setOrbitControlsRef: (ref: OrbitControls | null) => void;
setTextureBase: (value: boolean) => void;
setTextureBump: (value: boolean) => void;
setTypes: (types?: NumistaType[] | null) => void;
textureBase: boolean;
textureBump: boolean;
toggleSpin: () => void;
types: NumistaType[];
}
@@ -59,6 +63,14 @@ export const useShowcaseStore = create<ShowcaseStore>((set, get) => ({
set(() => ({
orbitControlsRef: { current: instance }
})),
setTextureBase: value =>
set(() => ({
textureBase: value
})),
setTextureBump: value =>
set(() => ({
textureBump: value
})),
setTypes: types =>
set(() => ({
currentIndex: 0,
@@ -66,6 +78,8 @@ export const useShowcaseStore = create<ShowcaseStore>((set, get) => ({
isTransitioning: true,
types: Array.isArray(types) ? types : []
})),
textureBase: true,
textureBump: true,
toggleSpin: () =>
set(state => {
if (!state.isSpinning) {
+1
View File
@@ -26,6 +26,7 @@ const PilePage: NextPage<Props> = ({ query }) => {
<Filters
className={styles.sidebar}
filterBanknotes
filterTextures
onHide={() => setDrawerVisible(false)}
query={query}
visible={drawerVisible}
+1
View File
@@ -25,6 +25,7 @@ const ShowcasePage: NextPage<Props> = ({ query }) => {
<Filters
className={styles.sidebar}
filterTextures
onHide={() => setDrawerVisible(false)}
query={query}
visible={drawerVisible}