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 ;
+}