Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions src/modules/library/api/useLibraryContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,7 @@ export function useLibraryContent({

const selectMode = useLibrarySelectionStore((s) => s.selectMode);
const isSearching = searchQuery.length > 0;
const isPrioritySort = sort.field === "priority";
const dndDisabled = isSearching || isPatcherActive || hasActiveFilters || selectMode;
const reorderDisabled = !isPrioritySort;
const isFlatMode = isSearching || hasActiveFilters;

const folderMap = useMemo(() => {
Expand Down Expand Up @@ -140,7 +138,6 @@ export function useLibraryContent({
return {
viewMode,
dndDisabled,
reorderDisabled,
selectMode,
contentView,
detailsMod,
Expand Down
5 changes: 3 additions & 2 deletions src/modules/library/api/useRootModDnd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";

import type { InstalledMod } from "@/lib/tauri";
import { hasOrderChanged, resolveFolderId } from "@/modules/library/utils";
import { useReorderDisabled } from "@/stores";

import { useMoveModToFolder } from "./useMoveMod";

interface UseRootModDndArgs {
rootMods: InstalledMod[];
onReorder: (modIds: string[]) => void;
reorderDisabled: boolean;
}

export function useRootModDnd({ rootMods, onReorder, reorderDisabled }: UseRootModDndArgs) {
export function useRootModDnd({ rootMods, onReorder }: UseRootModDndArgs) {
const reorderDisabled = useReorderDisabled();
const moveModToFolder = useMoveModToFolder();

const rootModIds = useMemo(() => rootMods.map((m) => m.id), [rootMods]);
Expand Down
10 changes: 3 additions & 7 deletions src/modules/library/api/useSortableModDnd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";

import type { InstalledMod } from "@/lib/tauri";
import { REMOVE_FROM_FOLDER_ID } from "@/modules/library/utils";
import { useReorderDisabled } from "@/stores";

import { useMoveModToFolder } from "./useMoveMod";

Expand All @@ -13,15 +14,10 @@ interface UseSortableModDndArgs {
mods: InstalledMod[];
onReorder: (modIds: string[]) => void;
folderId?: string;
reorderDisabled?: boolean;
}

export function useSortableModDnd({
mods,
onReorder,
folderId,
reorderDisabled,
}: UseSortableModDndArgs) {
export function useSortableModDnd({ mods, onReorder, folderId }: UseSortableModDndArgs) {
const reorderDisabled = useReorderDisabled();
const moveModToFolder = useMoveModToFolder();

const propsOrder = useMemo(() => mods.map((m) => m.id), [mods]);
Expand Down
13 changes: 4 additions & 9 deletions src/modules/library/api/useUnifiedDnd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
REMOVE_FROM_FOLDER_ID,
resolveFolderId,
} from "@/modules/library/utils";
import { useReorderDisabled } from "@/stores";

import { useFolderDnd } from "./useFolderDnd";
import { useMoveModToFolder, useReorderFolderMods } from "./useMoveMod";
Expand All @@ -24,16 +25,10 @@ interface UseUnifiedDndArgs {
rootMods: InstalledMod[];
modsByFolder: Map<string, InstalledMod[]>;
onReorder: (modIds: string[]) => void;
reorderDisabled: boolean;
}

export function useUnifiedDnd({
folders,
rootMods,
modsByFolder,
onReorder,
reorderDisabled,
}: UseUnifiedDndArgs) {
export function useUnifiedDnd({ folders, rootMods, modsByFolder, onReorder }: UseUnifiedDndArgs) {
const reorderDisabled = useReorderDisabled();
const {
localOrder: modLocalOrder,
orderedRootMods,
Expand All @@ -42,7 +37,7 @@ export function useUnifiedDnd({
handleDragOver: handleModDragOver,
handleDragEnd: handleModDragEnd,
handleDragCancel: handleModDragCancel,
} = useRootModDnd({ rootMods, onReorder, reorderDisabled });
} = useRootModDnd({ rootMods, onReorder });

const {
folderLocalOrder,
Expand Down
3 changes: 0 additions & 3 deletions src/modules/library/components/LibraryContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ export function LibraryContent({
const {
viewMode,
dndDisabled,
reorderDisabled,
selectMode,
contentView,
detailsMod,
Expand Down Expand Up @@ -118,7 +117,6 @@ export function LibraryContent({
reorderFolderMods.mutate({ folderId: contentView.folder.id, modIds })
}
disabled={dndDisabled}
reorderDisabled={reorderDisabled}
onViewDetails={setDetailsMod}
onEditMetadata={setEditMod}
className={`${gridClass(viewMode)} stagger-enter mt-4`}
Expand Down Expand Up @@ -152,7 +150,6 @@ export function LibraryContent({
modsByFolder={contentView.modsByFolder}
viewMode={viewMode}
dndDisabled={dndDisabled}
reorderDisabled={reorderDisabled}
onReorder={(modIds) => reorderMods.mutate(modIds)}
onViewDetails={setDetailsMod}
onEditMetadata={setEditMod}
Expand Down
5 changes: 4 additions & 1 deletion src/modules/library/components/SortableFolderCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { CSS } from "@dnd-kit/utilities";
import type { CSSProperties } from "react";

import type { InstalledMod, LibraryFolder } from "@/lib/tauri";
import { useReorderDisabled } from "@/stores";

import { FolderCard } from "./FolderCard";

Expand All @@ -19,8 +20,10 @@ export function SortableFolderCard({
mods,
sortDisabled,
}: SortableFolderCardProps) {
const reorderDisabled = useReorderDisabled();
const disabled = sortDisabled || reorderDisabled;
const { attributes, listeners, setNodeRef, transform, transition, isDragging, isOver } =
useSortable({ id: sortableId, disabled: sortDisabled ? { draggable: true } : false });
useSortable({ id: sortableId, disabled: disabled ? { draggable: true } : false });

const style: CSSProperties = {
transform: CSS.Translate.toString(transform),
Expand Down
7 changes: 5 additions & 2 deletions src/modules/library/components/SortableFolderRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { GripVertical } from "lucide-react";
import type { CSSProperties } from "react";

import type { InstalledMod, LibraryFolder } from "@/lib/tauri";
import { useReorderDisabled } from "@/stores";

import { FolderRow } from "./FolderRow";

Expand All @@ -24,8 +25,10 @@ export function SortableFolderRow({
onViewDetails,
onEditMetadata,
}: SortableFolderRowProps) {
const reorderDisabled = useReorderDisabled();
const disabled = sortDisabled || reorderDisabled;
const { attributes, listeners, setNodeRef, transform, transition, isDragging, isOver } =
useSortable({ id: sortableId, disabled: sortDisabled ? { draggable: true } : false });
useSortable({ id: sortableId, disabled: disabled ? { draggable: true } : false });

const style: CSSProperties = {
transform: CSS.Translate.toString(transform),
Expand All @@ -45,7 +48,7 @@ export function SortableFolderRow({
<div className="absolute inset-0 rounded-lg border-2 border-dashed border-accent-500/40 bg-accent-500/5" />
)}
<div className={`flex items-start ${isDragging ? "invisible" : ""}`}>
{!sortDisabled && (
{!disabled && (
<div
className={`flex shrink-0 items-center px-2 py-2.5 text-surface-500 opacity-30 transition-opacity group-hover/sortable-folder:opacity-100 ${isDragging ? "cursor-grabbing" : "cursor-grab"}`}
data-no-toggle
Expand Down
4 changes: 2 additions & 2 deletions src/modules/library/components/SortableModCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@ import type { CSSProperties } from "react";

import type { InstalledMod } from "@/lib/tauri";
import { usePatcherStatus } from "@/modules/patcher";
import { useReorderDisabled } from "@/stores";

import { ModCard } from "./ModCard";

interface SortableModCardProps {
mod: InstalledMod;
viewMode: "grid" | "list";
reorderDisabled?: boolean;
onViewDetails?: (mod: InstalledMod) => void;
onEditMetadata?: (mod: InstalledMod) => void;
}

export function SortableModCard({
mod,
viewMode,
reorderDisabled,
onViewDetails,
onEditMetadata,
}: SortableModCardProps) {
const reorderDisabled = useReorderDisabled();
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
id: mod.id,
disabled: reorderDisabled ? { droppable: true } : false,
Expand Down
5 changes: 1 addition & 4 deletions src/modules/library/components/SortableModList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ interface SortableModListProps {
viewMode: "grid" | "list";
onReorder: (modIds: string[]) => void;
disabled?: boolean;
reorderDisabled?: boolean;
onViewDetails?: (mod: InstalledMod) => void;
onEditMetadata?: (mod: InstalledMod) => void;
className?: string;
Expand All @@ -53,7 +52,6 @@ export function SortableModList({
viewMode,
onReorder,
disabled,
reorderDisabled,
onViewDetails,
onEditMetadata,
className,
Expand All @@ -68,7 +66,7 @@ export function SortableModList({
handleDragOver,
handleDragEnd,
handleDragCancel,
} = useSortableModDnd({ mods, onReorder, folderId, reorderDisabled });
} = useSortableModDnd({ mods, onReorder, folderId });

const sensors = useSensors(
useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),
Expand Down Expand Up @@ -111,7 +109,6 @@ export function SortableModList({
key={mod.id}
mod={mod}
viewMode={viewMode}
reorderDisabled={reorderDisabled}
onViewDetails={onViewDetails}
onEditMetadata={onEditMetadata}
/>
Expand Down
12 changes: 3 additions & 9 deletions src/modules/library/components/UnifiedDndGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ interface UnifiedDndGridProps {
modsByFolder: Map<string, InstalledMod[]>;
viewMode: "grid" | "list";
dndDisabled: boolean;
reorderDisabled: boolean;
onReorder: (modIds: string[]) => void;
onViewDetails?: (mod: InstalledMod) => void;
onEditMetadata?: (mod: InstalledMod) => void;
Expand All @@ -40,7 +39,6 @@ export function UnifiedDndGrid({
modsByFolder,
viewMode,
dndDisabled,
reorderDisabled,
onReorder,
onViewDetails,
onEditMetadata,
Expand Down Expand Up @@ -69,7 +67,6 @@ export function UnifiedDndGrid({
rootMods={rootMods}
modsByFolder={modsByFolder}
viewMode={viewMode}
reorderDisabled={reorderDisabled}
onReorder={onReorder}
onViewDetails={onViewDetails}
onEditMetadata={onEditMetadata}
Expand Down Expand Up @@ -132,7 +129,6 @@ interface DndGridProps {
rootMods: InstalledMod[];
modsByFolder: Map<string, InstalledMod[]>;
viewMode: "grid" | "list";
reorderDisabled: boolean;
onReorder: (modIds: string[]) => void;
onViewDetails?: (mod: InstalledMod) => void;
onEditMetadata?: (mod: InstalledMod) => void;
Expand All @@ -143,7 +139,6 @@ function DndGrid({
rootMods,
modsByFolder,
viewMode,
reorderDisabled,
onReorder,
onViewDetails,
onEditMetadata,
Expand All @@ -161,7 +156,7 @@ function DndGrid({
handleDragOver,
handleDragEnd,
handleDragCancel,
} = useUnifiedDnd({ folders, rootMods, modsByFolder, onReorder, reorderDisabled });
} = useUnifiedDnd({ folders, rootMods, modsByFolder, onReorder });

const sensors = useSensors(
useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),
Expand Down Expand Up @@ -196,7 +191,7 @@ function DndGrid({
sortableId={sortableId}
folder={folder}
mods={folderMods}
sortDisabled={reorderDisabled || isDraggingMod || isDraggingFolderMod}
sortDisabled={isDraggingMod || isDraggingFolderMod}
onViewDetails={onViewDetails}
onEditMetadata={onEditMetadata}
/>
Expand All @@ -208,7 +203,7 @@ function DndGrid({
sortableId={sortableId}
folder={folder}
mods={folderMods}
sortDisabled={reorderDisabled || isDraggingMod || isDraggingFolderMod}
sortDisabled={isDraggingMod || isDraggingFolderMod}
/>
);
})}
Expand All @@ -218,7 +213,6 @@ function DndGrid({
key={mod.id}
mod={mod}
viewMode={viewMode}
reorderDisabled={reorderDisabled}
onViewDetails={onViewDetails}
onEditMetadata={onEditMetadata}
/>
Expand Down
5 changes: 5 additions & 0 deletions src/stores/libraryFilter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,8 @@ export function useHasActiveFilters() {
s.showOnlyEnabled,
);
}

/** Reordering only applies in priority sort; any other sort imposes its own order. */
export function useReorderDisabled() {
return useLibraryFilterStore((s) => s.sort.field !== "priority");
}
Loading