From bf972018c785a9c02036207e2ab88c5cdfa6e137 Mon Sep 17 00:00:00 2001 From: Marcel Elias Date: Wed, 19 Feb 2025 13:15:18 +0000 Subject: [PATCH] feat: dedicated mode toggle --- src/app/[game]/[category]/page.tsx | 20 ++---- src/components/asset/asset-item.tsx | 24 ++++--- src/components/asset/download-indicator.tsx | 2 - src/components/category/asset-handler.tsx | 71 ++++++++++++++++----- src/redux/slice/asset-slice.ts | 7 ++ 5 files changed, 81 insertions(+), 43 deletions(-) diff --git a/src/app/[game]/[category]/page.tsx b/src/app/[game]/[category]/page.tsx index 42703fdf..0509ecb0 100644 --- a/src/app/[game]/[category]/page.tsx +++ b/src/app/[game]/[category]/page.tsx @@ -33,7 +33,7 @@ export async function generateMetadata(props: Props): Promise { return { title: `${FormatGameName(response.game)} ${FormatCategoryName(response.asset)} • wanderer.moe`, - description: `${FormatGameName(response.game)} ${FormatCategoryName(response.asset)} assets on wanderer.moe`, + description: `Current ${FormatCategoryName(response.asset)} assets for ${FormatGameName(response.game)} available on wanderer.moe`, }; } @@ -119,24 +119,12 @@ export default async function GameCategoryPage(props: Readonly) {
- ww emote

- - Single Click: - {" "} - Select Asset -

-

- - Double Click: - {" "} - View Asset + Toggle between view and multi-select + mode from the Mode button. Tap or click + on an asset to view/select.

diff --git a/src/components/asset/asset-item.tsx b/src/components/asset/asset-item.tsx index 5259cb8a..0c80c943 100644 --- a/src/components/asset/asset-item.tsx +++ b/src/components/asset/asset-item.tsx @@ -20,6 +20,7 @@ import { useAppDispatch, useAppSelector } from "~/redux/store"; import { toggleAssetSelection, isAssetSelected, + getSelectMode, } from "~/redux/slice/asset-slice"; export function AssetItem({ @@ -35,21 +36,26 @@ export function AssetItem({ const dispatch = useAppDispatch(); - const isSelected = isAssetSelected( - useAppSelector((state) => state.assets), - asset, + const isSelected = useAppSelector((state) => + isAssetSelected(state.assets, asset), ); + const selectMode = useAppSelector((state) => getSelectMode(state.assets)); + + const handleClick = (e: React.MouseEvent) => { + e.stopPropagation(); + if (selectMode) { + dispatch(toggleAssetSelection(asset)); + } else { + setDialogOpen(true); + } + }; return (
setDialogOpen(true)} - onClick={(e) => { - e.stopPropagation(); - dispatch(toggleAssetSelection(asset)); - }} + onClick={handleClick} >
+ + +
- Toggle Selection + {allSelected ? "Deselect All" : "Select All"}
); diff --git a/src/redux/slice/asset-slice.ts b/src/redux/slice/asset-slice.ts index ad2d2e9f..a3c84c50 100644 --- a/src/redux/slice/asset-slice.ts +++ b/src/redux/slice/asset-slice.ts @@ -4,11 +4,13 @@ import type { Asset } from "~/lib/types"; export interface IAssetState { isMassDownloading: boolean; selectedAssets: Asset[]; + selectMode: boolean; } const initialState: IAssetState = { isMassDownloading: false, selectedAssets: [], + selectMode: false, }; export const assetSlice = createSlice({ @@ -36,6 +38,9 @@ export const assetSlice = createSlice({ clearSelectedAssets: (state) => { state.selectedAssets = []; }, + toggleSelectMode: (state) => { + state.selectMode = !state.selectMode; + }, }, }); @@ -45,12 +50,14 @@ export const isAssetSelected = (state: IAssetState, asset: Asset) => ); export const getSelectedAssets = (state: IAssetState) => state.selectedAssets; +export const getSelectMode = (state: IAssetState) => state.selectMode; export const { setSelectedAssets, setIsMassDownloading, toggleAssetSelection, clearSelectedAssets, + toggleSelectMode, } = assetSlice.actions; export default assetSlice.reducer;