diff --git a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatureHeader/SystemSignatureHeader.tsx b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatureHeader/SystemSignatureHeader.tsx new file mode 100644 index 00000000..7e940ebc --- /dev/null +++ b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatureHeader/SystemSignatureHeader.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { SystemView, WdCheckbox, WdImgButton, TooltipPosition } from '@/hooks/Mapper/components/ui-kit'; +import { PrimeIcons } from 'primereact/api'; +import { CheckboxChangeEvent } from 'primereact/checkbox'; +import { InfoDrawer, LayoutEventBlocker } from '@/hooks/Mapper/components/ui-kit'; +import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper'; + +export type HeaderProps = { + systemId: string; + isNotSelectedSystem: boolean; + sigCount: number; + isCompact: boolean; + lazyDeleteValue: boolean; + onLazyDeleteChange: (checked: boolean) => void; + pendingCount: number; + onUndoClick: () => void; + onSettingsClick: () => void; +}; + +function HeaderImpl({ + systemId, + isNotSelectedSystem, + sigCount, + isCompact, + lazyDeleteValue, + onLazyDeleteChange, + pendingCount, + onUndoClick, + onSettingsClick, +}: HeaderProps) { + return ( +
+
+ {!isCompact && ( +
+ {sigCount ? `[${sigCount}] ` : ''}Signatures {isNotSelectedSystem ? '' : 'in'} +
+ )} + {!isNotSelectedSystem && } +
+ + + + onLazyDeleteChange(!!event.checked)} + /> + + + {pendingCount > 0 && ( + + )} + + + How to add/update signature?}> + In game you need to select one or more signatures
in the list in{' '} + Probe scanner.
Use next hotkeys: +
+ Shift + LMB or Ctrl + LMB +
or Ctrl + A for select all +
and then use Ctrl + C, after you need to go
+ here, select Solar system and paste it with Ctrl + V +
+ How to select?}> + For selecting any signature, click on it
with hotkeys{' '} + Shift + LMB or Ctrl + LMB +
+ How to delete?}> + To delete any signature, first select it
and then press Del +
+
+ ), + }} + /> + + + + + ); +} + +export const SystemSignaturesHeader = React.memo(HeaderImpl); diff --git a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatures.tsx b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatures.tsx index 31dea303..37c05c78 100644 --- a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatures.tsx +++ b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/SystemSignatures.tsx @@ -1,13 +1,5 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Widget } from '@/hooks/Mapper/components/mapInterface/components'; -import { - InfoDrawer, - LayoutEventBlocker, - SystemView, - TooltipPosition, - WdCheckbox, - WdImgButton, -} from '@/hooks/Mapper/components/ui-kit'; import { SystemSignaturesContent } from './SystemSignaturesContent'; import { COSMIC_ANOMALY, @@ -21,13 +13,11 @@ import { SystemSignatureSettingsDialog, } from './SystemSignatureSettingsDialog'; import { SignatureGroup, SystemSignature } from '@/hooks/Mapper/types'; -import { PrimeIcons } from 'primereact/api'; import { useMapRootState } from '@/hooks/Mapper/mapRootProvider'; -import { CheckboxChangeEvent } from 'primereact/checkbox'; import useMaxWidth from '@/hooks/Mapper/hooks/useMaxWidth'; -import { WdTooltipWrapper } from '@/hooks/Mapper/components/ui-kit/WdTooltipWrapper'; import { useHotkey } from '@/hooks/Mapper/hooks'; import { COMPACT_MAX_WIDTH } from './constants'; +import { renderHeaderLabel } from './renders'; const SIGNATURE_SETTINGS_KEY = 'wanderer_system_signature_settings_v5_5'; export const SHOW_DESCRIPTION_COLUMN_SETTING = 'show_description_column_setting'; @@ -58,7 +48,9 @@ const SETTINGS: Setting[] = [ { key: SignatureGroup.CombatSite, name: 'Show Combat Sites', value: true, isFilter: true }, ]; -const getDefaultSettings = (): Setting[] => [...SETTINGS]; +function getDefaultSettings(): Setting[] { + return [...SETTINGS]; +} export const SystemSignatures: React.FC = () => { const { @@ -85,7 +77,8 @@ export const SystemSignatures: React.FC = () => { const [sigCount, setSigCount] = useState(0); const [pendingSigs, setPendingSigs] = useState([]); - const [undoPending, setUndoPending] = useState<() => void>(() => () => {}); + + const undoPendingFnRef = useRef<() => void>(() => {}); const handleSigCountChange = useCallback((count: number) => { setSigCount(count); @@ -96,7 +89,7 @@ export const SystemSignatures: React.FC = () => { const lazyDeleteValue = useMemo( () => currentSettings.find(setting => setting.key === LAZY_DELETE_SIGNATURES_SETTING)?.value || false, - [currentSettings], + [currentSettings] ); const handleSettingsChange = useCallback((newSettings: Setting[]) => { @@ -106,93 +99,59 @@ export const SystemSignatures: React.FC = () => { const handleLazyDeleteChange = useCallback((value: boolean) => { setCurrentSettings(prevSettings => - prevSettings.map(setting => (setting.key === LAZY_DELETE_SIGNATURES_SETTING ? { ...setting, value } : setting)), + prevSettings.map(setting => (setting.key === LAZY_DELETE_SIGNATURES_SETTING ? { ...setting, value } : setting)) ); }, []); const containerRef = useRef(null); const isCompact = useMaxWidth(containerRef, COMPACT_MAX_WIDTH); - useHotkey(true, ['z'], (event: KeyboardEvent) => { + useHotkey(true, ['z'], event => { if (pendingSigs.length > 0) { event.preventDefault(); event.stopPropagation(); - undoPending(); + undoPendingFnRef.current(); setPendingSigs([]); } }); const handleUndoClick = useCallback(() => { - undoPending(); + undoPendingFnRef.current(); setPendingSigs([]); - }, [undoPending]); + }, []); const handleSettingsButtonClick = useCallback(() => { setVisible(true); }, []); - const renderLabel = () => ( -
-
- {!isCompact && ( -
- {sigCount ? `[${sigCount}] ` : ''}Signatures {isNotSelectedSystem ? '' : 'in'} -
- )} - {!isNotSelectedSystem && } -
- - - handleLazyDeleteChange(!!event.checked)} - /> - - {pendingSigs.length > 0 && ( - - )} - - How to add/update signature?}> - In game you need to select one or more signatures
in the list in{' '} - Probe scanner.
Use next hotkeys: -
- Shift + LMB or Ctrl + LMB -
or Ctrl + A for select all -
and then use Ctrl + C, after you need to go
- here, select Solar system and paste it with Ctrl + V -
- How to select?}> - For selecting any signature, click on it
with hotkeys{' '} - Shift + LMB or Ctrl + LMB -
- How to delete?}> - To delete any signature, first select it
and then press Del -
-
- ) as React.ReactNode, - }} - /> - - - - ); + const handlePendingChange = useCallback((newPending: SystemSignature[], newUndo: () => void) => { + setPendingSigs(prev => { + if (newPending.length === prev.length && newPending.every(np => prev.some(pp => pp.eve_id === np.eve_id))) { + return prev; + } + return newPending; + }); + undoPendingFnRef.current = newUndo; + }, []); return ( - + + {renderHeaderLabel({ + systemId, + isNotSelectedSystem, + isCompact, + sigCount, + lazyDeleteValue, + pendingCount: pendingSigs.length, + onLazyDeleteChange: handleLazyDeleteChange, + onUndoClick: handleUndoClick, + onSettingsClick: handleSettingsButtonClick, + })} + + } + > {isNotSelectedSystem ? (
System is not selected @@ -203,10 +162,7 @@ export const SystemSignatures: React.FC = () => { settings={currentSettings} onLazyDeleteChange={handleLazyDeleteChange} onCountChange={handleSigCountChange} - onPendingChange={(pending, undo) => { - setPendingSigs(pending); - setUndoPending(() => undo); - }} + onPendingChange={handlePendingChange} /> )} {visible && ( diff --git a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/index.ts b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/index.ts index 91b7bb53..9e55bacc 100644 --- a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/index.ts +++ b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/index.ts @@ -5,3 +5,4 @@ export * from './renderAddedTimeLeft'; export * from './renderUpdatedTimeLeft'; export * from './renderLinkedSystem'; export * from './renderInfoColumn'; +export * from './renderHeaderLabel'; diff --git a/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/renderHeaderLabel.tsx b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/renderHeaderLabel.tsx new file mode 100644 index 00000000..fba0d71e --- /dev/null +++ b/assets/js/hooks/Mapper/components/mapInterface/widgets/SystemSignatures/renders/renderHeaderLabel.tsx @@ -0,0 +1,5 @@ +import { SystemSignaturesHeader, HeaderProps } from '../SystemSignatureHeader/SystemSignatureHeader'; + +export function renderHeaderLabel(props: HeaderProps) { + return ; +}